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 Sub

Bonjour Romain33,

Essaye comme ceci:

Worksheets("mvt" & val(numMVT)).Cells(nuLign, numCol) = "mvt" & numMVT & numCol

Bonjour,

pas sur d'avoir compris, mais j'ai compris autre chose que Florian

remplacer ceci

Worksheets("mvt" & numMVT).Cells(nuLign, numCol) = "mvt" & numMVT & numCol

par

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 numCol

par

 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 Sub

Merci pour cette solution qui me semble fonctionner!

Bonne journée,

Romain

Rechercher des sujets similaires à "comment intepreter chaine caracteres comme nom var"