ActiveSheet.UsedRange.Columns.Count - 8 Что это значит?

что означает ActiveSheet.UsedRange.Columns.Count - 8 в vba?

Как vba знает используемый Range?

Ответ 1

Здесь точное определение UsedRange (ссылка MSDN):

Каждый объект Worksheet имеет свойство UsedRange, которое возвращает объект Range, представляющий область используемого листа. Свойство UsedRange представляет область, обозначенную самыми дальними верхними и левыми и нелегими ячейками на правой панели, и включает все ячейки между ними.

Итак, в основном, что делает эта строка:

  • .UsedRange → "Рисует" поле вокруг внешних ячеек с содержимым внутри.
  • .Columns → Выбирает все столбцы этих ячеек
  • .Count → Возвращает целое число, соответствующее количеству столбцов (в этом выборе)
  • - 8 → Вычитает 8 из предыдущего целого числа.

Я предполагаю, что VBA вычисляет UsedRange, находя непустые ячейки с наименьшими и наивысшими значениями индекса.

Скорее всего, вы получаете сообщение об ошибке, потому что количество строк в вашем диапазоне меньше 3, и поэтому возвращаемое число отрицательно.

Ответ 2

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

Ответ 3

Похоже, вы хотите двигаться. Попробуйте следующее:

ActiveSheet.UsedRange.select

приводит к....

enter image description here

Если вы хотите переместить этот выбор на 3 строки вверх, попробуйте это

ActiveSheet.UsedRange.offset(-3).select

делает это...

enter image description here

Ответ 4

Я думаю, если вы попробуете:

Sub Macro3()
a = ActiveSheet.UsedRange.Columns.Count - 3
End Sub  

с часами на a, вы увидите, что это действительно имеет значение.

Ответ 5

UsedRange представляет не только непустые ячейки, но и отформатированные ячейки без какого-либо значения. И поэтому вы должны быть очень бдительными.