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
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 SubS'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 WithJe 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 WithMerci!!
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