2016-09-07 8 views
-1

Ich führe einen Code, der Daten von PI mit bedingten Formel zieht. Wenn die Werte gezogen werden, weist sie die Formel ganze Spalte, aber nur wenige von ihnen tatsächlich Werte haben:VBA: Ersetzen von Leertasten durch Leerzeichen?

enter image description here

Die Säule etwa 300.000 Zeilen hat, aber ich möchte nur die Schleife laufen, wenn ich Istwerten haben (4 mal statt 300.000 in diesem Fall).

Gibt es irgendwelche Vorschläge, die Schleife 300.000 Mal zu vermeiden?

ich versucht habe, mit der Funktion ersetzen durch alle Räume mit leeren ersetzen und dann die Anzahl der nicht leeren Zellen zählen mit COUNTA:

'Replacing all spaces in a column by blanks 
Workseets("Sheet6").Range("D:D") = Replace(Worksheets("Sheet6").Range("D:D")," ","") 
'counting non-blank cells 
n = WorksheetFunction.CountA(Worksheets("Sheet6").Range("D:D")) 
'running code only 4 times 
for I = 1 to n..... 

Aber ich bin immer Typenkonfliktfehler für die Funktion ersetzen. Ich habe noch nichts für FOR Loop geschrieben. Derzeit versucht nur die REPLACE Funktion korrekt zu verwenden

+0

'Dim n As Long' und' Dim I as Long', 300,000 well überschreitet die Grenze des Datentyps ganzzahl. Sehen Sie sich auch an, was Sie in der Schleife tun. –

+0

Wenn eine Schleife notwendig ist (und es nicht sein kann), können Sie die 'Do While' Schleife anstelle der' For' Schleife verwenden, mit Kriterien zum Beenden, wenn der Zellenwert leer ist. –

+0

Im Idealfall, statt hartcodierte 'Workseets (" Sheet6 "). Range (" D: D ")' Sie definieren eine richtige Range-Variable, die nur die Zeilen/Daten darstellt, die Sie verarbeiten möchten. –

Antwort

2

Ihr Versuch verwendet die String.Replace Funktion und verursacht einen Fehler nicht übereinstimmen, da Sie eine Variante/Bereich an eine Funktion übergeben, die eine Zeichenfolge erwartet.

'Replacing all spaces in a column by blanks 
Workseets("Sheet6").Range("D:D") = Replace(Worksheets("Sheet6").Range("D:D")," ","") 

Eine Lösung ist stattdessen die Range.Replace Methode zu verwenden. Es ist keine Zuweisung erforderlich, die Methode arbeitet mit dem Bereichsobjekt, das sie aufruft. Diese Kopien direkt die Werte und ersetzt die leere Zeichenkette

'Replacing all spaces in a column by blanks 
With Worksheets("Sheet6").Range("D:D") 
    .Value = .Value2 
    .Replace " ", "", xlWhole 
End With 
+0

Range.Replace gibt nur eine boolesche Funktion zurück. Es gibt TRUE für jede Zelle in der Spalte –

2

Sie sollen die Intersect Methode verwenden, um den Bereich bis hinunter zu den aktuell verwendeten Zellen zu trimmen.

+0

Wenn der Bereich Leerzeichen oder andere nicht druckbare Zeichen enthält oder Formel enthält, die dasselbe ausgeben, wird UsedRange nicht zuverlässig sein. (Es gibt andere Gründe, warum UsedRange nicht immer zuverlässig ist!) –

+0

Vom OP aus: * Es weist die Formel der gesamten Spalte zu, aber nur wenige von ihnen haben die tatsächlichen Werte *. –

+0

Anstatt in ein Piss-Match darüber zu kommen, wäre es viel passender für Sie gewesen, meine Antwort einfach zu bearbeiten, als was ein offensichtliches Versehen ist. –

Verwandte Themen