2016-09-07 3 views
-1

Я запускаю код, который извлекает данные из PI с использованием условной формулы. Когда значения вытягиваются, он присваивает формулу весь столбец, но лишь немногие из них имеют фактические значения:VBA: Замена пробелов пробелами?

enter image description here

колонна имеет около 300 000 строк, но я хочу, чтобы запустить цикл только тогда, когда у меня есть фактические значения (В этом случае 4 раза вместо 300 000).

Есть ли какие-либо предложения по этому поводу, избегая петли 300 000 раз?

Я попытался с помощью функции замены, заменив все пробелы пустым, а затем подсчитать количество не пустых ячеек с помощью 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..... 

Но я получаю ошибку несоответствия типов для функции замены. Я еще ничего не написал для FOR Loop. В настоящее время просто пытается правильно использовать функцию REPLACE

+0

'Dim n As Long' и' Dim I as Long', 300 000 скважин превышает предел целочисленного типа данных. Также, пожалуйста, подумайте о том, что вы делаете внутри цикла. –

+0

Если цикл необходим (и это может быть не так), вы можете использовать цикл «Do While» вместо цикла «For», с критериями для выхода, когда значение ячейки пусто. –

+0

В идеале вместо использования жестко заданных «Workseets» («Sheet6»). Range («D: D») вы определяете правильную переменную диапазона, которая представляет только строки/данные, которые вы хотите обработать. –

ответ

2

Ваша попытка использует функцию String.Replace и вызывает ошибку несоответствия, потому что вы передаете вариант/диапазон функции, которая ожидает строку.

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

Решение состоит в том, чтобы использовать метод Range.Replace, вместо этого. Назначение не требуется, метод работает над объектом диапазона, который его вызывает. Это копирует значения непосредственно и заменяет собой пустую строку

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

Range.Replace возвращает только булевскую функцию. Он дает TRUE для каждой ячейки в столбце –

2

Вы должны использовать метод Intersect урезать диапазон вплоть до фактических используемых клеток.

With Worksheets("Sheet6") 

    Intersect(.Range("D:D"), .UsedRange).Replace " ", "" 

End With 
+0

Если диапазон имеет пробелы или другие непечатаемые символы или содержит формулу, которая выводится одинаково, UseRange не будет надежным. (Есть и другие причины, по которым UsedRange тоже не всегда надежный!) –

+0

Из OP там: * он присваивает формулу всему столбцу, но лишь немногие из них имеют действительные значения *. –

+0

Вместо того, чтобы входить в писающий матч об этом, было бы гораздо более подходящим для вас просто * отредактировать * мой ответ за то, что является очевидным недосмотром. –

Смежные вопросы