#excel #vba
#excel #vba
Вопрос:
Как вы можете видеть в следующем коде, мой способ создания этого конкретного диапазона для копирования довольно обширен. Есть ли более эффективный способ?
For counter = 1 To quantity
Set header_range(counter) = _
Application.InputBox("Select the HEADER of the " amp; counter amp; "º column you want to copy", Type:=8)
col_number = header_range(counter).Column
last_row = Cells(Rows.Count, col_number).End(xlUp).Row
col_letter = Split(Cells(1, col_number).Address(True, False), "$")(0)
Range(header_range(counter), Range(col_letter amp; last_row)).Copy
target_wb.Sheets("Sheet1").Cells(1, counter).PasteSpecial
Next counter
Комментарии:
1. Используйте
Cells( Row Number, Column Number )
, чтобы вам вообще не нужна буква. Просто используйте более короткие переменные дляheader_range
amp;last_row
like (r
amp;c
)2. Не совсем уверен, что вы хотите, чтобы вы пытались это сделать. Вы уверены, что хотите, чтобы поле ввода находилось внутри цикла? Изменится ли целевой заголовок для каждого значения
quantity
? Если нет, вы должны переместить это за пределы цикла. Может быть полезно объяснить больше контекста проблемы 🙂3. Использование буквы неуклюже. Используйте
Cells
, как уже рекомендовано, с индексами строк и столбцов.4. Обычно я использую
cells()
, но в этом случае мне нужно было использоватьInputBox
с выбором, потому что человек, который использует лист, хотел, чтобы это было так. И этот ввод поступает вrange()
формате.
Ответ №1:
Вам не нужно использовать фактическую букву. Вместо этого используйте индекс столбца и строки с Cells
объектом. Cells
Входными данными являются индексы, т.е. Cells(Row Index, Column Index)
Я бы также рекомендовал более короткие имена переменных для удобства чтения
r
= Индекс строкиc
= Индекс столбца
Вот пример использования индексов для копирования диапазона от Row 1
до r
(последняя строка) в переменный столбец, выбранный с помощью InputBox
Sub Example()
Dim Input_C As Range
Dim r As Long, c As Long
Set Input_C = Application.InputBox("Select Target Header", Type:=8)
'Convert to Index
c = Input_C.Column
r = Cells(Rows.Count, c).End(xlUp).Row
'Build Dynamic Range
Range(Cells(1, c), Cells(r, c)).Copy
End Sub
Комментарии:
1. Это потрясающе. Вам не нужно получать букву. Спасибо!
2. Написал это в спешке, прежде чем надеяться на встречу. Обновлено с объяснением. В prod вы также должны квалифицировать все объекты (
Range
,Cells
, и т.д.) с помощью объекта worksheet.3. Мне понравилось ваше предложение о более коротких именах переменных.