Excel vba количество столбцов на листе

Как узнать количество используемых столбцов на листе Excel с помощью VBA?

Dim lastRow As Long
lastRow = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
MsgBox lastRow

Используя приведенный выше VBA, я могу найти количество строк. Но как мне узнать количество столбцов в моем файле Excel?

5 ответов

Лучший ответ

Ваш примерный код получает номер строки последней непустой ячейки в текущем столбце и может быть переписан следующим образом:

Dim lastRow As Long
lastRow = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row
MsgBox lastRow

Тогда легко увидеть, что эквивалентный код для получения номера столбца последней непустой ячейки в текущей строке:

Dim lastColumn As Long
lastColumn = Sheet1.Cells(1, Columns.Count).End(xlToLeft).Column
MsgBox lastColumn

Это также может быть полезно для вас:

With Sheet1.UsedRange
    MsgBox .Rows.Count & " rows and " & .Columns.Count & " columns"
End With

Но имейте в виду, что если столбец A и / или строка 1 пусты, это не даст такого же результата, как в других примерах выше. Чтобы узнать больше, прочтите о свойстве UsedRange.


47

Jean-François Corbett
1 Авг 2011 в 16:36

Ответ Жана-Франсуа Корбетта идеален. Чтобы быть исчерпывающим, я просто хотел бы добавить, что с некоторыми ограничениями вы также можете использовать UsedRange.Columns.Count или UsedRange.Rows.Count.
Проблема в том, что UsedRange не всегда обновляется при удалении строк / столбцов (по крайней мере, пока вы снова не откроете книгу).


8

Patrick Honorez
1 Авг 2011 в 15:51

Возможно, вы забыли sheet1 каждый раз где-то перед columns.count, или он будет считать столбцы activesheet, а не sheet1.

Кроме того, не следует ли использовать xltoleft вместо xltoright? (Хорошо, здесь уже очень поздно, но я думаю, что знаю, что справа налево). Я проверил, вы должны написать xltoleft.

lastColumn = Sheet1.Cells(1, sheet1.Columns.Count).End(xlToleft).Column


2

seaotternerd
20 Дек 2013 в 06:40

Результат показан в следующем коде как номер столбца (8,9 и т. Д.):

Dim lastColumn As Long
lastColumn = Sheet1.Cells(1, Columns.Count).End(xlToLeft).Column
MsgBox lastColumn

Результат показан в следующем коде как буква (H, I и т. Д.):

Dim lastColumn As Long
lastColumn = Sheet1.Cells(1, Columns.Count).End(xlToLeft).Column
MsgBox Split(Sheet1.Cells(1, lastColumn).Address, "$")(1)


0

Martijn Pieters
7 Апр 2017 в 12:08

5 ответов

Ваш примерный код получает номер строки последней непустой ячейки в текущем столбце и может быть переписан следующим образом:

Dim lastRow As Long
lastRow = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row
MsgBox lastRow

Затем легко увидеть, что эквивалентный код для получения номера столбца последней непустой ячейки в текущей строке:

Dim lastColumn As Long
lastColumn = Sheet1.Cells(1, Columns.Count).End(xlToLeft).Column
MsgBox lastColumn

Это также может быть полезно для вас:

With Sheet1.UsedRange
    MsgBox .Rows.Count & " rows and " & .Columns.Count & " columns"
End With

но имейте в виду, что если столбец A и/или строка 1 пусты, то это не даст того же результата, что и другие примеры выше. Подробнее читайте в UsedRange.

Jean-François Corbett
01 авг. 2011, в 11:57

Поделиться

Ответ Jean-François Corbett идеален. Чтобы быть исчерпывающим, я хотел бы добавить, что с некоторыми ограничителями вы также можете использовать UsedRange.Columns.Count или UsedRange.Rows.Count.
Проблема в том, что UsedRange не всегда обновляется при удалении строк/столбцов (по крайней мере, пока вы не откроете книгу).

Patrick Honorez
01 авг. 2011, в 11:55

Поделиться

Возможно, вы забыли sheet1 каждый раз где-то перед columns.count, или он будет считать столбцы activesheet, а не sheet1.

Кроме того, не должно быть xltoleft вместо xltoright? (Хорошо, очень поздно здесь, но я думаю, что я знаю свое право слева) Я проверил его, вы должны написать xltoleft.

lastColumn = Sheet1.Cells(1, sheet1.Columns.Count).End(xlToleft).Column

Patrick Lepelletier
20 дек. 2013, в 02:12

Поделиться

Результат показан в следующем коде как номер столбца (8,9 и т.д.):

Dim lastColumn As Long
lastColumn = Sheet1.Cells(1, Columns.Count).End(xlToLeft).Column
MsgBox lastColumn

Результат показан в следующем коде как буква (H, я и т.д.):

Dim lastColumn As Long
lastColumn = Sheet1.Cells(1, Columns.Count).End(xlToLeft).Column
MsgBox Split(Sheet1.Cells(1, lastColumn).Address, "$")(1)

kadrleyn
10 окт. 2016, в 20:47

Поделиться

Ещё вопросы

  • 0Ошибка в разделении strtok с использованием C ++
  • 1Ошибка при посещении класса AST
  • 0phpMyAdmin объяснение ошибок
  • 1Пользовательский ArrayAdapter для Spinner: раскрывающийся список не работает должным образом
  • 1Правильное использование list_ssheets () с parent_id в pygsheets
  • 1сценарий узла js для реагирования на отклик созвездия
  • 1Затмение из памяти
  • 0Параметр ng не работает, когда список параметров возвращается из службы $ http
  • 1Карты Android V2: java.lang.noclassdeffounderror: com.google.android.gms.R $ styleable
  • 0Извлечь письмо из заголовков
  • 0Лучший способ реализации конфигурации для пользовательской директивы (ngIdle)?
  • 0JQuery исчезает в вопросе или альтернативе
  • 1Multi select Элементы с угловой 2/4
  • 1Как связать Google Maps Android API v2 Marker с объектом
  • 0HTML 5 и CSS 3, страница с шириной 100%, фиксированная панель навигации и оставленный контент
  • 1Панды — проверьте значение в соседнем столбце
  • 0Конкатенация циклов SQL?
  • 0удалить из таблицы используя mysql и php
  • 1Сетка с плоской геометрией не получает тени в трех JS r86
  • 0Как добавить класс с анимацией css3?
  • 0Первый вариант, выбранный по умолчанию в теге select при использовании templateURL с AngularJS
  • 1построение подсвечников с клещами за 1 минуту
  • 1Как я могу переписать функцию __mul__ в Python
  • 1Android: layout_toRightOf и android: layout_below
  • 1Загрузка текста richTextBox в массив
  • 1Процент отбрасывания данных [панды]
  • 0Как бы вы запустили очистку после создания исключения в оболочке API?
  • 0Переопределить метод HTTP для запросов GET в symfony2
  • 0CSS делает мои фоновые показатели цветом и заканчивается другим (похожим) цветным фоновым изображением: линейный градиент
  • 1Ошибка при загрузке log4net
  • 1Преобразование строк файла, содержащего массивы, в список словарей
  • 0Angularjs $ http.get (). JSON Фрон сервер
  • 1Выдает шаблон RabbitMQ Spring. Попытка использовать закрытый канал после отправки 15 сообщений.
  • 0Динамический текст верхней панели на основе текущей страницы в приложении Zurb Foundation for Apps
  • 0HTML вертикальный перенос страницы
  • 1Невозможно опубликовать в зарезервированную тему с помощью AWS IoT SDK
  • 1Как применить условие onPreferenceClick в Android?
  • 1JavaScript — Случайные числа и переменные между функциями
  • 0javascript + coffeescript, с оператором группировки?
  • 0Потерянное соединение с сервером MySQL во время запроса при создании индекса, но все же после получения индекса
  • 1Как генератор имен можно добавить в контекст: компонент-сканирование в форме аннотации?
  • 0Неопределенный индекс уведомления в php
  • 1Как правильно создавать отдельные модули npm и использовать их локально?
  • 0Показать последние несколько символов при привязке данных в angularjs
  • 0Как установить высоту угловой ui-сетки так, чтобы она соответствовала родительскому контейнеру
  • 1Преобразовать одно значение LINQ в строку
  • 0Имеет ли значение порядок ссылок на таблицы в MySQL?
  • 1Возникли проблемы при получении необходимых данных из БД
  • 0Как я могу заставить min_element ловить ВСЕ точки с наименьшим значением?
  • 0MFMailComposeViewController обрабатывает вложение html как изображение на iOS7

подскажите, пожалуйста, как в документе (см. приложение) похожей структуры (имею в виду наличие пустых ячеек, строк, столбцов) в макросе узнать кол-во строк и столбцов значимой области. под значимой областью имею в виду прямоугольную область, покрывающую все непустые ячейки, в данном случае это область С2:N28, т.е. 27 строк, 12 столбцов

Имеется ли какой-то объект или свойство, которое отвечает за эту информацию?

команды ActiveSheet.Cells.Columns.Count и ActiveSheet.Cells.Rows.Count, показывают кол-во столбцов и строк всего листа, т.е. не подходят. Сейчас я просто пробегаю все ячейки и, если встречается подряд пять пустых строк (обычно больше не бывает) делаю останов.
есть вариант перед запуском макроса, нужную область выделить вручную, но это тоже не всегда удобно


я новичок в VBA поэтому врядли подскажу…
а вот спросить бы очень хотелось:
что значит «пробегаю пять пустых ячеек? «

-можете с макросом выложить пример?

Цитата: polioli от 09.11.2009, 23:56
подскажите, пожалуйста, как в документе (см. приложение) похожей структуры (имею в виду наличие пустых ячеек, строк, столбцов) в макросе узнать кол-во строк и столбцов значимой области.

я знаю как не в макросе узнать  — функцией по английски называющейся counta (она из диапазона как раз выдает колличество значимых ячеек)

возможно при помощи макрорекордера можно вытянуть как ее использовать в макросе.

p.s если выложите пример макроса перебирающего ячейки, буду очень благодарен.


Если не учитывать первые пустые строки и столбцы, то можно так:

Sub rrrr()
    r1_ = Range(«A1»).SpecialCells(xlLastCell).Row
    c1_ = Range(«A1»).SpecialCells(xlLastCell).Column
End Sub

если учитывать:

Sub ttt()
    r1_ = Range(«A1»).SpecialCells(xlLastCell).Row
    r2_ = Range(«A1»).SpecialCells(xlConstants).Row
    r_ = r1_ — r2_
    c1_ = Range(«A1»).SpecialCells(xlLastCell).Column
    c2_ = Range(«A1»).SpecialCells(xlConstants).Column
    c_ = c1_ — c2_
End Sub

Скажи мне, кудесник, любимец ба’гов…

Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995


_Boroda_, большое спасибо, то, что надо
но в одном случае этого не достаточно.
если в документе строки удаляли с помощью Del, т.е удаление информации, но не самой строки, то после последней «значимой» строки может идти ряд пустых строк.

можно ли как-то вычислить их кол-во (не перебирая ячейки по одной), т.е. посчитать размер диапазона не учитывая последние пустые строки?
еще раз, спасибо!

Нelg, «пробегаю пять пустых ячеек? » имелось в виду в цикле методом перебора проверяю каждую ячейку, и если, к примеру, встречается пять пустых ячеек подряд, то считать, что информации в файле дальше нет.
выглядит это примерно так
ii = 1
Do
    If Len(.Cells(vRow, 1)) = 0 Then
       ii = ii + 1
    End If
   …
      vRow = vRow + 1
  Loop Until ii > 5
Не красиво, не удобно, но работало.
Теперь буду использовать способ, предложенный Бородой :)


Тогда так:

Sub yyyyy()
   ActiveWorkbook.Save
   r1_ = Cells.SpecialCells(xlLastCell).Row
    c1_ = Cells.SpecialCells(xlLastCell).Column

End Sub

Скажи мне, кудесник, любимец ба’гов…

Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995


Цитата: Нelg от 10.11.2009, 00:15
… пример макроса перебирающего ячейки … [/u]

‘Варианта два:
‘1-й: Количество строк, столбцов заранее известно;
‘2-й: Количество строк, столбцов заранее не известно;

‘Ответ:
‘1-й: (нужно «перебрать ячейки в блоке «b2:f7″, двигаясь по ячейкам строки, а затем на строку ниже»)
Sub pereborIzwestnogoBloka()
    Dim i As Long
    Dim j As Integer

    ‘перебрать ячейки в блоке «b2:f7», двигаясь по ячейкам строки, а затем на строку ниже
    i = 0
    For i = 2 To 7 ‘по строкам
        j = 0
        For j = 2 To 6 ‘по ячейкам строки
            ‘в ячейке с координатами очередного шага перебора, выполняем действия = Start
            Cells(i, j) = i + j ‘ — пишем в нее сумму координат
            Cells(i, j).Select ‘ — делаем ее активной
            ‘в ячейке с координатами очередного шага перебора, выполняем действия = Stop
        Next j
    Next i
End Sub

‘2-й: (число строк, столбцов, заранее неизвестно. Но, известно: ячейка старта и _
       условие при котором нужно ‘прекратить перебор. Скажем: при обнаружении _
       ячейки со словом «Всего:» — по строке в первой колонке перебираемого блока, и _
       пустой ячейки по колонке в первой строке перебираемого блока)

       ‘      Например стартовая ячейка b3
Sub pereborNeizwestnogoBloka()
    Dim nR As Long
    Dim nC As Integer

        nR = 3
    nC = 2
    Do
        Do
            ‘в ячейке с координатами очередного шага перебора, выполняем действия = Start
            Cells(nR, nC) = nR + nC ‘ — пишем в нее сумму координат
            Cells(nR, nC).Select ‘ — делаем ее активной
            ‘в ячейке с координатами очередного шага перебора, выполняем действия = Stop
            nC = nC + 1
        Loop While Cells(3, nC) <> Empty
        nR = nR + 1
    Loop While Cells(nR, 2).Text <> «Всего»
End Sub

Путей к вершине — множество. Этот один из многих!


_Boroda_ , спасибо!
теперь, что называется «дошло».
при сохранении программа видимо обновляет информацию о последней ячейке (Ctrl+End).
в моем случае еще важно было обратить внимание на отсутствие форматирования в пустых ячейках в конце документа,
так как они тоже влияют на значение послед. ячейки.
еще раз спасибо, что помогли решить задачу и разобраться.


GreyW, дело в том, что несмежный диапазон состоит из нескольких отдельных диапазонов. И при обработке строчки rngH.Columns.Count вы получаете количество столбцов в первом из несмежных диапазонов (диапазоне B2). Естественно, количество столбцов в этом диапазоне равно единице.
Чтобы обработать все поддиапазоны несмежного диапазона, можно использовать свойство .Areas диапазона:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub CountColumnsInSeparateAreas()
    Dim rngH As Range   'Äèàïàçîí çàãîëîâêîâ ñòîëáöîâ äëÿ ýêñïîðòà
    Dim area As Range   'Îòäåëüíàÿ ÷àñòü (ïîääèàïàçîí) íåñìåæíîãî äèàïàçîíà.
    Dim c As Long   'Êîëè÷åñòâî âûäåëåííûõ ñòîëáöîâ.
    
    Set rngH = Application.InputBox("Óêàæèòå çàãîëîâêè ñòîëáöîâ äëÿ ýêñïîðòà", _
        "Ñòîëáöû äëÿ ýêñïîðòà", Replace(Selection.Address, ",", ";"), Type:=8)
    'Äëÿ êàæäîãî ïîääèàïàçîíà ñ÷èòàåì êîëè÷åñòâî ñòîëáöîâ â íåì è äîáàâëÿåì ýòî êîëè÷åñòâî ê îáùåé ñóììå.
    For Each area In rngH.Areas
        c = c + area.Columns.Count
    Next area
    'Âûâîäèì îáùåå êîëè÷åñòâî ñòîëáöîâ âî âñåõ ïîääèàïàçîíàõ.
    MsgBox c
End Sub

P.S. Если пользователь аккуратный и не выделяет ячейки ниже/выше заголовков, то можно сделать еще проще:

Visual Basic
1
2
3
4
5
6
7
8
9
Sub CountCellsInSeparateAreas()
    Dim rngH As Range   'Äèàïàçîí çàãîëîâêîâ ñòîëáöîâ äëÿ ýêñïîðòà
    
    Set rngH = Application.InputBox("Óêàæèòå çàãîëîâêè ñòîëáöîâ äëÿ ýêñïîðòà", _
        "Ñòîëáöû äëÿ ýêñïîðòà", Replace(Selection.Address, ",", ";"), Type:=8)
 
    'Âûâîäèì îáùåå êîëè÷åñòâî ñòîëáöîâ âî âñåõ ïîääèàïàçîíàõ.
    MsgBox rngH.Count
End Sub

С уважением,

Aksima

Не по теме:

Вот так… Hugo обогнал меня за счет экономии времени на комментариях :).

Понравилась статья? Поделить с друзьями:
  • Excel vba количество отфильтрованных строк в
  • Excel vba количество знаков после запятой
  • Excel vba кодировка файла
  • Excel vba код символа кавычки
  • Excel vba изменить имя листа