Comparaison et calculs puis exportation vers nouveau tableau
Désolé mais en fait si le nombre rama est bien limité à 3. Je viens de me rendre compte qu'il y avait en effet des erreurs dans ma base de données... Du coup maintenant ça fonctionne très bien.
Je me demandais juste, dans cette nouvelle macro "recopie", à quoi sert le offset dans la commande :
.Range("A2:R" & DerLig).Copy Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
Et ne puis-je pas écrire .Range("A2:R" & DerLig).Copy Sheets("BDD").Range("A" & Rows.Count).End(xlUp).Offset(1, 0) pour éviter d'avoir à nécessairement être sur la feuille BDD pour lancer ma macro?
Sinon, une avant-dernière question afin de bien comprendre la macro de tri/calcul. Que signifie : " IIf(WsD.Range("G" & Cel.Row) = "I", 1, 2) " dans " Colonne = ((WsD.Range("F" & Cel.Row) - 1) * 2) + IIf(WsD.Range("G" & Cel.Row) = "I", 1, 2) "
Je ne comprends pas le "IIf"
Aussi, comment puis-je connaitre les coordonnées RGB (si il peut s'écrire comme ça vu que c'est du gris...) de cellules. En fait je voudrais rajouter une condition. Je voudrais qu'il m'effectue les opérations uniquement si les lignes sont sans couleur ou en gris clair. Du coup est ce que si je rajoute
" If ActiveCell.Font.Color = (255,255,255) or If ActiveCell.Font.Color = (... , ... , ... )Then de la manière suivante (en rouge), cela parait cohérent? (je veux juste avoir un avis avant d'essayer et de le faire planter pour rien vu qu'il met déjà assez longtemps à calculer sur mon ordinateur)
For K = 1 To MaxParcelle
For L = 1 To MaxPlant
For M = 1 To 3
If ActiveCell.Font.Color = (255,255,255) or If ActiveCell.Font.Color = (... , ... , ... ) Then
Entete = False
For J = 1 To MaxMois
WsD.Range("B" & NbLg + 6) = "<=" & J ' Mois
WsD.Range("C" & NbLg + 6) = K ' Parcelle
WsD.Range("D" & NbLg + 6) = L ' Plant
WsD.Range("E" & NbLg + 6) = M ' Rameau
WsD.Range("A1:AC" & NbLg).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=WsD.Range("B" & NbLg + 5 & ":E" & NbLg + 6), Unique:=False
If Application.Subtotal(103, WsD.Range("A1:A" & NbLg)) > 1 Then
For Each Cel In WsD.Range("A2:A" & NbLg).SpecialCells(xlCellTypeVisible)
Colonne = ((WsD.Range("F" & Cel.Row) - 1) * 2) + IIf(WsD.Range("G" & Cel.Row) = "I", 1, 2)
WsP.Cells(1, Colonne) = WsD.Range("AB" & Cel.Row)
Next Cel
If Entete = False Then
Entete = True
WsR.Range("A" & Ligne) = K ' Parcelle
WsR.Range("B" & Ligne) = L ' Plant
WsR.Range("C" & Ligne) = M ' Rameau
End If
WsR.Cells(Ligne, 3 + J) = Application.Sum(WsP.Rows(1))
WsP.Rows(1).ClearContents
End If
Next J
If Entete = True Then
Ligne = Ligne + 1
End If
End If
Next M
Next L
Next K
Merci beaucoup pour toute cette aide
Simon
Bonsoir
.Range("A2:R" & DerLig).Copy Range("A" & Rows.Count).End(xlUp).Offset(1, 0)On recherche la dernière ligne non vide dans la colonne A et on se décale d'une ligne vers le bas ( Offset(1,0) 1 ligne en positif et 0 colonne) ===> On se positionne sur la 1ère ligne vide dans la colonne A
Oui tu peux écrire
.Range("A2:R" & DerLig).Copy Sheets("BDD").Range("A" & Rows.Count).End(xlUp).Offset(1, 0)Simon_agro a écrit :pour éviter d'avoir à nécessairement être sur la feuille BDD pour lancer ma macro
IIf(WsD.Range("G" & Cel.Row) = "I", 1, 2)Cela remplace If .... Then ..... Else .... End If
Pour en savoir plus, tu places le curseur sur IIF et tu appuies sur F1
Ensuite ne pas confondre l'écriture (Font) et le fond (Interior) de la cellule
Utilises l'enregistreur de macro (2007 je ne sais pas où il est)
Tu te places sur une cellule et tu y colles la couleur du texte ou la couleur du fond voulue
Tu arrêtes l'enregistrement et tu dois avoir (avec 2003) l'index de la couleur (ColorIndex) que tu as choisis
C'est cette valeur que tu dois tester dans la macro mais pas à l'endroit que tu veux
Si je comprend je mettrais ces tests une fois les lignes filtrées
If Application.Subtotal(103, WsD.Range("A1:A" & NbLg)) > 1 Then
For Each Cel In WsD.Range("A2:A" & NbLg).SpecialCells(xlCellTypeVisible)
If WsD.Range("Colonne1" & Cel.Row).Font.ColorIndex = ValeurTrouvée1 or WsD.Range("Colonne2" & Cel.Row).Font.ColorIndex =ValeurTrouvée2 Then
Colonne = ((WsD.Range("F" & Cel.Row) - 1) * 2) + IIf(WsD.Range("G" & Cel.Row) = "I", 1, 2)
WsP.Cells(1, Colonne) = WsD.Range("AB" & Cel.Row)
End If
Next CelA toi de modifier Colonne1, ValeurTrouvée1, Colonne2 et ValeurTrouvée2 par les bons paramètres
Simon_agro a écrit :avant d'essayer et de le faire planter pour rien vu qu'il met déjà assez longtemps à calculer sur mon ordinateur
Réduis le nombre de lignes dans la pages "BDD"
Re
Quand j'enregistre une macro pour obtenir la couleur il me donne des choses bizarres mais ni des coordonnées RGB ni un numéro de l'index. Mais c'est pas grave j'ai trouvé une classeur sur internet dans lequel il y a une macro permettant de trouver la couleur au niveau du curseur de la souris donc du coup c'est facile.
En fait par contre j'essaye de comprendre exactement la macro mais je suis vraiment pas encore au point... Les définitions des variables et le début ça va. Les boucles et le principe de l’entête aussi. C'est surtout les indices qui me posent problème. Pourquoi NbLg+6 et +5? Comme dans WsD.Range("B" & NbLg + 6) = "<=" & J où d'ailleurs je ne comprends pas l'égalité : "<=" & J signifie <= J ?
Et j'ai le même problème avec la multiplication par 2 dans :
Colonne = ((WsD.Range("F" & Cel.Row) - 1) * 2) + IIf(WsD.Range("G" & Cel.Row) = "I", 1, 2)
je ne vois pas trop...
Je ne vois pas non plus à quel moment il compare la taille d'une feuille avec la taille de la même feuille au mois précédent. Peux-tu m'éclairer?
Bon sinon, excepté mes problèmes de compréhension, tout fonctionne parfaitement donc merci beaucoup pour tout.
Simon
Bonjour
Je vais essayer de t'expliquer (pas l'habitude) le principe de la macro
Simon_agro a écrit :Pourquoi NbLg+6 et +5?
Pour chaque mes,parcela,mata, et rama je filtre la base avec un filtre élaboré
Pour ce filtre il me faut une zone de critères que (pour ce cas) je place dans la même page que la base de données mais en dehors de la base bien sur
Pour un filtre élaborée il faut les entêtes à filtrer et les critères du filtre
Je me place 5 lignes plus bas que la dernière ligne de la base pour les entêtes à filtrer
et 6 lignes plus bas que la dernière ligne de la base pour les critères du filtre
Comme critère pour le mois j'ai =< mois testé (1 à MaxMois)
Quand j'obtiens des lignes filtrées : test SubTotal(103....), je parcours toutes les lignes visibles et dans la page "Intermedio1" je note la taille des feuilles dans une colonne qui est déterminée par le Nudo
Chaque Nudo peut avoir 2 feuilles c'est pour ça qu'il y a le 2 dans Colonne = ((WsD.Range("F" & Cel.Row) - 1) * 2)
Exemple
Nudo 1 ----> 0
Nudo 2 ---> 2
Nudo 7 ---> 14
A cette position je rajoute 1 si c'est Gauche et 2 si c'est Droite : + IIf(WsD.Range("G" & Cel.Row) = "I", 1, 2)
Donc pour le Nudo 1 on obtient colonne 1 ou 2, pour le Nudo 2 on obtient 3 ou 4 etc....
Et si dans ma liste j'ai noté Nudo 1 pour le mois 1 avec telle valeur mais qu'ensuite je trouve le Nudo 1 pour le mois 4 , la nouvelle valeur remplacera dans la colonne correspondante l'ancienne valeur
Pas facile (même quand je me relis) de comprendre
Je ne sais pas faire mieux, en vocal cela serait plus simple à expliquer