VBA, использовать предыдущий столбец, когда он хранится как переменная

#excel #vba

#excel #vba

Вопрос:

Я сохраняю свой столбец в переменной. NameColumn равен столбцу AD .

Как мне сохранить новую переменную в NameColumn — 1? Я хочу сохранить AC.

полный код:

 Sub FindAfterShort()

    Dim nameColumn As String   ' Name Column Letter
    Dim ScoreColumn As String  ' Score Column Letter
    Sheets("Load check data").Activate
    With Rows(1)
        nameColumn = Split(.Find(Sheets("Input").Range("A2"), .Cells(.Cells.Count), xlValues, _
                xlWhole).Address, "$")(1)
        'PreviousColumn = NameColumn.Offset(0, -1)
    End With

    Debug.Print "Column Letters '" amp; nameColumn amp; "' and '" amp; PreviousColumn amp; "'."
    
    Dim k As Long
    k = Sheets("Load check data").Range("A1", Sheets("Load check data").Range("A1").End(xlDown)).Rows.Count
    Debug.Print (k)
    
    Sheets("Load check data").Range(nameColumn amp; "2:" amp; nameColumn amp; k).ClearContents
    Sheets("Load check data").Range(.Cells(2, nameColumn - 1), .Cells(k, nameColumn - 1)).Copy
end sub
  

У меня проблемы с этой строкой:

 `Sheets("Load check data").Range(.Cells(2, nameColumn - 1), .Cells(k, nameColumn - 1)).Copy`
  

Неквалифицированные ссылки на Cells

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

1. Excelguy постоянно забывает тег Excel, ха-ха.

2. ВЫ ВСПОМНИЛИ!!!!!

3. Используйте номер столбца в качестве переменной вместо буквы столбца. Работа с буквами неуклюжая.

4. Неясно, как вы используете NameColumn для ссылки на диапазон, но как бы вы это ни делали, используйте RangeReferedToByNameColumn.Offset( 0,-1)

5. важный вопрос здесь заключается в том, какой тип переменной NameColumn . Хотя приведенные выше комментарии хороши, есть несколько способов приблизиться к тому, что вам нужно.

Ответ №1:

Без изменения слишком большого количества исходного кода это должно работать хорошо.

 With Sheets("Load check data")

    Dim nameColumn as Long
    nameColumn = .Rows(1).Find(Sheets("Input").Range("A2"), .Cells(.Cells.Count), xlValues, xlWhole).Column

    .Range(.Cells(2,nameColumn- 1),.cells(k, nameColumn - 1)).Copy

End With
  

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

1. Эй, Скотт, я получаю объект, необходимый для этого, я собираюсь загрузить свой полный код на вопрос.

2. @excelguy — мое редактирование должно решить эту проблему. посмотрите, как я работаю явно с каждым объектом. Ваши неквалифицированные объекты могут причинить вам вред (т.е. — With Rows(1) и тому подобное).

3. Получение объекта, необходимого для nameColumn

4. @BigBen — спасибо, что исправили мой беспорядок в этом сообщении. На этот раз я явно потерял контроль качества!

5. Привет, Скотт, я получаю overflow сообщение об ошибке в nameColumn строке.

Ответ №2:

Когда вы говорите PreviousColumn, и если вы начинаете с AD, вы имеете в виду AC (вы написали AE)?

Если это просто опечатка, как насчет чего-то подобного:

Добавьте эти функции:

 Private Function GetColNo(str_ColLetter As String) As Long

GetColNo = Range(str_ColLetter amp; 1).Column

End Function

Private Function GetColLetter(lng_ColNo As Long) As String

GetColLetter = Split(Cells(1, lng_ColNo).Address, "$")(1)

End Function
  

Затем используйте их следующим образом:

 Dim NameColumn As String

Dim PreviousColumn As String

NameColumn = "AD"

PreviousColumn = GetColLetter(GetColNo(NameColumn) - 1)

Debug.Print (PreviousColumn)
  

Это возвращает PreviousColumn = AC (поскольку это столбец до AD)