Je sais que vous pouvez facilement prendre une gamme de cellules et les gifler dans un tableau de variantes, mais je veux travailler avec un réseau de strings (car il est monodimensionnel et prend less de memory qu'une série de variantes).
Existe-t-il un moyen de convertir automatiquement une gamme en une string de caractères?
À l'heure actuelle, j'utilise une fonction qui prendra la gamme et sauvegardera les valeurs dans une masortingce variante, puis convertira le tableau variant en string. Cela fonctionne bien, mais je cherche un moyen d'aller directement de la gamme à la string de caractères. Toute aide serait grandement appréciée.
Function RangeToArray(ByVal my_range As Range) As Ssortingng() Dim vArray As Variant Dim sArray() As Ssortingng Dim i As Long vArray = my_range.Value ReDim sArray(1 To UBound(vArray)) For i = 1 To UBound(vArray) sArray(i) = vArray(i, 1) Next RangeToArray = sArray() End Function
MISE À JOUR: Il semble qu'il n'y ait aucun moyen de sauter l'étape de lancer datatables dans un tableau variable d'abord avant de la convertir en un tableau de strings à une seule dimension. Une honte si c'est vrai (même si cela ne prend pas beaucoup d'effort, j'aime trop optimiser, alors j'espérais qu'il y avait un moyen de sauter cette étape). Je fermerai la question dans quelques jours si aucune solution ne se présente. Merci pour les commentaires utiles, les gars!
UPDATE2: La réponse va à Simon qui a mis beaucoup d'efforts (tout comme l'ont fait tous les autres) et a souligné clairement qu'il est effectivement impossible de passer de la gamme à la string en un seul coup. Merci tout le monde.
Que diriez-vous…
Public Function RangeToSsortingngArray(theRange As Excel.Range) As Ssortingng() ' Get values into a variant array Dim variantValues As Variant variantValues = theRange.Value ' Set up a ssortingng array for them Dim ssortingngValues() As Ssortingng ReDim ssortingngValues(1 To UBound(variantValues, 1), 1 To UBound(variantValues, 2)) ' Put them in there! Dim columnCounter As Long, rowCounter As Long For rowCounter = UBound(variantValues, 1) To 1 Step -1 For columnCounter = UBound(variantValues, 2) To 1 Step -1 ssortingngValues(rowCounter, columnCounter) = CStr(variantValues(rowCounter, columnCounter)) Next columnCounter Next rowCounter ' Return the ssortingng array RangeToSsortingngArray = ssortingngValues End Function
Fonction publique RangeToSsortingngArray (theRange As Excel.Range) As Ssortingng ()Public Function RangeToSsortingngArray(theRange As Excel.Range) As Ssortingng() ' Get values into a variant array Dim variantValues As Variant variantValues = theRange.Value ' Set up a ssortingng array for them Dim ssortingngValues() As Ssortingng ReDim ssortingngValues(1 To UBound(variantValues, 1), 1 To UBound(variantValues, 2)) ' Put them in there! Dim columnCounter As Long, rowCounter As Long For rowCounter = UBound(variantValues, 1) To 1 Step -1 For columnCounter = UBound(variantValues, 2) To 1 Step -1 ssortingngValues(rowCounter, columnCounter) = CStr(variantValues(rowCounter, columnCounter)) Next columnCounter Next rowCounter ' Return the ssortingng array RangeToSsortingngArray = ssortingngValues End Function
'Obtenir des valeurs dans un set de variantesPublic Function RangeToSsortingngArray(theRange As Excel.Range) As Ssortingng() ' Get values into a variant array Dim variantValues As Variant variantValues = theRange.Value ' Set up a ssortingng array for them Dim ssortingngValues() As Ssortingng ReDim ssortingngValues(1 To UBound(variantValues, 1), 1 To UBound(variantValues, 2)) ' Put them in there! Dim columnCounter As Long, rowCounter As Long For rowCounter = UBound(variantValues, 1) To 1 Step -1 For columnCounter = UBound(variantValues, 2) To 1 Step -1 ssortingngValues(rowCounter, columnCounter) = CStr(variantValues(rowCounter, columnCounter)) Next columnCounter Next rowCounter ' Return the ssortingng array RangeToSsortingngArray = ssortingngValues End Function
Dim VariantValues As VariantPublic Function RangeToSsortingngArray(theRange As Excel.Range) As Ssortingng() ' Get values into a variant array Dim variantValues As Variant variantValues = theRange.Value ' Set up a ssortingng array for them Dim ssortingngValues() As Ssortingng ReDim ssortingngValues(1 To UBound(variantValues, 1), 1 To UBound(variantValues, 2)) ' Put them in there! Dim columnCounter As Long, rowCounter As Long For rowCounter = UBound(variantValues, 1) To 1 Step -1 For columnCounter = UBound(variantValues, 2) To 1 Step -1 ssortingngValues(rowCounter, columnCounter) = CStr(variantValues(rowCounter, columnCounter)) Next columnCounter Next rowCounter ' Return the ssortingng array RangeToSsortingngArray = ssortingngValues End Function
VariantValues = theRange.ValuePublic Function RangeToSsortingngArray(theRange As Excel.Range) As Ssortingng() ' Get values into a variant array Dim variantValues As Variant variantValues = theRange.Value ' Set up a ssortingng array for them Dim ssortingngValues() As Ssortingng ReDim ssortingngValues(1 To UBound(variantValues, 1), 1 To UBound(variantValues, 2)) ' Put them in there! Dim columnCounter As Long, rowCounter As Long For rowCounter = UBound(variantValues, 1) To 1 Step -1 For columnCounter = UBound(variantValues, 2) To 1 Step -1 ssortingngValues(rowCounter, columnCounter) = CStr(variantValues(rowCounter, columnCounter)) Next columnCounter Next rowCounter ' Return the ssortingng array RangeToSsortingngArray = ssortingngValues End Function
'Configurer un set de strings pour euxPublic Function RangeToSsortingngArray(theRange As Excel.Range) As Ssortingng() ' Get values into a variant array Dim variantValues As Variant variantValues = theRange.Value ' Set up a ssortingng array for them Dim ssortingngValues() As Ssortingng ReDim ssortingngValues(1 To UBound(variantValues, 1), 1 To UBound(variantValues, 2)) ' Put them in there! Dim columnCounter As Long, rowCounter As Long For rowCounter = UBound(variantValues, 1) To 1 Step -1 For columnCounter = UBound(variantValues, 2) To 1 Step -1 ssortingngValues(rowCounter, columnCounter) = CStr(variantValues(rowCounter, columnCounter)) Next columnCounter Next rowCounter ' Return the ssortingng array RangeToSsortingngArray = ssortingngValues End Function
Dim ssortingngValues () As SsortingngPublic Function RangeToSsortingngArray(theRange As Excel.Range) As Ssortingng() ' Get values into a variant array Dim variantValues As Variant variantValues = theRange.Value ' Set up a ssortingng array for them Dim ssortingngValues() As Ssortingng ReDim ssortingngValues(1 To UBound(variantValues, 1), 1 To UBound(variantValues, 2)) ' Put them in there! Dim columnCounter As Long, rowCounter As Long For rowCounter = UBound(variantValues, 1) To 1 Step -1 For columnCounter = UBound(variantValues, 2) To 1 Step -1 ssortingngValues(rowCounter, columnCounter) = CStr(variantValues(rowCounter, columnCounter)) Next columnCounter Next rowCounter ' Return the ssortingng array RangeToSsortingngArray = ssortingngValues End Function
ReDim ssortingngValues (1 à UBound (variantValues, 1), 1 à UBound (variantValues, 2))Public Function RangeToSsortingngArray(theRange As Excel.Range) As Ssortingng() ' Get values into a variant array Dim variantValues As Variant variantValues = theRange.Value ' Set up a ssortingng array for them Dim ssortingngValues() As Ssortingng ReDim ssortingngValues(1 To UBound(variantValues, 1), 1 To UBound(variantValues, 2)) ' Put them in there! Dim columnCounter As Long, rowCounter As Long For rowCounter = UBound(variantValues, 1) To 1 Step -1 For columnCounter = UBound(variantValues, 2) To 1 Step -1 ssortingngValues(rowCounter, columnCounter) = CStr(variantValues(rowCounter, columnCounter)) Next columnCounter Next rowCounter ' Return the ssortingng array RangeToSsortingngArray = ssortingngValues End Function
'Mets-les là-bas!Public Function RangeToSsortingngArray(theRange As Excel.Range) As Ssortingng() ' Get values into a variant array Dim variantValues As Variant variantValues = theRange.Value ' Set up a ssortingng array for them Dim ssortingngValues() As Ssortingng ReDim ssortingngValues(1 To UBound(variantValues, 1), 1 To UBound(variantValues, 2)) ' Put them in there! Dim columnCounter As Long, rowCounter As Long For rowCounter = UBound(variantValues, 1) To 1 Step -1 For columnCounter = UBound(variantValues, 2) To 1 Step -1 ssortingngValues(rowCounter, columnCounter) = CStr(variantValues(rowCounter, columnCounter)) Next columnCounter Next rowCounter ' Return the ssortingng array RangeToSsortingngArray = ssortingngValues End Function
Dim columnCounter As Long, rowCounter As LongPublic Function RangeToSsortingngArray(theRange As Excel.Range) As Ssortingng() ' Get values into a variant array Dim variantValues As Variant variantValues = theRange.Value ' Set up a ssortingng array for them Dim ssortingngValues() As Ssortingng ReDim ssortingngValues(1 To UBound(variantValues, 1), 1 To UBound(variantValues, 2)) ' Put them in there! Dim columnCounter As Long, rowCounter As Long For rowCounter = UBound(variantValues, 1) To 1 Step -1 For columnCounter = UBound(variantValues, 2) To 1 Step -1 ssortingngValues(rowCounter, columnCounter) = CStr(variantValues(rowCounter, columnCounter)) Next columnCounter Next rowCounter ' Return the ssortingng array RangeToSsortingngArray = ssortingngValues End Function
Pour rowCounter = UBound (variantValues, 1) À 1 étape -1Public Function RangeToSsortingngArray(theRange As Excel.Range) As Ssortingng() ' Get values into a variant array Dim variantValues As Variant variantValues = theRange.Value ' Set up a ssortingng array for them Dim ssortingngValues() As Ssortingng ReDim ssortingngValues(1 To UBound(variantValues, 1), 1 To UBound(variantValues, 2)) ' Put them in there! Dim columnCounter As Long, rowCounter As Long For rowCounter = UBound(variantValues, 1) To 1 Step -1 For columnCounter = UBound(variantValues, 2) To 1 Step -1 ssortingngValues(rowCounter, columnCounter) = CStr(variantValues(rowCounter, columnCounter)) Next columnCounter Next rowCounter ' Return the ssortingng array RangeToSsortingngArray = ssortingngValues End Function
Pour columnCounter = UBound (VariantValues, 2) To 1 Step -1Public Function RangeToSsortingngArray(theRange As Excel.Range) As Ssortingng() ' Get values into a variant array Dim variantValues As Variant variantValues = theRange.Value ' Set up a ssortingng array for them Dim ssortingngValues() As Ssortingng ReDim ssortingngValues(1 To UBound(variantValues, 1), 1 To UBound(variantValues, 2)) ' Put them in there! Dim columnCounter As Long, rowCounter As Long For rowCounter = UBound(variantValues, 1) To 1 Step -1 For columnCounter = UBound(variantValues, 2) To 1 Step -1 ssortingngValues(rowCounter, columnCounter) = CStr(variantValues(rowCounter, columnCounter)) Next columnCounter Next rowCounter ' Return the ssortingng array RangeToSsortingngArray = ssortingngValues End Function
ssortingngValues (rowCounter, columnCounter) = CStr (variantValues (rowCounter, columnCounter))Public Function RangeToSsortingngArray(theRange As Excel.Range) As Ssortingng() ' Get values into a variant array Dim variantValues As Variant variantValues = theRange.Value ' Set up a ssortingng array for them Dim ssortingngValues() As Ssortingng ReDim ssortingngValues(1 To UBound(variantValues, 1), 1 To UBound(variantValues, 2)) ' Put them in there! Dim columnCounter As Long, rowCounter As Long For rowCounter = UBound(variantValues, 1) To 1 Step -1 For columnCounter = UBound(variantValues, 2) To 1 Step -1 ssortingngValues(rowCounter, columnCounter) = CStr(variantValues(rowCounter, columnCounter)) Next columnCounter Next rowCounter ' Return the ssortingng array RangeToSsortingngArray = ssortingngValues End Function
Next columnCounterPublic Function RangeToSsortingngArray(theRange As Excel.Range) As Ssortingng() ' Get values into a variant array Dim variantValues As Variant variantValues = theRange.Value ' Set up a ssortingng array for them Dim ssortingngValues() As Ssortingng ReDim ssortingngValues(1 To UBound(variantValues, 1), 1 To UBound(variantValues, 2)) ' Put them in there! Dim columnCounter As Long, rowCounter As Long For rowCounter = UBound(variantValues, 1) To 1 Step -1 For columnCounter = UBound(variantValues, 2) To 1 Step -1 ssortingngValues(rowCounter, columnCounter) = CStr(variantValues(rowCounter, columnCounter)) Next columnCounter Next rowCounter ' Return the ssortingng array RangeToSsortingngArray = ssortingngValues End Function
Next rowCounterPublic Function RangeToSsortingngArray(theRange As Excel.Range) As Ssortingng() ' Get values into a variant array Dim variantValues As Variant variantValues = theRange.Value ' Set up a ssortingng array for them Dim ssortingngValues() As Ssortingng ReDim ssortingngValues(1 To UBound(variantValues, 1), 1 To UBound(variantValues, 2)) ' Put them in there! Dim columnCounter As Long, rowCounter As Long For rowCounter = UBound(variantValues, 1) To 1 Step -1 For columnCounter = UBound(variantValues, 2) To 1 Step -1 ssortingngValues(rowCounter, columnCounter) = CStr(variantValues(rowCounter, columnCounter)) Next columnCounter Next rowCounter ' Return the ssortingng array RangeToSsortingngArray = ssortingngValues End Function
'Retourner la stringPublic Function RangeToSsortingngArray(theRange As Excel.Range) As Ssortingng() ' Get values into a variant array Dim variantValues As Variant variantValues = theRange.Value ' Set up a ssortingng array for them Dim ssortingngValues() As Ssortingng ReDim ssortingngValues(1 To UBound(variantValues, 1), 1 To UBound(variantValues, 2)) ' Put them in there! Dim columnCounter As Long, rowCounter As Long For rowCounter = UBound(variantValues, 1) To 1 Step -1 For columnCounter = UBound(variantValues, 2) To 1 Step -1 ssortingngValues(rowCounter, columnCounter) = CStr(variantValues(rowCounter, columnCounter)) Next columnCounter Next rowCounter ' Return the ssortingng array RangeToSsortingngArray = ssortingngValues End Function
RangeToSsortingngArray = ssortingngValuesPublic Function RangeToSsortingngArray(theRange As Excel.Range) As Ssortingng() ' Get values into a variant array Dim variantValues As Variant variantValues = theRange.Value ' Set up a ssortingng array for them Dim ssortingngValues() As Ssortingng ReDim ssortingngValues(1 To UBound(variantValues, 1), 1 To UBound(variantValues, 2)) ' Put them in there! Dim columnCounter As Long, rowCounter As Long For rowCounter = UBound(variantValues, 1) To 1 Step -1 For columnCounter = UBound(variantValues, 2) To 1 Step -1 ssortingngValues(rowCounter, columnCounter) = CStr(variantValues(rowCounter, columnCounter)) Next columnCounter Next rowCounter ' Return the ssortingng array RangeToSsortingngArray = ssortingngValues End Function
Function RangeToSsortingngArray(myRange as range) as Ssortingng() ReDim strArray(myRange.Cells.Count - 1) As Ssortingng Dim idx As Long Dim c As Range For Each c In myRange Set strArray(idx) = c.Text idx = idx + 1 Next c RangeToSsortingngArray = strArray End sub
Fonction RangeToSsortingngArray (myRange as range) en tant que Ssortingng ()Function RangeToSsortingngArray(myRange as range) as Ssortingng() ReDim strArray(myRange.Cells.Count - 1) As Ssortingng Dim idx As Long Dim c As Range For Each c In myRange Set strArray(idx) = c.Text idx = idx + 1 Next c RangeToSsortingngArray = strArray End sub
ReDim strArray (myRange.Cells.Count - 1) As SsortingngFunction RangeToSsortingngArray(myRange as range) as Ssortingng() ReDim strArray(myRange.Cells.Count - 1) As Ssortingng Dim idx As Long Dim c As Range For Each c In myRange Set strArray(idx) = c.Text idx = idx + 1 Next c RangeToSsortingngArray = strArray End sub
Dim idx As LongFunction RangeToSsortingngArray(myRange as range) as Ssortingng() ReDim strArray(myRange.Cells.Count - 1) As Ssortingng Dim idx As Long Dim c As Range For Each c In myRange Set strArray(idx) = c.Text idx = idx + 1 Next c RangeToSsortingngArray = strArray End sub
Dim c As RangeFunction RangeToSsortingngArray(myRange as range) as Ssortingng() ReDim strArray(myRange.Cells.Count - 1) As Ssortingng Dim idx As Long Dim c As Range For Each c In myRange Set strArray(idx) = c.Text idx = idx + 1 Next c RangeToSsortingngArray = strArray End sub
Pour chaque c Dans myRangeFunction RangeToSsortingngArray(myRange as range) as Ssortingng() ReDim strArray(myRange.Cells.Count - 1) As Ssortingng Dim idx As Long Dim c As Range For Each c In myRange Set strArray(idx) = c.Text idx = idx + 1 Next c RangeToSsortingngArray = strArray End sub
Définir strArray (idx) = c.TexteFunction RangeToSsortingngArray(myRange as range) as Ssortingng() ReDim strArray(myRange.Cells.Count - 1) As Ssortingng Dim idx As Long Dim c As Range For Each c In myRange Set strArray(idx) = c.Text idx = idx + 1 Next c RangeToSsortingngArray = strArray End sub
idx = idx + 1Function RangeToSsortingngArray(myRange as range) as Ssortingng() ReDim strArray(myRange.Cells.Count - 1) As Ssortingng Dim idx As Long Dim c As Range For Each c In myRange Set strArray(idx) = c.Text idx = idx + 1 Next c RangeToSsortingngArray = strArray End sub
Suivant cFunction RangeToSsortingngArray(myRange as range) as Ssortingng() ReDim strArray(myRange.Cells.Count - 1) As Ssortingng Dim idx As Long Dim c As Range For Each c In myRange Set strArray(idx) = c.Text idx = idx + 1 Next c RangeToSsortingngArray = strArray End sub
RangeToSsortingngArray = strArrayFunction RangeToSsortingngArray(myRange as range) as Ssortingng() ReDim strArray(myRange.Cells.Count - 1) As Ssortingng Dim idx As Long Dim c As Range For Each c In myRange Set strArray(idx) = c.Text idx = idx + 1 Next c RangeToSsortingngArray = strArray End sub
Vous pouvez effectivement passer directement d'une gamme à un tableau en utilisant les fonctions Split, Join et un délimiteur non dans le text.
En supposant que vous avez déjà atsortingbué une gamme de valeurs 1D comme SrcRange
Dim Array() As Ssortingng: Array = Split(Join(Application.Transpose(SrcRange), "#"), "#")
Si cela ne vous dérange pas de modifier le contenu du presse-papiers, procédez comme suit:
COPIEz la scope dans le presse-papier avec la méthode Copier:
MyTargetRange.Copy
Copiez le contenu du presse-papiers vers une variable de string (searchz ce site ou ailleurs pour les fonctions de transfert de strings vers / depuis le presse-papiers).
SPLIT la string dans un set de variantes:
MySsortingngArray = Split(MyClipboardText, vbCrLf)
OPTIONNEL: Le tableau aura un élément vierge supplémentaire car il y a toujours un renvoi supplémentaire (vbCrLf) à la fin du text que vous venez de copyr dans le presse-papiers. Pour supprimer simplement resize le tableau:
Redim Preserve MySsortingngArray(Ubound(MySsortingngArray) - 1)
Très simple et rapide !!!
Les inconvénients sont que le presse-papiers peut changer lorsque vous vous attendez le less (pendant un nouveau calcul) et qu'il ne produit que des masortingces de strings (pas des doubles ou d'autres types de valeur numérique).
Cela serait EXTRÊMEMENT UTILE si vous travaillez avec beaucoup de fonctions répétitives (milliers) qui utilisent les mêmes données (des milliers de points de données). La première fois que votre fonction est appelée, effectuez tous les calculs intermédiaires sur les plages de données dont vous avez besoin, mais enregistrez les résultats dans des variables statiques. Égalisez également une copy de string de vos plages d'input via le presse-papiers. Avec chaque appel ultérieur à votre fonction, convertissez les plages d'input en text, à nouveau via le Presse-papiers et comparez-en avec la copy enregistrée. Si elles sont identiques, vous pouvez contourner les calculs préliminaires.
Les gammes nommées utilisées dans VBA sont déjà des arrays. Donc, faites d'abord la gamme dans une gamme nommée, puis renvoyez-la et supprimez la gamme nommée. Par exemple:
ThisWorkbook.Names.Add Name:="test_array", RefersTo:=Sheet1.Range("A4:B10") a = Sheet1.Range("test_array") ThisWorkbook.Names("test_array").Delete
ThisWorkbook.Names.Add Name: = "test_array", RefersTo: = Sheet1.Range ("A4: B10")ThisWorkbook.Names.Add Name:="test_array", RefersTo:=Sheet1.Range("A4:B10") a = Sheet1.Range("test_array") ThisWorkbook.Names("test_array").Delete
a = Sheet1.Range ("test_array")ThisWorkbook.Names.Add Name:="test_array", RefersTo:=Sheet1.Range("A4:B10") a = Sheet1.Range("test_array") ThisWorkbook.Names("test_array").Delete