Excel VBA: intervallo su array di stringhe in 1 step

So che puoi facilmente prendere un intervallo di celle e schiaffarle in un array Variant ma voglio lavorare con un array di stringhe (perché è unidimensionale e richiede meno memoria di un array Variant).

C’è un modo per convertire automaticamente un intervallo in un array di stringhe?

In questo momento sto usando una funzione che prenderà l’intervallo e salverà i valori in un array variante, quindi convertiremo l’array variante in un array di stringhe. Funziona bene, ma sto cercando un modo per passare direttamente dalla gamma all’array di stringhe. Qualsiasi aiuto sarebbe molto apprezzato.

Function RangeToArray(ByVal my_range As Range) As String() Dim vArray As Variant Dim sArray() As String 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 

AGGIORNAMENTO: Sembra che non ci sia modo di saltare il passaggio del lancio dei dati in un array di variabili prima di convertirlo in un array di stringhe monodesmensionali. Un peccato se è vero (anche se non ci vuole molto sforzo, mi piace ultra-ottimizzare quindi speravo che ci fosse un modo per saltare quel passaggio). Chiuderò la domanda tra qualche giorno se nessuna soluzione si presenta. Grazie per i commenti utili, ragazzi!

AGGIORNAMENTO2: La risposta va a Simon che ha fatto un grande sforzo (così come tutti gli altri) e ha sottolineato che è davvero imansible passare dall’array all’array di stringhe in un colpo solo. Grazie a tutti.

Che ne dite di…

 Public Function RangeToStringArray(theRange As Excel.Range) As String() ' Get values into a variant array Dim variantValues As Variant variantValues = theRange.Value ' Set up a string array for them Dim stringValues() As String ReDim stringValues(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 stringValues(rowCounter, columnCounter) = CStr(variantValues(rowCounter, columnCounter)) Next columnCounter Next rowCounter ' Return the string array RangeToStringArray = stringValues End Function 

In realtà puoi passare direttamente da un intervallo a un array utilizzando le funzioni Dividi, Unisci e un delimitatore non nel testo.

Supponendo che tu abbia già assegnato un intervallo di valori 1D come SrcRange

 Dim Array() As String: Array = Split(Join(Application.Transpose(SrcRange), "#"), "#") 
 Function RangeToStringArray(myRange as range) as String() ReDim strArray(myRange.Cells.Count - 1) As String Dim idx As Long Dim c As Range For Each c In myRange Set strArray(idx) = c.Text idx = idx + 1 Next c RangeToStringArray = strArray End sub 

Se non ti dispiace alterare il contenuto degli appunti, allora:

  1. COPY l’intervallo negli appunti con il metodo Copy:

     MyTargetRange.Copy 
  2. Copia il contenuto dagli Appunti a una variabile stringa (cerca in questo sito o altrove per le funzioni per trasferire le stringhe negli Appunti).

  3. SPLIT la stringa in una matrice variante:

     MyStringArray = Split(MyClipboardText, vbCrLf) 
  4. FACOLTATIVO: l’array avrà un elemento vuoto aggiuntivo perché c’è sempre un ritorno aggiuntivo (vbCrLf) alla fine del testo che hai appena copiato negli appunti. Per rimuovere semplicemente ridimensiona l’array:

     Redim Preserve MyStringArray(Ubound(MyStringArray) - 1) 

Molto semplice e veloce !!!

Gli svantaggi sono che gli appunti possono cambiare quando meno te lo aspetti (durante un ricalcolo) e che produce solo matrici di stringhe (non Doubles o altri tipi di valori numerici).

Questo sarebbe ESTREMAMENTE UTILE se stai lavorando con molte funzioni ripetitive (migliaia) che usano gli stessi dati (migliaia di punti dati). La prima volta che viene chiamata la funzione, eseguire tutti i calcoli intermedi sugli intervalli di dati necessari ma salvare i risultati in variabili statiche. Salva anche una copia di stringa dei tuoi intervalli di input tramite gli appunti. Con ogni chiamata successiva alla tua funzione, converti gli intervalli di input in testo, sempre tramite gli Appunti, e confrontali con la copia salvata. Se sono uguali potresti essere in grado di bypassare i tuoi calcoli preliminari.

Gli intervalli denominati utilizzati in VBA sono già array. Quindi, prima estrai l’intervallo in un intervallo denominato, quindi fai riferimento ad esso ed elimina l’intervallo denominato. Per esempio:

 ThisWorkbook.Names.Add Name:="test_array", RefersTo:=Sheet1.Range("A4:B10") a = Sheet1.Range("test_array") ThisWorkbook.Names("test_array").Delete