Compréhension et réutilisation d'un code VBA

TgR

XLDnaute Junior
Bonjour le forum,

Je sollicite ton aide aujourd'hui pour la compréhension et la réutilisation d'un code VBA ! Quelques petites explications s'imposent !

Grâce au forum et à un ami, la macro que je voulais réaliser sur un 1er tableau fonctionne parfaitement. Il s'agit de la pièce jointe "HR occupation mensuelle etc..", module 2. Après avoir présenté le fichier Excel, mon directeur souhaiterait la même macro pour le fichier d'un autre établissement. Celui-ci est un peu différent mais le principe est le même. Il s'agit de la pièce jointe n°2 (occupation mensuelle CLM). Je pensais au départ faire un copié collé du code et que tout roulerai, mais ce n'est pas le cas !

Code:
For Each cel In Sheets(ni).Range("H4:H195") 
    If cel.Value = "" And cel.Offset(0, -5).Value <> "" Then
        ad = cel.Offset(0, -5).Address 
        ad2 = cel.Offset(0, 3).Address 
        Sheets(ni).Cells(cel.Row, 3).Resize(1, 4).Copy Sheets(ni + 1).Range(ad)
    End If 'fin de la condition
Next cel 'prochaine cellule de la boucle

Cette partie du code venant du tableau où j'essaye d'intégrer la macro fonctionne très bien Elle me sert à copier/coller les patients qui sont encore présent à la fin du mois vers le mois suivant

La seconde partie du code est celle qui me pose souci. Celui-ci sert à vérifier la case verte et son chiffre dans la partie droite du tableau et recopie le dernier chiffre incrémenté de 1 dans l'onglet suivant à la ligne correspondant au patient (j'espère être clair)

je vais recopier le code du tableau qui marche (HR occupation mensuelle)

Code:
For Each cel2 In Sheets(ni).Range("K4:K423")
    nbDayInMonth = Day(DateSerial(Year(Date), ni + 1, 1) - 1)
    nbDayInNextMonth = Day(DateSerial(Year(Date), ni + 2, 1) - 1)
    If cel2.Offset(0, nbDayInMonth - 1).Value <> "" Then
        ad3 = cel2.Address
        cel2.Offset(0, nbDayInMonth - 1).Copy Sheets(ni + 1).Range(ad3)
        Range((ad3)).Select
        
        ad4 = cel2.Offset(0, nbDayInNextMonth - 1).Address
        i = 1
        For Each cel3 In Sheets(ni + 1).Range(ad3, ad4)
            If cel2.Offset(0, nbDayInMonth - 1).Value <> "P" Then
                cel3 = cel2.Offset(0, nbDayInMonth - 1).Value + i
                i = i + 1
            Else
                cel3 = cel2.Offset(0, nbDayInMonth - 1).Value
            End If
        Next cel3
    End If
Next cel2
Application.Calculation = xlCalculationAutomatic
End Sub

Ce code fonctionne parfaitement sur le premier tableau mais pas du tout sur le 2nd. Pourtant le principe est le même et je ne change qu'une seule chose c'est le colonne de NI qui devient

Code:
For Each cel2 In Sheets(ni).Range("L4:L195")

et encore :

Code:
If cel2.Offset(0, nbDayInMonth - 1).Value <> "P" Then
ou grand "P" devient petit "p"

Je n'arrive pas très bien à comprendre le bout de code, notamment l'affectation des variables nbDayInMont et nbDayInNextMonth.

Si quelqu'un pouvait m'aider à comprendre et à corriger le code pour qu'il fonctionne sur le second tableau...

Merci d'avance
 

Pièces jointes

  • HR OCCUPATION MENSUELLE CHAMBRES 2013 JANVIER - AVEC MACRO.zip
    200.4 KB · Affichages: 22
  • HR OCCUPATION MENSUELLE CHAMBRES 2013 JANVIER - AVEC MACRO.zip
    200.4 KB · Affichages: 20
  • HR OCCUPATION MENSUELLE CHAMBRES 2013 JANVIER - AVEC MACRO.zip
    200.4 KB · Affichages: 20
  • OCCUPATION MENSUELLE CHAMBRES CLM.zip
    189.1 KB · Affichages: 14

herve62

XLDnaute Barbatruc
Supporter XLD
Re : Compréhension et réutilisation d'un code VBA

Bonjour
On dirait que tu mélanges les "torchons et les serviettes" , ta macro marche pas , Ok
j'ai testé en changeant le type de colonne !!!!!! ( pour les for Each avec la plage L , j'ai mis G juste pour voir) là ou il y a des dates .... ca a l'air d'aller mieux
Mais comme je vois pas ce que tu veux , regarde cette piste et adapte
ex : ad3 = cel2.Address me donne un résultat , avant .. Rien !
notamment l'affectation des variables nbDayInMont et nbDayInNextMonth
Ca te donne le NBre de jours du mois et celui après
 

Tirou

XLDnaute Occasionnel
Re : Compréhension et réutilisation d'un code VBA

Bien le bonjour !

Alors, en plus des deux modifications que tu as déjà soulevé, j'ai trouvé 2 erreurs qui empêchent ton code de fonctionner:

La première est dans la partie où tu considère que ton code fonctionne :
Code:
For Each cel In Sheets(ni).Range("H4:H195") 
    If cel.Value = "" And cel.Offset(0, -5).Value <> "" Then
        ad = cel.Offset(0, -5).Address 
        ad2 = cel.Offset(0, 3).Address 
        Sheets(ni).Cells(cel.Row, 3).Resize(1, 4).Copy Sheets(ni + 1).Range(ad)
    End If 'fin de la condition
Next cel 'prochaine cellule de la boucle

Tu dois remplacer ad2 = cel.Offset(0, 3).Address par ad2 = cel.Offset(0, 4).Address car ta cible n'est plus la colonne K mais la colonne L

Bon ceci réglé, passons au gros du problème.
Pour déterminer le nombre de jours dans le mois (et dans le mois suivant), tu utilises le numéro de la feuille dans le classeur. Cela fonctionne bien quand ton classeur commence en Janvier (comme dans ton fichier HR machin) mais te pose problème quand c'est par un autre mois que ton classeur commence (d'où ton problème dans ton fichier machin CLM).

La solution la plus simple est de te rajouter des onglets pour obtenir de janvier à décembre sans interruption. (attention, c'est le classement "normal" des onglets qui comptent, et pas comme je le pensais au départ, le numéro attribué aux feuilles lors de leur création et visible dans l'onglet VBA)

La solution la plus propre étant bien entendu de revoir la manière de déterminer le nombre de jours par mois (ainsi que toutes les références à la variable "ni" qui te pose problème aujourd'hui) pour s'affranchir de la dépendance au numero de la feuille
 

herve62

XLDnaute Barbatruc
Supporter XLD
Re : Compréhension et réutilisation d'un code VBA

Bonjour
Quand j'ai dit :
tu mélanges les "torchons et les serviettes"
c'était gentil !!!
Car oui , déjà en mode "Debug" la 1ere fois on était en Février ???? , et comme tu dis Tirou les colonnes étaient fausses, quand j'ai mis G , c'était déjà mieux
et puis un conseil , que j'ai donné à un nouvel "ami virtuel du forum" !!!
Travaillez avec des noms de FEUILLES , si vous avez des modifs futures
Exemple : dans le VBA de mon "ami" c'était sheets(5) , il améliore son Pg , cela devient sheets(7) ???? ballot ca marche plus et forcément il m'appelle
Sheets.count et Sheets.name ..... c'est fait pour servir !!!!

Sinon Tgr .... t'as du boulot !!!!!!!!!!!!!!!
Bonne journée
 

Tirou

XLDnaute Occasionnel
Re : Compréhension et réutilisation d'un code VBA

Bonjour Herve62,

Je n'ai pour ma part pas eu besoin de modifier les colonnes.
Si, comme tu le préconises, on change pour la colonne G, la macro me parait défectueuse (ne bug pas, mais ne donne pas le résultat escompté (sauf erreur de ma part))

Mais je rejoins ton commentaire de fin. Dans l'état actuel des choses, la macro de Tgr fonctionne dans des cas bien précis (onglet de destination déjà créé, onglets bien triés, pas d’arrêt d'occupation des chambres le dernier jour, on considère qu'une personne présente au dernier jour d'un mois sera présente tout le mois suivant (alors qu'à un endroit, on a le nombre de jours prescrits, à voir si ce nombre peut varier dans le temps (je pense que oui)))

Donc en conclusion, pour faire une macro qui soit plus malléable et "intelligente", "Tgr .... t'as du boulot !!!!!!!!!!!!!!!"
 

TgR

XLDnaute Junior
Re : Compréhension et réutilisation d'un code VBA

Merci à vous deux pour vos réponses. J'avais en effet compris (après avoir posté) que les onglets posaient problèmes. je ne pense pas pouvoir faire une macro meilleure que celle là (étant donné que ce n'est pas moi qui l'ai faite) car mes connaissances en VBA sont limités.

Toutefois, je prends en compte vos commentaires et vais quand même essayer de faire quelque chose de plus propre et de plus intelligent ;)
 

Discussions similaires

Statistiques des forums

Discussions
312 228
Messages
2 086 421
Membres
103 206
dernier inscrit
diambote