Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

VBA : concaténer des tableaux

3 réponses
Avatar
Quetzalcoatl
Bonsoir,

Comment faire pour concaténer (simplement) des tableaux par VBA ?

Mettons que j'aie 3 tableaux :
Dim Table1()
Dim Table2()
Dim Table3()
Je m'arrange pour les remplir de constantes de type STRING avec :
Table1 = Array ("string1", "string2", "string3", "string4", "string5")
Table2 = Array ("string6", "string7", "string8")
Table3 = Array ("string9", "string10")
(Déjà là, je ne parviens pas à déclarer directement un tableau de constantes de
type STRING, je suis obligé de passer par du code pour remplir le tableau, ce
qui me paraît lourdingue, mais bon).

Je voudrais les concaténer PAR CODE VBA, pour obtenir un nouveau tableau, -- qui
aurait pu être déclaré par :
NouvelleTable = Array ("string1", "string2", "string3", "string4", "string5",
"string6", "string7", "string8", "string9", "string10"),
-- dont on puisse accéder aux éléments par :
NouvelleTable (i)

J'ai essayé :
NouvelleTable = Array (Table1, Table2, Table3)
mais l'accès est malaisé : pour accéder à "string 8" par exemple, il faut :
NouvelleTable (2) (3).

Ou alors :
For i = 1 to Ubound (Table1)
NouvelleTable (i) = Table1 (i)
Next i
For i = 1 to Ubound (Table2)
NouvelleTable (i + Ubound (Table1)) = Table2 (i)
Next i
For i = 1 to Ubound (Table3)
NouvelleTable (i + Ubound (Table1) + Ubound (Table2)) = Table3 (i)
Next i

mais c'est super lourd !

Il doit bien y avoir plus simple ? Avez-vous une idée ?
Merci d'avance.

P.S. : pour info, les STRING sont les noms des feuilles de calcul d'un classeur,
feuilles que l'on peut regrouper par catégories logiques prédéfinies; et selon
le bouton cliqué par l'opérateur, on masque / affiche telles ou telles
catégories de feuilles (de nombreux boutons, de nombreuses catégories, de
nombreuses combinaisons possibles). D'où l'idée de concaténer, selon l'action
opérateur, les différents groupes de feuilles prédéfinis en : tout ce qui est à
masquer et tout ce qui est à afficher

--
So long

3 réponses

Avatar
Hervé
Bonsoir,
Une piste :

Sub Concatener()
'de type variant obligatoire
Dim Table1, Table2, Table3
Dim NouvelleTable() As String
Dim I As Long, J As Long

Table1 = Array("string1", "string2", "string3", "string4", "string5")
Table2 = Array("string6", "string7", "string8")
Table3 = Array("string9", "string10")

For I = 0 To UBound(Table1)
J = J + 1
ReDim Preserve NouvelleTable(1 To J)
NouvelleTable(J) = Table1(I)
Next I

For I = 0 To UBound(Table2)
J = J + 1
ReDim Preserve NouvelleTable(1 To J)
NouvelleTable(J) = Table2(I)
Next I

For I = 0 To UBound(Table3)
J = J + 1
ReDim Preserve NouvelleTable(1 To J)
NouvelleTable(J) = Table3(I)
Next I
'résultat
For I = 1 To UBound(NouvelleTable)
Debug.Print NouvelleTable(I)
Next I

Erase Table1
Erase Table2
Erase Table3
Erase NouvelleTable

End Sub

Hervé.

"Quetzalcoatl" a écrit dans le message de
news: 430a1fef$0$5398$
Bonsoir,

Comment faire pour concaténer (simplement) des tableaux par VBA ?

Mettons que j'aie 3 tableaux :
Dim Table1()
Dim Table2()
Dim Table3()
Je m'arrange pour les remplir de constantes de type STRING avec :
Table1 = Array ("string1", "string2", "string3", "string4", "string5")
Table2 = Array ("string6", "string7", "string8")
Table3 = Array ("string9", "string10")
(Déjà là, je ne parviens pas à déclarer directement un tableau de
constantes de

type STRING, je suis obligé de passer par du code pour remplir le tableau,
ce

qui me paraît lourdingue, mais bon).

Je voudrais les concaténer PAR CODE VBA, pour obtenir un nouveau
tableau, -- qui

aurait pu être déclaré par :
NouvelleTable = Array ("string1", "string2", "string3", "string4",
"string5",

"string6", "string7", "string8", "string9", "string10"),
-- dont on puisse accéder aux éléments par :
NouvelleTable (i)

J'ai essayé :
NouvelleTable = Array (Table1, Table2, Table3)
mais l'accès est malaisé : pour accéder à "string 8" par exemple, il faut
:

NouvelleTable (2) (3).

Ou alors :
For i = 1 to Ubound (Table1)
NouvelleTable (i) = Table1 (i)
Next i
For i = 1 to Ubound (Table2)
NouvelleTable (i + Ubound (Table1)) = Table2 (i)
Next i
For i = 1 to Ubound (Table3)
NouvelleTable (i + Ubound (Table1) + Ubound (Table2)) = Table3 (i)
Next i

mais c'est super lourd !

Il doit bien y avoir plus simple ? Avez-vous une idée ?
Merci d'avance.

P.S. : pour info, les STRING sont les noms des feuilles de calcul d'un
classeur,

feuilles que l'on peut regrouper par catégories logiques prédéfinies; et
selon

le bouton cliqué par l'opérateur, on masque / affiche telles ou telles
catégories de feuilles (de nombreux boutons, de nombreuses catégories, de
nombreuses combinaisons possibles). D'où l'idée de concaténer, selon
l'action

opérateur, les différents groupes de feuilles prédéfinis en : tout ce qui
est à

masquer et tout ce qui est à afficher

--
So long




Avatar
michdenis
Bonjour Quetzalcoatl,

| (Déjà là, je ne parviens pas à déclarer directement un tableau de constantes de
| type STRING, je suis obligé de passer par du code pour remplir le tableau, ce
| qui me paraît lourdingue, mais bon).

La fonction array renvoie une variable de type variant ... le reste est dans l'aide de Excel

Un exemple pour le type de déclaration de tableau que tu désires !
'--------------------------------
Sub Exemple()
Dim Arr() As String * 15
Dim Z As Integer, Nb As Integer
Nb = 12

ReDim Arr(1 To Nb) 'Tableau de base 1

For Z = 1 To Nb
Arr(Z) = Format(DateSerial(2005, Z, 1), "mmmm")
Next
MsgBox Arr(3)
End Sub
'--------------------------------


Une solution à ta problématique :
'------------------------------
Sub ConcatenerTableau()

Dim Table1(), C As Integer
Dim Table2(), A As Integer
Dim Table3()
Dim nouveauTableau()

Table1 = Array("string1", "string2", "string3", "string4", "string5")
Table2 = Array("string6", "string7", "string8")
Table3 = Array("string9", "string10")

For Each arr In Array(Table1, Table2, Table3)
For A = 0 To UBound(arr)
ReDim Preserve nouveauTableau(C)
nouveauTableau(C) = arr(A)
Next
Next

Msgbox NouveauTableau(5)

End Sub
'------------------------------


Salutations!




"Quetzalcoatl" a écrit dans le message de news: 430a1fef$0$5398$
Bonsoir,

Comment faire pour concaténer (simplement) des tableaux par VBA ?

Mettons que j'aie 3 tableaux :
Dim Table1()
Dim Table2()
Dim Table3()
Je m'arrange pour les remplir de constantes de type STRING avec :
Table1 = Array ("string1", "string2", "string3", "string4", "string5")
Table2 = Array ("string6", "string7", "string8")
Table3 = Array ("string9", "string10")
(Déjà là, je ne parviens pas à déclarer directement un tableau de constantes de
type STRING, je suis obligé de passer par du code pour remplir le tableau, ce
qui me paraît lourdingue, mais bon).

Je voudrais les concaténer PAR CODE VBA, pour obtenir un nouveau tableau, -- qui
aurait pu être déclaré par :
NouvelleTable = Array ("string1", "string2", "string3", "string4", "string5",
"string6", "string7", "string8", "string9", "string10"),
-- dont on puisse accéder aux éléments par :
NouvelleTable (i)

J'ai essayé :
NouvelleTable = Array (Table1, Table2, Table3)
mais l'accès est malaisé : pour accéder à "string 8" par exemple, il faut :
NouvelleTable (2) (3).

Ou alors :
For i = 1 to Ubound (Table1)
NouvelleTable (i) = Table1 (i)
Next i
For i = 1 to Ubound (Table2)
NouvelleTable (i + Ubound (Table1)) = Table2 (i)
Next i
For i = 1 to Ubound (Table3)
NouvelleTable (i + Ubound (Table1) + Ubound (Table2)) = Table3 (i)
Next i

mais c'est super lourd !

Il doit bien y avoir plus simple ? Avez-vous une idée ?
Merci d'avance.

P.S. : pour info, les STRING sont les noms des feuilles de calcul d'un classeur,
feuilles que l'on peut regrouper par catégories logiques prédéfinies; et selon
le bouton cliqué par l'opérateur, on masque / affiche telles ou telles
catégories de feuilles (de nombreux boutons, de nombreuses catégories, de
nombreuses combinaisons possibles). D'où l'idée de concaténer, selon l'action
opérateur, les différents groupes de feuilles prédéfinis en : tout ce qui est à
masquer et tout ce qui est à afficher

--
So long
Avatar
michdenis
Désolé, j'ai omis une ligne incrémentant la variable du tableau :

Voici le corrigé :
'--------------------------------
Sub ConcatenerTableau()

Dim Table1(), C As Integer
Dim Table2(), A As Integer
Dim Table3()
Dim nouveauTableau()

Table1 = Array("string1", "string2", "string3", "string4", "string5")
Table2 = Array("string6", "string7", "string8")
Table3 = Array("string9", "string10")

For Each arr In Array(Table1, Table2, Table3)
For A = 0 To UBound(arr)
ReDim Preserve nouveauTableau(C)
nouveauTableau(C) = arr(A)
C = C + 1 ' La ligne oubliée.
Next
Next
MsgBox nouveauTableau(6)
End sub
'--------------------------------


Salutations!




"michdenis" a écrit dans le message de news: %
Bonjour Quetzalcoatl,

| (Déjà là, je ne parviens pas à déclarer directement un tableau de constantes de
| type STRING, je suis obligé de passer par du code pour remplir le tableau, ce
| qui me paraît lourdingue, mais bon).

La fonction array renvoie une variable de type variant ... le reste est dans l'aide de Excel

Un exemple pour le type de déclaration de tableau que tu désires !
'--------------------------------
Sub Exemple()
Dim Arr() As String * 15
Dim Z As Integer, Nb As Integer
Nb = 12

ReDim Arr(1 To Nb) 'Tableau de base 1

For Z = 1 To Nb
Arr(Z) = Format(DateSerial(2005, Z, 1), "mmmm")
Next
MsgBox Arr(3)
End Sub
'--------------------------------


Une solution à ta problématique :
'------------------------------
Sub ConcatenerTableau()

Dim Table1(), C As Integer
Dim Table2(), A As Integer
Dim Table3()
Dim nouveauTableau()

Table1 = Array("string1", "string2", "string3", "string4", "string5")
Table2 = Array("string6", "string7", "string8")
Table3 = Array("string9", "string10")

For Each arr In Array(Table1, Table2, Table3)
For A = 0 To UBound(arr)
ReDim Preserve nouveauTableau(C)
nouveauTableau(C) = arr(A)
Next
Next

Msgbox NouveauTableau(5)

End Sub
'------------------------------


Salutations!




"Quetzalcoatl" a écrit dans le message de news: 430a1fef$0$5398$
Bonsoir,

Comment faire pour concaténer (simplement) des tableaux par VBA ?

Mettons que j'aie 3 tableaux :
Dim Table1()
Dim Table2()
Dim Table3()
Je m'arrange pour les remplir de constantes de type STRING avec :
Table1 = Array ("string1", "string2", "string3", "string4", "string5")
Table2 = Array ("string6", "string7", "string8")
Table3 = Array ("string9", "string10")
(Déjà là, je ne parviens pas à déclarer directement un tableau de constantes de
type STRING, je suis obligé de passer par du code pour remplir le tableau, ce
qui me paraît lourdingue, mais bon).

Je voudrais les concaténer PAR CODE VBA, pour obtenir un nouveau tableau, -- qui
aurait pu être déclaré par :
NouvelleTable = Array ("string1", "string2", "string3", "string4", "string5",
"string6", "string7", "string8", "string9", "string10"),
-- dont on puisse accéder aux éléments par :
NouvelleTable (i)

J'ai essayé :
NouvelleTable = Array (Table1, Table2, Table3)
mais l'accès est malaisé : pour accéder à "string 8" par exemple, il faut :
NouvelleTable (2) (3).

Ou alors :
For i = 1 to Ubound (Table1)
NouvelleTable (i) = Table1 (i)
Next i
For i = 1 to Ubound (Table2)
NouvelleTable (i + Ubound (Table1)) = Table2 (i)
Next i
For i = 1 to Ubound (Table3)
NouvelleTable (i + Ubound (Table1) + Ubound (Table2)) = Table3 (i)
Next i

mais c'est super lourd !

Il doit bien y avoir plus simple ? Avez-vous une idée ?
Merci d'avance.

P.S. : pour info, les STRING sont les noms des feuilles de calcul d'un classeur,
feuilles que l'on peut regrouper par catégories logiques prédéfinies; et selon
le bouton cliqué par l'opérateur, on masque / affiche telles ou telles
catégories de feuilles (de nombreux boutons, de nombreuses catégories, de
nombreuses combinaisons possibles). D'où l'idée de concaténer, selon l'action
opérateur, les différents groupes de feuilles prédéfinis en : tout ce qui est à
masquer et tout ce qui est à afficher

--
So long