XL 2013 Besoin d'aide pour ma toute 1ière macro

slamdunk77

XLDnaute Nouveau
Bonjour la communauté,

j'ai besoin de vous pour m'aider à résoudre un petit soucis dans ma 1iére macro.
J'ai créé un calendrier "dynamique" qui en fonction du mois ou de l'année sélectionné change les jours jusque ici pas de soucis.
Et maintenant je dois créer une macro pour qu'en fonction du mois sélectionné, la macro me cache les jours en trop (exemple : en juin on cache le 31 ).
Voici ma macro :
' titre macro
Sub Masquer_Jour()

'variable balayée (ligne 34 - 35 - 36)
Dim Num_Ligne As Long

For Num_Ligne = 34 To 36
'La fonction sélection RANGE aurait pu être utilisée?

' Compare la valeur du mois en A1 pour ajuster le nombre de jour en colone B
If Month(Cells(Num_Ligne, 2)) <> Cells(1, 1) Then
' Cache les lignes en trop du mois (soit B34/35 ou 36)
Rows(Num_Ligne).Hidden = True
Else
Rows(Num_Ligne).Hidden = False
End If
Next
End Sub

Le problème dans ma macro c'est que peut importe le mois sélectionné, il me cache les jours 29/30/31.
Et vu que je découvre les macros, je me pose plein de questions, je lis plein d'infos et d'aides mais je me perds.
Je vous joins mon fichier excel.
Merci pour vos réponses :)
 

Pièces jointes

  • calendrier essai macro.xlsm
    24.3 KB · Affichages: 11

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

voici votre macro modifiée le numéro de mois est en cells(1,3) et non en cells(1,1)

Trouvez des tutoriels qui foisonnent sur vba.

VB:
Sub Masquer_Jour()
'Voir l'aide excel sur les types de variable et leur capacité
'Mettez votre curseur sur le mot 'Long' ci-dessous et F1
' Un type long à une capacité importante de  -2 147 483 648 à 2 147 483 647
' depuis excel 2007 le nombre de lignes ayant augmenté, vba convertit  les références aux lignes déclarés en Integer
' automatiquement en long

    Dim Num_Ligne As Long
       
    Dim Mois As Integer
   
    '
    ' Prenez l'habitude de dire sur que classeur et quelle feuille vos
    ' macros devront travailler.
    With ThisWorkbook.Sheets("Feuil2")
        'Le numéro de mois est en C1
        Mois = .Range("C1")
        For Num_Ligne = 34 To 36
            '
            ' Month(.Cells(Num_Ligne, 2)) <> Mois renverra False ou True
            ' Et la propriété hidden attends une valeur booléenne (False ou True)
            ' Donc pas besoin de if then puisque se sera soit l'un soit l'autre
            .Rows(Num_Ligne).Hidden = Month(.Cells(Num_Ligne, 2)) <> Mois
        Next
    End With
End Sub

cordialement
[Edit] Hello @pierrejean
 

Pièces jointes

  • calendrier essai macro.xlsm
    25.6 KB · Affichages: 6

slamdunk77

XLDnaute Nouveau
Bonjour,

voici votre macro modifiée le numéro de mois est en cells(1,3) et non en cells(1,1)

Trouvez des tutoriels qui foisonnent sur vba.

VB:
Sub Masquer_Jour()
'Voir l'aide excel sur les types de variable et leur capacité
'Mettez votre curseur sur le mot 'Long' ci-dessous et F1
' Un type long à une capacité importante de  -2 147 483 648 à 2 147 483 647
' depuis excel 2007 le nombre de lignes ayant augmenté, vba convertit  les références aux lignes déclarés en Integer
' automatiquement en long

    Dim Num_Ligne As Long
      
    Dim Mois As Integer
  
    '
    ' Prenez l'habitude de dire sur que classeur et quelle feuille vos
    ' macros devront travailler.
    With ThisWorkbook.Sheets("Feuil2")
        'Le numéro de mois est en C1
        Mois = .Range("C1")
        For Num_Ligne = 34 To 36
            '
            ' Month(.Cells(Num_Ligne, 2)) <> Mois renverra False ou True
            ' Et la propriété hidden attends une valeur booléenne (False ou True)
            ' Donc pas besoin de if then puisque se sera soit l'un soit l'autre
            .Rows(Num_Ligne).Hidden = Month(.Cells(Num_Ligne, 2)) <> Mois
        Next
    End With
End Sub

cordialement
[Edit] Hello @pierrejean



Merci d'avoir pris le temps de me répondre et d'ajouter de précieux conseils
 

slamdunk77

XLDnaute Nouveau
Re bonjour,

je suis de nouveau coincé, j’essaie de faire évoluer ma macro pour qu'elle s'applique plusieurs onglets (il y en a plusieurs et se serai trop long à les écrire 1 par 1) Du coup j'ai essayé de dire à la macro où travailler avec With ThisWorkbook.Sheets ("nom de la feuille" To "nom de la feuille")
mais cela ne fonctionne pas.
Merci pour vos futurs réponses

VB:
Sub Masquer_Jour()

    Dim Num_Ligne As Long
      
    Dim Mois As Integer

    [COLOR=rgb(147, 101, 184)][B]With ThisWorkbook.Sheets("Feuil2") <------ With ThisWorkbook.Sheets ("nom de la feuille" To "nom de la feuille")[/B][/COLOR]
        
[COLOR=rgb(184, 49, 47)]    [/COLOR][COLOR=rgb(0, 0, 0)]    Mois = .Range("C1")
        For Num_Ligne = 34 To 36
            '
            ' Month(.Cells(Num_Ligne, 2)) <> Mois renverra False ou True
           
            .Rows(Num_Ligne).Hidden = Month(.Cells(Num_Ligne, 2)) <> Mois
        Next
    End With
End Sub
[/COLOR]
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil, slamdunk77, pierrejean, Roblochon

Pour cela, il faut faire une boucle
VB:
Sub boucle()
Dim Num_Ligne As Long
Dim Mois As Integer
Dim i&
For i = 1 To Worksheets.Count
With ThisWorkbook.Sheets(i)
        'Le numéro de mois est en C1
        Mois = .Range("C1")
        For Num_Ligne = 34 To 36
            .Rows(Num_Ligne).Hidden = Month(.Cells(Num_Ligne, 2)) <> Mois
        Next
    End With
Next
End Sub
Ou mettre le nom des feuilles concernées dans un Array
 

slamdunk77

XLDnaute Nouveau
Bonsoir,
merci pour ta réponse Staple1600, mais j'ai dû mal m'y prendre car plus rien de ne fonctionne. Voici ce que j'ai écrit dans mon module1 de macro :

Sub Masquer_Jour()

Dim Num_Ligne As Long

Dim Mois As Integer

Dim F&
For F = 1 To Worksheet.Count
With ThisWorkbook.Sheets(F)

'Le numéro de mois est en AC1
Mois = .Range("AC1")
For Num_Ligne = 40 To 42

.Rows(Num_Ligne).Hidden = Month(.Cells(Num_Ligne, 1)) <> Mois
Next
End With
End Sub


Quand j'écris " For F = 1 To Worksheet.Count" le "1" désigne ma 1iere feuille de classeur (peut importe le nom que je lui donne)? et le "Worksheet.Count" la dernière?

merci
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Quand j'écris " For F = 1 To Worksheet.Count" le "1" désigne ma 1iere feuille de classeur (peut importe le nom que je lui donne)? et le "Worksheet.Count" la dernière?

Oui, c'est ça. si ce sont des feuilles avec les noms de mois d'une année, voici deux propositions (qu'avec un peu de recherche vous auriez trouvées sur le site)

La première : valide si vous êtes certaine que les feuille de tous les mois de l'année existent dans le classeur
La seconde : certains mois ou tous peuvent être manquants.

VB:
Sub LesFeuillesMois1()
Dim ws As Worksheet
'
' Parcourir uniquement les feuilles dont les noms sont dans le tableau
For Each ws In ThisWorkbook.Worksheets(Array("Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"))
   '
   ' Faire le travail sur la feuille
   With ws
    Debug.Print .Name
   End With
Next
End Sub

Sub LesFeuillesMois2()
Dim ws As Worksheet
Dim LesMois As Variant
'Création d'un tableau contenant les noms de mois
'par éclatement d'une chaine de caractère.
LesMois = Split("Janvier;Février;Mars;Avril;Mai;Juin;Juillet;Août;Septembre;Octobre;Novembre;Décembre", ";")
'
'Parcourir toutes les feuilles de travail du classeurs
For Each ws In ThisWorkbook.Worksheets()
    ' Si le nom de la feuille fait partie du tableau LesMois
    ' (Utilisation de l'équivalent VBA de la fonction de feuille Equiv)
    If Not IsError(Application.Match(ws.Name, LesMois, 0)) Then
        'faire le travail sur la feuille
        With ws
            Debug.Print .Name
        End With
    End If
Next
End Sub

Cordialement
 

slamdunk77

XLDnaute Nouveau
Bonjour,



Oui, c'est ça. si ce sont des feuilles avec les noms de mois d'une année, voici deux propositions (qu'avec un peu de recherche vous auriez trouvées sur le site)

La première : valide si vous êtes certaine que les feuille de tous les mois de l'année existent dans le classeur
La seconde : certains mois ou tous peuvent être manquants.

VB:
Sub LesFeuillesMois1()
Dim ws As Worksheet
'
' Parcourir uniquement les feuilles dont les noms sont dans le tableau
For Each ws In ThisWorkbook.Worksheets(Array("Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"))
   '
   ' Faire le travail sur la feuille
   With ws
    Debug.Print .Name
   End With
Next
End Sub

Sub LesFeuillesMois2()
Dim ws As Worksheet
Dim LesMois As Variant
'Création d'un tableau contenant les noms de mois
'par éclatement d'une chaine de caractère.
LesMois = Split("Janvier;Février;Mars;Avril;Mai;Juin;Juillet;Août;Septembre;Octobre;Novembre;Décembre", ";")
'
'Parcourir toutes les feuilles de travail du classeurs
For Each ws In ThisWorkbook.Worksheets()
    ' Si le nom de la feuille fait partie du tableau LesMois
    ' (Utilisation de l'équivalent VBA de la fonction de feuille Equiv)
    If Not IsError(Application.Match(ws.Name, LesMois, 0)) Then
        'faire le travail sur la feuille
        With ws
            Debug.Print .Name
        End With
    End If
Next
End Sub

Cordialement


Bonjour Roblochon,

tout d'abord merci d'avoir pris le temps pour me répondre.
J'aimerai quand même éclaircir un point, je ne m'amuse pas à déranger les personnes sans avoir "chercher un minimum". Quand j'ai demandé lors de mon dernier post (vendredi 23, 23h22) "Quand j'écris " For F = 1 To Worksheet.Count" le "1" désigne ma 1iere feuille de classeur (peut importe le nom que je lui donne)?" c'est parce que l'on trouve tout et n'importe quoi comme réponse sur le Net et on se perd. Et le plus bête dans tout cela c'est que je ne sais pas pourquoi ma macro ne fonctionnait pas alors que je dis à la macro sur quelles feuilles travailler...!

Ensuite la fonction Array ne peut convenir à mon fichier car il y a trop de feuille j'en ajoute tous les mois jusqu'en 2023. Les feuilles ont le nom du Mois et de l'année, ex : SEPT 19, OCT 19, NOV 19, etc jusqu'en 2023.


Je vais donc regarder ce que tu m'as donné Roblochon, je vais surtout essayer de la comprendre pour ne pas l'appliquer bêtement et voir si j'arrive à l'intégrer à mon fichier (je rappelle que je suis ultra novice).

Je vais aussi chercher comment je rajoute une macro, est ce que je la rajoute à la suite, est ce que je dois rajouter un Sub et End Sub ou faut-il rajouter une fonction Call ... voila toutes les questions que je me pose aussi.

Bien cordialement :)


 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Pour rajouter une macro il suffit, dans un module standard de ces deux lignes:

Sub NomDeLaMacro()

End Sub

Et d'y enfermer les lignes à exécuter.

Une fonction quand à elle est prévue pour retourner un résultat exemple:

Function ParDeux( nombre as Double) as Double
ParDeux = nombre * 2
End Function

Utilisation:

Dim Résultat as double
Résultat = ParDeux(4)

Bon apprentissage.
 

Statistiques des forums

Discussions
311 720
Messages
2 081 912
Membres
101 837
dernier inscrit
Ugo