Aide sur macro
Bonjour,
Il y a quelques temps, deux d'entre vous m'avaient bien aidé sur un fichier. J'ai cherché à adapter la macro que vous aviez faite pour un autre fichier un peu différent, mais très ressemblant.
Une petite partie du code macro (adapté) ne me donne pas ce que je voudrais.
Cette macro est exécutée dans le fichier appelé "Récap déclaration", elle ouvre, l'un après l'autre des "fichiers collaborateurs" et est censée me rapatrier des données de ces fichiers collaborateurs selon les modalités suivantes :
Sub récap_déclaration()
Dim Chemin As String, Nom_collaborateur As String, Mois_concerné As String, Ligne_mois As Integer
Dim i As Integer, j As Integer, k As Integer
Dim Ligne As Long
Application.ScreenUpdating = False
Range("B6:C17,B24:C35,E6:H17,E24:H35,J6:M17,J24:M35,O6:R17,O24:R35,T6:T17,T24:T35") .ClearContents 'quand on change l'année en S1 efface anciennes données dans plages citées
k = Range("S1")
'Chemin = "E:\Mes documents\Mes documents\comptes\Prévision salaires indiv\"
Chemin = "E:\Mes documents\Mes documents\comptes\Prévision salaires indiv\"
For Ligne = 4 To 22 Step 18 ' Les lignes des noms (boucle rajoutée)
For i = 2 To 21 Step 5 ' De la colonne B à la colonne U
Nom_collaborateur = Cells(Ligne, i) ' Modification
If Nom_collaborateur = "" Then GoTo Etiquette
Workbooks.Open Filename:=Chemin & "\" & Nom_collaborateur & "\" & "Salaires " & Nom_collaborateur & ".xls"
For j = 1 To Sheets.Count
Sheets(j).Activate
If Right(Sheets(j).Name, 4) <> k Then GoTo Etiquette_bis
Mois_concerné = LCase(Left(ActiveSheet.Name, 4))
Select Case Mois_concerné
Case "janv"
Ligne_mois = 1
Case "févr"
Ligne_mois = 2
Case "mars"
Ligne_mois = 3
Case "avri"
Ligne_mois = 4
Case "mai "
Ligne_mois = 5
Case "juin"
Ligne_mois = 6
Case "juil"
Ligne_mois = 7
Case "août"
Ligne_mois = 8
Case "sept"
Ligne_mois = 9
Case "octo"
Ligne_mois = 10
Case "nove"
Ligne_mois = 11
Case "déce"
Ligne_mois = 12
End Select
Ligne_mois = Ligne_mois + 1 + Ligne ' Modification décalage
With ThisWorkbook.Sheets("Base")
.Cells(Ligne_mois, i) = Range("Q44")
.Cells(Ligne_mois, i + 3) = Range("A10")
If Range("Q43") = 0 Then
.Cells(Ligne_mois, i + 1) = ""
Else
.Cells(Ligne_mois, i + 1) = Range("Q43")
If ("M46" - "M42") > 0 Then
.Cells(Ligne_mois, i + 4) = Range("M46")
Else
.Cells(Ligne_mois, i + 4) = Range("M42")
End If
End If
End With
Etiquette_bis:
Next j
' Application.DisplayAlerts = False
ActiveWorkbook.Close savechanges:=False
'Application.DisplayAlerts = True
Etiquette:
Next i
Next Ligne ' Fin de la boucle rajoutée
End Sub
La partie qui pose problème est la suivante :
If ("M46" - "M42") > 0 Then
.Cells(Ligne_mois, i + 4) = Range("M46")
Else
.Cells(Ligne_mois, i + 4) = Range("M42")
J'aimerais que Si (M46-M42) > 0 (dans les fichiers collaborateurs), la 5ème colonne (i + 4) pour chaque personne concernée et pour chaque mois concerné dans "récap déclaration" (ce sont les colonnes F,K,P,U) soit égale à M46 du fichier collaborateur, sinon (Si (M46-M42)=<0) alors la cellule (i + 4) (dans Récap Déclaration)= M42 du fichier collaborateur.
Ca ne fonctionne que si dans les fichiers collaborateurs, la cellue I10 est supérieure à zéro. Or elle est souvent vide ou égale à zéro.
Ces fichiers collaborateurs sont générés par userform et les feuilles contiennent souvent des formules.
Je vous transmets tous les fichiers.
Le fichier concerné par la macro est dans "contributions" "essai récap".
D'avance merci pour votre aide.
Cordialement 8) 8)
Salut,
Un fichier .rar = grrrrrr !
Il y a trop de texte, je n'ai pas tout lu !
Essaie de remplacer
If ("M46" - "M42") > 0 Thenpar
If Range("M46") - Range("M42") > 0 ThenCordialement.
Bonsoir Yvouille,
Un fichier .rar = grrrrrr !
Oui je sais, mais avec plusieurs dossiers, j'avais un problème de taille de fichier à uploader ...
J'ai déjà essayé cette écriture sans succès.
Merci d'avoir tenté
Cordialement.
Bonsoir
Dans la macro il y a
With ThisWorkbook.Sheets("Base")
.Cells(Ligne_mois, i) = Range("Q44")
.Cells(Ligne_mois, i + 3) = Range("A10")
If Range("Q43") = 0 Then
.Cells(Ligne_mois, i + 1) = ""
Else
.Cells(Ligne_mois, i + 1) = Range("Q43")
If Range("M46") > Range("M42") Then
.Cells(Ligne_mois, i + 4) = Range("M46")
Else
.Cells(Ligne_mois, i + 4) = Range("M42")
End If
End If
End WithEt dans ce code (partie surlignée)
If Range("M46") > Range("M42") ThenEquivaut à
If Range("M46") - Range("M42") > 0ThenAlors où est le problème ?
J'ai fait un essai en modifiant le fichier de Croquignole, feuille Mars 2012
J'ai mis 1 dans I10
Sauvegarde, Fermeture
Ensuite lancement de la macro du fichier "Récap déclaration"
J'ai obtenu 18 en cellule F8
C'est bon ou ce n'est pas bon ?
Une info : L'effacement du tableau n'est pas bon
Range("B6:C17,B24:C35,E6:H17,E24:H35,J6:M17,J24:M35,O6:R17,O24:R35,T6:U17,T24:U35").ClearContentsBonjour Banzaï64,
J'ai fait un essai en modifiant le fichier de Croquignole, feuille Mars 2012
J'ai mis 1 dans I10
Sauvegarde, Fermeture
Ensuite lancement de la macro du fichier "Récap déclaration"
J'ai obtenu 18 en cellule F8
C'est bon ou ce n'est pas bon ?
Oui le 18 est bon mais le résultat de la feuille de calcul de Croquignole est faux. J'avais indiqué dans mon post :
Ca ne fonctionne que si dans les fichiers collaborateurs, la cellue I10 est supérieure à zéro. Or elle est souvent vide ou égale à zéro.
Mais lorsque la cellule doit être vide (ou égale à zéro, c'est pareil dans mon cas), pourquoi est-ce que je ne peux pas faire apparaître la valeur contenue dans M42 ou M46 ?
Range("B6:C17,B24:C35,E6:H17,E24:H35,J6:M17,J24:M35,O6:R17,O24:R35,T6:U17,T24:U35").ClearContents
C'est vrai, merci, je vais corriger.
A bientôt
Cordialement
Bonjour à Yvouille et Banzaï64 d'abord, et à tous les autres ensuite, 8)
Je reviens vous tenir informés puisque vous avez bien voulu vous pencher sur mon problème.
Nos échanges m'ont déjà permis de penser que le code macro n'était pas en cause .
Depuis 2 jours j'ai bataillé avec différentes formules dans mes feuilles de calculs "collaborateurs" et il s'avère que les formules contenant la fonction "SI" dans les cellules en rapport avec celles appelées par la macro doivent empêcher son fonctionnement. Je ne sais pas pourquoi, mais tous les essais que j'ai fait m'amenaient à cette conclusion.
Alors puisque la formule de la macro ne fonctionnait pas, il ne me restait qu'une solution, c'était la faire disparaître :
Dans les fichiers Croquignole, Philochard, Ribouldingue et Mandrake,
J'ai entré (en "M45") la formule correspondante à celle sur laquelle la macro ne renvoie rien si I10 n'est pas > à zéro.
Donc en "M45" des feuilles collaborateurs j'ai entré :
=SI($M$46>$M$42;$M$46;$M$42)
Et dans la macro j'ai supprimé :
If ("M46" - "M42") > 0 Then
.Cells(Ligne_mois, i + 4) = Range("M46")
Else
.Cells(Ligne_mois, i + 4) = Range("M42")
End If
Pour le remplacer par
.Cells(Ligne_mois, i + 4) = Range ("M45")
Voilà... Juste pour ne pas rester sur un sujet non résolu.
Merci tout de même, car les échanges font toujours avancer.
A bientôt
Cordialement
Bonjour
Très bien que tu as réussi à te dépanner
mais pour mon information personnelle (tu n'y ais pas obligé du tout)
If ("M46" - "M42") > 0 ThenCe code n'a jamais existé dans la macro (voir le fichier que tu as envoyé)
ensuite peux tu mettre le code que tu as mis à partir de
With ThisWorkbook.Sheets("Base") jusqu'au
End WithMerci
8) 8)
Ce code n'a jamais existé dans la macro
C'est vrai le code du fichier joint était celui-ci
If Range("M46") > Range("M42") Then
J'ai fait tellement de tentatives depuis 2 jours que je n'ai pas tout ramené à l'origine…
Je ne suis pas sûre de comprendre ce que tu voudrais : Après la sélection des lignes qui correspondent aux mois, voici un extrait du code tel qu'il fonctionne à présent :
Ligne_mois = Ligne_mois + 1 + Ligne ' Modification décalage
With ThisWorkbook.Sheets("Base")
.Cells(Ligne_mois, i) = Range("Q44")
.Cells(Ligne_mois, i + 3) = Range("A10")
.Cells(Ligne_mois, i + 4) = Range("M45")
If Range("Q43") = 0 Then
.Cells(Ligne_mois, i + 1) = ""
Else
.Cells(Ligne_mois, i + 1) = Range("Q43")
End If
End With
Etiquette_bis:
Next j
' Application.DisplayAlerts = False
ActiveWorkbook.Close savechanges:=False
'Application.DisplayAlerts = True
Etiquette:
Next i
Next Ligne ' Fin de la boucle rajoutée
End Sub
Est-ce que ça correspond à ce que tu demandes ou est ce que tu voudrais que je place
A un autre endroit ?With ThisWorkbook.Sheets("Base")
Cordialement
Bonsoir
merci de ta réponse
Je comprends mieux pourquoi tu dis que cela fonctionne
Tu as déplacé l'instruction (du moins son équivalent)
Avant
With ThisWorkbook.Sheets("Base")
.Cells(Ligne_mois, i) = Range("Q44")
.Cells(Ligne_mois, i + 3) = Range("A10")
If Range("Q43") = 0 Then
.Cells(Ligne_mois, i + 1) = ""
Else
.Cells(Ligne_mois, i + 1) = Range("Q43")
' Instruction ici
If Range("M46") > Range("M42") Then
.Cells(Ligne_mois, i + 4) = Range("M46")
Else
.Cells(Ligne_mois, i + 4) = Range("M42")
End If
End If
End WithMaintenant
With ThisWorkbook.Sheets("Base")
.Cells(Ligne_mois, i) = Range("Q44")
.Cells(Ligne_mois, i + 3) = Range("A10")
' Instruction ici
.Cells(Ligne_mois, i + 4) = Range("M45")
If Range("Q43") = 0 Then
.Cells(Ligne_mois, i + 1) = ""
Else
.Cells(Ligne_mois, i + 1) = Range("Q43")
End If
End WithTu aurais déplacé le code d'où il était à sa nouvelle place, tu n'aurais pas eu besoin de modifier tes fichiers Croquignole, Philochard, Ribouldingue et Mandrake
Le plus important dans tout ça c'est que ton problème est solutionné