Vba excel размеры ячейки

Изменение размера ячейки в VBA Excel. Высота строки, ширина столбца, автоподбор ширины ячейки. Свойства RowHeight и ColumnWidth объекта Range.

Размер ячейки

Размер ячейки по высоте и ширине определяется высотой строки и шириной столбца, на пересечении которых она находится. Если, в вашем случае, нежелательно изменять размеры всей строки или всего столбца, используйте объединенные ячейки нужной величины.

Обратите внимание, что высота строки задается в пунктах, а ширина столбца в символах, поэтому их числовые значения не соответствуют друг другу по фактическому размеру.

Информационные окна с высотой строки и шириной столбца в Excel

Высота строки и ширина столбца в Excel

Программно, без дополнительных макросов, можно изменять высоту строки только в пунктах, а ширину столбца только в символах.

На сайте поддержки офисных приложений Microsoft так написано об этих величинах:

  • высота строки может принимать значение от 0 до 409 пунктов, причем 1 пункт приблизительно равен 1/72 дюйма или 0,035 см;
  • ширина столбца может принимать значение от 0 до 255, причем это значение соответствует количеству символов, которые могут быть отображены в ячейке.

Смотрите, как сделать все ячейки рабочего листа квадратными.

Высота строки

Для изменения высоты строки используйте свойство RowHeight объекта Range. И не важно, будет объект Range представлять из себя выделенный произвольный диапазон, отдельную ячейку, целую строку или целый столбец — высота всех строк, пересекающихся с объектом Range будет изменена после присвоения свойству RowHeight этого объекта нового значения.

Примеры изменения высоты строк:

Пример 1
Изменение высоты отдельной ячейки:

ActiveCell.RowHeight = 10

в результате, строка, в которой находится активная ячейка, приобретает высоту, равную 10 пунктам.

Пример 2
Изменение высоты строки:

в результате, третья строка рабочего листа приобретает высоту, равную 30 пунктам.

Пример 3
Изменение высоты ячеек заданного диапазона:

Range(«A1:D6»).RowHeight = 20

в результате, каждой из первых шести строк рабочего листа будет задана высота, равная 20 пунктам.

Пример 4
Изменение высоты ячеек целого столбца:

Columns(5).RowHeight = 15

в результате, всем строкам рабочего листа будет назначена высота, равная 15 пунктам.

Ширина столбца

Для изменения ширины столбца используйте свойство ColumnWidth объекта Range. Как и в случае с высотой строки, не важно, будет объект Range представлять из себя выделенный произвольный диапазон, отдельную ячейку, целую строку или целый столбец — ширина всех столбцов, пересекающихся с объектом Range будет изменена после присвоения свойству ColumnWidth этого объекта нового значения.

Примеры изменения ширины столбцов:

Пример 1
Изменение ширины отдельной ячейки:

ActiveCell.ColumnWidth = 15

в результате, столбец, в котором находится активная ячейка, приобретает ширину, равную 15 символам.

Пример 2
Изменение ширины столбца:

Columns(3).ColumnWidth = 50

в результате, третий столбец рабочего листа (столбец «C») приобретает ширину, равную 50 символам.

Пример 3
Изменение ширины ячеек заданного диапазона:

Range(«A1:D6»).ColumnWidth = 25

в результате, каждому из первых четырех столбцов рабочего листа будет задана ширина, равная 25 символам.

Пример 4
Изменение ширины ячеек целой строки:

в результате, всем столбцам рабочего листа будет назначена ширина, равная 35 символам.

Автоподбор ширины

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

‘запишем для примера в любую ячейку рабочего

‘листа какой-нибудь текст, например, такой:

Cells(5, 5) = «Автоподбор ширины ячейки»

‘теперь подгоним ширину ячейки, а точнее

‘столбца, в котором эта ячейка находится:

Cells(5, 5).EntireColumn.AutoFit

Имейте в виду, что ширина столбца будет подогнана по расположенной в этом столбце ячейке с самым длинным содержимым. Например, если длина содержимого ячейки Cells(7, 5) будет превышать длину содержимого ячейки Cells(5, 5), то автоподбор ширины пятого столбца произойдет по содержимому ячейки Cells(7, 5), несмотря на то, что в строке кода указана другая ячейка.

Как осуществить автоподбор ширины объединенной ячейки, в которой метод AutoFit не работает, смотрите в следующей статье.

Всё о работе с ячейками в Excel-VBA: обращение, перебор, удаление, вставка, скрытие, смена имени.

Содержание:

Table of Contents:

  • Что такое ячейка Excel?
  • Способы обращения к ячейкам
    • Выбор и активация
    • Получение и изменение значений ячеек
      • Ячейки открытой книги
      • Ячейки закрытой книги 
    • Перебор ячеек
    • Перебор в произвольном диапазоне
  • Свойства и методы ячеек
    • Имя ячейки
    • Адрес ячейки
    • Размеры ячейки
  • Запуск макроса активацией ячейки

2 нюанса:

  1. Я почти везде стараюсь использовать ThisWorkbook (а не, например, ActiveWorkbook) для обращения к текущей книге, в которой написан этот код (считаю это наиболее безопасным для новичков способом обращения к книгам, чтобы случайно не внести изменения в другие книги). Для экспериментов можете вставлять этот код в модули, коды книги, либо листа, и он будет работать только в пределах этой книги. 
  2. Я использую английский эксель и у меня по стандарту листы называются Sheet1, Sheet2 и т.д. Если вы работаете в русском экселе, то замените Thisworkbook.Sheets(«Sheet1») на Thisworkbook.Sheets(«Лист1»). Если этого не сделать, то вы получите ошибку в связи с тем, что пытаетесь обратиться к несуществующему объекту. Можно также заменить на Thisworkbook.Sheets(1), но это менее безопасно.

Что такое ячейка Excel?

В большинстве мест пишут: «элемент, образованный пересечением столбца и строки». Это определение полезно для людей, которые не знакомы с понятием «таблица». Для того, чтобы понять чем на самом деле является ячейка Excel, необходимо заглянуть в объектную модель Excel. При этом определения объектов «ряд», «столбец» и «ячейка» будут отличаться в зависимости от того, как мы работаем с файлом.

Объекты в Excel-VBA. Пока мы работаем в Excel без углубления в VBA определение ячейки как «пересечения» строк и столбцов нам вполне хватает, но если мы решаем как-то автоматизировать процесс в VBA, то о нём лучше забыть и просто воспринимать лист как «мешок» ячеек, с каждой из которых VBA позволяет работать как минимум тремя способами:

  1. по цифровым координатам (ряд, столбец),
  2. по адресам формата А1, B2 и т.д. (сценарий целесообразности данного способа обращения в VBA мне сложно представить)
  3. по уникальному имени (во втором и третьем вариантах мы будем иметь дело не совсем с ячейкой, а с объектом VBA range, который может состоять из одной или нескольких ячеек). Функции и методы объектов Cells и Range отличаются. Новичкам я бы порекомендовал работать с ячейками VBA только с помощью Cells и по их цифровым координатам и использовать Range только по необходимости.

Все три способа обращения описаны далее

Как это хранится на диске и как с этим работать вне Excel? С точки зрения хранения и обработки вне Excel и VBA. Сделать это можно, например, сменив расширение файла с .xls(x) на .zip и открыв этот архив.

Пример содержимого файла Excel:

Далее xl -> worksheets и мы видим файл листа

Содержимое файла:

 То же, но более наглядно:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac xr xr2 xr3" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" xmlns:xr="http://schemas.microsoft.com/office/spreadsheetml/2014/revision" xmlns:xr2="http://schemas.microsoft.com/office/spreadsheetml/2015/revision2" xmlns:xr3="http://schemas.microsoft.com/office/spreadsheetml/2016/revision3" xr:uid="{00000000-0001-0000-0000-000000000000}">
	<dimension ref="B2:F6"/>
	<sheetViews>
		<sheetView tabSelected="1" workbookViewId="0">
			<selection activeCell="D12" sqref="D12"/>
		</sheetView>
	</sheetViews>
	<sheetFormatPr defaultRowHeight="14.4" x14ac:dyDescent="0.3"/>
	<sheetData>
		<row r="2" spans="2:6" x14ac:dyDescent="0.3">
			<c r="B2" t="s">
				<v>0</v>
			</c>
		</row>
		<row r="3" spans="2:6" x14ac:dyDescent="0.3">
			<c r="C3" t="s">
				<v>1</v>
			</c>
		</row>
		<row r="4" spans="2:6" x14ac:dyDescent="0.3">
			<c r="D4" t="s">
				<v>2</v>
			</c>
		</row>
		<row r="5" spans="2:6" x14ac:dyDescent="0.3">
			<c r="E5" t="s">
				<v>0</v></c>
		</row>
		<row r="6" spans="2:6" x14ac:dyDescent="0.3">
			<c r="F6" t="s"><v>3</v>
		</c></row>
	</sheetData>
	<pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/>
</worksheet>

Как мы видим, в структуре объектной модели нет никаких «пересечений». Строго говоря рабочая книга — это архив структурированных данных в формате XML. При этом в каждую «строку» входит «столбец», и в нём в свою очередь прописан номер значения данного столбца, по которому оно подтягивается из другого XML файла при открытии книги для экономии места за счёт отсутствия повторяющихся значений. Почему это важно. Если мы захотим написать какой-то обработчик таких файлов, который будет напрямую редактировать данные в этих XML, то ориентироваться надо на такую модель и структуру данных. И правильное определение будет примерно таким: ячейка — это объект внутри столбца, который в свою очередь находится внутри строки в файле xml, в котором хранятся данные о содержимом листа.

Способы обращения к ячейкам

Выбор и активация

Почти во всех случаях можно и стоит избегать использования методов Select и Activate. На это есть две причины:

  1. Это лишь имитация действий пользователя, которая замедляет выполнение программы. Работать с объектами книги можно напрямую без использования методов Select и Activate.
  2. Это усложняет код и может приводить к неожиданным последствиям. Каждый раз перед использованием Select необходимо помнить, какие ещё объекты были выбраны до этого и не забывать при необходимости снимать выбор. Либо, например, в случае использования метода Select в самом начале программы может быть выбрано два листа вместо одного потому что пользователь запустил программу, выбрав другой лист.

Можно выбирать и активировать книги, листы, ячейки, фигуры, диаграммы, срезы, таблицы и т.д.

Отменить выбор  ячеек можно методом Unselect:

Selection.Unselect

Отличие выбора от активации — активировать можно только один объект из раннее выбранных. Выбрать можно несколько объектов.

Если вы записали и редактируете код макроса, то лучше всего заменить Select и Activate на конструкцию With … End With. Например, предположим, что мы записали вот такой макрос:

Sub Macro1()
' Macro1 Macro
    Range("F4:F10,H6:H10").Select 'выбрали два несмежных диапазона зажав ctrl
    Range("H6").Activate          'показывает только то, что я начал выбирать второй диапазон с этой ячейки (она осталась белой). Это действие ни на что не влияет
    With Selection.Interior       
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 65535            'залили желтым цветом, нажав на кнопку заливки на верхней панели
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
End Sub

Почему макрос записался таким неэффективным образом? Потому что в каждый момент времени (в каждой строке) программа не знает, что вы будете делать дальше. Поэтому в записи выбор ячеек и действия с ними — это два отдельных действия. Этот код лучше всего оптимизировать (особенно если вы хотите скопировать его внутрь какого-нибудь цикла, который должен будет исполняться много раз и перебирать много объектов). Например, так:

Sub Macro11()
'
' Macro1 Macro
    Range("F4:F10,H6:H10").Select '1. смотрим, что за объект выбран (что идёт до .Select)
    Range("H6").Activate
    With Selection.Interior       '2. понимаем, что у выбранного объекта есть свойство interior, с которым далее идёт работа
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 65535
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
End Sub



Sub Optimized_Macro()
    With Range("F4:F10,H6:H10").Interior '3. переносим объект напрямую в конструкцию With вместо Selection
' ////// Здесь я для надёжности прописал бы ещё Thisworkbook.Sheet("ИмяЛиста") перед Range,
' ////// чтобы минимизировать риск любых случайных изменений других листов и книг
' ////// With Thisworkbook.Sheet("ИмяЛиста").Range("F4:F10,H6:H10").Interior
        .Pattern = xlSolid               '4. полностью копируем всё, что было записано рекордером внутрь блока with
        .PatternColorIndex = xlAutomatic
        .Color = 55555                   '5. здесь я поменял цвет на зеленый, чтобы было видно, работает ли код при поочерёдном запуске двух макросов
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
End Sub

Пример сценария, когда использование Select и Activate оправдано:

Допустим, мы хотим, чтобы во время исполнения программы мы одновременно изменяли несколько листов одним действием и пользователь видел какой-то определённый лист. Это можно сделать примерно так:

Sub Select_Activate_is_OK()
Thisworkbook.Worksheets(Array("Sheet1", "Sheet3")).Select 'Выбираем несколько листов по именам
Thisworkbook.Worksheets("Sheet3").Activate 'Показываем пользователю третий лист
'Далее все действия с выбранными ячейками через Select будут одновременно вносить изменения в оба выбранных листа

'Допустим, что тут мы решили покрасить те же два диапазона:
Range("F4:F10,H6:H10").Select
    Range("H6").Activate
    With Selection.Interior       
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 65535
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With

End Sub

Единственной причиной использовать этот код по моему мнению может быть желание зачем-то показать пользователю определённую страницу книги в какой-то момент исполнения программы. С точки зрения обработки объектов, опять же, эти действия лишние.

Получение и изменение значений ячеек

Значение ячеек можно получать/изменять с помощью свойства value. 

'Если нужно прочитать / записать значение ячейки, то используется свойство Value
a = ThisWorkbook.Sheets("Sheet1").Cells (1,1).Value 'записать значение ячейки А1 листа "Sheet1" в переменную "a"
ThisWorkbook.Sheets("Sheet1").Cells (1,1).Value = 1  'задать значение ячейки А1 (первый ряд, первый столбец) листа "Sheet1"

'Если нужно прочитать текст как есть (с форматированием), то можно использовать свойство .text:
ThisWorkbook.Sheets("Sheet1").Cells (1,1).Text = "1" 
a = ThisWorkbook.Sheets("Sheet1").Cells (1,1).Text

'Когда проявится разница:
'Например, если мы считываем дату в формате "31 декабря 2021 г.", хранящуюся как дата
a = ThisWorkbook.Sheets("Sheet1").Cells (1,1).Value 'эапишет как "31.12.2021"
a = ThisWorkbook.Sheets("Sheet1").Cells (1,1).Text  'запишет как "31 декабря 2021 г."

Ячейки открытой книги

К ячейкам можно обращаться:

'В книге, в которой хранится макрос (на каком-то из листов, либо в отдельном модуле или форме)
ThisWorkbook.Sheets("Sheet1").Cells(1,1).Value        'По номерам строки и столбца
ThisWorkbook.Sheets("Sheet1").Cells(1,"A").Value      'По номерам строки и букве столбца
ThisWorkbook.Sheets("Sheet1").Range("A1").Value       'По адресу - вариант 1
ThisWorkbook.Sheets("Sheet1").[A1].Value              'По адресу - вариант 2
ThisWorkbook.Sheets("Sheet1").Range("CellName").Value 'По имени ячейки (для этого ей предварительно нужно его присвоить)

'Те же действия, но с использованием полного названия рабочей книги (книга должна быть открыта)
Workbooks("workbook.xlsm").Sheets("Sheet1").Cells(1,1).Value 'По номерам строки и столбца
Workbooks("workbook.xlsm").Sheets("Sheet1").Cells(1,"A").Value                'По номерам строки и букве столбца
Workbooks("workbook.xlsm").Sheets("Sheet1").Range("A1").Value                 'По адресу - вариант 1
Workbooks("workbook.xlsm").Sheets("Sheet1").[A1].Value                        'По адресу - вариант 2
Workbooks("workbook.xlsm").Sheets("Sheet1").Range("CellName").Value           'По имени ячейки (для этого ей предварительно нужно его присвоить)

Ячейки закрытой книги

Если нужно достать или изменить данные в другой закрытой книге, то необходимо прописать открытие и закрытие книги. Непосредственно работать с закрытой книгой не получится, потому что данные в ней хранятся отдельно от структуры и при открытии Excel каждый раз производит расстановку значений по соответствующим «слотам» в структуре. Подробнее о том, как хранятся данные в xlsx см выше.

Workbooks.Open Filename:="С:closed_workbook.xlsx"    'открыть книгу (она становится активной)
a = ActiveWorkbook.Sheets("Sheet1").Cells(1,1).Value  'достать значение ячейки 1,1
ActiveWorkbook.Close False                            'закрыть книгу (False => без сохранения)

Скачать пример, в котором можно посмотреть, как доставать и как записывать значения в закрытую книгу. 

Код из файла:

Option Explicit
Sub get_value_from_closed_wb() 'достать значение из закрытой книги
Dim a, wb_path, wsh As String
wb_path = ThisWorkbook.Sheets("Sheet1").Cells(2, 3).Value 'get path to workbook from sheet1
wsh = ThisWorkbook.Sheets("Sheet1").Cells(3, 3).Value
Workbooks.Open Filename:=wb_path
a = ActiveWorkbook.Sheets(wsh).Cells(3, 3).Value
ActiveWorkbook.Close False
ThisWorkbook.Sheets("Sheet1").Cells(4, 3).Value = a
End Sub

Sub record_value_to_closed_wb() 'записать значение в закрытую книгу
Dim wb_path, b, wsh As String
wsh = ThisWorkbook.Sheets("Sheet1").Cells(3, 3).Value
wb_path = ThisWorkbook.Sheets("Sheet1").Cells(2, 3).Value 'get path to workbook from sheet1
b = ThisWorkbook.Sheets("Sheet1").Cells(5, 3).Value 'get value to record in the target workbook
Workbooks.Open Filename:=wb_path
ActiveWorkbook.Sheets(wsh).Cells(4, 4).Value = b 'add new value to cell D4 of the target workbook
ActiveWorkbook.Close True
End Sub

Перебор ячеек

Перебор в произвольном диапазоне

Скачать файл со всеми примерами

Пройтись по всем ячейкам в нужном диапазоне можно разными способами. Основные:

  1. Цикл For Each. Пример:
    Sub iterate_over_cells()
    
    For Each c In ThisWorkbook.Sheets("Sheet1").Range("B2:D4").Cells
    MsgBox (c)
    Next c
    
    End Sub​

    Этот цикл выведет в виде сообщений значения ячеек в диапазоне B2:D4 по порядку по строкам слева направо и по столбцам — сверху вниз. Данный способ можно использовать для действий, в который вам не важны номера ячеек (закрашивание, изменение форматирования, пересчёт чего-то и т.д.).

  2. Ту же задачу можно решить с помощью двух вложенных циклов — внешний будет перебирать ряды, а вложенный — ячейки в рядах. Этот способ я использую чаще всего, потому что он позволяет получить больше контроля над исполнением: на каждой итерации цикла нам доступны координаты ячеек. Для перебора всех ячеек на листе этим методом потребуется найти последнюю заполненную ячейку. Пример кода:
    Sub iterate_over_cells()
    
    Dim cl, rw As Integer
    Dim x As Variant
    
    'перебор области 3x3
    For rw = 1 To 3 ' цикл для перебора рядов 1-3
    
        For cl = 1 To 3 'цикл для перебора столбцов 1-3
            x = ThisWorkbook.Sheets("Sheet1").Cells(rw + 1, cl + 1).Value
            MsgBox (x)
        Next cl
    Next rw
    
    
    
    'перебор всех ячеек на листе. Последняя ячейка определена с помощью UsedRange
    'LastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
    'LastCol = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1
    'For rw = 1 To LastRow 'цикл перебора всех рядов
    '    For cl = 1 To LastCol 'цикл для перебора всех столбцов
    '        Действия 
    '    Next cl
    'Next rw
    
    
    End Sub​
  3. Если нужно перебрать все ячейки в выделенном диапазоне на активном листе, то код будет выглядеть так:
    Sub iterate_cell_by_cell_over_selection()
        Dim ActSheet As Worksheet
        Dim SelRange As Range
        Dim cell As Range
        
     
        Set ActSheet = ActiveSheet
        Set SelRange = Selection
        
        'if we want to do it in every cell of the selected range
        For Each cell In Selection
        MsgBox (cell.Value)
        
        Next cell
    
    End Sub​

    Данный метод подходит для интерактивных макросов, которые выполняют действия над выбранными пользователем областями.

  4. Перебор ячеек в ряду
    Sub iterate_cells_in_row()
        Dim i, RowNum, StartCell As Long
        
        RowNum = 3 'какой ряд
        StartCell = 0 ' номер начальной ячейки (минус 1, т.к. в цикле мы прибавляем i)
        
        For i = 1 To 10 ' 10 ячеек в выбранном ряду
        ThisWorkbook.Sheets("Sheet1").Cells(RowNum, i + StartCell).Value = i '(i + StartCell) добавляет 1 к номеру столбца при каждом повторении
        Next i
    
    End Sub
  5. Перебор ячеек в столбце
    Sub iterate_cells_in_column()
        Dim i, ColNum, StartCell As Long
        
        ColNum = 3 'какой столбец
        StartCell = 0 ' номер начальной ячейки (минус 1, т.к. в цикле мы прибавляем i)
        
        For i = 1 To 10 ' 10 ячеек
        ThisWorkbook.Sheets("Sheet1").Cells(i + StartCell, ColNum).Value = i ' (i + StartCell) добавляет 1 к номеру ряда при каждом повторении
        Next i
    
    End Sub​

Свойства и методы ячеек

Имя ячейки

Присвоить новое имя можно так:

Thisworkbook.Sheets(1).Cells(1,1).name = "Новое_Имя"

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

ActiveWorkbook.Names("Старое_Имя").Delete

Пример кода для переименования ячеек:

Sub rename_cell()

old_name = "Cell_Old_Name"
new_name = "Cell_New_Name"

ActiveWorkbook.Names(old_name).Delete
ThisWorkbook.Sheets(1).Cells(2, 1).Name = new_name
End Sub

Sub rename_cell_reverse()

old_name = "Cell_New_Name"
new_name = "Cell_Old_Name"

ActiveWorkbook.Names(old_name).Delete
ThisWorkbook.Sheets(1).Cells(2, 1).Name = new_name
End Sub

Адрес ячейки

Sub get_cell_address() ' вывести адрес ячейки в формате буква столбца, номер ряда
  '$A$1 style
  txt_address = ThisWorkbook.Sheets(1).Cells(3, 2).Address
  MsgBox (txt_address)
End Sub

Sub get_cell_address_R1C1()' получить адрес столбца в формате номер ряда, номер столбца
  'R1C1 style
  txt_address = ThisWorkbook.Sheets(1).Cells(3, 2).Address(ReferenceStyle:=xlR1C1)
  MsgBox (txt_address)
End Sub

  'пример функции, которая принимает 2 аргумента: название именованного диапазона и тип желаемого адреса 
  '(1- тип $A$1 2- R1C1 - номер ряда, столбца)
Function get_cell_address_by_name(str As String, address_type As Integer)
  '$A$1 style
  Select Case address_type
    Case 1
      txt_address = Range(str).Address
    Case 2
      txt_address = Range(str).Address(ReferenceStyle:=xlR1C1)
    Case Else
      txt_address = "Wrong address type selected. 1,2 available"
    End Select
  get_cell_address_by_name = txt_address
End Function

'перед запуском нужно убедиться, что в книге есть диапазон с названием, 
'адрес которого мы хотим получить, иначе будет ошибка
Sub test_function() 'запустите эту программу, чтобы увидеть, как работает функция
  x = get_cell_address_by_name("MyValue", 2)
  MsgBox (x)
End Sub

Размеры ячейки

Ширина и длина ячейки в VBA меняется, например, так:

Sub change_size()
Dim x, y As Integer
Dim w, h As Double

'получить координаты целевой ячейки
x = ThisWorkbook.Sheets("Sheet1").Cells(2, 2).Value
y = ThisWorkbook.Sheets("Sheet1").Cells(3, 2).Value

'получить желаемую ширину и высоту ячейки
w = ThisWorkbook.Sheets("Sheet1").Cells(6, 2).Value
h = ThisWorkbook.Sheets("Sheet1").Cells(7, 2).Value

'сменить высоту и ширину ячейки с координатами x,y
ThisWorkbook.Sheets("Sheet1").Cells(x, y).RowHeight = h
ThisWorkbook.Sheets("Sheet1").Cells(x, y).ColumnWidth = w


End Sub

Прочитать значения ширины и высоты ячеек можно двумя способами (однако результаты будут в разных единицах измерения). Если написать просто Cells(x,y).Width или Cells(x,y).Height, то будет получен результат в pt (привязка к размеру шрифта). 

Sub get_size()
Dim x, y As Integer
'получить координаты ячейки, с которой мы будем работать
x = ThisWorkbook.Sheets("Sheet1").Cells(2, 2).Value
y = ThisWorkbook.Sheets("Sheet1").Cells(3, 2).Value

'получить длину и ширину выбранной ячейки в тех же единицах измерения, в которых мы их задавали
ThisWorkbook.Sheets("Sheet1").Cells(2, 6).Value = ThisWorkbook.Sheets("Sheet1").Cells(x, y).ColumnWidth
ThisWorkbook.Sheets("Sheet1").Cells(3, 6).Value = ThisWorkbook.Sheets("Sheet1").Cells(x, y).RowHeight

'получить длину и ширину с помощью свойств ячейки (только для чтения) в поинтах (pt)
ThisWorkbook.Sheets("Sheet1").Cells(7, 9).Value = ThisWorkbook.Sheets("Sheet1").Cells(x, y).Width
ThisWorkbook.Sheets("Sheet1").Cells(8, 9).Value = ThisWorkbook.Sheets("Sheet1").Cells(x, y).Height

End Sub

Скачать файл с примерами изменения и чтения размера ячеек

Запуск макроса активацией ячейки

Для запуска кода VBA при активации ячейки необходимо вставить в код листа нечто подобное:

3 важных момента, чтобы это работало:

1. Этот код должен быть вставлен в код листа (здесь контролируется диапазон D4)

2-3. Программа, ответственная за запуск кода при выборе ячейки, должна называться Worksheet_SelectionChange и должна принимать значение переменной Target, относящейся к триггеру SelectionChange. Другие доступные триггеры можно посмотреть в правом верхнем углу (2).

Скачать файл с базовым примером (как на картинке)

Скачать файл с расширенным примером (код ниже)

Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

        ' имеем в виду, что триггер SelectionChange будет запускать эту Sub после каждого клика мышью (после каждого клика будет проверяться:
          '1. количество выделенных ячеек и 
          '2. не пересекается ли выбранный диапазон с заданным в этой программе диапазоном.
        ' поэтому в эту программу не стоит без необходимости писать никаких других тяжелых операций

    If Selection.Count = 1 Then 'запускаем программу только если выбрано не более 1 ячейки


    'вариант модификации - брать адрес ячейки из другой ячейки:
    'Dim CellName as String
    'CellName = Activesheet.Cells(1,1).value 'брать текстовое имя контролируемой ячейки из A1 (должно быть в формате Буква столбца + номер строки)
    'If Not Intersect(Range(CellName), Target) Is Nothing Then
    'для работы этой модификации следующую строку надо закомментировать/удалить



        If Not Intersect(Range("D4"), Target) Is Nothing Then 
        'если заданный (D4) и выбранный диапазон пересекаются 
        '(пересечение диапазонов НЕ равно Nothing)

        'можно прописать диапазон из нескольких ячеек:
        'If Not Intersect(Range("D4:E10"), Target) Is Nothing Then
        'можно прописать несколько диапазонов:
        'If Not Intersect(Range("D4:E10"), Target) Is Nothing or Not Intersect(Range("A4:A10"), Target) Is Nothing Then

            Call program 'выполняем программу
        End If
    End If
End Sub

Sub program()

MsgBox ("Program Is running") 'здесь пишем код того, что произойдёт при выборе нужной ячейки


End Sub

Return to VBA Code Examples

In this Article

  • Set Column Width with VBA
  • Set Row Height with VBA
  • Autofit Column Width
  • Autofit Row Height
  • Set Cell Width
  • Set Cell Height
  • Obtain Column Width
  • Obtain Row Height
  • VBA Coding Made Easy

This tutorial will demonstrate how to set row height and column widths using VBA.

Excel Row heights and Columns widths can be changed in VBA by setting the .RowHeight and .ColumnWidth properties.

Set Column Width with VBA

Macro to set the column width of Columns A to E:

Sub Column_Width()
    Columns("A:E").ColumnWidth = 30
End Sub

Set Row Height with VBA

Macro to set the row height of Row 1:

Sub RowHeight()
    Rows("1:1").RowHeight = 30
End Sub

Autofit Column Width

Excel offers the ability to “Autofit” column widths. This feature adjusts the column width so that the column(s) is wide enough to fit all text found in that column.
vba autofit column width
To Autofit column widths in VBA:

Columns("A:B").Autofit

We wrote more about this in another article on how to Autofit a Column from VBA, including how to Autofit all used columns.

Autofit Row Height

You can also autofit row heights using a similar method:

Rows("1:2").Autofit

Set Cell Width

You can also adjust column widths by referencing a cell:

Range("a1").EntireColumn.ColumnWidth = 20

Set Cell Height

Or adjust row heights by referencing a cell:

Range("a1").EntireRow.RowHeight = 10

Obtain Column Width

To obtain the column width of a column:

dim iColumnWidth as long
iColumnWidth = columns("a").ColumnWidth

Note: This will return Null if all columns in the range do not have the same width.

Obtain Row Height

Similarly, you can obtain the row height:

dim iRowHeight as long
iRowHeight = rows("1").RowHeight

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro – A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!

vba set column width

Learn More!

<<Return to VBA Examples

Содержание

  1. Свойство Range.Resize (Excel)
  2. Синтаксис
  3. Параметры
  4. Возвращаемое значение
  5. Пример
  6. Поддержка и обратная связь
  7. VBA Excel. Свойства ячейки (объекта Range)
  8. Ячейка и объект Range
  9. Свойства ячейки (объекта Range)
  10. Простые примеры для начинающих
  11. Форматирование ячеек
  12. Свойство Worksheet.Cells (Excel)
  13. Синтаксис
  14. Замечания
  15. Пример
  16. Поддержка и обратная связь
  17. VBA Excel. Размер ячейки (высота строки, ширина столбца)
  18. Размер ячейки
  19. Высота строки
  20. Ширина столбца
  21. Автоподбор ширины
  22. VBA Excel. Автоподбор высоты объединенной ячейки
  23. Автоподбор высоты ячейки
  24. Обработка списка ячеек
  25. 12 комментариев для “VBA Excel. Автоподбор высоты объединенной ячейки”

Свойство Range.Resize (Excel)

Изменяет размер указанного диапазона. Возвращает объект Range , представляющий измененный диапазон.

Синтаксис

expression. Изменение размера (RowSize, ColumnSize)

выражение: выражение, возвращающее объект Range.

Параметры

Имя Обязательный или необязательный Тип данных Описание
RowSize Необязательный Variant Количество строк в новом диапазоне. Если этот аргумент опущен, количество строк в диапазоне остается неизменным.
ColumnSize Необязательный Variant Количество столбцов в новом диапазоне. Если этот аргумент опущен, количество столбцов в диапазоне останется прежним.

Возвращаемое значение

Пример

Этот пример изменяет размер выделенного фрагмента на Листе1, чтобы расширить его на одну строку и один столбец.

В этом примере предполагается, что на листе Sheet1 есть таблица со строкой заголовка. В примере выбирается таблица без выбора строки заголовка. Перед выполнением примера активная ячейка должна находиться где-то в таблице.

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

VBA Excel. Свойства ячейки (объекта Range)

Свойства ячейки, часто используемые в коде VBA Excel. Демонстрация свойств ячейки, как структурной единицы объекта Range, на простых примерах.

Ячейка и объект Range

Объект Range в VBA Excel представляет диапазон ячеек. Он (объект Range) может описывать любой диапазон, начиная от одной ячейки и заканчивая сразу всеми ячейками рабочего листа.

  • Одна ячейка – Range(«A1») .
  • Девять ячеек – Range(«A1:С3») .
  • Весь рабочий лист в Excel 2016 – Range(«1:1048576») .

В VBA Excel есть свойство Cells объекта Range, которое позволяет обратиться к одной ячейке в указанном диапазоне (возвращает объект Range в виде одной ячейки). Если в коде используется свойство Cells без указания диапазона, значит оно относится ко всему диапазону активного рабочего листа.

Примеры обращения к одной ячейке:

  • Cells(1000) , где 1000 – порядковый номер ячейки на рабочем листе, возвращает ячейку «ALL1».
  • Cells(50, 20) , где 50 – номер строки рабочего листа, а 20 – номер столбца, возвращает ячейку «T50».
  • Range(«A1:C3»).Cells(6) , где «A1:C3» – заданный диапазон, а 6 – порядковый номер ячейки в этом диапазоне, возвращает ячейку «C2».

Подробнее о том, как обратиться к ячейке, смотрите в статье: Ячейки (обращение, запись, чтение, очистка).

В этой статье мы рассмотрим свойства объекта Range, применимые, в том числе, к диапазону, состоящему из одной ячейки.

Еще надо добавить, что свойства и методы объектов отделяются от объектов точкой, как в третьем примере обращения к одной ячейке: Range(«A1:C3»).Cells(6) .

Свойства ячейки (объекта Range)

Свойство Описание
Address Возвращает адрес ячейки (диапазона).
Borders Возвращает коллекцию Borders, представляющую границы ячейки (диапазона). Подробнее…
Cells Возвращает объект Range, представляющий коллекцию всех ячеек заданного диапазона. Указав номер строки и номер столбца или порядковый номер ячейки в диапазоне, мы получаем конкретную ячейку. Подробнее…
Characters Возвращает подстроку в размере указанного количества символов из текста, содержащегося в ячейке. Подробнее…
Column Возвращает номер столбца ячейки (первого столбца диапазона). Подробнее…
ColumnWidth Возвращает или задает ширину ячейки в пунктах (ширину всех столбцов в указанном диапазоне).
Comment Возвращает комментарий, связанный с ячейкой (с левой верхней ячейкой диапазона).
CurrentRegion Возвращает прямоугольный диапазон, ограниченный пустыми строками и столбцами. Очень полезное свойство для возвращения рабочей таблицы, а также определения номера последней заполненной строки.
EntireColumn Возвращает весь столбец (столбцы), в котором содержится ячейка (диапазон). Диапазон может содержаться и в одном столбце, например, Range(«A1:A20») .
EntireRow Возвращает всю строку (строки), в которой содержится ячейка (диапазон). Диапазон может содержаться и в одной строке, например, Range(«A2:H2») .
Font Возвращает объект Font, представляющий шрифт указанного объекта. Подробнее о цвете шрифта…
HorizontalAlignment Возвращает или задает значение горизонтального выравнивания содержимого ячейки (диапазона). Подробнее…
Interior Возвращает объект Interior, представляющий внутреннюю область ячейки (диапазона). Применяется, главным образом, для возвращения или назначения цвета заливки (фона) ячейки (диапазона). Подробнее…
Name Возвращает или задает имя ячейки (диапазона).
NumberFormat Возвращает или задает код числового формата для ячейки (диапазона). Примеры кодов числовых форматов можно посмотреть, открыв для любой ячейки на рабочем листе Excel диалоговое окно «Формат ячеек», на вкладке «(все форматы)». Свойство NumberFormat диапазона возвращает значение NULL, за исключением тех случаев, когда все ячейки в диапазоне имеют одинаковый числовой формат. Если нужно присвоить ячейке текстовый формат, записывается так: Range(«A1»).NumberFormat = «@» . Общий формат: Range(«A1»).NumberFormat = «General» .
Offset Возвращает объект Range, смещенный относительно первоначального диапазона на указанное количество строк и столбцов. Подробнее…
Resize Изменяет размер первоначального диапазона до указанного количества строк и столбцов. Строки добавляются или удаляются снизу, столбцы – справа. Подробнее…
Row Возвращает номер строки ячейки (первой строки диапазона). Подробнее…
RowHeight Возвращает или задает высоту ячейки в пунктах (высоту всех строк в указанном диапазоне).
Text Возвращает форматированный текст, содержащийся в ячейке. Свойство Text диапазона возвращает значение NULL, за исключением тех случаев, когда все ячейки в диапазоне имеют одинаковое содержимое и один формат. Предназначено только для чтения. Подробнее…
Value Возвращает или задает значение ячейки, в том числе с отображением значений в формате Currency и Date. Тип данных Variant. Value является свойством ячейки по умолчанию, поэтому в коде его можно не указывать.
Value2 Возвращает или задает значение ячейки. Тип данных Variant. Значения в формате Currency и Date будут отображены в виде чисел с типом данных Double.
VerticalAlignment Возвращает или задает значение вертикального выравнивания содержимого ячейки (диапазона). Подробнее…

В таблице представлены не все свойства объекта Range. С полным списком вы можете ознакомиться не сайте разработчика.

Простые примеры для начинающих

Вы можете скопировать примеры кода VBA Excel в стандартный модуль и запустить их на выполнение. Как создать стандартный модуль и запустить процедуру на выполнение, смотрите в статье VBA Excel. Начинаем программировать с нуля.

Учтите, что в одном программном модуле у всех процедур должны быть разные имена. Если вы уже копировали в модуль подпрограммы с именами Primer1, Primer2 и т.д., удалите их или создайте еще один стандартный модуль.

Форматирование ячеек

Заливка ячейки фоном, изменение высоты строки, запись в ячейки текста, автоподбор ширины столбца, выравнивание текста в ячейке и выделение его цветом, добавление границ к ячейкам, очистка содержимого и форматирования ячеек.

Если вы запустите эту процедуру, информационное окно MsgBox будет прерывать выполнение программы и сообщать о том, что произойдет дальше, после его закрытия.

Источник

Свойство Worksheet.Cells (Excel)

Возвращает объект Range , представляющий все ячейки на листе (а не только используемые в данный момент ячейки).

Синтаксис

выражение.Cells

Выражение Переменная, представляющая объект Worksheet .

Замечания

Так как элемент по умолчанию объекта Range направляет вызовы с параметрами в свойство Item, можно указать индекс строки и столбца сразу после ключевого слова Cells, вместо явного вызова свойства Item.

При использовании этого свойства без квалификатора объекта возвращается объект Range, который представляет все ячейки на активном листе.

Пример

В этом примере размер шрифта ячейки C5 на листе 1 активной книги устанавливается в 14 пунктов.

В этом примере формула очищается в ячейке 1 на листе 1 активной книги.

В этом примере шрифт и размер шрифта для каждой ячейки на листе Sheet1 устанавливается значение Arial из 8 точек.

В этом примере выполняется переключение сортировки между порядком по возрастанию и убыванию при двойном щелчке любой ячейки в диапазоне данных. Данные сортируются по столбцу ячейки, дважды щелкнув которую.

В этом примере выполняется просмотр столбца C активного листа, и для каждой ячейки с комментарием текст примечания помещается в столбец D и удаляется комментарий из столбца C.

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

VBA Excel. Размер ячейки (высота строки, ширина столбца)

Изменение размера ячейки в VBA Excel. Высота строки, ширина столбца, автоподбор ширины ячейки. Свойства RowHeight и ColumnWidth объекта Range.

Размер ячейки

Размер ячейки по высоте и ширине определяется высотой строки и шириной столбца, на пересечении которых она находится. Если, в вашем случае, нежелательно изменять размеры всей строки или всего столбца, используйте объединенные ячейки нужной величины.

Обратите внимание, что высота строки задается в пунктах, а ширина столбца в символах, поэтому их числовые значения не соответствуют друг другу по фактическому размеру.

Высота строки и ширина столбца в Excel

Программно, без дополнительных макросов, можно изменять высоту строки только в пунктах, а ширину столбца только в символах.

На сайте поддержки офисных приложений Microsoft так написано об этих величинах:

  • высота строки может принимать значение от 0 до 409 пунктов, причем 1 пункт приблизительно равен 1/72 дюйма или 0,035 см;
  • ширина столбца может принимать значение от 0 до 255, причем это значение соответствует количеству символов, которые могут быть отображены в ячейке.

Смотрите, как сделать все ячейки рабочего листа квадратными.

Высота строки

Для изменения высоты строки используйте свойство RowHeight объекта Range. И не важно, будет объект Range представлять из себя выделенный произвольный диапазон, отдельную ячейку, целую строку или целый столбец — высота всех строк, пересекающихся с объектом Range будет изменена после присвоения свойству RowHeight этого объекта нового значения.

Примеры изменения высоты строк:

Пример 1
Изменение высоты отдельной ячейки:

в результате, строка, в которой находится активная ячейка, приобретает высоту, равную 10 пунктам.

Пример 2
Изменение высоты строки:

в результате, третья строка рабочего листа приобретает высоту, равную 30 пунктам.

Пример 3
Изменение высоты ячеек заданного диапазона:

в результате, каждой из первых шести строк рабочего листа будет задана высота, равная 20 пунктам.

Пример 4
Изменение высоты ячеек целого столбца:

в результате, всем строкам рабочего листа будет назначена высота, равная 15 пунктам.

Ширина столбца

Для изменения ширины столбца используйте свойство ColumnWidth объекта Range. Как и в случае с высотой строки, не важно, будет объект Range представлять из себя выделенный произвольный диапазон, отдельную ячейку, целую строку или целый столбец — ширина всех столбцов, пересекающихся с объектом Range будет изменена после присвоения свойству ColumnWidth этого объекта нового значения.

Примеры изменения ширины столбцов:

Пример 1
Изменение ширины отдельной ячейки:

в результате, столбец, в котором находится активная ячейка, приобретает ширину, равную 15 символам.

Пример 2
Изменение ширины столбца:

в результате, третий столбец рабочего листа (столбец «C») приобретает ширину, равную 50 символам.

Пример 3
Изменение ширины ячеек заданного диапазона:

в результате, каждому из первых четырех столбцов рабочего листа будет задана ширина, равная 25 символам.

Пример 4
Изменение ширины ячеек целой строки:

в результате, всем столбцам рабочего листа будет назначена ширина, равная 35 символам.

Автоподбор ширины

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

Источник

VBA Excel. Автоподбор высоты объединенной ячейки

Автоподбор высоты объединенной ячейки с помощью кода VBA Excel, когда метод AutoFit не работает. Обработка ячеек по списку адресов из массива.

Автоподбор высоты ячейки

К сожалению, в объединенных ячейках метод VBA Excel AutoFit не работает. Но есть возможность подогнать ширину или высоту такой ячейки под длину текста с помощью макроса.

Здесь мы рассмотрим макрос для автоподбора высоты ячейки, объединенной с другими по горизонтали в одной строке, которые обычно используются в заголовках электронных таблиц Excel. Для объединенной ячейки должен быть задан перенос текста по словам: Формат ячеек >> Выравнивание >> переносить текст .

Высота ячейки будет такой, чтобы уместились все строки, на которые будет разбит контент в зависимости от ширины объединенной ячейки.

Для решения задачи по автоподбору высоты необходимо с помощью кода VBA определить:

  1. Длину текста (количество символов) в объединенной ячейке.
  2. Ширину объединенной ячейки. Длина одного символа текста со шрифтом и его размером по умолчанию приблизительно соответствует длине символа, в котором измеряется ширина ячейки.
  3. Размер шрифта, чтобы рассчитать коэффициент, увеличивающий или уменьшающий высоту ячейки в зависимости от его (шрифта) размера.

Макрос VBA Excel для автоподбора высоты ячейки с учетом размера используемого шрифта:

  • myCell — отдельная ячейка в объединенной;
  • myLen — длина текста в активной ячейке;
  • myWidth — ширина объединенной ячейки;
  • k — коэффициент, вносящий поправку в зависимости от размера шрифта;
  • n — размер шрифта по умолчанию.*

* Это не точное значение: у меня по умолчанию установлен шрифт Calibri размером 11, но точнее код работает с n = 10. Значение переменной n подбирается опытным путем, так как длина текста зависит от процентного соотношения широких и узких символов, если шрифт не моноширинный. Переменной n можно присваивать и дробные значения для более точного автоподбора высоты.

Максимальная высота строки — 409,5. Если расчетная высота объединенной ячейки окажется больше, будет сгенерирована ошибка.

Данный код VBA Excel работает с выделенной ячейкой. Вы можете задать список адресов объединенных ячеек и пройтись макросом по каждой из них.

Обработка списка ячеек

Укажите список объединенных ячеек в качестве аргументов функции Array. Для списка используйте адреса только первых ячеек из состава объединенных.

  • myCell — массив со списком адресов объединенных ячеек;
  • myElem — используется как элемент массива myCell.

Макрос ObkhodYacheyek по адресам из списка обращается к каждой ячейке по очереди, выделяет ее и запускает код автоподбора высоты PodborVysoty.

Если выделить диапазон объединенных ячеек по одной, удерживая клавишу Ctrl, то запустить код автоподбора высоты можно с помощью следующего макроса:

12 комментариев для “VBA Excel. Автоподбор высоты объединенной ячейки”

Здравствуйте, Евгений. А если сделать проверку каждой строки, ограничив по количеству строк и ячеек, сильно на производительности скажется? Или лучше прописывать
myCell = Array(«A1», . «A2000») ?

Добрый день, Алексей!
Сравните время выполнения обоих вариантов вашего кода.

Евгений, подскажите пожалуйста первый вариант, я думаю он длинный, да и я его не осилю.

Да нет, он не длинный, но вряд ли вам подойдут оба варианта, так как замедляет код метод .Select . Я то рассчитывал, когда писал эти коды, на небольшое количество объединенных ячеек. Замерьте время выполнения у этого варианта и напишите, что получилось:

Запускайте код не из редактора VBA, а кнопкой на рабочем листе или пользовательской форме, так он работает быстрее.

Вводная: у меня документ разноплановый и большой (32 ячейки (ширину подгонял для формата А4) на 2000 строк), т.е. присутствуют строки объединённые в одну (текст многострочный и однострочный), есть таблицы (как однострочные в ячейке, так и многострочные и с картинками в строках и с вертикальным текстом). В основном в строках, это формулы эксель, но есть и просто текст.
Отчёт по работе макроса. Засечь время не удалось, наблюдал работу макроса. Результат работы:
1. не правит одинарную строку (на 32 ячейки) многострочный текст, как было до работы макроса, так и осталось;
2. правит одинарную строку однострочный текст (местами отсутствует эта работа, необходимы ещё тесты, чтобы с уверенностью высказать);
3. таблицу с однострочными текстами правит хорошо;
4. в таблице с многострочными текстами есть нюансы, подгоняет ширину под первую ячейку, т.е. если во второй ячейке этой же строки есть более многострочный текст ширина строки определяется по первой ячейке и во второй содержание «съедается»;
5. вертикальные тексты в ячейках, отсутствуют боковые отступы от грани таблицы до текста;
6. если есть в документе пустая строка с ячейками не объединённая, макрос её (строку) ширину смещает в ноль;
Имеются ещё мелкие огрехи, но тут надо ещё тестировать и пробовать.
Много слов получилось и неутешительных. Если мой пост будет мешать вашей работе, можете его не публиковать. За правками макроса можно будет к вам обращаться?

За небольшими правками можете обращаться. Вот одна из них:

Это для того, чтобы не скрывались пустые строки.

А по п.1 не правит одинарную строку (на 32 ячейки) многострочный текст, можно сделать правку? или это по другой теме?

Я не совсем понял: многострочный текст в ячейке, объединенной из 32 ячеек?

Описывал процесс и понял, надо проще. Открываем новый документ эксель и ячейку А1 объединяем с ячейкой В1 получим строку (объединённая ячейка А1). Вот в неё вставляем многострочный текст (с переносом слов). Если не менялись размеры стандартных ячеек, то в такую объединённую ячейку в одну строку можно напечатать 17 букв «а». 18 буква сместится её можно будет увидеть только, если расширишь строку. Вот и получается строка одна, а в ней многострочный текст.

Если у вас автоматически не устанавливается высота строки, когда только один или несколько символов перенесены на новую строку, подберите более точное значение коэффициента n .

Привет.
Я придумал метод, как подстроить высоту объединенной ячейки с длинным текстом с помощью AutoFit, который встроен в Excel.
Идея заключается в том, чтобы на пустом (новом) листе завести обычную ячейку (формат естественно с переносом текста).
Если в нее скопировать текст из исходной объединенной ячейки, то он автоматом разобъется на строки и высота этой конечной ячейки даст нам искомую высоту для такой же объединенной ячейки.
Проблема в том, чтобы подобрать ширину одиночной ячейки такую, чтобы текст из объединенной ячейки «укладывался» в нее аналогичным образом. Ибо, как выяснилось в процессе эта ширина хоть и зависит линейно от ширины исходной ячейке, но не равна ей.
Например.
У меня есть объединенная ячейка, которая получилась объединением 62 одинаковых ячеек шириной 1.43 пункта.
Шрифт Coliri, 11, обычный.
«Ширина» объединенной ячейки получается 1.43 х 62 = 88.6
Так вот для обычной ячейки этой ширины оказалось мало.
Чтобы текст из исходной ячейки уложился в обычной в те же 5 строк, потребовалось задать ширину конечной ячейки 139.
То есть при выборе ширины обычной конечной ячейки нужно применять коэффициент 1.55-1.56 (в моем случае).
Возможно этот коэффициент постоянный, возможно зависит как он выбранного шрифта, так и от количества объединяемых ячеек и их исходной ширины и моноширинности (этот вопрос я не исследовал).
Но в итоге метод работает.
Я завожу обычную ячейку нужной ширины записываю в нее текст из исходной объединенной, текст автопереносится, и я получаю высоту для объединенной ячейки из свойств обычной.

Существенное замечание.
Формат ячейки для работы с длинным текстом должен быть «Общий» («General»).
При записи же в ячейку с форматом «Текстовый» строки более 256 символов отображаются ############ и автофит не работает.
Если формат Общий, то все работает и отображается как нужно.

Источник

Skip to content

Change Row Height and Column Width using Excel VBA

Home » Excel VBA » Change Row Height and Column Width using Excel VBA

Description:

Some times we may enter the data into cells more than it’s width. In this case we can not able to see entire text. So we can change row height and Column width using excel using VBA. So that we can see entire data in that cell. When you have more lengthy data in cells, you can Auto Adjust Column Width or Row Height in Excel VBA to show the entire data. So that users can see the entire data in the cells. We will see with Examples.

Changing Row Height in Excel VBA

Change Row Height in Excel VBA
We can change row height in Excel using RowHeight Property of a Row in VBA. See the following example to do it.

Examples

The following example will change the height of the 3rd Row to 25.

Sub sbChangeRowHeight()

'Changing the 3rd row Height
Rows(3).RowHeight = 25

End Sub

We can also set the height for multiple rows, the following example will change the height of the 3rd to 20th row height to 25.

Sub sbChangeRowHeightMulti()

'Changing the 3rd-25the row Height
Rows("3:25").RowHeight = 25

End Sub
Instructions:
  1. Open an excel workbook
  2. Press Alt+F11 to open VBA Editor
  3. Insert a Module for Insert Menu
  4. Copy the above code and Paste in the code window
  5. Save the file as macro enabled workbook
  6. Press F5 to execute itit

Changing Column Width in Excel VBA

Change Column Width in Excel VBA
We can change column width in Excel using ColumnWidth Property of a Column in VBA. See the following example to do it.

In this Example I am changing the Column B width to 25.

Sub sbChangeColumnWidth()

Columns("B").ColumnWidth = 25

End Sub

Examples

We can also set the column width for multiple columns at a time, see this Example I am changing the Column B to E width to 25.

Sub sbChangeColumnWidthMulti()

Columns("B:E").ColumnWidth = 25

End Sub
Instructions:
  1. Open an excel workbook
  2. Press Alt+F11 to open VBA Editor
  3. Insert a Module for Insert Menu
  4. Copy the above code and Paste in the code window
  5. Save the file as macro enabled workbook
  6. Press F5 to execute it

Auto Adjust Column Width and Row Height using Excel VBA

Auto Adjust Column Width - Row Height in Excel VBA
We can use AutoFit method of Columns and Rows in Excel using VBA to Auto Adjust the rows and Columns.

Examples

Code to Auto Adjust Column Width

Following are the example to show you how to do this.

Sub sbAutoAdjustColumnWidth()

    Columns(2).AutoFit

End Sub
Code to Auto fit Row Height

Following are the example to show you how to do this.

   Sub sbAutoAdjustRowHight()
   Rows(2).AutoFit
End Sub
Instructions:

Follow the instructions below to test the codes above.

  1. Open an excel workbook
  2. Press Alt+F11 to open VBA Editor
  3. Insert a Module for Insert Menu
  4. Copy the above code and Paste in the code window
  5. Save the file as macro enabled workbook
  6. Press F5 to execute it
Effortlessly Manage Your Projects and Resources
120+ Professional Project Management Templates!

A Powerful & Multi-purpose Templates for project management. Now seamlessly manage your projects, tasks, meetings, presentations, teams, customers, stakeholders and time. This page describes all the amazing new features and options that come with our premium templates.

Save Up to 85% LIMITED TIME OFFER
Excel VBA Project Management Templates
All-in-One Pack
120+ Project Management Templates
Essential Pack
50+ Project Management Templates

Excel Pack
50+ Excel PM Templates

PowerPoint Pack
50+ Excel PM Templates

MS Word Pack
25+ Word PM Templates

Ultimate Project Management Template

Ultimate Resource Management Template

Project Portfolio Management Templates

Related Posts

    • Description:
    • Changing Row Height in Excel VBA
    • Examples
    • Changing Column Width in Excel VBA
    • Examples
    • Auto Adjust Column Width and Row Height using Excel VBA
    • Examples

VBA Reference

Effortlessly
Manage Your Projects

120+ Project Management Templates

Seamlessly manage your projects with our powerful & multi-purpose templates for project management.

120+ PM Templates Includes:

4 Comments

  1. Koert penne
    March 29, 2016 at 2:35 PM — Reply

    I wanted the row height for content of one column, regardsless what was in the other columns. I did it as follows:

    Sub rowheight_one_column()

    Column = InputBox(“Hoeveelste kolom?”) + 0

    Rows(20).Delete

    For x = 4 To 13
    Cells(20, Column) = Cells(x, Column)
    Rows(20).AutoFit
    hoogte = Cells(20, Column).RowHeight
    Rows(x).RowHeight = hoogte
    Next x

    Rows(20).Delete

    End Sub

  2. Sathish
    October 26, 2016 at 11:39 AM — Reply

    Please help me for auto fit the entire sheet1

  3. Jack
    February 21, 2017 at 7:43 PM — Reply

    where have you declared your Variables, It does confuse people when your code is not neat and is exposed on the Internet where everybody does search and get stuck.

  4. dskar
    April 13, 2017 at 7:10 AM — Reply

    the difference between writing the code in code window and a module?

Effectively Manage Your
Projects and  Resources

With Our Professional and Premium Project Management Templates!

ANALYSISTABS.COM provides free and premium project management tools, templates and dashboards for effectively managing the projects and analyzing the data.

We’re a crew of professionals expertise in Excel VBA, Business Analysis, Project Management. We’re Sharing our map to Project success with innovative tools, templates, tutorials and tips.

Project Management
Excel VBA

Download Free Excel 2007, 2010, 2013 Add-in for Creating Innovative Dashboards, Tools for Data Mining, Analysis, Visualization. Learn VBA for MS Excel, Word, PowerPoint, Access, Outlook to develop applications for retail, insurance, banking, finance, telecom, healthcare domains.

Analysistabs Logo

Page load link

VBA Projects With Source Code

3 Realtime VBA Projects
with Source Code!

Take Your Projects To The Next Level By Exploring Our Professional Projects

Go to Top

Using VBA, is it possible to get the size of a given range in terms of pixels or units? (I don’t care which unit as I am only using it to relate to other measurements with the same unit).

Thanks.

lfrandom's user avatar

lfrandom

9932 gold badges9 silver badges31 bronze badges

asked Feb 10, 2010 at 15:19

Cameron's user avatar

The overall dimensions of a range are in its Width and Height properties.

Dim r As Range
Set r = ActiveSheet.Range("A4:H12")

Debug.Print r.Width
Debug.Print r.Height

answered Feb 10, 2010 at 15:30

Tomalak's user avatar

TomalakTomalak

330k66 gold badges523 silver badges623 bronze badges

2

The Range object has both width and height properties, which are measured in points.

answered Feb 10, 2010 at 15:31

Chris McCall's user avatar

Chris McCallChris McCall

10.3k8 gold badges49 silver badges80 bronze badges

0

Excel VBA Tutorial about Column Width Setting or AutofittingIn this VBA Tutorial, you learn how to use Excel VBA to set or autofit the width of columns in a variety of circumstances.

This VBA Tutorial is accompanied by Excel workbooks containing the data and macros I use in the examples below. You can get immediate free access to these example workbooks by subscribing to the Power Spreadsheets Newsletter.

Use the following Table of Contents to navigate to the section you’re interested in.

Related VBA and Macro Tutorials

The following VBA and Macro Tutorials may help you better understand and implement the contents below:

  • General VBA constructs and structures:
    • Learn about using variables here.
    • Learn about VBA data types here.
    • Learn about R1C1 and A1 style references here.
  • Practical VBA applications and macro examples:
    • Learn how to work with worksheets here.
    • Learn how to delete columns here.
    • Learn how to hide or unhide rows and columns here.

You can find additional VBA and Macro Tutorials in the Archives.

#1: Set Column Width

VBA Code to Set Column Width

To set the width of a column with VBA, use a statement with the following structure:

Worksheet.Range("A1CellReference").ColumnWidth = ColumnWidthUnits

Process Followed by VBA Code

Identify cell in column to set width for data-lazy-srcset= Specify column width in units” width=”316″ height=”102″>

VBA Statement Explanation

  1. Item: Worksheet.
    • VBA Construct: Workbook.Worksheets property.
    • Description: Returns a Worksheet object representing the worksheet you work with.
  2. Item: Range(“A1CellReference”).
    • VBA Construct: Worksheet.Range property.
    • Description: Returns a Range object representing a cell within the column whose width you set. You specify the cell using an A1-style cell reference (A1CellReference) enclosed within quotations (“”).
  3. Item: ColumnWidth.
    • VBA Construct: Range.ColumnWidth property.
    • Description: Sets the width of the column containing the Range object returned by item #2 above.
  4. Item: ColumnWidthUnits.
    • VBA Construct: New value of the Range.ColumnWidth property.
    • Description: Specifies the width, in units, of the column containing the Range object returned by item #2 above.
      • Column width isn’t measured in points, centimeters or inches. Excel measures column width units based on the size (width) of the font you use in the Normal style (for example, Calibri 11).
      • Therefore, 1 unit of column width is equal to 1 character of the Normal style font. Consider the following:
        • If your Normal style font is a fixed-width font, such as Courier New or Consolas, all characters have the same width.
        • If your Normal style font is a proportional font, Excel considers the width of the character “0” (the number zero).
      • If you explicitly declare a variable to represent ColumnWidthUnits, use a numeric data type that can handle the value you use to specify the column width in the appropriate units.

Macro Example

The following macro sets the width of column A of the worksheet named “Column width” to 15 units.

Sub columnWidth()

    'Source: https://powerspreadsheets.com/
    'For further information: https://powerspreadsheets.com/excel-vba-column-width/

    Worksheets("Column width").Range("A5").columnWidth = 15

End Sub

Effects of Executing Macro Example

The following GIF illustrates the results of executing this macro example. As expected, VBA sets the width of column A to 15 units.

Macro sets column width

#2: Set Column Width for Multiple Contiguous Columns

VBA Code to Set Column Width for Multiple Contiguous Columns

To set the width of multiple contiguous columns with VBA, use a statement with the following structure:

Worksheet.Range("FirstColumnLetter:LastColumnLetter").ColumnWidth = ColumnWidthUnits

Process Followed by VBA Code

Identify columns to set width for data-lazy-srcset= Specify column width in units” width=”312″ height=”105″>

VBA Statement Explanation

  1. Item: Worksheet.
    • VBA Construct: Workbook.Worksheets property.
    • Description: Returns a Worksheet object representing the worksheet you work with.
  2. Item: Range(“FirstColumnLetter:LastColumnLetter”).
    • VBA Construct: Worksheet.Range property.
    • Description: Returns a Range object representing the columns whose width you set. Under this syntax:
      • You identify columns by the letters of their headers (FirstColumnLetter and LastColumnLetter).
      • The column letters are:
        • Separated by a colon (:), which allows you to set up an array.
        • Enclosed within quotations (“”).
  3. Item: ColumnWidth.
    • VBA Construct: Range.ColumnWidth property.
    • Description: Sets the width of the columns returned by item #2 above.
  4. Item: ColumnWidthUnits.
    • VBA Construct: New value of the Range.ColumnWidth property.
    • Description: Specifies the width, in units, of the columns returned by item #2 above.
      • Column width isn’t measured in points, centimeters or inches. Excel measures column width units based on the size (width) of the font you use in the Normal style (for example, Calibri 11).
      • Therefore, 1 unit of column width is equal to 1 character of the Normal style font. Consider the following:
        • If your Normal style font is a fixed-width font, such as Courier New or Consolas, all characters have the same width.
        • If your Normal style font is a proportional font, Excel considers the width of the character “0” (the number zero).
      • If you explicitly declare a variable to represent ColumnWidthUnits, use a numeric data type that can handle the value you use to specify the column width in the appropriate units.

Macro Example

The following macro sets the width of columns C through E (C, D and E) of the worksheet named “Column width” to 10 units.

Sub columnWidthMultipleColumns()

    'Source: https://powerspreadsheets.com/
    'For further information: https://powerspreadsheets.com/excel-vba-column-width/

    Worksheets("Column width").Range("C:E").columnWidth = 10

End Sub

Effects of Executing Macro Example

The following GIF illustrates the results of executing this macro example. As expected, VBA sets the width of columns C through E to 10 units.

Macro sets column width for multiple columns

#3: Set Column Width for Multiple Non-Contiguous Columns

VBA Code to Set Column Width for Multiple Non-Contiguous Columns

To set the width of multiple non-contiguous columns with VBA, use a statement with the following structure:

Worksheet.Range("Column1Area1Letter:ColumnLastArea1Letter,Column1Area2Letter:ColumnLastArea2Letter, ... , Column1AreaLastLetter:ColumnLastAreaLastLetter").ColumnWidth = ColumnWidthUnits

Process Followed by VBA Code

Identify columns to set width for data-lazy-srcset= Specify column width in units” width=”312″ height=”105″>

VBA Statement Explanation

  1. Item: Worksheet.
    • VBA Construct: Workbook.Worksheets property.
    • Description: Returns a Worksheet object representing the worksheet you work with.
  2. Item: Range(“Column1Area1Letter:ColumnLastArea1Letter,Column1Area2Letter:ColumnLastArea2Letter, … , Column1AreaLastLetter:ColumnLastAreaLastLetter”).
    • VBA Construct: Worksheet.Range property.
    • Description: Returns a Range object representing the columns whose width you set. Under this syntax:
      • You identify columns by the letters of their headers (Column1Area1Letter, ColumnLastArea1Letter, Column1Area2Letter, ColumnLastArea2Letter, … , Column1AreaLastLetter and ColumnLastAreaLastLetter”).
      • The column letters identifying contiguous columns (within the same data area) are separated by a colon (:), which allows you to set up an array. If you’re only referring to a single column (for example, column B), include the letter reference twice and separate them with a colon (:) (for example “B:B”).
      • The column letters identifying non-contiguous columns (in separate data areas) are separated by the union operator, a comma (,).
      • The complete column reference is enclosed within quotations (“”).
  3. Item: ColumnWidth.
    • VBA Construct: Range.ColumnWidth property.
    • Description: Sets the width of the columns returned by item #2 above.
  4. Item: ColumnWidthUnits.
    • VBA Construct: New value of the Range.ColumnWidth property.
    • Description: Specifies the width, in units, of the columns returned by item #2 above.
      • Column width isn’t measured in points, centimeters or inches. Excel measures column width units based on the size (width) of the font you use in the Normal style (for example, Calibri 11).
      • Therefore, 1 unit of column width is equal to 1 character of the Normal style font. Consider the following:
        • If your Normal style font is a fixed-width font, such as Courier New or Consolas, all characters have the same width.
        • If your Normal style font is a proportional font, Excel considers the width of the character “0” (the number zero).
      • If you explicitly declare a variable to represent ColumnWidthUnits, use a numeric data type that can handle the value you use to specify the column width in the appropriate units.

Macro Example

The following macro sets the width of columns B, F and H of the worksheet named “Column width” to 20 units.

Sub columnWidthMultipleNonAdjacentColumns()

    'Source: https://powerspreadsheets.com/
    'For further information: https://powerspreadsheets.com/excel-vba-column-width/

    Worksheets("Column width").Range("B:B,F:F,H:H").columnWidth = 20

End Sub

Effects of Executing Macro Example

The following GIF illustrates the results of executing this macro example. As expected, VBA sets the width of columns B, F and H to 20 units.

Macro sets column width for multiple non-contiguous columns

#4: AutoFit Column Width Based on Entire Column

VBA Code to AutoFit Column Width Based on Entire Column

To autofit the width of a column with VBA, considering the contents of the entire column, use a statement with the following structure:

Worksheet.Range("A1CellReference").EntireColumn.AutoFit

Process Followed by VBA Code

Identify cell data-lazy-srcset= return entire column > autofit entire column width” width=”497″ height=”107″>

VBA Statement Explanation

  1. Item: Worksheet.
    • VBA Construct: Workbook.Worksheets property.
    • Description: Returns a Worksheet object representing the worksheet you work with.
  2. Item: Range(“A1CellReference”).
    • VBA Construct: Worksheet.Range property.
    • Description: Returns a Range object representing a cell within the column you autofit. You specify the cell using an A1-style cell reference (A1CellReference) enclosed within quotations (“”).
  3. Item: EntireColumn.
    • VBA Construct: Range.EntireColumn property.
    • Description: Returns a Range object representing the entire column containing the Range object returned by item #2 above.
  4. Item: AutoFit.
    • VBA Construct: Range.AutoFit method.
    • Description: Modifies the width of the column represented by the Range object returned by item #3 above to achieve the best fit (autofits).

Macro Example

The following macro autofits the width of column G of the worksheet named “Column width” based on the contents of all the cells in the entire column.

Sub columnWidthAutoFitEntireColumn()

    'Source: https://powerspreadsheets.com/
    'For further information: https://powerspreadsheets.com/excel-vba-column-width/

    Worksheets("Column width").Range("G5").EntireColumn.AutoFit

End Sub

Effects of Executing Macro Example

The following GIF illustrates the results of executing this macro example. As expected, VBA autofits the width of column G based on the contents of all the cells in the entire column. Notice the contents in cell G10 (Autofit based on entire column), which are used as the basis for the autofitting operation.

Macro autofits column width based on entire column

#5: AutoFit Column Width Based on Specific Cell

VBA Code to AutoFit Column Width Based on Specific Cell

To autofit the width of a column with VBA, considering the contents of a specific cell or row, use a statement with the following structure:

Worksheet.Range("A1CellReference").Columns.AutoFit

Process Followed by VBA Code

Identify cell data-lazy-srcset= return column > autofit entire column width to contents of cell” width=”493″ height=”105″>

VBA Statement Explanation

  1. Item: Worksheet.
    • VBA Construct: Workbook.Worksheets property.
    • Description: Returns a Worksheet object representing the worksheet you work with.
  2. Item: Range(“A1CellReference”).
    • VBA Construct: Worksheet.Range property.
    • Description: Returns a Range object representing a cell.
      • This cell:
        • Is within the column you autofit.
        • Is the cell whose contents Excel considers for purposes of achieving the best fit (autofitting).
      • You specify the cell using an A1-style cell reference (A1CellReference) enclosed within quotations (“”).
  3. Item: Columns.
    • VBA Construct: Range.Columns property.
    • Description: Returns a Range object representing the column containing the Range object returned by item #2 above.
  4. Item: AutoFit.
    • VBA Construct: Range.AutoFit method.
    • Description: Modifies the width of the column represented by the Range object returned by item #3 above to achieve the best fit (autofits) based on the contents within the cell represented by the Range object returned by item #2 above.

Macro Example

The following macro autofits the width of column I of the worksheet named “Column width” based on the contents of cell I5.

Sub columnWidthAutoFitRow()

    'Source: https://powerspreadsheets.com/
    'For further information: https://powerspreadsheets.com/excel-vba-column-width/

    Worksheets("Column width").Range("I5").Columns.AutoFit

End Sub

Effects of Executing Macro Example

The following GIF illustrates the results of executing this macro example. As expected, VBA sets autofits the width of column I based on the contents of cell I5. Notice the contents in cell I10 (Autofit based on specific cell), which aren’t used as the basis for the autofitting operation.

Macro autofits column width based on cell contents

#6: Set Column Width in Points

VBA Code to Set Column Width in Points

To set the width of a column in points with VBA, use a macro with the following statement structure:

With Worksheet.Range("A1CellReference")
    For Counter = 1 To 3
        .ColumnWidth = ColumnWidthPoints * (.ColumnWidth / .Width)
    Next Counter
End With

Process Followed by VBA Code

Identify cell data-lazy-srcset= specify column width in points 3 times” width=”689″ height=”192″>

VBA Statement Explanation

Lines #1 and #5: With Worksheet.Range(“A1CellReference”) | End With

  1. Item: With… End With.
    • VBA Construct: With… End With statement.
    • Description: Statements within the With… End With statement (lines # through #4 below) are executed on the Range object returned by item #3 below.
  2. Item: Worksheet.
    • VBA Construct: Workbook.Worksheets property.
    • Description: Returns a Worksheet object representing the worksheet you work with.
  3. Item: Range(“A1CellReference”).
    • VBA Construct: Worksheet.Range property.
    • Description: Returns a Range object representing a cell within the column whose width you set. You specify the cell using an A1-style cell reference (A1CellReference) enclosed within quotations (“”).

Lines #2 and #4: For Counter = 1 To 3 | Next Counter

  1. Item: For… Next Counter.
    • VBA Construct: For… Next statement.
    • Description: Repeats the statement within the loop (line #3 below) 3 times, as required by item #3 below.
  2. Item: Counter.
    • VBA Construct: Counter of For… Next statement.
    • Description: Loop counter. If you explicitly declare a variable to represent the loop counter, use the Long data type.
  3. Item: 1 To 3.
    • VBA Construct: Counter Start (1) and Counter End (3) of For… Next statement.
    • Description: The statement within the loop (line #3 below) is executed 3 times (1 To 3).
      • Theoretically, line #3 below should be enough to set the column width in points without requiring the loop specified by these lines #2 and #4. In practice, this may not be the case. Some tests suggest that repeating line #3 below (or similar) 3 times generally gets you the closest to the specified column width.

Line #3: .ColumnWidth = ColumnWidthPoints * (.ColumnWidth / .Width)

  1. Item: .ColumnWidth.
    • VBA Construct: Range.ColumnWidth property.
    • Description:
      • Sets the width of the column containing the Range object within the opening statement of the With… End With block (line #1, item #3 above).
      • .ColumnWidth is included twice in the statement. In this first mention, (.ColumnWidth = …), ColumnWidth is the property to which a value is assigned. The value assigned to the ColumnWidth property is the value returned by the other items within this statement.
  2. Item: ColumnWidthPoints.
    • VBA Construct: Numeric (for example, Double) variable.
    • Description: Specifies the width (in points) of the columns containing the Range object within the opening statement of the With… End With block (line #1, item #3 above).
      • If you explicitly declare a variable to represent ColumnWidthPoints, use a numeric data type that can handle the value you use to specify the column width in points.
  3. Item: .ColumnWidth.
    • VBA Construct: Range.ColumnWidth property.
    • Description:
      • Returns the width of the column containing the Range object within the opening statement of the With… End With block (line #1, item #3 above).
      • .ColumnWidth is included twice in the statement. In this second mention, (.ColumnWidth), ColumnWidth returns the current value of the property.
      • The ColumnWidth property returns the column width in units based on the size (width) of the font you use in the Normal style (for example, Calibri 11). Therefore, 1 unit of column width is equal to 1 character of the Normal style font. If your Normal style font is a proportional (not fixed-width) font, Excel considers the width of the character “0” (the number zero).
  4. Item: .Width.
    • VBA Construct: Range.Width property.
    • Description:
      • Returns the width of the column containing the Range object within the opening statement of the With… End With block (line #1, item #3 above).
      • The Width property returns the column width in points.
  5. Item: (.ColumnWidth / .Width).
    • VBA Construct: Numeric expression.
    • Description:
      • Both ColumnWidth (item #3 above) and Width (item #4 above) return the width of the column containing the Range object within the opening statement of the With… End With block (line #1, item #3 above).
      • The units in which ColumnWidth and Width return the column width differ.
        • ColumnWidth expresses the column width in units based on the size (width) of the font you use in the Normal style.
        • Width expresses the column width in points.
      • ColumnWidth divided by Width (.ColumnWidth / .Width) returns the factor by which you must multiply the desired column width expressed in points (item #2 above) to obtain the appropriate column width in units based on the size (width) of the font you use in the Normal style. In other words, this expression converts ColumnWidthPoints from points to the units required by the ColumnWidth property.

Macro Example

The following macro sets the width of column J of the worksheet named “Column width” to 80 points.

Sub columnWidthPoints()

    'Source: https://powerspreadsheets.com/
    'For further information: https://powerspreadsheets.com/excel-vba-column-width/

    Dim iCounter As Long

    With Worksheets("Column width").Range("J5")
        For iCounter = 1 To 3
            .columnWidth = 80 * (.columnWidth / .Width)
        Next iCounter
    End With

End Sub

Effects of Executing Macro Example

The following GIF illustrates the results of executing this macro example. As expected, VBA sets the width of column J to 80 points.

Macro sets column width in points

#7: Set Column Width in Inches

VBA Code to Set Column Width in Inches

To set the width of a column in inches with VBA, use a macro with the following statement structure:

With Worksheet.Range("A1CellReference")
    For Counter = 1 To 3
        .ColumnWidth = Application.InchesToPoints(ColumnWidthInches) * (.ColumnWidth / .Width)
    Next Counter
End With

Process Followed by VBA Code

Identify cell data-lazy-srcset= specify column width in inches 3 times” width=”686″ height=”191″>

VBA Statement Explanation

Lines #1 and #5: With Worksheet.Range(“A1CellReference”) | End With

  1. Item: With… End With.
    • VBA Construct: With… End With statement.
    • Description: Statements within the With… End With statement (lines # through #4 below) are executed on the Range object returned by item #3 below.
  2. Item: Worksheet.
    • VBA Construct: Workbook.Worksheets property.
    • Description: Returns a Worksheet object representing the worksheet you work with.
  3. Item: Range(“A1CellReference”).
    • VBA Construct: Worksheet.Range property.
    • Description: Returns a Range object representing a cell within the column whose width you set. You specify the cell using an A1-style cell reference (A1CellReference) enclosed within quotations (“”).

Lines #2 and #4: For Counter = 1 To 3 | Next Counter

  1. Item: For… Next Counter.
    • VBA Construct: For… Next statement.
    • Description: Repeats the statement within the loop (line #3 below) 3 times, as required by item #3 below.
  2. Item: Counter.
    • VBA Construct: Counter of For… Next statement.
    • Description: Loop counter. If you explicitly declare a variable to represent the loop counter, use the Long data type.
  3. Item: 1 To 3.
    • VBA Construct: Counter Start (1) and Counter End (3) of For… Next statement.
    • Description: The statement within the loop (line #3 below) is executed 3 times (1 To 3).
      • Theoretically, line #3 below should be enough to set the column width in inches without requiring the loop specified by these lines #2 and #4. In practice, this may not be the case. Some tests suggest that repeating line #3 below (or similar) 3 times generally gets you the closest to the specified column width.

Line #3: .ColumnWidth = Application.InchesToPoints(ColumnWidthInches) * (.ColumnWidth / .Width)

  1. Item: .ColumnWidth.
    • VBA Construct: Range.ColumnWidth property.
    • Description:
      • Sets the width of the column containing the Range object within the opening statement of the With… End With block (line #1, item #3 above).
      • .ColumnWidth is included twice in the statement. In this first mention, (.ColumnWidth = …), ColumnWidth is the property to which a value is assigned. The value assigned to the ColumnWidth property is the value returned by the other items within this statement.
  2. Item: Application.InchesToPoints.
    • VBA Construct: Application.InchesToPoints method.
    • Description: Converts the measurement specified by item #3 below from inches to points.
  3. Item: ColumnWidthInches.
    • VBA Construct: Inches parameter of Application.InchesToPoints method.
    • Description: Specifies the width (in inches) of the columns containing the Range object within the opening statement of the With… End With block (line #1, item #3 above).
      • If you explicitly declare a variable to represent ColumnWidthInches, use a numeric data type that can handle the value you use to specify the column width in inches.
  4. Item: .ColumnWidth.
    • VBA Construct: Range.ColumnWidth property.
    • Description:
      • Returns the width of the column containing the Range object within the opening statement of the With… End With block (line #1, item #3 above).
      • .ColumnWidth is included twice in the statement. In this second mention, (.ColumnWidth), ColumnWidth returns the current value of the property.
      • The ColumnWidth property returns the column width in units based on the size (width) of the font you use in the Normal style (for example, Calibri 11). Therefore, 1 unit of column width is equal to 1 character of the Normal style font. If your Normal style font is a proportional (not fixed-width) font, Excel considers the width of the character “0” (the number zero).
  5. Item: .Width.
    • VBA Construct: Range.Width property.
    • Description:
      • Returns the width of the column containing the Range object within the opening statement of the With… End With block (line #1, item #3 above).
      • The Width property returns the column width in points.
  6. Item: (.ColumnWidth / .Width).
    • VBA Construct: Numeric expression.
    • Description:
      • Both ColumnWidth (item #4 above) and Width (item #5 above) return the width of the column containing the Range object within the opening statement of the With… End With block (line #1, item #3 above).
      • The units in which ColumnWidth and Width return the column width differ.
        • ColumnWidth expresses the column width in units based on the size (width) of the font you use in the Normal style.
        • Width expresses the column width in points.
      • ColumnWidth divided by Width (.ColumnWidth / .Width) returns the factor by which you must multiply the desired column width expressed in inches/points (items #2 and #3 above) to obtain the appropriate column width in units based on the size (width) of the font you use in the Normal style. In other words, this expression converts Application.InchesToPoints(ColumnWidthInches) from points to the units required by the ColumnWidth property.

Macro Example

The following macro sets the width of column K of the worksheet named “Column width” to 1 inch.

Sub columnWidthInches()

    'Source: https://powerspreadsheets.com/
    'For further information: https://powerspreadsheets.com/excel-vba-column-width/

    Dim iCounter As Long

    With Worksheets("Column width").Range("K5")
        For iCounter = 1 To 3
            .columnWidth = Application.InchesToPoints(1) * (.columnWidth / .Width)
        Next iCounter
    End With

End Sub

Effects of Executing Macro Example

The following GIF illustrates the results of executing this macro example. As expected, VBA sets the width of column K to 1 inch.

Macro sets column width in inches

#8: Set Column Width in Centimeters

VBA Code to Set Column Width in Centimeters

To set the width of a column in centimeters with VBA, use a macro with the following statement structure:

With Worksheet.Range("A1CellReference")
    For Counter = 1 To 3
        .ColumnWidth = Application.CentimetersToPoints(ColumnWidthCentimeters) * (.ColumnWidth / .Width)
    Next Counter
End With

Process Followed by VBA Code

Identify cell data-lazy-srcset= specify column width in centimeters 3 times” width=”683″ height=”192″>

VBA Statement Explanation

Lines #1 and #5: With Worksheet.Range(“A1CellReference”) | End With

  1. Item: With… End With.
    • VBA Construct: With… End With statement.
    • Description: Statements within the With… End With statement (lines # through #4 below) are executed on the Range object returned by item #3 below.
  2. Item: Worksheet.
    • VBA Construct: Workbook.Worksheets property.
    • Description: Returns a Worksheet object representing the worksheet you work with.
  3. Item: Range(“A1CellReference”).
    • VBA Construct: Worksheet.Range property.
    • Description: Returns a Range object representing a cell within the column whose width you set. You specify the cell using an A1-style cell reference (A1CellReference) enclosed within quotations (“”).

Lines #2 and #4: For Counter = 1 To 3 | Next Counter

  1. Item: For… Next Counter.
    • VBA Construct: For… Next statement.
    • Description: Repeats the statement within the loop (line #3 below) 3 times, as required by item #3 below.
  2. Item: Counter.
    • VBA Construct: Counter of For… Next statement.
    • Description: Loop counter. If you explicitly declare a variable to represent the loop counter, use the Long data type.
  3. Item: 1 To 3.
    • VBA Construct: Counter Start (1) and Counter End (3) of For… Next statement.
    • Description: The statement within the loop (line #3 below) is executed 3 times (1 To 3).
      • Theoretically, line #3 below should be enough to set the column width in centimeters without requiring the loop specified by these lines #2 and #4. In practice, this may not be the case. Some tests suggest that repeating line #3 below (or similar) 3 times generally gets you the closest to the specified column width.

Line #3: .ColumnWidth = Application.CentimetersToPoints(ColumnWidthCentimeters) * (.ColumnWidth / .Width)

  1. Item: .ColumnWidth.
    • VBA Construct: Range.ColumnWidth property.
    • Description:
      • Sets the width of the column containing the Range object within the opening statement of the With… End With block (line #1, item #3 above).
      • .ColumnWidth is included twice in the statement. In this first mention, (.ColumnWidth = …), ColumnWidth is the property to which a value is assigned. The value assigned to the ColumnWidth property is the value returned by the other items within this statement.
  2. Item: Application.CentimetersToPoints.
    • VBA Construct: Application.CentimetersToPoints method.
    • Description: Converts the measurement specified by item #3 below from centimeters to points.
  3. Item: ColumnWidthCentimeters.
    • VBA Construct: Centimeters parameter of Application.CentimetersToPoints method.
    • Description: Specifies the width (in centimeters) of the columns containing the Range object within the opening statement of the With… End With block (line #1, item #3 above).
      • If you explicitly declare a variable to represent ColumnWidthCentimeters, use a numeric data type that can handle the value you use to specify the column width in centimeters.
  4. Item: .ColumnWidth.
    • VBA Construct: Range.ColumnWidth property.
    • Description:
      • Returns the width of the column containing the Range object within the opening statement of the With… End With block (line #1, item #3 above).
      • .ColumnWidth is included twice in the statement. In this second mention, (.ColumnWidth), ColumnWidth returns the current value of the property.
      • The ColumnWidth property returns the column width in units based on the size (width) of the font you use in the Normal style (for example, Calibri 11). Therefore, 1 unit of column width is equal to 1 character of the Normal style font. If your Normal style font is a proportional (not fixed-width) font, Excel considers the width of the character “0” (the number zero).
  5. Item: .Width.
    • VBA Construct: Range.Width property.
    • Description:
      • Returns the width of the column containing the Range object within the opening statement of the With… End With block (line #1, item #3 above).
      • The Width property returns the column width in points.
  6. Item: (.ColumnWidth / .Width).
    • VBA Construct: Numeric expression.
    • Description:
      • Both ColumnWidth (item #4 above) and Width (item #5 above) return the width of the column containing the Range object within the opening statement of the With… End With block (line #1, item #3 above).
      • The units in which ColumnWidth and Width return the column width differ.
        • ColumnWidth expresses the column width in units based on the size (width) of the font you use in the Normal style.
        • Width expresses the column width in points.
      • ColumnWidth divided by Width (.ColumnWidth / .Width) returns the factor by which you must multiply the desired column width expressed in centimeters/points (items #2 and #3 above) to obtain the appropriate column width in units based on the size (width) of the font you use in the Normal style. In other words, this expression converts Application.CentimetersToPoints(ColumnWidthCentimeters) from points to the units required by the ColumnWidth property.

Macro Example

The following macro sets the width of column L of the worksheet named “Column width” to 1 centimeter.

Sub columnWidthCentimeters()

    'Source: https://powerspreadsheets.com/
    'For further information: https://powerspreadsheets.com/excel-vba-column-width/

    Dim iCounter As Long

    With Worksheets("Column width").Range("L5")
        For iCounter = 1 To 3
            .columnWidth = Application.CentimetersToPoints(1) * (.columnWidth / .Width)
        Next iCounter
    End With

End Sub

Effects of Executing Macro Example

The following GIF illustrates the results of executing this macro example. As expected, VBA sets the width of column L to 1 centimeter.

Macro sets column width in centimeters

Home / VBA / VBA AutoFit (Rows, Column, or the Entire Worksheet)

Key Points

  • In VBA, you can use the AutoFit method to auto-fit rows, columns, and even an entire worksheet.
  • You need to specify the range, and then you can use the AutoFit method.

Let’s say you want to autofit column A, the code would be something like below:

Range("A1").EntireColumn.AutoFit

In the above line of code, you have used the EntireColumn property to refer to the entire column of cell A1.

As you are within a worksheet so you can also use the columns property and write a code like the below.

Columns(1).AutoFit

AutoFit a Row

In the same way, you can write code to autofit a row. Let’s say you want to autofit row 5, the code would be:

Range("A5").EntireRow.AutoFit

And if you want to use the row property, then you can use the code like the following.

Rows(5).AutoFit

AutoFit UsedRange (Rows and Columns)

Now let’s say, you only want to autofit those columns and rows where you have data. In VBA, there is a property called used range that you can use. So the code would be.

ActiveSheet.UsedRange.EntireColumn.AutoFit

ActiveSheet.UsedRange.EntireRow.AutoFit

And if you want to use a specific worksheet then the code would be.

Worksheets("Sheet1").UsedRange.EntireColumn.AutoFit
Worksheets("Sheet1").UsedRange.EntireRow.AutoFit

AutoFit Entire Worksheet

And if you want to refer to all the columns and rows of the worksheet then you can use the “CELLS” property. Here’s the code.

Worksheets("Sheet1").Cells.EntireColumn.AutoFit
Worksheets("Sheet1").Cells.EntireRow.AutoFit

Or you can also use VBA’s WITH statement to write a code like the below.

With Worksheets("Sheet1").Cells
    .EntireColumn.AutoFit
    .EntireRow.AutoFit
End With

More Tutorials

    • Count Rows using VBA in Excel
    • Excel VBA Font (Color, Size, Type, and Bold)
    • Excel VBA Hide and Unhide a Column or a Row
    • Excel VBA Range – Working with Range and Cells in VBA
    • Apply Borders on a Cell using VBA in Excel
    • Find Last Row, Column, and Cell using VBA in Excel
    • Insert a Row using VBA in Excel
    • Merge Cells in Excel using a VBA Code
    • Select a Range/Cell using VBA in Excel
    • SELECT ALL the Cells in a Worksheet using a VBA Code
    • ActiveCell in VBA in Excel
    • Special Cells Method in VBA in Excel
    • UsedRange Property in VBA in Excel
    • VBA ClearContents (from a Cell, Range, or Entire Worksheet)
    • VBA Copy Range to Another Sheet + Workbook
    • VBA Enter Value in a Cell (Set, Get and Change)
    • VBA Insert Column (Single and Multiple)
    • VBA Named Range | (Static + from Selection + Dynamic)
    • VBA Range Offset
    • VBA Sort Range | (Descending, Multiple Columns, Sort Orientation
    • VBA Wrap Text (Cell, Range, and Entire Worksheet)
    • VBA Check IF a Cell is Empty + Multiple Cells

    ⇠ Back to What is VBA in Excel

    Helpful Links – Developer Tab – Visual Basic Editor – Run a Macro – Personal Macro Workbook – Excel Macro Recorder – VBA Interview Questions – VBA Codes

    В данном примере описаны макросы для автоматического форматирования или спроса формата для ячеек таблиц Excel средствами VBA.

    VBA-макрос: заливка, шрифт, линии границ, ширина столбцов и высота строк

    В процессе запыления данных сотрудниками отдела на некоторых листах были изменены форматы ячеек:

    запыления планов работ.

    Необходимо сбросить форматирование ячеек и сделать так чтобы на всех таблицах планов выполнения работ были одинаковые форматы отображения данных. Формат ячеек для исходной таблицы должен быть закреплен за шаблоном, чтобы можно было сделать сброс и применять заданный стиль оформления в дальнейшем.

    Чтобы выполнять такие задачи вручную можно попытаться облегчить процесс настройки множества опций форматирования для многих диапазонов ячеек на разных листах и рабочих книгах. Плюс к о всему можно ошибиться и применить несколько другие настройки форматирования.

    Макросы Excel прекрасно справляются с форматированием ячеек на рабочих листах. Кроме того, делают это быстро и в полностью автоматическом режиме. Воспользуемся этими преимуществами и для решения данной задачи напишем свой код VBA-макроса. Он поможет нам быстро и безопасно сбрасывать форматы на исходный предварительно заданный в шаблоне главной таблицы.

    Чтобы написать свой код макроса откройте специальный VBA-редактор в Excel: «РАЗРАБОТЧИК»-«Код»-«Visual Basic» или нажмите комбинацию клавиш ALT+F11:

    Код Visual Basic.

    В редакторе создайте новый модуль выбрав инструмент «Insert»-«Module» и введите в него такой VBA-код макроса:

    Sub SbrosFormat()
    If TypeName(Selection) <> "Range" Then Exit Sub
    With Selection
    .HorizontalAlignment = xlVAlignCenter
    .VerticalAlignment = xlVAlignCenter
    .WrapText = True
    .Borders.LineStyle = xlContinuous
    .Borders.Weight = xlThin
    .Font.ColorIndex = xlColorIndexAutomatic
    .Interior.ColorIndex = xlColorIndexAutomatic
    .Columns.AutoFit
    .Rows.AutoFit
    End With
    End Sub

    VBA-код макроса.

    Теперь если нам нужно сбросить форматирование таблицы на исходный формат отображения ее данных, выделите диапазон ячеек A1:E20 и запустите макрос: «РАЗРАБОЧТИК»-«Код»-«Макросы»-«SbrosFormat»-«Выполнить». Результат работы макроса изображен ниже на рисунке:

    сбросить форматирование таблицы на исходный формат.

    Таблица приобрела формат, который определен макросом. Таким образом код VBA нам позволяет сбросить любые изменения формата ячеек на предустановленный автором отчета.

    

    Описание VBA-макроса для формата ячеек таблицы Excel

    Первая инструкция в коде, проверяет выделены ли ячейки диапазоном. Если перед выполнением макроса выделил другой элемент листа, например, график, тогда макрос закрывается и дальнейшие инструкции выполняться не будут. В противные случаи будут форматироваться все выделенные ячейки по очереди в соответствии с определенными настройками форматирования:

    1. Текст в значениях ячеек выравнивается по центру горизонтально и вертикально.
    2. Включен построчный перенос текста.
    3. Все границы ячеек получают черную обычной толщины непрерывную линию с черным цветом.
    4. Сброс цвета шрифта на авто.
    5. Удаляется любая заливка ячеек.
    6. Ширина столбцов автоматически настраивается под текст в ячейках.
    7. Автоматически настроить высоту строк по содержимому ячеек.

    Модификация исходного кода макроса для форматирования

    Если необходимо сделать так чтобы текст выравнивался не по центру относительно горизонтали, а по правую сторону ячейки, тогда измените константу xlHAlignCenter на xlHAlignRight. Она находиться в свойстве .HorizontalAlignment. Сделайте это следующим образом:

    .HorizontalAlignment = xlHAlignRight.

    Таким же образом можно выровнять текст по левую сторону изменив значение константы на xlHAlignLeft. Или можно выровнять положение текста по ширине ячейки используя константу xlHAlignJustify.

    Чтобы макрос выравнивал текст в ячейках по вертикали к низу, измените строку кода, отвечающую за данную настройку форматирования. Измените константу, которая присваивается к свойству VerticalAlignment в следующий способ:

    Если хотите выровнять текс к верху ячейки, тогда воспользуйтесь константой xlHAlignTop.

    Если нужно применить для границ ячеек толстую и пунктирную линию в синем цвете, смодифицируйте инструкцию, отвечающую за формат линий:

    .Borders.LineStyle = xlDash

    .Borders.Color = vbBlue

    .Borders.Weight = xlMedium

    Описание настройки форматирования для линий границ ячеек. Мы будем получать разные дополнительные типы линий границ если для свойства LineStyle присваивать такие константы:

    • xlDoshDot – применяется для рисования пунктирных линий в границах ячеек;
    • xlDouble – рисует двойную линию;
    • xlHairLine – рисует тонкую линию;
    • xlThick – для рисования очень толстой линии.

    Для настройки цвета линий Excel предлагает всего 8 констант для определенных цветов. Константы для настройки цвета линий границ для свойства Color:

    • vbBlack – черный;
    • vbWhite – белый;
    • vbRed – красный;
    • vbGreen –зеленый;
    • vbBlue – синий;
    • vbYellow – желтый;
    • vbMagenta – алый;
    • vbCyan – голубой.

    Но при необходимости присвоить линиям границ другие цвета можно вместо константы для свойства Color записать функцию RGB(). Достаточно лишь в аргументе этой функции указать код цвета по шкале от 0 и до 255.

    Если нужно применить толстую линию только для границ выделенного диапазона, тогда перед инструкцией End With добавьте следующую строку кода:

    .BorderAround xlContinuous, xlMedium, vbBlack

    Описание: В первом аргументе для метода BorderAround можно записать также другой стиль линии. Во втором – толщину линии, а в третьем – цвет. Константы, которые можно присвоить в качестве значений для этих аргументов можно использовать те же, которые мы использовали для свойств: LineStyle, Weight, Color.

    Если нужно экспонировать первую строку для выделенного диапазона с помощью жирного и курсивного шрифта значений ячеек. А также заполнить ячейки первой строки заливкой с голубым цветом, тогда в самом конце кода макроса перед последней инструкцией End Sub следует добавить несколько строк с VBA-кодом:

    .Rows(1).Font.Bold = True

    .Rows(1).Font.Italic = True

    .Rows(1).Interior.Color = vbCyan

    Если хотите присвоить такой же формат для не только для первой строки, но и для первого столбца выделенного диапазона, тогда скопируйте и вставьте ниже эти 3 строчки кода. После в последних трех строках измените свойство Rows на Columns.

    .Columns (1).Font.Bold = True

    .Columns (1).Font.Italic = True

    .Columns (1).Interior.Color = vbCyan

    Если нужно задать особенный формат для экспонирования последней строки выделенного диапазона, тогда измените число 1 в аргументе свойства Rows на число всех выделенных строк .Rows.Count. Например, добавьте в конец кода еще такую строку:

    .Rows(.Rows.Count).Font.Bold = True

    Полная версия модифицированного кода макроса выглядит так:

    Sub SbrosFormat()
    If TypeName(Selection) <> "Range" Then Exit Sub
    With Selection
    .HorizontalAlignment = xlVAlignCenter
    .VerticalAlignment = xlVAlignCenter
    .WrapText = True
    .Borders.LineStyle = xlDash
    .Borders.Color = vbBlue
    .Borders.Weight = xlMedium
    .Font.ColorIndex = xlColorIndexAutomatic
    .Interior.ColorIndex = xlColorIndexAutomatic
    .Columns.AutoFit
    .Rows.AutoFit
    .BorderAround xlContinuous, xlMedium, vbBlack
    .Rows(1).Font.Bold = True
    .Rows(1).Font.Italic = True
    .Rows(1).Interior.Color = vbCyan
    .Columns(1).Font.Bold = True
    .Columns(1).Font.Italic = True
    .Columns(1).Interior.Color = vbCyan
    .Rows(.Rows.Count).Font.Bold = True
    End With
    End Sub

    Пример работы измененного кода VBA-макроса:

    Пример после изменений в коде.

    В данном примере вы ознакомились с базовыми возможностями форматирования с помощью VBA-макросов. Уверен, что теперь вы сможете самостоятельно найти практическое применение этим исходным кодам.

    Понравилась статья? Поделить с друзьями:
  • Vba excel размерность двумерного массива
  • Vba excel свойства таблицы
  • Vba excel размер файла
  • Vba excel свойства столбца
  • Vba excel свойства массива