2016-07-08 1 views
0

Я пытаюсь оптимизировать некоторый код сортировки данных, исходный код выглядит так, как будто он был «написан» с использованием функции Excel «Запись макроса».VBA превращает разделы записанного макроса в нечто более эффективное

Ниже приведен пример из кода.

Range("A12").Offset(z, 0).Select 
Selec.Resize(Selection.Rows.Count, Selection.Columns.Count + (X2 - 1)).Select 
Selection.Copy 
Range("C4").Offset(y, 0).Select 
ActiveSheet.Paste 

Для того, чтобы сделать этот код более эффективным, я должен переписать этот раздел, чтобы привлечь переменный диапазон, что его .Value равно данные селекционных?

Переменные X2, z и y используются как часть функции копирования и постепенно увеличиваются, чтобы облегчить чтение конечного продукта. Они изменены в другом месте модуля.

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

Я прочитал очень популярный вопрос «Как избежать использования Select in Excel VBA Macros» здесь, и я просто ищу дальнейшие советы.

(How to avoid using Select in Excel VBA macros)

Благодаря

+0

Это было бы:. 'Range ("A12") Смещение (г, 0) .Resize (1, X2) .Copy назначения : = Диапазон («C4»). Смещение (y, 0) ' – Rory

+0

Спасибо, это похоже на работу! Я приступлю к тому, чтобы делать подобные вещи остальным. Спасибо – lewisthegruffalo

+0

Hiya @Rory я не думаю, что вы могли бы показать мне, как вы могли бы это сделать? Сброс (z, 0) .Выберите Selection.Resize (Selection.Rows.Count, Selection.Columns.Count + (X2). - x - 1)). Выберите Selection.Copy Диапазон («C4»). Смещение (y, X2 - a). Выберите ActiveSheet.Paste – lewisthegruffalo

ответ

0

Я думаю, это было бы самым простым способом.

Range("C4").Offset(y, 0).Resize(1, x2) = Range("A12").Offset(z, 0).Resize(1, x2) 

Хотя я бы посоветовал:

  • избежать .Offset и работать с именованными диапазонами вместо
  • избежать .Copy и .Paste иногда ваши данные могут быть слишком большими для вашего буфера обмена и использования только в = -оператор быстрее
  • , чтобы не называть ваши переменные заглавными буквами или дополнительными шифрами, это может быть очень запутанным
  • используйте этот формат .Cells(row, column) вместо `.Cells (« A1 »). Это проще в обращении и могут быть изменены более легко с помощью расчетов

НТН

+0

За исключением того, что вам нужно изменить размер диапазона слева от '=', поэтому он имеет тот же размер, что и тот, который находится справа. Кроме того, вы должны указать свойство «Value» или «Value2» и не принимать значения по умолчанию. – Rory

+0

@Rory, не хотел бы VBA использовать '.offset (y, 0)' в качестве целевой ячейки, тогда все нижнее и правое было бы введено? – lewisthegruffalo

+0

@Rory на самом деле это не имеет значения, так как я просто копирую одну строку - спасибо за мысль tho – lewisthegruffalo

0

Копирование/вставка не очень эффективным. Диапазон выполнения («X1»). Значение = Диапазон («Y1»). Значение лучше. Это то, что я бы сделал

'change this 
Selection.Copy 
Range("C4").Offset(y, 0).Select 
ActiveSheet.Paste 

'to this 
Range("C4").Offset(y, 0).Value = Selection.Value 'selection value is the range that is being copied. 
+0

Итак, вы бы не посоветовали мне переписывать его, чтобы избежать выбора или выбрать вообще? – lewisthegruffalo

+0

Если это не сломано, не исправляйте это! Однако копирование/вставка не очень эффективна, и в зависимости от того, что вы делаете, вам может не понадобиться что-то, что будет использовать/модифицировать ваш буфер обмена. – Alex

+0

Я полностью согласен с тем, что если он не сломался, не исправите его идеологию, однако размеры файлов, которые эта таблица должна просеять, являются массивными, и иногда пользователь может сидеть там в течение 3 минут, в то время как Excel все работает. (это не единственный раздел выбора/выбора/копирования/вставки, около 15. Каждый из них - это разные части инструкции if или case! – lewisthegruffalo

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