Utilisation de Redim Preserve

Bonjour,

J'expérimente la fonction Redim Preserve sans succès. Pour comprendre le problème, j'ai créé une petite macro qui utilise cette fonction.

Le pricnipe est simple, je copie le tabelau de la sheet 1 dans un tableau VBA TAB_Data puis je le screen sur la meme sheet.

J'ai une erreur type Run-Time error '9': subscript out of range lorsque x = 2. Apparemment, la fonction redim preserve n'arrive pas à redimensionner le tableau en fonction de la variable x. Je ne comprends pas pourquoi.

Sub test()

Dim h As Single, i As Single, j As Single, x As Single

Dim TAB_Data() As Variant

For i = 1 To 15

j = 0

If Sheets("sheet1").Cells(i, 1) <> Empty Then

x = x + 1

ReDim Preserve TAB_Data(1 To x, 1 To 2)

For j = 1 To 2

TAB_Data(x, j) = Sheets("sheet1").Cells(i, j)

Next

End If

Next

For i = 1 To 13

For j = 1 To 2

Sheets("sheet1").Cells(i, j + 10) = TAB_Data(i, j)

Next

Next

End Sub

Cf. fichier excel en annexe

291test-v1.xlsm (15.47 Ko)

Bonjour

Redim ne permet que de redimensionner que la dernière dimension

Extrait de l'aide

Si vous utilisez le mot clé Preserve, vous ne pouvez redimensionner que la dernière dimension du tableau. Vous ne pouvez en aucun cas modifier le nombre de dimensions. Par exemple, si votre tableau n'a qu'une dimension, vous pouvez la modifier puisqu'il s'agit de la dernière et seule dimension. Toutefois, si le tableau compte plusieurs dimensions, seule la taille de la dernière dimension est modifiable si vous souhaitez préserver le contenu du tableau. L'exemple suivant montre comment augmenter la taille de la dernière dimension d'un tableau dynamique sans effacer les données qu'il contient :

Merci pour la réponse rapide maisje suis toujours coincé.

Voici le code midifié:

Sub test()

Dim h As Single, i As Single, j As Single, x As Single

Dim TAB_Data() As Variant

ReDim TAB_Data(1 To 2, 1 To 1)

For i = 1 To 15

If Sheets("sheet1").Cells(i, 1) <> Empty Then

x = x + 1

ReDim Preserve TAB_Data(x)

For j = 1 To 2

TAB_Data(j, x) = Sheets("sheet1").Cells(i, j)

Next

End If

Next

For i = 1 To 13

For j = 1 To 2

Sheets("sheet1").Cells(i, j + 10) = TAB_Data(j, i)

Next

Next

End Sub

Je pense que je la synthaxe de la commande Redim preseve n'est pas correct. Banzai64, pourrais-tu me dire quelle est la synthaxe exacte?

Merci encore!

Ok j'ai compris.

Voici le code correct:

Sub test()

Dim h As Single, i As Single, j As Single, x As Single

Dim TAB_Data() As Variant

For i = 1 To 15

If Sheets("sheet1").Cells(i, 1) <> Empty Then

x = x + 1

ReDim Preserve TAB_Data(1 To 2, 1 To x)

For j = 1 To 2

TAB_Data(j, x) = Sheets("sheet1").Cells(i, j)

Next

End If

Next

For i = 1 To 13

For j = 1 To 2

Sheets("sheet1").Cells(i, j + 10) = TAB_Data(j, i)

Next

Next

End Sub

Merci pour votre aide.

Bonjour

Seulement la dernière dimension

Tu initialise un tableau à 2 dimensions

ReDim TAB_Data(1 To 2, 1 To 1)

Ensuite ton tableau n'a plus qu'une seule dimension

ReDim Preserve TAB_Data(x)

Normalement tu devrais avoir

ReDim Preserve TAB_Data(1 To 2, 1 To x)

Pour t'aider il faudrait le résultat afin que je comprenne ce que tu cherches à faire

Prépares un fichier en y indiquant ce que tu as et ce que tu veux

EDIT: Ok tu as saisi et tant mieux si cela fonctionne. A une prochaine

Rechercher des sujets similaires à "utilisation redim preserve"