Как узнать количество используемых столбцов на листе 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 | ||
|
P.S. Если пользователь аккуратный и не выделяет ячейки ниже/выше заголовков, то можно сделать еще проще:
Visual Basic | ||
|
С уважением,
Aksima
Не по теме:
Вот так… Hugo обогнал меня за счет экономии времени на комментариях :).