#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)