Автозаполнение с динамическим диапазоном

Я создаю программу для автоматизации некоторой работы, используя запись, а затем очистку. Это работало хорошо до расчета, который занимает слишком много времени для меня. Это простой вложенный оператор IF

ActiveCell.FormulaR1C1 = _
    "=IF(RC[-16]="""",""MISSING"",IF(RC[-14]="""",""MISSING"",RC[-14]-RC[-16]))"

Мы имеем дело с данными, которые могут варьироваться от 10 строк до нескольких сотен тысяч. Мое «решение», которым я пока не доволен, ограничивает автозаполнение диапазоном A1: A35000, что все еще требует немного времени для обработки Excel. Это было решение, чтобы xlDown не привело меня к 1-миллионной строке. Кроме того, я попытался уменьшить размер листа, это тоже работает, но не является хорошим решением.

Вот как выглядит код:

Selection.AutoFill Destination:=ActiveCell.Range("A1:A35000"), Type:= _
    xlFillDefault

Что я хочу сделать, так это либо:

  1. автозаполнение из диапазона, на который ссылается число в данной ячейке (поэтому, если данные, которые я помещаю, составляют 500 строк, у меня есть ячейка, которую я набираю 500, и все автозаполнения идут от A1: A500), или

  2. более предпочтительно, чтобы это было сделано автоматически, если программа уже распознала диапазон для автозаполнения.

Я проверил решения и не могу понять, как применить их к моей ситуации.


person Dm3k1    schedule 04.01.2013    source источник


Ответы (1)


Я думаю, вы можете искать следующее...

Dim ws as Worksheet
Set ws = Worksheets("Sheet1")

Dim usedRows as Long

'Option One (not recommended): USED RANGE METHOD 
usedRows = ws.UsedRange.Rows.Count

'Option Two (more robust) .END(xlUp) METHOD (Assuming you have your Data in column "RC")
usedRows = ws.Cells(ws.Rows.Count, "RC").End(xlUp).Row

'YOUR
'CODE
'HERE

Selection.AutoFill Destination:=ws.Range(Cells(1,1),Cells(usedRows,1)), Type:= _ xlFillDefault

если в этом столбце есть наиболее часто используемые строки из всех на вашем листе.

Спасибо @scott за указание на превосходство опции .End(xlUp) :)

person Katy    schedule 04.01.2013
comment
Используемый диапазон может быть несколько ненадежным. Я бы предпочел использовать .End(xlup) для более надежного решения. Вот ссылка на похожее обсуждение - person scott; 04.01.2013
comment
@ Скотт Согласен! Мне это особенно нравится, потому что вы можете использовать его, чтобы изолировать один столбец, что, похоже, он и пытается сделать в данном случае. Ответ отредактирован соответственно. - person Katy; 04.01.2013
comment
На первый взгляд, это именно то, что я ищу! Единственным исключением является то, что использование Integer ограничивает вас до 32767 строк, верно? Будет ли LONG работать лучше? - person Dm3k1; 04.01.2013
comment
Ах, только что увидел обновленную... попробую, столкнулся с проблемой, что она идет в энную строку. Я обновлю! - person Dm3k1; 04.01.2013
comment
@ user1949212 +1 за указание на ошибку Long vs. Integer, которую я совершил. Итак, отредактировано. - person Katy; 04.01.2013
comment
Извините, еще кое-что. У меня автозаполнение начинается с 3-й строки. Поэтому, используя этот метод, я замечаю, что заполняю эти данные на 3 строки слишком далеко. Это, вероятно, очень простое решение, которое я должен знать. Решение? - person Dm3k1; 04.01.2013
comment
@Dm3k1 попробуй Selection.AutoFill Destination:=ws.Range("A3:A" & usedrows), Type:= _ xlFillDefault - person scott; 04.01.2013
comment
@Katy, вы должны изменить пункт назначения, чтобы использовать обозначение строки диапазона, как в моем комментарии выше, чтобы он останавливался на последней строке, а не на количестве строк из активной ячейки. - person scott; 04.01.2013
comment
@ Dm3k1 вам просто нужно изменить индекс при первом вызове функции Cells (). 1,1 соответствует А1; 1,2 соответствует В1; 2,1 соответствует А2; и так далее. Похоже, что желаемая комбинация, которую вы ищете, это 3,1 - person Katy; 05.01.2013
comment
Отлично, только что сделал ячейки (используемые ряды - 3, 1), и это решило эту проблему. Спасибо еще раз - person Dm3k1; 05.01.2013