Aide itération

Bonjour,

Je suis tout à fait débutante en vba et je souhaiterai utiliser des macros pour pouvoir construire une base de données. Les données dont j'ai besoin sont présentées dans un tableau croisé, du genre:

Pays 1960 1961

a 100 105

b 132 137

Or, j'aimerais qu'elles soient en "liste", c'est-à-dire:

Pays année PIB

a 1960 100

a 1961 105

b 1960 132

b 1961 137

J'ai essayé d'écrire un code, mais je me rend compte que j'arrive pas à itérer les coordonnées des cellules à copier-coller... J'ai bêtement cru qu'il suffisait de remplacer le numéro de ligne par la variable que j'ai déclarée mais pas du tout , du coup je vous demande votre aide. Voici mon code (désolée il est très anoté car je touche rien hehe):

Sub essai()
'
Dim pays, année As Integer   ' déclare les variables
année = 2
pays = 2

For pays = 2 To 221
Application.ScreenUpdating = False    ' Pas de rafraichissement écran

' selectionne la feuille "Data"
    Sheets("Data").Select

' selectionne les dates 1960-2016 et copie
    Sheets("Data").Range("B1:BF1").Select  
    Selection.Copy

' Retour à feuille cible (feuil1)
    Sheets("Feuil1").Select
    Range("Bannée").Select      'besoin itération +56 car 56 observations par pays (1 par année, de 1960 à 2016) -> année = année + 56. Mais comment introduire cette itération?? 
 ' Coller avec transposition
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=True

 ' Copie le nom du pays depuis feuille source
    Sheets("Data").Select
    Range("Apays").Select      ' itération +1 -> besoin de 2 variables, une pour cette partie de la commande: pays = 2 ; pays = pays + 1
    Application.CutCopyMode = False
    Selection.Copy
  ' Colle nom pays sur feuille cible
    Sheets("Feuil1").Select
    Range("Apays").Select       ' besoin itération +56 car 56 observations par pays (1 par année, de 1960 à 2016) -> pays =  + 56
    ActiveSheet.Paste
  ' Copie les GDP sur toute la période 1960-2016
    Sheets("Data").Select
    Range("Bpays:BFpays").Select    ' besoin itération en 1 -> use même variable "pays"
    Application.CutCopyMode = False
    Selection.Copy
  ' Colle gdp dans 3ème colonne
    Sheets("Feuil1").Select
    Range("Cannée").Select      ' itération +56 -> use variable "année"
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=True

année = année + 56
pays = pays + 1

Next pays
End Sub

S'il y a des erreurs de logique dans mon code, n'hésitez pas à me rectifier. Et merci d'avance pour votre aide!

Bonjour,

c'est plus simple et considérablement plus rapide de tout charger en mémoire d'un coup, de travailler avec les variables tableau, puis de coller tout le résultat d'un coup.

eric

Merci beaucoup !

Mais du coup, j'aimerais bien comprendre le code, car je vais devoir le réutiliser sur différents fichiers. Par exemple, je ne comprends pas cette partie, pourais-je avoir une explication?

With Sheets("Data")
        datas = .[A1].CurrentRegion.Value
        ReDim result(1 To Application.CountA(.[A1].CurrentRegion.Offset(1, 1)), 1 To 3)
    End With

Je comprends pas la syntaxe, le vide devant .[A1]; et la partie avec result(...)

Je suis pas certaine de ce que fait cette partie du code non plus

With Sheets("Feuil1")
        .[A2].CurrentRegion.Offset(1).ClearContents
        .[A2].Resize(UBound(result, 1), UBound(result, 2)) = result
        .Select
    End With

Merci!!

Comme tu commences un touche magique : F1 sur tout ce que tu ne connais pas.

L'aide d'excel est très bien faite.

With permet de désigner et d'éviter de répéter l'objet avec lequel tu travailles.

Le . devant [A1] indique que tu utilises cet objet. C'est donc équivalent à

        datas = Sheets("Data").[A1].CurrentRegion.Value
        ReDim result(1 To Application.CountA(Sheets("Data").[A1].CurrentRegion.Offset(1, 1)), 1 To 3)

Ca allège le code et la lecture.

    ' avec Feuil1
    With Sheets("Feuil1")
        ' décaler d'une ligne CurrentRegion pour nettoyer une précédente extraction
        ' des fois qu'il y ait moins de lignes
        .[A2].CurrentRegion.Offset(1).ClearContents
        ' redimensionner une plage démarrant en .[A2] à la taille de la matrice result pour la coller
        .[A2].Resize(UBound(result, 1), UBound(result, 2)) = result
        ' activer feuille
        .Select
    End With
Rechercher des sujets similaires à "aide iteration"