2016-05-29 25 views
4

Ich versuche, Formeln in einer Tabulator-getrennte Textdatei in einen Bereich in einem Arbeitsblatt geladen zu laden. Ich habe die Funktion Split(Expression As String, Delimiter) verwendet, um jede Zeile nacheinander in ein 1D-Array zu laden, habe aber Probleme bezüglich des zurückgegebenen Array-Typs festgestellt.Wie konvertiert man String-Array zu Variant-Array - Excel VBA

Die Split-Funktion gibt nur Arrays vom Typ String zurück, und ich brauche ein Array vom Typ Variant, um den Bereich auf zu setzen. Dies liegt daran, dass beim Festlegen der Formeln von Zellen mithilfe eines Array vom Typ "Zeichenfolgen" die Zellenwerte auf den unformatierten Text festgelegt werden, selbst wenn die Zeichenfolgen mit einem Gleichheitszeichen beginnen.

'Example code to demonstrate the problem: 
Sub Tester() 
    Dim StringArr(1 To 3) As String 
    StringArr(1) = "= 1" 
    StringArr(2) = "= 2" 
    StringArr(3) = "= 3" 
    Range("Sheet1!$A$1:$C$1").Formula = StringArr 
    'Cells display raw string until edited manually 

    Dim VariantArr(1 To 3) As Variant 
    VariantArr(1) = "= 1" 
    VariantArr(2) = "= 2" 
    VariantArr(3) = "= 3" 
    Range("Sheet1!$A$2:$C$2").Formula = VariantArr 
    'Cells display formula result correctly 
End Sub 

Resultierende Ausgabe:

output

Ich mag würde wissen, ob es einen Weg gibt, um das Array von der zurück Split Funktion einer Variante Typ Array, vorzugsweise ohne Schleifen zu konvertieren. Mir ist bewusst, dass ich jede Zellenformel individuell innerhalb einer Schleife einstellen kann, aber ich versuche, sie so effizient und sauber wie möglich zu halten.

Ich verwende Microsoft Excel für Mac 2011, Version 14.5.5. VBA treibt mich die Mauer hoch.

+1

Sie können sie immer nur einzeln oder mit einer Schleife einfügen, und es wird funktionieren; versuche 'Range (" Sheet1! $ A $ 1 "). Formula = StringArr (1)' Ich weiß nicht warum. –

+0

Ich denke, es hat damit zu tun, dass Zellen im Excel-Arbeitsblatt vom Variant-Typ sind, und indem man das ganze Array auf einmal setzt, werden die Zellen in Zeichenkettentypen gezwungen, so dass sie dem Array entsprechen. Dies bleibt so lange bestehen, bis sie wieder bearbeitet werden und sie dann in den Variantentyp zurückversetzt werden.Eine andere Methode Wenn das String-Array groß ist, würde man das String-Array durchlaufen und die Werte in ein variantes Array setzen und dann zuweisen. Oder, wenn das String-Array klein ist, dann wie oben beschrieben durchschleifen und die Formel individuell zuweisen. –

+0

@ScottCraner Ja, das macht Sinn - es sieht so aus, als würde ich mich an eine der Methoden halten, die du vorhin vorgeschlagen hast. Weißt du, ob es eine Möglichkeit gibt, den Typ des Arrays auf einmal zu ändern? –

Antwort

1

Sie WorksheetFunction.Index verwenden können (oder Application.Index) das Array von String zur Anordnung von Variant/String zu konvertieren:

Sub Test() 

    StringArr = Split("=1 =2 =3") 
    VariantArr = WorksheetFunction.Index(StringArr, 1, 0) 
    Range("Sheet1!$A$1:$C$1").Formula = StringArr 
    Range("Sheet1!$A$2:$C$2").Formula = VariantArr 

End Sub 

Hier sind Array-Typen:

locals

Und erwarteter Ausgang:

output

+0

Komisch, ich denke, es ist nur eine andere Art, das Array auf sich selbst zu setzen und aus irgendeinem Grund den Variablentyp in eine Variante zu ändern. Ich habe das erfolgreich in meinem Projekt verwendet - Prost! –

1

Ich habe eine Textdatei mit ein paar Formeln erstellt. Ich habe das "|" Zeichen anstelle von "," oder Tabulatorzeichen getrennt. Sie können die Funktion zum Ersetzen von find & in einem Texteditor verwenden, um die vier Leerzeichen zu "|" Wenn du kannst.

Forumulas

Dann habe ich diesen Code in VBA

Sub loadFormula() 


Dim fso As Object, textFile As Object: Set fso = CreateObject("Scripting.FileSystemObject") 
Dim textFileStr As String 
Dim textFileArr As Variant 
Dim outputArr() As Variant 
Dim oneRow As Variant 
Dim numRows, numColumns As Long 

If Dir("C:\Users\dawsong4\Documents\Reports\WIP\formula.txt") = "" Then 
    Exit Sub 
Else 
    potentialFileToLoad = "C:\Users\dawsong4\Documents\Reports\WIP\formula.txt" 
End If 

Set textFile = fso.OpenTextFile(potentialFileToLoad, 1) 
textFileStr = textFile.ReadAll 
textFile.Close 

Set textFile = Nothing 
Set fso = Nothing 

textFileArr = Split(textFileStr, Chr(10)) 
numRows = UBound(textFileArr) 
numColumns = UBound(Split(textFileArr(0), "|")) 
ReDim outputArr(numRows, numColumns) 

For ii = 0 To (numRows - 1) 
    oneRow = Split(textFileArr(ii), "|") 
    For jj = 0 To numColumns 
    outputArr(ii, jj) = oneRow(jj) 

    Next jj 
Next ii 

Worksheets("Data").Range("A2:P1048576").ClearContents 
Worksheets("Data").Range("A2").Resize(numRows + 1, numColumns).Value = outputArr 

End Sub 

Und das Ergebnis in Excel war:

result

Hoffnung, das hilft!

P.S. Ich stelle mir vor, wenn Sie "" vier Leerzeichen verwenden (wie viele tabulatorgetrennte Textdateien), anstelle von "|" es wird die gleiche Arbeit

+0

Vielen Dank für Ihre Antwort, es sieht so aus, als würde es funktionieren. Ich sagte jedoch in meiner Frage, dass ich wusste, dass ich jede Zellenformel individuell innerhalb einer Schleife einstellen konnte, aber versuchte, sie so effizient und sauber wie möglich zu halten (und somit jede Zeile auf einmal zu setzen, ohne die Zellen) –