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 Cel

A 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

Rechercher des sujets similaires à "comparaison calculs puis exportation nouveau tableau"