wake-up-neo.net

VBA (Excel) Initialisiert das gesamte Array ohne Schleifen

Ich bin relativ neu in der VBA, daher kann dies eine einfache Frage sein, aber hier geht es weiter.

Ich möchte ein ganzes Array myArray, beispielsweise von Ganzzahlen, in VBA initialisieren. Ich weiß, dass ich dies durch eine einfache Initialisierung wie folgt tun kann:

Dim myArray
myArray = Array(1, 2, 4, 8)

Wenn das Array groß ist, ist dies jedoch umständlich, und ich möchte alle Elemente mit demselben Wert initialisieren. Im Idealfall würde es so aussehen:

myArray(:) = 0

Ich habe es versucht, aber der Compiler hat sich beschwert. Dann habe ich myArray() = 0 ausprobiert und es hat sich auch darüber beschwert.

Kann jemand erklären, wie das geht, ohne Schleife? Ich möchte es in einer Aussage machen, wenn möglich.

Klarstellung:

Ich möchte jedes einzelne Element des Arrays mit einem anfänglichen Wert initialisieren. Wenn also beispielsweise ein Array Dim myArray(300) As Integer von 300 Ganzzahlen besteht, würden alle 300 Elemente den gleichen Anfangswert (z. B. die Zahl 13) enthalten.

Mehr Klarheit

Ich habe diese Antwort die besagt, dass Sie dies mit einer Variablen wie folgt machen können:

Dim x As Double: x = 0

Vielleicht gibt es eine Möglichkeit, die Syntax leicht zu aktualisieren, um sie auf Arrays anwendbar zu machen?

34
user1205577

Dies ist einfach, zumindest wenn Sie ein 1-basiertes, 1D- oder 2D-Varianten-Array wünschen:

Sub StuffVArr()
    Dim v() As Variant
    Dim q() As Variant
    v = Evaluate("=IF(ISERROR(A1:K1), 13, 13)")
    q = Evaluate("=IF(ISERROR(A1:G48), 13, 13)")
End Sub

Byte-Arrays sind auch nicht so schlecht:

Private Declare Sub FillMemory Lib "kernel32" Alias "RtlFillMemory" _
        (dest As Any, ByVal size As Long, ByVal fill As Byte)

Sub StuffBArr()
    Dim i(0 To 39) As Byte
    Dim j(1 To 2, 5 To 29, 2 To 6) As Byte
    FillMemory i(0), 40, 13
    FillMemory j(1, 5, 2), 2 * 25 * 5, 13
End Sub

Sie können dieselbe Methode verwenden, um Arrays anderer numerischer Datentypen zu füllen. Sie sind jedoch auf Werte beschränkt, die mit einem einzelnen sich wiederholenden Byte dargestellt werden können:

Sub StuffNArrs()
    Dim i(0 To 4) As Long
    Dim j(0 To 4) As Integer
    Dim u(0 To 4) As Currency
    Dim f(0 To 4) As Single
    Dim g(0 To 4) As Double

    FillMemory i(0), 5 * LenB(i(0)), &HFF 'gives -1
    FillMemory i(0), 5 * LenB(i(0)), &H80 'gives -2139062144
    FillMemory i(0), 5 * LenB(i(0)), &H7F 'gives 2139062143

    FillMemory j(0), 5 * LenB(j(0)), &HFF 'gives -1

    FillMemory u(0), 5 * LenB(u(0)), &HFF 'gives -0.0001

    FillMemory f(0), 5 * LenB(f(0)), &HFF 'gives -1.#QNAN
    FillMemory f(0), 5 * LenB(f(0)), &H80 'gives -1.18e-38
    FillMemory f(0), 5 * LenB(f(0)), &H7F 'gives 3.40e+38

    FillMemory g(0), 5 * LenB(g(0)), &HFF 'gives -1.#QNAN
End Sub

Wenn Sie in anderen Situationen eine Schleife vermeiden möchten, wird es noch haariger. Es lohnt sich nicht wirklich, es sei denn, Ihr Array ist 50 KB oder größer. Setzen Sie einfach jeden Wert in einer Schleife und Sie sind schnell genug,, wie ich in einer früheren Antwort von gesprochen habe.

26
Chel

Sie können das Array durch Angabe der Abmessungen initialisieren. Zum Beispiel

Dim myArray(10) As Integer
Dim myArray(1 to 10) As Integer

Wenn Sie mit Arrays arbeiten und dies das erste Mal ist, würde ich empfehlen, den WEBSITE von Chip Pearson zu besuchen.

Was initialisiert das? Was ist beispielsweise, wenn ich das gesamte Array auf 13 initialisieren möchte? 

Wenn Sie das Array mit 13 Elementen initialisieren möchten, haben Sie zwei Möglichkeiten

Dim myArray(12) As Integer
Dim myArray(1 to 13) As Integer

Im ersten Fall beginnt die untere Grenze des Arrays mit 0, sodass Sie 13 Elemente im Array speichern können. Zum Beispiel

myArray(0) = 1
myArray(1) = 2
'
'
'
myArray(12) = 13

Im zweiten Beispiel haben Sie die unteren Grenzen als 1 angegeben, sodass Ihr Array mit 1 beginnt und erneut 13 Werte speichern kann 

myArray(1) = 1
myArray(2) = 2
'
'
'
myArray(13) = 13

Wenn Sie ein Array mit einer der oben genannten Methoden initialisieren, ist der Wert jedes Elements im Array gleich 0. Um dies zu überprüfen, versuchen Sie diesen Code.

Sub Sample()
    Dim myArray(12) As Integer
    Dim i As Integer

    For i = LBound(myArray) To UBound(myArray)
        Debug.Print myArray(i)
    Next i
End Sub

oder

Sub Sample()
    Dim myArray(1 to 13) As Integer
    Dim i As Integer

    For i = LBound(myArray) To UBound(myArray)
        Debug.Print myArray(i)
    Next i
End Sub

FOLLOWUP VON KOMMENTAREN

In diesem Beispiel würde also jeder Wert 13 sein. Wenn ich also ein Array Dim myArray (300) As Integer hätte, würden alle 300 Elemente den Wert 13 enthalten

Wie ich schon erwähnt habe, AFAIK, gibt es keinen direkten Weg, um das zu erreichen, was Sie wollen. Dies ist jedoch eine Möglichkeit, die Arbeitsblattfunktion Rept zu verwenden, um eine sich wiederholende Zeichenfolge von 13 zu erstellen. Sobald wir diese Zeichenfolge haben, können wir SPLIT verwenden, wobei "," als Trennzeichen verwendet wird. Beachten Sie jedoch, dass dadurch ein variantes Array erstellt wird, das jedoch in Berechnungen verwendet werden kann.

Beachten Sie auch, dass in den folgenden Beispielen myArray tatsächlich 301 Werte enthält, von denen der letzte leer ist. Dies müsste berücksichtigt werden, indem Sie diesen Wert zusätzlich initialisieren oder das letzte "," von sNum vor der Split-Operation entfernen.

Sub Sample()
    Dim sNum As String
    Dim i As Integer
    Dim myArray

    '~~> Create a string with 13 three hundred times separated by comma
    '~~> 13,13,13,13...13,13 (300 times)
    sNum = WorksheetFunction.Rept("13,", 300)
    sNum = Left(sNum, Len(sNum) - 1)

    myArray = Split(sNum, ",")

    For i = LBound(myArray) To UBound(myArray)
        Debug.Print myArray(i)
    Next i
End Sub

Verwenden des varianten Arrays in Berechnungen

Sub Sample()
    Dim sNum As String
    Dim i As Integer
    Dim myArray

    '~~> Create a string with 13 three hundred times separated by comma
    sNum = WorksheetFunction.Rept("13,", 300)
    sNum = Left(sNum, Len(sNum) - 1)

    myArray = Split(sNum, ",")

    For i = LBound(myArray) To UBound(myArray)
        Debug.Print Val(myArray(i)) + Val(myArray(i))
    Next i
End Sub
10
Siddharth Rout

Ich möchte jedes einzelne Element des Arrays mit einem anfänglichen Wert initialisieren. Wenn ich also ein Array Dim myArray (300) als Integer von 300 ganzen Zahlen habe, würden alle 300 Elemente denselben Anfangswert (beispielsweise die Zahl 13) enthalten.

Kann jemand erklären, wie das geht, ohne Looping? Ich würde es gerne machen wenn möglich in einer Aussage.

Was gewinne ich?

Sub SuperTest()
   Dim myArray
   myArray = Application.Transpose([index(Row(1:300),)-index(Row(1:300),)+13])
End Sub
4
tbur

Diese Funktion arbeitet mit Variablen für Größe und Anfangswert. Sie kombiniert die Antworten von Tbur und Filipe.

Function ArrayIniValue(iSize As Integer, iValue As Integer)
Dim sIndex As String
sIndex = "INDEX(Row(1:" & iSize & "),)"
ArrayIniValue = Evaluate("=Transpose(" & sIndex & "-" & sIndex & "+" & iValue & ")")
End Function

So genannt:

myArray = ArrayIniValue(350, 13)
1
EEM

Für VBA müssen Sie zwei Zeilen initialisieren.

Sub TestArray()

Dim myArray
myArray = Array(1, 2, 4, 8)

End Sub
0
Santosh

Fantasievolle Art, @rdhs Antwort in eine Funktion zu setzen:

Function arrayZero(size As Integer)
  arrayZero = Evaluate("=IF(ISERROR(Transpose(A1:A" & size & ")), 0, 0)")
End Function

Und wie folgt verwenden:

myArray = arrayZero(15)
0
Filipe

Eine Methode, mit der ganzen Elementen eines Arrays Werte zugewiesen werden können, besteht darin, die Daten in ein nicht verwendetes Arbeitsblatt zu legen und dann die Werte aus dem Arbeitsblatt in das Array zurückzulesen. Zum Beispiel möchte ich ganze Elemente eines 5x5-Arrays mit Werten von 123 versehen. Hier ist der einzeilige Code, um eine solche Aufgabe zu implementieren:

ReDim MyArray(1 To 5, 1 To 5): Range("A1:E5") = 123: MyArray = Range("A1:E5")

Es ist zwar etwas langsam, aber es funktioniert gut. Sie können auch die Array-Deklaration löschen.

Range("A1:E5") = 123: MyArray = Range("A1:E5")

In der Tat können Sie den Wert einiger Elemente einfach ändern. Angenommen, Sie möchten den Wert der Elemente MyArray (1,1), MyArray (1,5), MyArray (3,3), MyArray (5,1) und MyArray (5,5) in 789 ändern Dann wird der Code so sein

Range("A1:E5") = 123: Range("A1,E1,C3,A5,E5") = 789: MyArray = Range("A1:E5")