3 votes

Joindre deux tableaux dans vba ?

Comment puis-je combiner ces tableaux avec le résultat de (2, 4, 5, 3, 7, 6) ?

array1 = Array(4,5,3,7,6)

array2 = Array(2)

7voto

JNevill Points 29897

Vous pourriez potentiellement Join() et concaténer vos deux tableaux, puis Split() le résultat dans un nouveau tableau :

array3 = Split(Join(array2, ",") & "," & Join(array1, ","), ",")

Explication :
Join() retournera une chaîne de caractères dont chaque élément du tableau (premier paramètre) est délimité par un signe "," (deuxième paramètre). Nous concaténons ces deux tableaux joints avec une virgule supplémentaire pour obtenir une chaîne de caractères telle que 2,4,5,3,7,6 . Nous utilisons ensuite Split() pour transformer cette chaîne en un tableau qui dit Split() que le délimiteur est une virgule "," .

4voto

QHarr Points 24420

Vous pourriez utiliser arrayLists. Cela permet également un tri facile si vous le souhaitez.

Option Explicit
Public Sub test()
    Dim list1 As Object, list2 As Object

    Set list1 = CreateObject("System.Collections.Arraylist")
    Set list2 = CreateObject("System.Collections.Arraylist")
    list1.Add 4
    list1.Add 5
    list1.Add 3
    list1.Add 7
    list1.Add 6
    list2.Add 2
    list1.addRange list2
    list1.Sort
End Sub

3voto

T.M. Points 1955

Joindre deux tableaux

Comme alternative à l'approche correcte et fonctionnelle proposée par Scott Craner

Créez un troisième tableau qui est vide de la taille des deux tableaux combinés, puis bouclez dans chaque tableau en ajoutant les éléments un par un.

... Je montre un moyen de

  • insérer uniquement le ou les éléments de la 2ème tableau par un boucle dans un tableau principal, alors que
  • le site tableau principal ne reçoit que restructuré par un une seule pièce via Application.Index() .

Comme cette fonction changerait les résultats en un tableau basé sur 1, je redimensionne le tableau en un tableau basé sur zéro. De plus, j'ai ajouté un affichage facultatif dans la fenêtre immédiate du VBE, ce qui donne lieu à 2|4|5|3|7|6 valeurs :

1ère étape : Démonstration simple avec les mêmes valeurs de tableau que dans OP (Insertion de 1 élément)

Sub SimpleDemo()
'[0]declare and assign zero-based 1-dimensioned arrays
    Dim main, newTop
    main = Array(4, 5, 3, 7, 6)
    newTop = Array(2)              ' only one element in a first step
'[1]transform main array by inserting(/i.e. repeating) "another" 1st element
    main = Application.Index(main, Array(1, 1, 2, 3, 4, 5)) ' changes to 1-based 1-dim array
    ReDim Preserve main(0 To UBound(main) - 1)              ' back to zero-based 1-dim array
'[2]overwrite new first element by the 1st(only) element of newTop
    main(0) = newTop(0)
'[3](optional) display in VBE's Immediate Window: main(0 To 5) ~> 2|4|5|3|7|6
    Debug.Print "main(" & LBound(main) & " To " & UBound(main) & ") ~> " & _
                Join(main, "|")
End Sub

2ème étape : Approche plus généralisée utilisant un AddElem procédure

Les inserts de démonstration ci-dessus ne sont que un élément. J'ai donc codé un AddElem procédure et une fonction d'aide addedElems() pour permettre à la insertion d'autres éléments . Il est supposé que tous les tableaux 1-dim sont basés sur zéro comme dans le post original ; pourrait être adapté facilement btw :-)

Sub AddElem(main, newTop)
' Purp. : add/insert other array element(s) on top of zero-based main array
' Author: https://stackoverflow.com/users/6460297/t-m
' Date  : 2020-02-05
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' a)insert newTop element(s) on top of main array
    main = Application.Index(main, addedElems(main, newTop)) ' changes temporarily to 1-based mainay!
' b)make main array zero-based again (optional)
    ReDim Preserve main(0 To UBound(main) - 1)
' c)overwrite inserted starting element(s) by the newTop element(s)
    Dim i&: For i = 0 To UBound(newTop): main(i) = newTop(i): Next i
End Sub

Fonction d'aide addedElems()

Function addedElems(main, newTop) As Variant()
'Note : help function called by AddElem()
'Purp.: return ordinal element counters of combined arrays
    Dim i&, n&: n = UBound(main) + UBound(newTop) + 1
    ReDim tmp(0 To n)
    For i = 0 To UBound(newTop): tmp(i) = i: Next i
    For i = i To n: tmp(i) = i - UBound(newTop): Next i
    addedElems = tmp        ' return combined elem counters,  e.g. Array(1,2, 1,2,3,4,5)
End Function

Exemple d'appel

J'ai légèrement modifié les valeurs du deuxième tableau de l'OP ( Array(2) ~> Array(20,21) pour démontrer l'insertion de plus d'éléments, donc résultant en un ensemble Array(20,21,2,4,5,3,7,6) .

Sub ExampleCall()
'[0]declare and assign zero-based 1-dimensional arrays
    Dim main, newTop
    main = Array(4, 5, 3, 7, 6)
    newTop = Array(20, 21)
'[1]Add/Insert newTop on top of main array
    AddElem main:=main, newTop:=newTop     ' or simply: AddElem main, newTop

'[2](optional) display in VBE's Immediate Window: ~~> main(0 To 6) ...20|21|4|5|3|7|6
    Debug.Print "main(" & LBound(main) & " To " & UBound(main) & ") ..." & _
                Join(main, "|")
End Sub

Lien connexe

De même, vous pouvez étudier certaines particularités de la Application.Index() fonction appliquée sur des tableaux de 2 dimensions à Insérer la première colonne dans un tableau de champs de données sans boucles ni appels API

2voto

JvdV Points 16691

J'arrive tard dans la soirée, mais je vais aussi ajouter mon grain de sel.

Vous pourriez simplement copie l'un des deux tableaux dans un nouveau tableau. Ensuite, Redim Preserve qui est la taille des deux tableaux d'origine pour ensuite boucler seulement le premier tableau. Le code suivant est basique, mais fait le travail rapidement sans convertir aucun type de données :

Sub Test()

Dim arr1 As Variant: arr1 = Array(4, 5, 3, 7, 6)
Dim arr2 As Variant: arr2 = Array(2)
Dim arr3 As Variant: arr3 = arr2

ReDim Preserve arr3(UBound(arr1) + Ubound(arr2) + 1)
For x = (UBound(arr3) - UBound(arr1)) To UBound(arr3)
    arr3(x) = arr1(x - UBound(arr2) - 1)
Next x

End Sub

Pour démontrer le rendement de différents Data Type en utilisant Type les conversions :

Sub Test()

Dim arr1 As Variant: arr1 = Array(CDbl(4), CLng(5), CStr(3), CDate(7), CCur(6))
Dim arr2 As Variant: arr2 = Array(2)
Dim arr3 As Variant: arr3 = arr2

ReDim Preserve arr3(UBound(arr1) + Ubound(arr2) + 1)
For x = (UBound(arr3) - UBound(arr1)) To UBound(arr3)
    arr3(x) = arr1(x - UBound(arr2) - 1)
Next x

End Sub

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X