Excel — Использование адреса для копирования по всему столбцу, включая пробелы

#excel #spreadsheet #copy-paste #excel-2003 #vba

#excel #электронная таблица #копировать-вставить #excel-2003 #vba

Вопрос:

Что я пытаюсь сделать, это просмотреть каждый заголовок на одном листе (заголовки расположены в формате «1: 1»), найти заголовок под названием «Код дилера», затем скопировать весь этот столбец на другой лист.

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

Есть способ, которым я могу включить пробелы в свой выбор или извлечь букву столбца и двигаться вверх?

Если я подхожу к проблеме очень неудобно, пожалуйста, дайте мне знать! Я хочу узнать как можно больше.

Ниже приведен мой код. Помощь была бы высоко оценена.

 'Copies over Dealer Codes
With Sheets("Raw Data").Range("1:1")
Set c = .Find("Dealer Code", LookIn:=xlValues)
If Not c Is Nothing Then
    firstAddress = c.Address
    Do
        Set c = .FindNext(c)
    Loop While Not c Is Nothing And c.Address <> firstAddress
End If

Sheets("Raw Data").Range(firstAddress).Select
Sheets("Raw Data").Range(Selection, Selection.End(xlDown)).Select
Selection.Copy (Sheets("Copied Data").Range("A1"))
End With
  

Ответ №1:

Попробуйте что-то вроде этого:

 Sub Test()
    With ActiveSheet.Range("1:1")
    Set c = .Find("Dealer Code")
    Dim column As String
    column = Mid(c.Address, 2, 1)
    Range(column amp; ":" amp; column).Select
    End With
End Sub
  

При этом выбирается весь столбец, но его легко изменить, чтобы выбрать элементы со 2-й строки до конца. Поскольку у вас есть пробелы, что-то вроде Range(column amp; "2:" amp; column amp; Range(column amp; "65536").End(xlUp).Row).Select работает, но, признаю, немного запутанно.

Другие решения могут быть более оптимальными.

Комментарии:

1. Еще один вопрос. Если я введу код дважды, как показано ниже, я получу «Переменная объекта или с неустановленной переменной блока», есть идеи, почему?

2. @AdamY Вам не нужно использовать оператор With дважды, поскольку он уже установлен в первый раз. Вы даже можете использовать set c = ActiveSheet.Range("1:1").Find("Dealer Code") и избавиться от With/End With строк (в примере, который я рассматривал, выполнялось гораздо больше операций с объектом Range, поэтому в этом случае это было более выгодно).

3. @AdamY На самом деле, если у вас есть N объектов для поиска, вместо повторения кода N вам следует заставить подпрограмму принимать две строки, одну для заголовка для поиска, а другую для диапазона назначения… просто мысль.

4. У меня получилось. Моя проблема заключалась в том, что я оставил его как «код» в ActiveSheet. Диапазон («1:1») «code» вместо «code» С таблицей, фактически используемой в проекте. Диапазон («1:1») ‘code’ Спасибо за всю помощь!