VBA - Union variables tableau

benhont

XLDnaute Nouveau
Bonjour,

J'aimerais pouvoir unir deux variables tableaux (A et B) en une seule sans utiliser de boucle.

La fonction que j'ai réalisé est la suivante mais comporte une boucle.

Function Union_matrice(A, B)
lignes_A = UBound(A, 1)
colonnes_A = UBound(A, 2)
lignes_B = UBound(B, 1)
lignes_AB = lignes_A + lignes_B
ReDim Matrice_Verticale(lignes_AB, colonnes_A)
For i = 1 To lignes_A
For j = 1 To colonnes_A
Matrice_Verticale(i, j) = A(i, j)
Next j
Next i
For i = 1 To lignes_B
For j = 1 To colonnes_A
Matrice_Verticale(lignes_A + i, j) = B(i, j)
Next j
Next i
Union_matrice = Matrice_Verticale
End Function

J'ai déjà essayé d'utiliser .copy ou encore Union mais je pense que le manque de connaissances en VBA me fait défaut ;)

Une idée ?
Merci d'avance.
 

pierrejean

XLDnaute Barbatruc
Re : VBA - Union variables tableau

Bonjour benhont

Je ne pense pas qu'il soit possible d'unir 2 tableaux (surtout s'ils sont de dimensions differentes )
Par contre il est possible d'unir 2 ranges
Peux-tu preciser comment sont définis tes tableaux A et B ????
 

ROGER2327

XLDnaute Barbatruc
Re : VBA - Union variables tableau

Bonjour benhont, pierrejean



D'accord avec pierrejean, je ne connais pas de fonction d'union de deux tableaux dans VisualBasic. Je ne sais le faire qu'avec des boucles, comme vous. C'est très rapide et ça l'est encore plus si vous typez les variables. Par exemple :​
VB:
Function Union_matrice(A, B)
Dim lignes_A&, colonnes_A, lignes_B, lignes_AB
Dim i&, j&
    lignes_A = UBound(A, 1)
    colonnes_A = UBound(A, 2)
    lignes_B = UBound(B, 1)
    lignes_AB = lignes_A + lignes_B
    ReDim Matrice_Verticale(lignes_AB, colonnes_A)
    For i = 1 To lignes_A: For j = 1 To colonnes_A
        Matrice_Verticale(i, j) = A(i, j)
    Next j, i
    For i = 1 To lignes_B: For j = 1 To colonnes_A
        Matrice_Verticale(lignes_A + i, j) = B(i, j)
    Next j, i
    Union_matrice = Matrice_Verticale
End Function
Sans boucle, on peut essayer cela :​
VB:
Function UMat(A, B)
Dim lignes_A&, colonnes_A, lignes_B, lignes_AB
Dim i&, j&
    lignes_A = UBound(A, 1)
    colonnes_A = UBound(A, 2)
    lignes_B = UBound(B, 1)
    lignes_AB = lignes_A + lignes_B
    With Application
        .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlCalculationManual
        Worksheets.Add Before:=ActiveSheet
        Cells(1, 1).Resize(lignes_A, colonnes_A).Value = A
        Cells(1, 1).Resize(lignes_B, colonnes_A).Offset(lignes_A).Value = B
        UMat = Cells(1, 1).Resize(lignes_AB, colonnes_A).Value
        .DisplayAlerts = False
        ActiveSheet.Delete
        .DisplayAlerts = True
        .Calculation = xlCalculationAutomatic: .EnableEvents = True: .ScreenUpdating = True
    End With
End Function
Mais c'est beaucoup plus lent si les tableaux sont de taille importante.​



ROGER2327
#5908


Mardi 10 Merdre 139 (Saint Barbapoux, amant - fête Suprême Quarte)
8 Prairial An CCXX, 6,4834h - martagon
2012-W21-7T15:33:37Z
 
Dernière édition:

Efgé

XLDnaute Barbatruc
Re : VBA - Union variables tableau

Bonjour benhont, Bonjour pierrejean, Bonjour ROGER2327,
Si je puis me permettre...
La fonction de base est prévue uniquement en option Base 1 et les deux tableaux en entrée sont de même seconde dimention.
On peux éviter une des deux boucles, mais je ne suis certain de rien quant au gain de temps.
VB:
Function Union_matrice_2(ByVal A As Variant, ByVal B As Variant) As Variant
Dim lignes_A&, colonnes_A&, lignes_B&
lignes_A = UBound(A, 1)
colonnes_A = UBound(A, 2)
lignes_B = UBound(B, 1)
ReDim Matrice_Verticale(colonnes_A, lignes_A)
Matrice_Verticale = Application.Transpose(A)
ReDim Preserve Matrice_Verticale(colonnes_A, lignes_A + lignes_B)
For j = 1 To colonnes_A
    For i = 1 To lignes_B
        Matrice_Verticale(j, lignes_A + i) = B(i, j)
    Next i
Next j
Union_matrice_2 = Application.Transpose(Matrice_Verticale)
End Function

Cordialement
 

ROGER2327

XLDnaute Barbatruc
Re : VBA - Union variables tableau

Bonsoir Efgé


Conclusion après test :
  1. Ne fonctionne que sur des petits tableaux.
  2. Nettement plus rapide que Umat, mais plus lent que Union_matrice. (Mais compte tenu de la petitesse des tableaux traitables, ceci n'a guère d'importance.)
  3. En typant i et j comme Entier Long, devient aussi rapide que Union_matrice.



ROGER2327
#5909


Mardi 10 Merdre 139 (Saint Barbapoux, amant - fête Suprême Quarte)
8 Prairial An CCXX, 8,6763h - martagon
2012-W21-7T20:49:23Z
 

Efgé

XLDnaute Barbatruc
Re : VBA - Union variables tableau

Bonjour à tous,
@ ROGER2327
Merci de vos tests.
Une "option explicit" m'aurais mis à l'abris des oublis de déclarations des variables i et j.
Par contre je ne comprend pas la notion de "petitesse des tableaux traités"
J'ai fait des essais pour comprendre. J'arrive à un tableau cumulé de 40 000 lignes sur 25 colonnes sans problème.
(Mes tests sur 65 000 lignes et 256 colonnes m'ont ammenés à une mémoire insufisante).
Peut être quelque chose m'a échapée...
Cordialement
 

Pièces jointes

  • Classeur1.xlsm
    25 KB · Affichages: 134
  • Classeur1.xlsm
    25 KB · Affichages: 143
  • Classeur1.xlsm
    25 KB · Affichages: 135

ROGER2327

XLDnaute Barbatruc
Re : VBA - Union variables tableau

Bonjour à tous


Bonjour à tous,
@ ROGER2327
Merci de vos tests.
Une "option explicit" m'aurais mis à l'abris des oublis de déclarations des variables i et j.
Par contre je ne comprend pas la notion de "petitesse des tableaux traités"
J'ai fait des essais pour comprendre. J'arrive à un tableau cumulé de 40 000 lignes sur 25 colonnes sans problème.
(Mes tests sur 65 000 lignes et 256 colonnes m'ont ammenés à une mémoire insufisante).
Peut être quelque chose m'a échapée...
Cordialement
J'ai réalisé mes essais avec des tableaux de cinq cent mille et deux cent-cinquante mille lignes sur deux colonnes ; avec des tableaux de trente-cinq mille lignes sur soixante-quatre colonnes. Ça passe en moins d'une seconde dans le premier cas, et 4,8 s dans le deuxième. (Temps d'exécution avec la fonction Union_matrice, sans affichage du résultat.)

Avec deux fois trente mille lignes sur deux cent cinquante-six colonnes, rien ne va plus, même avec 8 Go de mémoire vive sous Windows7[SUP]®[/SUP] (64 bits). Apparemment, ni Excel[SUP]®[/SUP], ni VBA ne savent utiliser une telle quantité de mémoire.
Est-ce vrai ?

Ce qui est certain, c'est que la fonction TRANSPOSE() d'Excel[SUP]®[/SUP] est incapable de traiter plus de soixante-cinq mille cinq cent trente-six lignes, même sur une seule colonne. Légèrement ringard à l'heure où les feuilles dépassent le million de lignes... On frôle dangereusement l'obsolescence. Rassurons-nous : de nos jours le ridicule ne tue plus.
Je ne saurais en dire plus.​



Bonne soirée.



ROGER2327
#5910


Mercredi 11 Merdre 139 (Saint Memnon, vidangeur - fête Suprême Quarte)
9 Prairial An CCXX, 6,3619h - serpolet
2012-W22-1T15:16:06Z
 

laurent950

XLDnaute Accro
Re : VBA - Union variables tableau

Bonsoir le forum un test,

1 - Creation de données
Tab1() et Tab2()
&
Affecté c'est valeur a une plage Range
&
Transferet le Range dans un tableau
&
Effacer de la memoir le range
&
copier les valeurs du tableau dans la feuil 3
=
Union Variable Tableaux

1 - Le main
VB:
Sub TestUnionVariableTableaux()

' Feuil3 Resultat
Dim Donner As Worksheet
Set Donner = Worksheets("Feuil3")

' Variable
Dim Tab1() As Variant
Dim Tab2() As Variant
Dim lig As Double
lig = 20000
Dim col As Integer
col = 25

' Procedure
CreationChant Tab1, Tab2, lig, col

' Variable Range
Dim Temp As Range
Set Temp = Donner.Range(Donner.Cells(1, 1), Donner.Cells(lig + lig, col))

' Remplir la variable Range avec les Position pour assemblage
Temp(1, 1).Resize(UBound(Tab1, 1), UBound(Tab1, 2)) = Tab1
Temp(200001, 1).Resize(UBound(Tab2, 1), UBound(Tab2, 2)) = Tab2

' Créer un tableau a partir du range
Dim TabAremplir() As Variant
TabAremplir = Temp

' Effacer les valeur
Temp.ClearContents

' Decharge la variable "Range" Temp (Libére la mémoire)
Set Temp = Nothing

' Dans la feuille 3
' Colle les valeurs du tableau TabAremplir()

Donner.Cells(1, 1).Resize(UBound(TabAremplir, 1), UBound(TabAremplir, 2)) = TabAremplir

End Sub

2 - Procedure
VB:
Sub CreationChant(Tab1() As Variant, Tab2() As Variant, lig As Double, col As Integer)
Dim i As Double, j As Double

ReDim Tab1(lig, col)
For i = LBound(Tab1, 1) To UBound(Tab1, 1)
    For j = LBound(Tab1, 2) To UBound(Tab1, 2)
        Tab1(i, j) = "Tab1_" & i & "_" & j
    Next j
Next i

ReDim Tab2(lig, col)
For i = LBound(Tab2, 1) To UBound(Tab2, 1)
    For j = LBound(Tab2, 2) To UBound(Tab2, 2)
        Tab2(i, j) = "Tab2_" & i & "_" & j
    Next j
Next i
End Sub

Laurent
 

Pièces jointes

  • UnionVariableTableaux.xlsm
    19.7 KB · Affichages: 66

Discussions similaires

Réponses
11
Affichages
304

Statistiques des forums

Discussions
312 336
Messages
2 087 387
Membres
103 532
dernier inscrit
sdfrgthyjuki