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)
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)
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 ","
.
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
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
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
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
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.