Есть ли быстрый способ получить букву столбца из диапазона в VBA?

#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. Мне понравилось ваше предложение о более коротких именах переменных.