Décaler les colonnes dans une boucle

Bonjour,

Je suis un grand novice dans le monde VBA. J'essaye grâce à ce super forum de créer quelques macros afin de faciliter ma vie (recherche scientifique) mais le manque de base dans la matière me rend la tâche très difficile...

Aujourd'hui j'ai besoin de réaliser une Macro assez simple (je pense). J'ai réussi un bout mais il me manque le plus important, le décalage à chaque boucle.

Pour faire simple je souhaite copier les cellules de B6 à la dernière valeur et coller sur AG6 puis copier AL3 (résultat d'une formule dépendant des données copier-coller précédemment sur AG6 depuis B6:B...) sur la colonne AN3.

Je souhaite ensuite répéter cette opération en décalant B6 d'une colonne et AN3 d'une colonne à chaque boucle (AG6 et AL3 ne changent pas) jusqu'à ce que la valeur de la colonne xxx6 du premier copier-coller soit vide. Tout cela se fait sur la même feuille du même classeur. (je ne peux pas vous envoyer le classeur car données confidentielles... )

Sub Macro3()

Dim numero As Integer

numero = Range("B6")

While numero <> 0

Range("B6").Select OD.Cells(1, OD.Cells(1, Columns.Count).End(xlToLeft).Column + 1)

Range(Selection, Selection.End(xlDown)).Select

Selection.Copy

Range("AG6").Select

ActiveSheet.Paste

Range("AL3").Select

Range(Selection, Selection.End(xlDown)).Select

Application.CutCopyMode = False

Selection.Copy

Range("AN3").Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

:=False, Transpose:=False

Range("AG6").Select

Range(Selection, Selection.End(xlDown)).Select

Selection.ClearContents

Wend

End Sub

J'espère que ce message respecte la charte, je précise bien entendu que je n'ai pas trouvé depuis ce matin 9h30 de réponse... C'est pour cela que je me permet de poster cette demande. Au plaisir de vous lire !

Salut crossfitman21,

jusqu'à ce que la valeur de la colonne xxx6 du premier copier-coller soit vide. ?? que veux dire xxx6?

mais un fichier test proche du réel avec le résultat souhaité sera lebienvenu!

Bonjour,

Merci pour ta réponse, j'ai joint un fichier avec quelques données afin de l'utiliser comme exemple, en effet ça sera plus simple ...

Le "xxx" signifie la xième colonne. J'aimerais que la macro s'effectue tant qu'une valeur est présente dans la xième colonne ligne 6. Jusqu'à E6 dans mon cas

et la formule qui devrait être dans AL3, elle est où?

et les données qui sont dans la colonne AI on les ecrases?

Mince j'ai supprimé la formule sans faire exprès pardon ... AL6 = "=SOMME. SI.ENS(AG:AG;AF:AF;AK3)" que je déroule jusqu'à AL43. Pour expliquer un peu plus le contexte, j'ai des sujets qui réalisent des apprentissages mais le nombre d'essais pour chaque sujet est variable. Je souhaite du coup normaliser le nombre d'essais en exprimant la progression en %. La colonne AH2 me sert à calculer le nombre total d'essais, AI le % de progression, AJ l'essai correspondant à x% et son arrondi à la décimale (AK). AL correspond du coup aux valeurs à chaque % de progression. (exemple, 5% de progression = 3è essai, AL = performance obtenue au 3è essai).

Donc AI, AJ et AK sont fixes, AG sert à recevoir la colonne copier pour calculer en AL les nouvelles valeurs. Et ensuite copier les nouvelles valeurs obtenues en AL sur AO et les colonnes suivantes (AO ou une autre feuille si plus simple, il n'y a pas d'importance à ce niveau). Il faut ensuite supprimer les valeurs dans AG et recommencer l'opération tant qu'il reste des colonnes à "normaliser en %". Ca sera surement plus clair avec ces explications !

Personne pour me donner un petit coup de pouce s'il vous plait ?

Salut crossfitman,

voici une idée

Sub test()
Dim sht As Worksheet
Dim i As Integer
Set sht = ThisWorkbook.Worksheets("News normalisé (2)")

With sht
    For i = 2 To 9
    If .Cells(3, i).Value = "" Then Exit Sub
        If .Cells(3, i).Value <> "" Then
        .Range("AG3:AG148").ClearContents
        .Range(.Cells(3, i), .Cells(148, i)).Copy .Range("AG3")
        .Range("AL3:AL148").Copy
        .Cells(3, 39 + i).PasteSpecial Paste:=xlPasteValues
        End If
    Next i
End With
End Sub

Bonne nuit

C'est parfait merci beaucoup ! Il faut vraiment que je reprenne les bases de VBA pour comprendre l'intérêt des premières lignes qui permettent de définir les arguments ainsi que le rôle des i, j etc ... Car quand ça marche, le gain de temps est magique !

Bonjour,

Sub test()
Dim sht As Worksheet ' déclaration de la variable sht comme feuille
Dim i As Integer '  déclaration de i pour le numéro de la colonne
Set sht = ThisWorkbook.Worksheets("News normalisé (2)") ' definir la feuille de travail

With sht ' la boucle ne fonctionne que sur la feuille de travail définie
    For i = 2 To 9 ' i correspond au numéro de la colonne 2==>B, 3==>C, 4==>D etc.
    If .Cells(3, i).Value = "" Then Exit Sub ' si la valeur de la céllule (B3, C3, D3,...) est vide on quite la macro
        If .Cells(3, i).Value <> "" Then ' si la valeur de la céllule (B3, C3, D3,...) n'est pas vide
        .Range("AG3:AG148").ClearContents ' on efface la plage AG3:AG148
        .Range(.Cells(3, i), .Cells(148, i)).Copy .Range("AG3") ' on copie les valeurs B3:B148, C3:C148, etc dans AG3:AG148
        .Range("AL3:AL148").Copy ' copier AL3:AL148
        .Cells(3, 39 + i).PasteSpecial Paste:=xlPasteValues ' insérer uniquement les valeurs dans AN3:AN148, AM3:AM148, etc.
        End If
    Next i
End With
End Sub

@++

Merci pour les explications ! Donc quand on écrit :

Dim i As Integer

Le i renvoi toujours à la colonne, et si ma logique est bonne j = ligne ? Donc si je voulais travailler sur des lignes, je dirais

Dim j As Integer 'définir la variable j

j = 5 'commencer à la ligne 5

If .Cells(1, j).Value 'Si la valeur de A5 ....

Je fais bonne route ??

Non c'est l'inverse

Dim j As Integer 'définir la variable j
j = 5 'définir la colonne 5 qui est E
If .Cells(1, j).Value 'Si la valeur de E1 (Cells(1, j) ===> j c'est la colonne E et la ligne 1

donc ton code deviendra comme ca si on change le i avec le j

Sub test()
Dim sht As Worksheet ' déclaration de la variable sht comme feuille
Dim j As Integer '  déclaration de j pour le numéro de la colonne
Set sht = ThisWorkbook.Worksheets("News normalisé (2)") ' definir la feuille de travail

With sht ' la boucle ne fonctionne que sur la feuille de travail définie
    For j = 2 To 9 ' j correspond au numéro de la colonne 2==>B, 3==>C, 4==>D etc.
    If .Cells(3, j).Value = "" Then Exit Sub ' si la valeur de la céllule (B3, C3, D3,...) est vide on quite la macro
        If .Cells(3, j).Value <> "" Then ' si la valeur de la céllule (B3, C3, D3,...) n'est pas vide
        .Range("AG3:AG148").ClearContents ' on efface la plage AG3:AG148
        .Range(.Cells(3, j), .Cells(148, j)).Copy .Range("AG3") ' on copie les valeurs B3:B148, C3:C148, etc dans AG3:AG148
        .Range("AL3:AL148").Copy ' copier AL3:AL148
        .Cells(3, 39 + j).PasteSpecial Paste:=xlPasteValues ' insérer uniquement les valeurs dans AN3:AN148, AM3:AM148, etc.
        End If
    Next j
End With
End Sub

Rechercher des sujets similaires à "decaler colonnes boucle"