2017-08-27 7 views
0

Ich habe einen Bereich voller Daten, die ich in ein Array einfügen möchte. In diesen Daten sind jedoch leere Zellen vorhanden, und ich möchte sie nicht in mein Array einschließen.Array mit Bereichswerten füllen, aber nicht, wenn Zelle leer ist

Ich habe die unten erstellt, aber es funktioniert nicht, ich habe versucht, eine msgbox "if has been triggered" in die IF Anweisung zu setzen und kein msgbox hat sich gezeigt, wenn dieser ausgeführt wird, die mir sagt der `IF-Anweisung nicht tatsächlich ausgelöst wird.

Dim rngAB As Range: Set rngAB = wsWeights.Range("AB4:AB" & wsWeights.Cells(Rows.count, "AB").End(xlUp).Row) 
Dim arr() As Variant 

k = 1 
For Each cell In rngAB 
    If cell.Value <> vbNullString Then 
     arr(k, 1) = cell.Value 
    k = k + 1 
    End If 
Next 

Wohin gehe ich hier falsch?

+0

Wenn die 'MsgBox' im' If' nicht gezeigt wird, das deutet darauf hin, dass die Spalte "AB" Ihres Arbeitsblatts vollständig leer ist. – YowE3K

Antwort

1

Der Hauptpunkt hier ist, was meinst du mit "leer"? Eine Zelle, die beispielsweise Empty ist, unterscheidet sich von einer, die vbNullString enthält.

Nur wissen Sie genau, was leer für Ihr Projekt bedeutet, aber einige gemeinsame Wege zu prüfen sind:

If IsEmpty() Then ... 
If Len(value) > 0 Then ... 
If Len(Trim(value)) > 0 Then ... 
If Trim(value & vbNullString) = vbNullString Then ... 

In Bezug auf den Code, müssen Sie Ihr Array dimensionieren, bevor Sie es bevölkern . Ein Weg, aber keineswegs die einzige Möglichkeit, Ihre Aufgabe zu erreichen wäre wie folgt (ich habe den IsEmpty() Fall angenommen):

Dim r As Long 
Dim data As Variant, n As Variant 
Dim col As Collection 
Dim arr() As Variant 

'Read sheet data into array. 
With Sheet1 
    data = .Range(.Range("AB4"), .Cells(.Rows.Count, "AB").End(xlUp)).Value2 
End With 

'Acquire the non-empty array indexes. 
Set col = New Collection 
For r = 1 To UBound(data, 1) 
    'We're using the IsEmpty() function. 
    If Not IsEmpty(data(r, 1)) Then col.Add r 

    'Uncomment any of the below if you prefer to use them instead: 
    'If Len(data(r, 1)) > 0 Then col.Add r 
    'If Trim(data(r, 1) & vbNullString) = vbNullString Then col.Add r 
Next 

'Dimension array to size of non-empty list. 
ReDim arr(1 To col.Count, 1 To 1) 

'Populate the array 
r = 1 
For Each n In col 
    arr(r, 1) = data(CLng(n), 1) 
    r = r + 1 
Next 
+1

FWIW - Wenn eine Zelle leer ist (dh nichts enthält, keine Formel, kein Wert), wird ein Test von 'If cell.Value = vbNullString Then' (und in ähnlicher Weise ein Test von 'If cell.Value <> vbNullString'), da der Zellenwert von 'Empty' vor der Ausführung des Vergleichs in eine Zeichenkette von' "" umgewandelt wird, und eine Zeichenkette von '" "' ist die gleiche wie 'vbNullString'. – YowE3K

+0

@ YowE3K, ja stimme voll und ganz zu. Ich bin nicht in die Fälle von Formel, CSV usw. gegangen - das ist ein guter Punkt. – Ambie

+0

Aber die große Frage ist ... warum trifft der OP-Code nicht die Msgbox, die sie in das "If" gestellt haben? Das bedeutet, dass alle Zellen in dem Bereich leer sind, was das Gegenteil von der Art von Problem ist, das Menschen normalerweise haben. Das ist, was mich ratlos gemacht hat. (Ein weiteres kleines Geheimnis des Lebens.) – YowE3K

1

dies sollte also funktionieren:

Sub FillArrayNoBlanks() 
Dim ws As Worksheet, Cell As Range 
Dim rngAB As Range, k As Long: k = 0 
Dim arr() As Variant 

Set ws = Worksheets(1) 
With ws 
    Set rngAB = .Range("AB4:AB" & .Cells(.Rows.Count, "AB").End(xlUp).Row) 
End With 

For Each Cell In rngAB 
    If Cell.Value <> vbNullString Then 
     ReDim Preserve arr(k) 
     arr(k) = Cell.Value 
     k = k + 1 
    End If 
Next 
End Sub 

So was fehlt einige Definitionen sind, sondern vor allem des Array wird nicht definiert, deren Größe nur durch in einigen Werten setzen. In VBA Sie ReDim zu definieren, um die Größe der Array zu verwenden, Preserve ist, die Werte zu halten bereits im Array. Wenn Sie es wirklich für etwas anderes nicht brauchen, würde ich nicht empfehlen, ein 2-dimensionales Array zu verwenden, weil Sie nur die letzte Dimension eines ReDimArray verwenden können.

Verwandte Themen