Comment intéprêter une chaine de caractères comme un nom de var?
Bonjour,
Je bloque sur un aspect de mon code portant sur la définition des variables.
En effet, j'ai défini15 variables en factorisant sous le nom suivant: mvt01(num) afin que plus tard dans mon code, je puisse les copier-coller aux bons endroits via une boucle.
Le problème se pose à la ligne suivante : Worksheets("mvt" & numMVT).Cells(nuLign, numCol) = "mvt" & numMVT & numCol
En effet, VBA m’interprète à juste titre le "mvt" & numMVT & numCol comme un String. Or, j'aimerais qu'il l'interprète comme la variable que j'ai définie en factorisant à savoir mvt01(num).
Comment faire pour cela?
Merci d'avance pour votre aide,
Cordialement,
Romain
Sub var()
'Etape 1: identification mvt du fichier GEST
Dim numMVT As String
Dim rowNum As Integer
Dim contatore As Integer
Dim nbVal As Integer
'new
Dim mvt01(1 To 15) As String
rowNum = 1
Set gestFile = Worksheets("Fichier GEST test")
nbVal = WorksheetFunction.CountA(gestFile.Range("A:A"))
Do While rowNum <= 50
gestFile.Select
numMVT = Mid(gestFile.Cells(rowNum, 1).Value, 40, 2)
mvt01(1) = Mid(gestFile.Cells(rowNum, 1).Value, 42, 8)
mvt01(2) = Mid(gestFile.Cells(rowNum, 1).Value, 50, 10)
mvt01(3) = Mid(gestFile.Cells(rowNum, 1).Value, 60, 2)
mvt01(4) = Mid(gestFile.Cells(rowNum, 1).Value, 62, 4)
mvt01(5) = Mid(gestFile.Cells(rowNum, 1).Value, 66, 1)
mvt01(6) = Mid(gestFile.Cells(rowNum, 1).Value, 67, 3)
mvt01(7) = Mid(gestFile.Cells(rowNum, 1).Value, 70, 3)
mvt01(8) = Mid(gestFile.Cells(rowNum, 1).Value, 73, 2)
mvt01(9) = Mid(gestFile.Cells(rowNum, 1).Value, 75, 3)
mvt01(10) = Mid(gestFile.Cells(rowNum, 1).Value, 78, 4)
mvt01(11) = Mid(gestFile.Cells(rowNum, 1).Value, 82, 1)
mvt01(12) = Mid(gestFile.Cells(rowNum, 1).Value, 83, 20)
mvt01(13) = Mid(gestFile.Cells(rowNum, 1).Value, 103, 4)
mvt01(14) = Mid(gestFile.Cells(rowNum, 1).Value, 107, 1)
mvt01(15) = Mid(gestFile.Cells(rowNum, 1).Value, 108, 1)
'Etape 2: Nouvel onglet: cas où dans le fichier GEST à scroller on a pour la première fois un mvt dans le fichier
If sheetExists("mvt" & numMVT) = False Then
Sheets.Add After:=ActiveSheet
ActiveSheet.Name = "mvt" & numMVT
ActiveSheet.Move Before:=Sheets(1)
Sheets("Infos gén 2").Select
Set contenu = Worksheets("Infos gén 2")
contatore = 2
Do While contatore < 180
If Mid(contenu.Cells(contatore, 1).Value, 4, 2) = numMVT Then
contenu.Select
Range("A" & contatore + 1 & ":CC" & contatore + 2).Select
Selection.Copy
Worksheets("mvt" & numMVT).Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
, SkipBlanks:=False, Transpose:=False
End If
contatore = contatore + 1
Loop
End If
'Etape 3: on décompose le contenu de la ligne (rowNum) du fichier GEST dans le bon onglet du mvt correspondant
Worksheets("mvt" & numMVT).Select
Dim nuLign As Integer, numCol As Long
nuLign = 3
Do While Cells(nuLign, 1).Value <> ""
nuLign = nuLign + 1
Loop
For numCol = 12 To 26
Worksheets("mvt" & numMVT).Cells(nuLign, numCol) = "mvt" & numMVT & numCol
Next numCol
rowNum = rowNum + 1
Loop
End SubBonjour Romain33,
Essaye comme ceci:
Worksheets("mvt" & val(numMVT)).Cells(nuLign, numCol) = "mvt" & numMVT & numColBonjour,
pas sur d'avoir compris, mais j'ai compris autre chose que Florian
remplacer ceci
Worksheets("mvt" & numMVT).Cells(nuLign, numCol) = "mvt" & numMVT & numColpar
Worksheets("mvt" & numMVT).Cells(nuLign, numCol) = mvt01(numCol - 11)ou encore
remplacer ceci
For numCol = 12 To 26
Worksheets("mvt" & numMVT).Cells(nuLign, numCol) = "mvt" & numMVT & numCol
Next numColpar
Worksheets("mvt" & numMVT).Cells(nuLign, 12).resize(,15) = mvt01
Bonjour,
Merci pour vos réponses.
Pour préciser mon problème, la variable numMVT prendra d'autres valeurs que '01' par la suite (jusqu'à 50 en réalité). Il s'agit juste d'une portion du code complet pour le moment.
Et pour éviter un code très très long, il me faudrait pouvoir mettre en boucle les noms de variables, c'est-à-dire que le "mvt" & numMVT & numCol (qui peut par exemple renvoyer à mvt01(2)) soit interpréter en variable et non en chaine de caractères.
La fonction var de florian53 n'a pas marché. J'avais pensé à la CallByName, sans succès également.
Merci pour vos réponses,
Romain
Bonjour,
la raison pour laquelle tu aurais besoin de 50 variables différentes m'échappe, mais dans ce cas
utilise alors un tableau à 2 dimensions
Sub var()
'Etape 1: identification mvt du fichier GEST
Dim numMVT As String
Dim rowNum As Integer
Dim contatore As Integer
Dim nbVal As Integer
'new
Dim mvt(1 To 50, 1 To 15) As String
rowNum = 1
Set gestFile = Worksheets("Fichier GEST test")
nbVal = WorksheetFunction.CountA(gestFile.Range("A:A"))
Do While rowNum <= 50
gestFile.Select
numMVT = Mid(gestFile.Cells(rowNum, 1).Value, 40, 2)
mvt(numMVT, 1) = Mid(gestFile.Cells(rowNum, 1).Value, 42, 8)
mvt(numMVT, 2) = Mid(gestFile.Cells(rowNum, 1).Value, 50, 10)
mvt(numMVT, 3) = Mid(gestFile.Cells(rowNum, 1).Value, 60, 2)
mvt(numMVT, 4) = Mid(gestFile.Cells(rowNum, 1).Value, 62, 4)
mvt(numMVT, 5) = Mid(gestFile.Cells(rowNum, 1).Value, 66, 1)
mvt(numMVT, 6) = Mid(gestFile.Cells(rowNum, 1).Value, 67, 3)
mvt(numMVT, 7) = Mid(gestFile.Cells(rowNum, 1).Value, 70, 3)
mvt(numMVT, 8) = Mid(gestFile.Cells(rowNum, 1).Value, 73, 2)
mvt(numMVT, 9) = Mid(gestFile.Cells(rowNum, 1).Value, 75, 3)
mvt(numMVT, 10) = Mid(gestFile.Cells(rowNum, 1).Value, 78, 4)
mvt(numMVT, 11) = Mid(gestFile.Cells(rowNum, 1).Value, 82, 1)
mvt(numMVT, 12) = Mid(gestFile.Cells(rowNum, 1).Value, 83, 20)
mvt(numMVT, 13) = Mid(gestFile.Cells(rowNum, 1).Value, 103, 4)
mvt(numMVT, 14) = Mid(gestFile.Cells(rowNum, 1).Value, 107, 1)
mvt(numMVT, 15) = Mid(gestFile.Cells(rowNum, 1).Value, 108, 1)
'Etape 2: Nouvel onglet: cas où dans le fichier GEST à scroller on a pour la première fois un mvt dans le fichier
If sheetExists("mvt" & numMVT) = False Then
Sheets.Add After:=ActiveSheet
ActiveSheet.Name = "mvt" & numMVT
ActiveSheet.Move Before:=Sheets(1)
Sheets("Infos gén 2").Select
Set contenu = Worksheets("Infos gén 2")
contatore = 2
Do While contatore < 180
If Mid(contenu.Cells(contatore, 1).Value, 4, 2) = numMVT Then
contenu.Select
Range("A" & contatore + 1 & ":CC" & contatore + 2).Select
Selection.Copy
Worksheets("mvt" & numMVT).Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
, SkipBlanks:=False, Transpose:=False
End If
contatore = contatore + 1
Loop
End If
'Etape 3: on décompose le contenu de la ligne (rowNum) du fichier GEST dans le bon onglet du mvt correspondant
Worksheets("mvt" & numMVT).Select
Dim nuLign As Integer, numCol As Long
nuLign = 3
Do While Cells(nuLign, 1).Value <> ""
nuLign = nuLign + 1
Loop
For numCol = 12 To 26
Worksheets("mvt" & numMVT).Cells(nuLign, numCol) = mvt(numMVT, numCol - 11)
Next numCol
rowNum = rowNum + 1
Loop
End SubMerci pour cette solution qui me semble fonctionner!
Bonne journée,
Romain