Copier coller avec une somme de colonne grâce à un offset
Je tente de copier des données d'un tableau vers un nouveau.
Par contre, je dois additionné les valeurs positive dans toutes les colonnes par multiple de 5.
Mon index de colonne est J. Donc, je dois relever les valeurs dans (J,10), (J,15), (J,20), (J,25) etc.... (encadré en rouge dans le tableau)
Je n'arrive pas à formuler mon vba correctement
Mais de base ce code fonctionne pour copier qu'une seule colonne (sans addition).
Sub OnSite()
Dim Source As Worksheet, Cible As Worksheet, RgSource As Range, RgCible As Range
Dim Données(), Résultats(), NewRés()
Dim i As Long, j As Long, NbL As Long, NbC As Long
Const NbColRés = 10
Set Source = ActiveWorkbook.Worksheets("CHARGEMENT")
Set Cible = ActiveWorkbook.Worksheets("ON SITE")
Set RgSource = Source.Range("D12:BB1519") 'Plage contenant toutes les données
Set RgCible = Cible.Range("A6") '1ère cellule de la plage cible
Application.ScreenUpdating = False
'On nettoie la cible (valeurs et formats)
RgCible.Resize(Cible.Rows.Count - RgCible.Row + 1, NbColRés).Clear
'on stocke dans un tableau de variables toutes les valeurs de la plage de données
Données = RgSource.Value2
'i : Index pour de décalage en ligne de la plage cible
i = 0
For j = 1 To UBound(Données, 1) 'J varie de 1 aux nombre de lignes de la plage des données (ici 1508 lignes)
If IsNumeric(Données(j, 10)) And Not IsEmpty(Données(j, 10)) Then
If Données(j, 10) > 0 Then
'Ici Données(j, 10) est une valeur numérique supérieure à 0
'On incrémente i pour le prochain résultat
i = i + 1
'On redimensionne le tableau Résultats et on le remplit (au début i vaut 1)
'————————————————————————————————————————————————————————————————————————————
'Remarque : le tableau est en colonnes-lignes et non pas en lignes-colonnes
'————————————————————————————————————————————————————————————————————————————
ReDim Preserve Résultats(1 To NbColRés, 1 To i)
Résultats(1, i) = Données(j, 1)
Résultats(2, i) = Données(j, 2)
Résultats(3, i) = Données(j, 5)
Résultats(4, i) = Données(j, 4)
Résultats(5, i) = Données(j, 10)
End If
End If
Next
If i = 0 Then
MsgBox "Aucune ligne ne correspond aux critères"
Exit Sub
End If
'On transpose les résultats pour passer dans un tableau en lignes, colonnes
NbL = UBound(Résultats, 2) 'Nbre de lignes = dimension 2 du tableau Résultats
NbC = UBound(Résultats, 1) 'Nbre de colonnes = dimension 1 du tableau Résultats
'Nouveau tableau de Résultats
ReDim NewRés(1 To NbL, 1 To NbC)
'Transposition
For i = 1 To NbL
For j = 1 To NbC
NewRés(i, j) = Résultats(j, i)
Next j
Next i
'On attribue à la plage cible redimensionnée les résultats
RgCible.Resize(NbL, NbC).Value2 = NewRés
'On se positionne juste au dessus de la cellule cible (True : avec défilement d'écran)
Application.Goto RgCible.Offset(-1, 0), True
Application.ScreenUpdating = True
End SubIl me permets de transcrire les données de cette façon dans une nouvelle page "on site" comme ci-dessous.
Ce que j'aimerais c'est modifier cette section du code pour me permettre d'additionnée des données à la colonne " Résultats(5, i) = Données(j, 10)" J'aimerais avoir une somme de toutes les colonnes " load" (en rouge dans l'image)" soit une formule qui me permets d'avoir " Résultats(5, i) = somme des Données(j, 10)+ offset 5....."
For j = 1 To UBound(Données, 1) 'J varie de 1 aux nombre de lignes de la plage des données (ici 1508 lignes)
If IsNumeric(Données(j, 10)) And Not IsEmpty(Données(j, 10)) Then
If Données(j, 10) > 0 Then
'Ici Données(j, 10) est une valeur numérique supérieure à 0
'On incrémente i pour le prochain résultat
i = i + 1
'On redimensionne le tableau Résultats et on le remplit (au début i vaut 1)
'————————————————————————————————————————————————————————————————————————————
'Remarque : le tableau est en colonnes-lignes et non pas en lignes-colonnes
'————————————————————————————————————————————————————————————————————————————
ReDim Preserve Résultats(1 To NbColRés, 1 To i)
Résultats(1, i) = Données(j, 1)
Résultats(2, i) = Données(j, 2)
Résultats(3, i) = Données(j, 5)
Résultats(4, i) = Données(j, 4)
Résultats(5, i) = Données(j, 10)Donc dans l'image ci-dessous, en rouge , ce sont les colonnes que je veut additionné, si les cellules contiennent quelque chose
En bleu, ce sont les autres informations qui doivent apparaître dans mon tableau lorsqu'il y a quelque chose dans la colonne load.
Finalement, dans mon tableau de résultats "on site". J'aimerais que la colonne quantity contiennent la somme de mes colonnes " loads" (en rouge)
Salut Caroline,
Des images, c'est bien (enfin, bof), un fichier (avec données non confidentielles), c'est 'achement mieux!
Sinon, une piste pour des données toutes les 5 lignes, c'est, dans ta boucle FOR, utiliser STEP.
For x = 1 TO 1000 Step 5A+
Merci
Je vais essayer!
J'ai joint des images car je ne suis pas capable de joindre mon fichier il est beaucoup trop lourd
Alors, tu nous gardes 100-1000 lignes max tant que nous avons la structure principale, nous n'avons pas besoin de tout le fichier non plus!
Bonsoir Caroline,
Bon, fichier avec des #REF!, ce n'est pas l'idéal mais passons.
Par contre, relever les valeurs de [J10], [J15],..., comprends pas trop!
Ce ne serait pas plutôt :
- parcourir la colonne [J]
- si on relève une valeur positive, on additionne les valeurs de cette ligne dans les colonnes en rouge (qui, elles, sont espacées de 5)
- remettre tout ça dans 'on site' avec cette addition dans Qty et la valeur de [BE] pour la longueur
Ai-je bien compris le truc?
A+
Salut Caroline,
en supposant que j'aie vu juste, voici une macro qui devrait faire le boulot.
Je ne vérifie pas si la feuille 'On Site' existe!
Je n'ai pas testé : avec toutes ces cellules #REF! et N/A, c'était le plantage assuré!
Public Sub Costing()
'
Dim tTab, tData(), iIdx%
'
Application.ScreenUpdating = False
'
tTab = Range("A12:BE" & Range("J" & Rows.Count).End(xlUp).Row).Value
For x = 1 To UBound(tTab, 1)
If tTab(x, 10) > 0 Then
iIdx = iIdx + 1
ReDim Preserve tData(5, iIdx)
tData(0, iIdx - 1) = tTab(x, 4)
tData(1, iIdx - 1) = tTab(x, 5)
tData(2, iIdx - 1) = tTab(x, 8)
tData(3, iIdx - 1) = tTab(x, UBound(tTab, 2))
For y = 17 To UBound(tTab, 2) - 5 Step 5
tData(4, iIdx - 1) = tData(4, iIdx - 1) + tTab(x, y)
Next
End If
Next
With Worksheets("On Site")
If .Range("A6").Value <> "" Then .Range("A6:E" & .Range("A" & Rows.Count).End(xlUp).Row).Clear
.Range("A6").Resize(iIdx, 5).Value = WorksheetFunction.Transpose(tData)
.Activate
End With
'
Application.ScreenUpdating = True
'
End SubA+
Bonjour,
Je vous remercie mais ce n'est pas cela.
En modifiant mon document pour être capable de l'importer c'est sur que mes valeurs vont passer en #ref
Tel qu'expliqué dans mon 1er message "J" est uniquement une valeur de référence pour indiquer la colonne de départ qui est en réalité la colonne "D".
Mon code de base fonctionne bien quand on parle de juste une colonne, mais ce que je veux additionné les données de: données(J,10), données(J,15),données(J,20).....
Donc on part, de la colonne D et on décale de 10 cellules, ensuite on part de la colonne D et on décale de 15 cellules, et ensuite on part de la colonne D et on décale de 20 cellules et ainsi de suite. c'est pourquoi il est indiqué Données (j,10), Données (j,15), Données (j,20)
C'est pour ça que j'ai joint les images dans mon premier message pour que ce soit plus clair même si vous ne trouviez pas celà fameux ça l'aide beaucoup à la compréhension.
Salut Caroline,
déso, comprends pas! Faut dire que je suis immergé dans un projet autrement compliqué!
Sans doute ne suis-je pas assez attentif pour le tien!
Peux-tu me donner un fichier avec, sur la feuille 'On Site', un exemple du résultat attendu correspondant aux données de 'Shipping List' ?
Merci.
A+
bonjour Caroline90, c'est colonne 11 au lieu de 10, je crois (oubien on a une confusion avec le "offset")
Merci énormément sa fonctionne très bien
Je vais l'étudier pour le comprendre.
