что означает ActiveSheet.UsedRange.Columns.Count - 8 в vba?
Как vba знает используемый Range?
что означает ActiveSheet.UsedRange.Columns.Count - 8 в vba?
Как vba знает используемый Range?
Здесь точное определение UsedRange
(ссылка MSDN):
Каждый объект Worksheet имеет свойство UsedRange, которое возвращает объект Range, представляющий область используемого листа. Свойство UsedRange представляет область, обозначенную самыми дальними верхними и левыми и нелегими ячейками на правой панели, и включает все ячейки между ними.
Итак, в основном, что делает эта строка:
.UsedRange
→ "Рисует" поле вокруг внешних ячеек с содержимым внутри..Columns
→ Выбирает все столбцы этих ячеек.Count
→ Возвращает целое число, соответствующее количеству столбцов (в этом выборе)- 8
→ Вычитает 8 из предыдущего целого числа.Я предполагаю, что VBA вычисляет UsedRange, находя непустые ячейки с наименьшими и наивысшими значениями индекса.
Скорее всего, вы получаете сообщение об ошибке, потому что количество строк в вашем диапазоне меньше 3, и поэтому возвращаемое число отрицательно.
BernardSaucier уже дал вам ответ. Мой пост - это не ответ, а объяснение, почему вы не должны использовать UsedRange
.
UsedRange
является очень ненадежным, как показано ЗДЕСЬ
Чтобы найти последний столбец с данными, используйте .Find
, а затем вычитайте из него.
With Sheets("Sheet1")
If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
lastCol = .Cells.Find(What:="*", _
After:=.Range("A1"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Column
Else
lastCol = 1
End If
End With
If lastCol > 8 Then
'Debug.Print ActiveSheet.UsedRange.Columns.Count - 8
'The above becomes
Debug.Print lastCol - 8
End If
Похоже, вы хотите двигаться. Попробуйте следующее:
ActiveSheet.UsedRange.select
приводит к....
Если вы хотите переместить этот выбор на 3 строки вверх, попробуйте это
ActiveSheet.UsedRange.offset(-3).select
делает это...
Я думаю, если вы попробуете:
Sub Macro3()
a = ActiveSheet.UsedRange.Columns.Count - 3
End Sub
с часами на a
, вы увидите, что это действительно имеет значение.
UsedRange представляет не только непустые ячейки, но и отформатированные ячейки без какого-либо значения. И поэтому вы должны быть очень бдительными.