Программно вставить ячейки excel

Вставка диапазона со сдвигом ячеек вправо или вниз методом Insert объекта Range. Вставка и перемещение строк и столбцов из кода VBA Excel. Примеры.

Range.Insert – это метод, который вставляет диапазон пустых ячеек (в том числе одну ячейку) на рабочий лист Excel в указанное место, сдвигая существующие в этом месте ячейки вправо или вниз. Если в буфере обмена содержится объект Range, то вставлен будет он со своими значениями и форматами.

Синтаксис

Expression.Insert(Shift, CopyOrigin)

Expression – выражение (переменная), возвращающее объект Range.

Параметры

Параметр Описание Значения
Shift Необязательный параметр. Определяет направление сдвига ячеек. Если параметр Shift опущен, направление выбирается в зависимости от формы* диапазона. xlShiftDown (-4121) – ячейки сдвигаются вниз;
xlShiftToRight (-4161) – ячейки сдвигаются вправо.
CopyOrigin Необязательный параметр. Определяет: из каких ячеек копировать формат. По умолчанию формат копируется из ячеек сверху или слева. xlFormatFromLeftOrAbove (0) – формат копируется из ячеек сверху или слева;
xlFormatFromRightOrBelow (1) – формат копируется из ячеек снизу или справа.

* Если диапазон горизонтальный или квадратный (количество строк меньше или равно количеству столбцов), ячейки сдвигаются вниз. Если диапазон вертикальный (количество строк больше количества столбцов), ячейки сдвигаются вправо.

Примеры

Простая вставка диапазона

Вставка диапазона ячеек в диапазон «F5:K9» со сдвигом исходных ячеек вправо:

Range(«F5:K9»).Insert Shift:=xlShiftToRight

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

Вставка вырезанного диапазона

Вставка диапазона, вырезанного в буфер обмена методом Range.Cut, из буфера обмена со сдвигом ячеек по умолчанию:

Range(«A1:B6»).Cut

Range(«D2»).Insert

Обратите внимание, что при использовании метода Range.Cut, точка вставки (в примере: Range("D2")) не может находится внутри вырезанного диапазона, а также в строке или столбце левой верхней ячейки вырезанного диапазона вне вырезанного диапазона (в примере: строка 1 и столбец «A»).

Вставка скопированного диапазона

Вставка диапазона, скопированного в буфер обмена методом Range.Copy, из буфера обмена со сдвигом ячеек по умолчанию:

Range(«B2:D10»).Copy

Range(«F2»).Insert

Обратите внимание, что при использовании метода Range.Copy, точка вставки (в примере: Range("F2")) не может находится внутри скопированного диапазона, но в строке или столбце левой верхней ячейки скопированного диапазона вне скопированного диапазона находится может.

Вставка и перемещение строк

Вставка одной строки на место пятой строки со сдвигом исходной строки вниз:


Вставка четырех строк на место пятой-восьмой строк со сдвигом исходных строк вниз:


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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

Sub Primer1()

Dim n As Long, k As Long, s As String

‘Номер строки, над которой необходимо вставить строки

n = 8

‘Количесто вставляемых строк

k = 4

‘Указываем адрес диапазона строк

s = n & «:» & (n + k 1)

‘Вставляем строки

Rows(s).Insert

End Sub

‘или то же самое с помощью цикла

Sub Primer2()

Dim n As Long, k As Long, i As Long

n = 8

k = 4

    For i = 1 To k

        Rows(n).Insert

    Next

End Sub


Перемещение второй строки на место шестой строки:

Rows(2).Cut

Rows(6).Insert

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


Перемещение шестой строки на место второй строки:

Rows(6).Cut

Rows(2).Insert

В этом случае шестая строка окажется на месте второй строки.

Вставка и перемещение столбцов

Вставка одного столбца на место четвертого столбца со сдвигом исходного столбца вправо:


Вставка трех столбцов на место четвертого-шестого столбцов со сдвигом исходных столбцов вправо:


Перемещение третьего столбца на место седьмого столбца:

Columns(3).Cut

Columns(7).Insert

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


Перемещение седьмого столбца на место третьего столбца:

Columns(7).Cut

Columns(3).Insert

В этом случае седьмой столбец окажется на месте третьего столбца.


Всё о работе с ячейками в 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

2006 г.

Cells, Range, Rows и Columns

  • Как записать значения сразу в несколько ячеек?
  • Как определить область выделенных ячеек и ее границы?
  • Как записывать значения в ячейку (Value, Value2, Text, Formula)?
  • Что работает быстрее, запись в Range или Cells?
  • Что такое UsedRange? Как найти последнюю используемую ячейку? Что такое SpecialCells? Что такое CurrentRegion?
  • Как получить адрес ячейки?
  • Нужно ли выделять ячейку/область для того чтобы вносить в нее данные?
  • В чем отличие Range.Activate от Range.Select?
  • Как установить свойству ячейки NumberFormat «общий» формат, текстовый формат, формат даты, числа, валюты?
  • Передаю в ячейку 385.00, а показывает 385. Почему?
  • При записи в ячейку чисел как текста, целые числа автоматический преобразуются в численный формат, а вещественные нет. Вследствие чего возникает ошибка «число сохранено как текст».
  • Делаю экспорт в Excel, допустим, текст «000069987», а он выводит в ячейку 69987, т.е. удаляет лидирующие нули. Как мне сделать, чтобы в ячейку выводилось 000069987?
  • Как очистить область ячеек? Как определить что ячейка Excel пустая?
  • Как задать имя области ячеек? Как обратиться к ячейке по имени? Как определить, что такое имя существует на листе? Как задать имя области ячеек?
  • Как объединить ячейки? Как узнать, что ячейка входит в объединенную область и определить границы этой области?
  • Как записывать данные из вариантного массива в Excel?
  • Как прочесть данные из области ячеек в массив?
  • Почему при выгрузке данных в Excel не могу записать строк больше 65536?
  • Как писать в ячейки нескольких листов сразу?
  • Как изменить цвет фона и шрифта ячейки?
  • Как изменить атрибуты шрифта части текста в ячейке (цвет, размер, имя)?
  • Как узнать позицию курсора в редактируемой по F2 ячейке или в строке формул и дописать в нее текст?
  • Как изменить выравнивание/угол наклона текста, отступы в ячейке?
  • Как задать границы для области ячеек (Borders)?
  • Как скопировать форматы и формулы из строки в нижележащую область (AutoFill)?
  • Как скопировать область ячеек с сохранением всех форматов? Как скопировать только значения ячейки?
  • Как скопировать область, чтоб сохранились размеры строк/столбцов?
  • Как сделать автоперенос строк в ячейке?
  • Как вставить несколько строк/столбцов? Как удалить несколько строк/столбцов? Как прятать/показывать строки и столбцы? Как программно изменить высоту строки или ширину столбца?
  • Как подогнать высоту или ширину ячеек для отображения всего текста?
  • Как сделать автоподбор высоты строк для объединенных ячеек?
  • Как программно «заморозить» строки/столбцы?
  • Как добавить примечание к ячейке? Как удалить примечание? Как изменить атрибуты шрифта примечания?
  • Как добавить URL? Как сделать гиперссылку для рисунка?
  • Как отсортировать область ячеек?
  • Как сделать поиск значений в области ячеек или по всему листу?
  • Как, имея ссылку на ячейку, узнать имя листа, которому она принадлежит? Узнать имя книги?
  • Полезные ссылки

Объект Cells предназначен для доступа к ячейкам в стиле R1C1 к одной ячейке. Range — в стиле A1 к области (коллекции) ячеек. Удобство объекта Range в том, что можно, при использовании оператор with, обращаться к нескольким свойствам и методам. Объект Rows возвращает коллекцию строк и Columns — коллекцию столбцов объекта Range (вместо этих свойств можно использовать свойства EntireRow и EntireColumn).

Range Collection

Cells Property

Rows Property

Columns Property

Excel Range Object

Как записать значения сразу в несколько ячеек?

Для записи в несколько (область) ячеек используется объект Range (ExcelRange). Пример, как можно получить объект Range для области ячеек.

Delphi:

oRng: ExcelRange;
...
    ASheet := (XL.ActiveWorkbook.ActiveSheet as _Worksheet);
    oRng := ASheet.Range['A1:B5', EmptyParam];
    oRng := ASheet.Range['A1', 'B5'];
    oRng := ASheet.Range[ASheet.Cells.Item[1, 1], ASheet.Cells.Item[5, 2]];
    oRng.Formula := 123.45;


// обращение к объекту Rows
    oRng := ASheet.Range['3:7', EmptyParam].Rows;
    oRng := ASheet.Range['A3:A7', EmptyParam].EntireRow;

// обращение к объекту Columns
    oRng := ASheet.Range['B:E', EmptyParam].Columns;
    oRng := ASheet.Range['B1:E1', EmptyParam].EntireColumn;

Заметьте, что при обращении к свойству Range и Cells объекта Range, адресация будет уже работать относительно области, указанной в объекте Range. Например, нижеприведенный код будет указывать не на ячейку «A1», как сразу можно подумать, а на «C2»:

ASheet.Range['C2:F20', EmptyParam].Range['A1', EmptyParam];

А вот такой код вернет ячейку с адресом «D3»:

ASheet.Range['C2:F20', EmptyParam].Range['B2', EmptyParam];

EntireRow Property

EntireColumn Property

How to: Refer to Worksheet Ranges in Code

Как определить область выделенных ячеек и ее границы?

Чтобы получить область (или области) выделенных ячеек, нужно получить объект Range из свойства Selection объекта Excel.Application и обратиться к свойству Range.Areas.

Delphi:

    try
      with XL.Selection[lcid] as ExcelRange do

        for i := 1 to Areas.Count do
          with Areas[i] do

            ShowMessageFmt('R%dC%d:R%dC%d',
              [Row, Column, Row + Rows.Count - 1, Column + Columns.Count - 1]);
    except
      // Selection - это не Range!
    end;

Areas Property

Selection Property

Как записывать значения в ячейку (Value, Value2, Text, Formula)?

Начиная с версии Excel XP (10.0), свойство Value имеет параметр. Отличие Value2 от Value в том, что Value2 не поддерживает «форматирования на лету» для типов Currency, Double и Date. Свойство Text (только чтение для Range) возвращает текст в ячейке. Свойство Formula выполняет те же функции, что и Value, с поддержкой «форматирования на лету», а также позволяет записывать в ячейку формулы со ссылками в стиле A1 (в идеале английские, но что на практике, смотрите здесь). Для стиля R1C1 используется свойство FormulaR1C1.

Для записи локализованных («русских») форматов данных и формул используются свойства с окончанием Local, например FormulaLocal.

Delphi:

Range['A1', EmptyParam].Value2 := 'Любой текст';
Range['A2', EmptyParam].Value[xlRangeValueDefault] := 123.45;
Range['A3', EmptyParam].Formula := Date;

// Будьте внимательны - в английских формулах разделитель аргументов
// только символ "," (запятая), а не ";", как в русских формулах!
Range['A4', EmptyParam].Formula := '=sum(A2:A3)';

C#:

// согласитесь, что немного неудобно писать так
oSheet.get_Range("A6", Type.Missing).set_Value(
  Excel.XlRangeValueDataType.xlRangeValueDefault, 123.45);
// или
oSheet.get_Range("A7", Type.Missing).set_Value(Type.Missing, 123.45);
// гораздо удобнее
oSheet.get_Range("A6", Type.Missing).Value2 = 123.45;
// или
oSheet.get_Range("A6", Type.Missing).Formula = 123.45;

Если вы попробуете записать макрос в Excel, то увидите, что запись значений ведется в свойство FormulaR1C1. С тем же успехом можно писать и в свойство Formula.

Внимание! При записи в свойство Formula, если это не формула, следите, чтобы текст не начинался с символов «=», «+», «-«, «*», «/». Или просто к тексту прибавляйте в начало знак апострофа (код символа 39):

Delphi:

Range['A1', EmptyParam].Formula := #39'Любой текст';
Range['A1', EmptyParam].Formula := #39 + MyStringVar;

По волнам интеграции… III

Value Property

Value2 Property

Formula Property

Text Property

Что работает быстрее, запись в Range или Cells?

Запись в Range работает быстрее, но не существенно (смотрите в Demo-проекте пример «Как сделать, чтобы Excel работал быстрее?»). Это связано с тем, что в Excel TLB свойство Cells.Item[R, C] имеет тип OleVariant и, как следствие, позднее связывание. В C# между Range и Cells нет никакой разницы.

Для перевода из координат R1C1 в A1 удобно пользоваться «самодельными» функциями, например:

Delphi:

function xlRCtoA1(const ARow, ACol: Integer;
  RowAbsolute: Boolean = False;
  ColAbsolute: Boolean = False): String;

const
  A1 = Ord('A') - 1;  // номер "A" минус 1 (65 - 1 = 64)
  AZ = Ord('Z') - A1; // кол-во букв в англ. алфавите (90 - 64 = 26)

var
  t, m: Integer;
  S: String[9]; // чтобы экономить память IV=256 последний столбец 
begin
  // номер колонки
  t := ACol div AZ; // целая часть

  m := (ACol mod AZ); // остаток?
  if m = 0 then Dec(t);
  if t > 0 then S := Char(A1 + t) else S := '';
  if m = 0 then t := AZ else t := m;
  S := S + Char(A1 + t);
  // весь адрес

  if ColAbsolute then S := '$' + S;
  if RowAbsolute then S := S + '$';
  S := S + IntToStr(ARow);
  Result := S;

end;

Вот еще примеры

Что такое UsedRange? Как найти последнюю используемую ячейку? Что такое SpecialCells? Что такое CurrentRegion?

UsedRange — прямоугольная область, включающая все заполненные ячейки и незаполненные, в промежутках между заполненными ячейками, на листе. Координаты области не обязательно начинаются в ячейке A1. Также для определения координат различных ячеек можно использовать объект SpecialCells, например, с параметром xlCellTypeLastCell для нахождения последней (крайней справа снизу) используемой ячейки. CurrentRegion возвращает область вокруг ячейки, выделенную пустыми (незаполненными) ячейками. End — находит последнюю ячейку в строке или столбце перед первой попавшейся пустой ячейкой, или первую заполненную, если вызывать метод End для пустой ячейки.

Delphi:

R: ExcelRange;
...
// вся используемая область ячеек (прямоугольная)
R := ASheet.UsedRange[lcid];

// получить последнюю (правую нижнюю) ячейку используемой области
R := ASheet.Range['A1', EmptyParam].SpecialCells(xlCellTypeLastCell, EmptyParam);

// получить все непустые ячейки вокруг ячейки "A5" (удобно для обнаружения таблиц
// на листе)

R := ASheet.Range['A5', EmptyParam].CurrentRegion;

// Найти последнюю непустую ячейку в столбце, если "A9" - непустая ячейка.
// Или первую непустую, если "A9" - пустая ячейка.
R := ASheet.Range['A9', EmptyParam].End_[xlDown];

UsedRange Property

SpecialCells Method

CurrentRegion Property

End Property

Как получить адрес ячейки?

Delphi:

R: ExcelRange;
...
    // абсолютные координаты в стиле A1

    R := ASheet.Range['A1', EmptyParam];
    R.Select;
    R.Formula := R.Address[True, True, xlA1, EmptyParam, EmptyParam];

    // относительные координаты в стиле A1
    R := ASheet.Range['A2', EmptyParam];
    R.Formula := R.Address[False, False, xlA1, EmptyParam, EmptyParam];

    // если указать RowAbsolute и ColumnAbsolute False,
    // то будет выдан адрес относительно активной ячейки
    R := ASheet.Range['A3', EmptyParam];
    R.Formula := R.Address[False, False, xlR1C1, EmptyParam, EmptyParam];

    // теперь получим абсолютный адрес

    R := ASheet.Range['A4', EmptyParam];
    R.Formula := R.Address[True, True, xlR1C1, EmptyParam, EmptyParam];

    // также координаты ячейки можно получить из свойств
    // Row и Column объекта Range
    R := ASheet.Range['A5', EmptyParam];
    R.Formula := Format('Строка %d, Колонка %d', [R.Row, R.Column]);

Address Property

Row Property

Column Property

Нужно ли выделять ячейку/область для того, чтобы вносить в нее данные?

Не нужно. Достаточно указать адрес области ячеек в объекте Range для выбранного объекта Worksheet (и/или Workbook). Любой Select или Activate только замедлит работу вашей программы. Кроме того, метод Select возможно вызвать только на активном листе активной книги! Не используйте Select и Activate без необходимости.

Best Practices for Setting Range Properties

В чем отличие Range.Activate от Range.Select?

И метод Activate и Select делают одно и то же — выделяют (активируют) ячейку. Разница лишь в том, что метод Activate позволяет выбрать только одну ячейку на листе или сделать активной любую ячейку в области, выделенной методом Select. Метод Select позволяет выделять одну и более областей ячеек.

Select Method

Activate Method

Как установить свойству ячейки NumberFormat «общий» формат, текстовый формат, формат даты, числа, валюты?

Для правильной работы NumberFormat с английскими форматами не забудьте подключить модуль TrDispCall

Delphi:

// Установка текстового формата.
    // Записанное число как текст будет воспринят как текст,
    // если указать текстовый формат
    with ASheet.Range['A1', EmptyParam] do begin

      NumberFormat := '@';
      Value[xlRangeValueDefault] := '1234567890123456';
    end;
    // Записанное число как текст будет воспринят как число,
    // если указать общий формат
    with ASheet.Range['A1', EmptyParam] do begin

      NumberFormat := '';
      Value2 := '1234567890123456';
    end;
    // Записанное в ячейку число будет воспринято как число, но
    // с выравниванием влево как текст
    with ASheet.Range['A1', EmptyParam] do begin

      NumberFormat := '@';
      Value2 := Now();
    end;
    // Для установки "общего" формата достаточно записать
    // в свойство NumberFormat пустую строку
    with ASheet.Range['A1', EmptyParam] do begin

      NumberFormat := '';
    end;
    // Для установки формата даты запишем в NumberFormat
    // формат "короткой" даты.
    with ASheet.Range['A1', EmptyParam] do begin

      NumberFormat := ShortDateFormat; // SysUtils
    end;
    // Установим формат целых чисел с разделителем тысяч
    with ASheet.Range['A1', EmptyParam] do begin

      NumberFormat := '#,##0';
    end;
    // Установим формат float чисел с разделителем тысяч и
    // двумя знаками после запятой
    with ASheet.Range['A1', EmptyParam] do begin

      NumberFormat := '#,##0.00';
    end;

NumberFormat

Передаю в ячейку 385.00, а показывает 385. Почему?

Потому что в ячейке установлен «общий» формат (general), который отсекает незначащие цифры. В данном примере всегда будут указываться 2 цифры после запятой:

Delphi:

ASheet.Range['A1', EmptyParam].NumberFormat := '0.00';
ASheet.Range['A1', EmptyParam].Value2 := 385; // будет отображено "385.00"

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

Лучше числа не записывать в ячейку как текст и не надеяться, что Excel всегда сможет «на лету» преобразовать текст верно. Вы никогда не можете быть уверенными, какие локальные установки формата чисел будут установлены на компьютере пользователя. Всегда перед записью переводите записываемые числа из текста в число (Float или Integer) в своей программе.

Делаю экспорт в Excel, допустим, текст «000069987», а он выводит в ячейку 69987, т.е. удаляет лидирующие нули. Как мне сделать, чтобы в ячейку выводилось 000069987?

При записи текста, содержащего одни цифры, Excel пытается его преобразовать в число. Чтобы избажать такой «помощи» со стороны Excel’я, перед записью в ячейку установите в свойство NumberFormat текстовый формат или добавьте перед текстом символ апострофа «‘» (код символа 39).

Delphi:

    S := '000069987';
    // установим текстовый формат перед записью в ячейку
    with ASheet.Range['A1', EmptyParam] do begin

      NumberFormat := '@';
      Formula := S;
    end;
    // или добавим перед текстом апостроф - результат тот же и даже быстрее работает
    // так как не приходится изменять свойство NumberFormat
    ASheet.Range['A2', EmptyParam].Formula := #39 + S;

Как очистить область ячеек? Как определить что ячейка Excel пустая?

Delphi:

    ASheet.Range['A1', EmptyParam].Formula := 123.45;
    ASheet.Range['A2', EmptyParam].Formula := 0;


// проверяем
    ASheet.Range['B1', EmptyParam].Formula := VarIsClear(ASheet.Range['A1', EmptyParam].Value2);
    ASheet.Range['B2', EmptyParam].Formula := VarIsClear(ASheet.Range['A2', EmptyParam].Value2);
    ASheet.Range['B3', EmptyParam].Formula := VarIsClear(ASheet.Range['A3', EmptyParam].Value2);

// Записали в ячейку информацию и проверяем, что вернет нам функция VarIsClear

// Запишем в A3 пустой текст, а в A1 очистим форматы
    ASheet.Range['A1', EmptyParam].ClearFormats;
    ASheet.Range['A3', EmptyParam].Formula := '';

// проверим
    ASheet.Range['B1', EmptyParam].Formula := VarIsEmpty(ASheet.Range['A1', EmptyParam].Value2);
    ASheet.Range['B2', EmptyParam].Formula := VarIsEmpty(ASheet.Range['A2', EmptyParam].Value2);
    ASheet.Range['B3', EmptyParam].Formula := VarIsEmpty(ASheet.Range['A3', EmptyParam].Value2);


// После записи пустой строки ячейка так и осталась "пустой"
// Очистим содержание всех ячеек и посмотрим, что получилось
    ASheet.UsedRange[lcid].ClearContents;
    ASheet.Range['B1', EmptyParam].Formula := VarIsEmpty(ASheet.Range['A1', EmptyParam].Value2);
    ASheet.Range['B2', EmptyParam].Formula := VarIsEmpty(ASheet.Range['A2', EmptyParam].Value2);
    ASheet.Range['B3', EmptyParam].Formula := VarIsEmpty(ASheet.Range['A3', EmptyParam].Value2);


// Видно, что теперь все ячейки "пустые" (нет данных).

Чтобы радикально очистить ячейки (данные, форматы, примечания и т.д.), можно вызвать метод Clear.

Clear Method

ClearContents Method

ClearFormats Method

Как задать имя области ячеек? Как обратиться к ячейке по имени? Как определить, что такое имя существует на листе? Как задать имя области ячеек?

Delphi:

// создадим функцию для проверки наличия именованной области ячеек на листе
function RangeNameExists(ASheet: ExcelWorksheet; const ARangeName: String): Boolean;
var
  i: Integer;
  S: ExcelWorksheet;
  WB: ExcelWorkbook;

begin
  Result := False;
  if not Assigned(ASheet) then Exit;
  WB := ASheet.Parent as ExcelWorkbook;
  for i := 1 to WB.Names.Count do begin

    if AnsiSameText(WB.Names.Item(i, EmptyParam, EmptyParam).Name_, ARangeName) then begin
      // имя нашли, а на нашем ли листе?
      S := WB.Names.Item(i, EmptyParam, EmptyParam).RefersToRange.Worksheet as ExcelWorksheet;
      Result := AnsiSameText(S.Name, ASheet.Name);
      if Result then Break;
    end;
  end;

end;

// присвоим имя "MyNamedRange" области "B2:D7"
    (ASheet.Parent as ExcelWorkbook).Names.Add(
      'MyNamedRange', // Name,

      ASheet.Range['B2:D7', EmptyParam], // RefersTo: OleVariant; стиль адресации A1
      True, // Visible: OleVariant;
      EmptyParam, // MacroType: OleVariant;
      EmptyParam, // ShortcutKey: OleVariant;

      EmptyParam, // Category: OleVariant;
      EmptyParam, // NameLocal: OleVariant;
      EmptyParam, // RefersToLocal: OleVariant;
      EmptyParam, // CategoryLocal: OleVariant;
      EmptyParam, // RefersToR1C1: OleVariant; // адрес в стиле R1C1

      EmptyParam // RefersToR1C1Local: OleVariant
    ); // : Name;

// теперь попробуем определить наличие именованной области и, если есть такая, 
// обведем область рамкой

    if RangeNameExists(ASheet, 'MyNamedRange')
      then ASheet.Range['MyNamedRange', EmptyParam].BorderAround(
        xlContinuous,
        xlThick,
        xlColorIndexAutomatic,
        EmptyParam
        );

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

Names Collection Object

Add Method

How to: Create New Named Ranges in Worksheets

Как объединить ячейки? Как узнать, что ячейка входит в объединенную область и определить границы этой области?

Delphi:

    // объединим область ячеек "A1:C2" строки "вместе"
    ASheet.Range['A1:C2', EmptyParam].Merge(False);
    ASheet.Range['A1', EmptyParam].Select; // подправим вид курсора
    ASheet.Range['A1', EmptyParam].MergeArea.Formula := 'A1:C2 объединены';

    // объединим область ячеек "A3:C4" "раздельно" каждую строку

    ASheet.Range['A3:C4', EmptyParam].Merge(True);

    // определим, что ячейка C2 принадлежит объединенной области
    // при этом тестируем крайнюю ячейку области на вхождение

    if ASheet.Range['C2', EmptyParam].MergeCells then begin

    // если это так, то получим координаты области
      ASheet.Range['A3', EmptyParam].MergeArea.Formula := 'В стиле A1: ' +
        ASheet.Range['C2', EmptyParam].MergeArea.Address[True, True,
        xlA1, EmptyParam, EmptyParam];
      ASheet.Range['A4', EmptyParam].MergeArea.Formula :=
        Format('Начало в R%dC%d, конец в R%dC%d', [
          ASheet.Range['C2', EmptyParam].MergeArea.Row,
          ASheet.Range['C2', EmptyParam].MergeArea.Column,
          ASheet.Range['C2', EmptyParam].MergeArea.Row +
            ASheet.Range['C2', EmptyParam].MergeArea.Rows.Count - 1,
          ASheet.Range['C2', EmptyParam].MergeArea.Column +
            ASheet.Range['C2', EmptyParam].MergeArea.Columns.Count - 1

        ]);
    end;

Смотрите дальше, как сделать автоподбор высоты строк для объединенных ячеек.

MergeCells Property

MergeArea Property

Merge Method

UnMerge Method

Как записывать данные из вариантного массива в Excel?

Запись данных из вариантного массива (VarArray) очень хорошо расписана в статьях «По волнам интеграции… III» и «Зарисовка на тему экспорта в Excel». Для разнообразия, приведу еще раз этот вариант быстрого экспорта в Excel.

Внимание! Если вы пытаетесь записать в область одну строку, то МАССИВ все равно ДОЛЖЕН БЫТЬ ДВУМЕРНЫМ! Т.е. varData := VarArrayCreate([1, 1, 1, ColumnCount], varVariant); При записи массива вы должны указать в адресе области ячеек Range ВСЮ область для заполнения.

Delphi:

procedure CopyFromDataSet(ASheet: _WorkSheet; DataSet: TDataSet);

var
  R, C: Integer;
  vData: Variant;
begin
  DataSet.Last; // специально для IBX
  // строки на одну больше, чем в датасете - для шапки
  vData := VarArrayCreate([0, DataSet.RecordCount, 1, DataSet.FieldCount], varVariant);
  for C := 0 to DataSet.FieldCount - 1 do

    vData[0, C + 1] := DataSet.Fields[C].DisplayLabel;
  DataSet.First;
  R := 1;
  while not DataSet.Eof do begin

    for C := 0 to DataSet.FieldCount - 1 do
      case DataSet.Fields[C].DataType of

        ftString, ftFixedChar, ftWideString:
          vData[R, C + 1] := #39 + DataSet.Fields[C].Value;
        else vData[R, C + 1] := DataSet.Fields[C].Value;
      end;
    Inc(R);
    DataSet.Next;
  end;
  // укажем всю область, в которую будут записаны данные из массива

  with ASheet do with Range['A1',
    Cells.Item[DataSet.RecordCount + 1, DataSet.FieldCount]] do begin

    Formula := vData;
    Borders.Weight := xlHairline;
    EntireColumn.AutoFit;
  end;
  vData := Unassigned; // освободим память сами
  // настройка внешнего вида
  with ASheet do Range['A1',
    Cells.Item[1, DataSet.FieldCount]].Interior.ColorIndex := 15;
  ASheet.Application.ActiveWindow.SplitRow := 1;
  ASheet.Application.ActiveWindow.FreezePanes := True;
  ASheet.Application.ActiveWindow.DisplayGridlines := False;

end;

C#:

      // данные будут взяты из таблицы EMPLOYEE из файла DBDEMOS.MDB
      string dbFile = Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFiles);
      dbFile += @"Borland SharedDatadbdemos.mdb";
      // заменим путь к файлу dbdemos
      dbFile = Regex.Replace(oleDbConnection1.ConnectionString,
        @"^(?<start>.*?;Data Source=)(?<db>[^;]*)(?<end>;.*)$",
        "${start}" + dbFile + "${end}");
      oleDbConnection1.ConnectionString = dbFile;
      try
      {
        oleDbDataAdapter1.Fill(dataSet1, "employee");
        oleDbConnection1.Close(); // закроем соединение
        //
        DataTable tblEmployee = dataSet1.Tables["employee"];
        dataGrid1.DataSource = tblEmployee; // dataSet1.Tables["employee"];
        // создадим двумерный массив для экспорта
        object[,] arrEmployee = (object[,]) Array.CreateInstance(typeof(object),
          new int[2] {tblEmployee.Rows.Count + 1, tblEmployee.Columns.Count}, // длины массива
          new int[2] {0, 1}); // начальные индексы строк и столбцов
        // заголовки
        for (int i = 0; i < tblEmployee.Columns.Count; i++)
          arrEmployee[0, i + 1] = tblEmployee.Columns[i].Caption;
        // данные
        for (int R = 0; R < tblEmployee.Rows.Count; R++)
          for (int C = 0; C < tblEmployee.Columns.Count; C++) {
            arrEmployee[R + 1, C + 1] = tblEmployee.Rows[R][C];
            Application.DoEvents();
          }
        Excel.Worksheet oSheet = null;
        Excel.Range oRng = null;
        Excel.Application XL = new Excel.Application();
        try
        {
          XL.Visible = true;
          XL.Interactive = false;
          XL.Workbooks.Add(Type.Missing);
          oSheet = (Excel.Worksheet) XL.ActiveSheet;
          oRng = oSheet.get_Range(oSheet.Cells[1, 1],
            oSheet.Cells[tblEmployee.Rows.Count + 1, tblEmployee.Columns.Count]);
          oRng.Formula = arrEmployee; // запись данных
          oRng.EntireColumn.AutoFit();
          oRng.Borders.LineStyle = Excel.XlLineStyle.xlContinuous;
          oRng.Borders.Weight = Excel.XlBorderWeight.xlHairline;
          // шапка
          oRng = oSheet.get_Range(oSheet.Cells[1, 1],
            oSheet.Cells[1, tblEmployee.Columns.Count]);
          oRng.Interior.ColorIndex = 15; // 25% серого
          oRng.Interior.Pattern = Excel.XlPattern.xlPatternSolid;
          XL.ActiveWindow.SplitRow = 1;
          XL.ActiveWindow.FreezePanes = true;
          XL.ActiveWindow.DisplayGridlines = false;
          XL.ActiveWorkbook.Saved = true;
          this.Activate();
        }
        finally
        {
          oSheet = null;
          XL.Interactive = true;
          XL.UserControl = true;
          XL = null;
        }
        dataSet1.Tables.Remove(tblEmployee);
      }
      catch (Exception ex)
      {
        if (oleDbConnection1.State == ConnectionState.Open) oleDbConnection1.Close();
        MessageBox.Show(ex.Message);
      }

Как прочесть данные из области ячеек в массив?

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

Delphi:

var
  myVarArray: OleVariant;
…
  // массив будет создан автоматически

  MyVarArray := ASheet.UsedRange[lcid].Value[xlRangeValueDefault];
  // цикл по строкам
  for R := VarArrayLowBound(MyVarArray, 1) to VarArrayHighBound(MyVarArray, 1) do

  // цикл по столбцам
    for C := VarArrayLowBound(MyVarArray, 2) to VarArrayHighBound(MyVarArray, 2) do

C#:

// объявим пустой двумерный массив и получим в него данные
object[,] srcArr = (object[,]) ASheet.UsedRange.get_Value(
          Excel.XlRangeValueDataType.xlRangeValueDefault);
// цикл по массиву 
for (int R = srcArr.GetLowerBound(0); R <= srcArr.GetUpperBound(0); R++) 
  for (int C = srcArr.GetLowerBound(1); C <= srcArr.GetUpperBound(1); C++) 

Почему при выгрузке данных в Excel не могу записать строк больше 65536?

Потому что это максимально возможное количество строк объекта Worksheet. Если вы записываете больше строк, чем 65536, то помещайте их на следующий лист книги — благо, что количество листов ограничено только оперативной памятью комьютера.

Excel specifications and limits

Как писать в ячейки нескольких листов сразу?

Чтобы занести данные в несколько листов сразу, вы можете объединить листы методом Worksheets.Select и воспользоваться методом FillAcrossSheets

Delphi:

var
  SelSheets: Sheets;
…
    // заносим данные в активный лист

    XL.Range['B2', EmptyParam].Formula := 123.45;
    XL.Range['B3', EmptyParam].Borders.LineStyle := xlUnderlineStyleDouble;

    // выберем 4 листа, в которые будут сдублированы данные
    SelSheets := XL.ActiveWorkbook.Sheets[VarArrayOf([1, 2, 3, 4])] as Sheets;


//    SelSheets.Select(False, lcid); // не обязательно

    // заполним выбранные листы данными из активного листа из любой области ячеек
    SelSheets.FillAcrossSheets((XL.ActiveSheet as _Worksheet).UsedRange[lcid],
      xlFillWithAll, lcid);

Select Method

FillAcrossSheets Method

Как изменить цвет фона и шрифта ячейки?

Смотрите свойства Font и Interior объекта Range

Font Property

Interior Property

How to: Change Formatting in a Row that Contains a Selected Cell

Как изменить атрибуты шрифта части текста в ячейке (цвет, размер, имя)?

Чтобы изменить часть текста ячейки можно воспользоваться свойством Characters объекта Range.

Delphi:

Msg: String;
...
    Msg := ' Человек собаке друг J';
    // занесем тест в ячейку
    ASheet.Range['B3', EmptyParam].Formula := Msg;
    // займемся последним символом - изменим атрибуты шрифта
    ASheet.Range['B3', EmptyParam].Characters[Length(Msg), 1].Font.Name :=
      'Wingdings';
    ASheet.Range['B3', EmptyParam].Characters[Length(Msg), 1].Font.Size := 24;
    ASheet.Range['B3', EmptyParam].Characters[Length(Msg), 1].Font.Color := clBlue;

Characters Property

Как узнать позицию курсора в редактируемой по F2 ячейке или в строке формул и дописать в нее текст?

Никак! При входе в режим редактирования ячейки объект Excel.Application становится полностью недоступен через OLE.

XL97: Error Printing Microsoft Excel Section in a Binder

Как изменить выравнивание/угол наклона текста, отступы в ячейке?

Смотрите свойства HorizontalAlignment, VerticalAlignment, AddIndent и Orientation объекта Range

Delphi:

    ASheet.Range['B2', EmptyParam].HorizontalAlignment := xlLeft;
    ASheet.Range['B2', EmptyParam].VerticalAlignment := xlCenter;
    ASheet.Range['B2', EmptyParam].Orientation := 45; // 45 градусов
    // подберем ширину столбца

    ASheet.Range['B:B', EmptyParam].Columns.AutoFit;
//    ASheet.Range['B2', EmptyParam].EntireColumn.AutoFit;

HorizontalAlignment Property

VerticalAlignment Property

Orientation Property

AddIndent Property

IndentLevel Property

Как задать границы для области ячеек (Borders)?

Смотрите свойство Borders объекта Range.

Delphi:

// нарисуем рамку вокруг "B2"
    ASheet.Range['B2', EmptyParam].BorderAround(
        xlContinuous,
        xlThick,
        xlColorIndexAutomatic,
        EmptyParam
      );

    // нарисуем границу сверху

    ASheet.Range['A7:А7', EmptyParam].Borders[xlEdgeTop].LineStyle := xlContinuous;
    ASheet.Range['A7:E7', EmptyParam].Borders[xlEdgeTop].Weight := xlMedium;

Перенос VBA-макросов в Delphi

Borders Property

BorderAround Method

Как скопировать форматы и формулы из строки в нижележащую область (AutoFill)?

Это как раз самый удобный метод копирования форматов и формул для расширения области данных при использовании шаблонов. Подразумевается, что между НАЧАЛО/КОНЕЦ находятся подготовленные ячейки шаблона (форматирование, именованная область DataRange для данных).

Delphi:

    // НАЧАЛО ШАБЛОНА
    // шапка
    ASheet.Range['A1', EmptyParam].Formula := 'Шапка';
    // таблица

    ASheet.Range['A2', EmptyParam].Formula := '#';
    ASheet.Range['B2', EmptyParam].Formula := 'Имя';
    ASheet.Range['C2', EmptyParam].Formula := 'Кол-во';
    ASheet.Range['D2', EmptyParam].Formula := 'Цена';
    ASheet.Range['E2', EmptyParam].Formula := 'Сумма';
    ASheet.Range['A2:E2', EmptyParam].BorderAround(
        xlContinuous,
        xlHairline,
        xlColorIndexAutomatic,
        EmptyParam
      );
    // сделаем вид, что у нас уже готова строка шаблона данных

    // и зададим форматы и формулы
    ASheet.Range['A3', EmptyParam].Font.Bold := True;
    ASheet.Range['C3', EmptyParam].Formula := '=round(rand()*10+1,0)';
    ASheet.Range['D3', EmptyParam].Formula := '=round(rand()*100,2)';

    // в случаях формул удобно использовать стил R1C1

    ASheet.Range['E3', EmptyParam].FormulaR1C1 := '=round(RC[-1]*RC[-2],2)';
    ASheet.Range['E3', EmptyParam].NumberFormat := '#,##0.00';

    // пустая строка для того, чтоб сумма считалась автоматом
    ASheet.Range['A4', EmptyParam].EntireRow.Hidden := True;

    // добавим итоговую сумму (с пустой строкой)

    ASheet.Range['E5', EmptyParam].FormulaR1C1 := '=sum(R[-1]C:R[-2]C)';
    ASheet.Range['E5', EmptyParam].Font.Bold := True;
    ASheet.Range['A5:E5', EmptyParam].Borders[xlEdgeTop].LineStyle :=
      xlContinuous;
    ASheet.Range['A5:E5', EmptyParam].Borders[xlEdgeTop].Weight := xlMedium;

    // области данных присвоим имя
    (ASheet.Parent as ExcelWorkbook).Names.Add(
      'DataRange', // Name,

      ASheet.Range['A3:E3', EmptyParam], // RefersTo: OleVariant;
      True, // Visible: OleVariant;
      EmptyParam, // MacroType: OleVariant;
      EmptyParam, // ShortcutKey: OleVariant;

      EmptyParam, // Category: OleVariant;
      EmptyParam, // NameLocal: OleVariant;
      EmptyParam, // RefersToLocal: OleVariant;
      EmptyParam, // CategoryLocal: OleVariant;
      EmptyParam, // RefersToR1C1: OleVariant;

      EmptyParam // RefersToR1C1Local: OleVariant
    );
    ASheet.Range['DataRange', EmptyParam].Borders[xlEdgeBottom].LineStyle :=
      xlContinuous;
    ASheet.Range['DataRange', EmptyParam].Borders[xlEdgeBottom].Weight := xlHairline;
    // КОНЕЦ ШАБЛОНА

    // Начало работы с шаблоном
    // Добавим 4 строки для занесения данных (итого уже 5 строк для данных)

    // Неудобство при использовании Cells в Range - обязательное
    // дублирование Cells во втором параметре
    ASheet.Range[
      ASheet.Cells.Item[ASheet.Range['DataRange', EmptyParam].Row + 1, 1],
      ASheet.Cells.Item[ASheet.Range['DataRange', EmptyParam].Row + 4, 1]
    ].EntireRow.Insert(xlShiftDown, EmptyParam);

    // теперь заполним область форматированием, захватив (ОБЯЗАТЕЛЬНО)

    // и область-шаблон "DataRange"
    ASheet.Range['DataRange', EmptyParam].AutoFill(
      ASheet.Range[
        // захватим область источника
        ASheet.Cells.Item[ASheet.Range['DataRange', EmptyParam].Row, 1],
        ASheet.Cells.Item[ASheet.Range['DataRange', EmptyParam].Row + 5,
        ASheet.Range['DataRange', EmptyParam].Columns.Count]
      ],
      xlFillCopy
    );

    // заносим данные из массива (номер и имя) - 5 строк, 2 столбца

    arrData := VarArrayCreate([1, 5, 1, 2], varVariant);
    for i := 1 to 5 do begin

      arrData[i, 1] := i;
      arrData[i, 2] := Format('Имя %d', [i]);
    end;
    ASheet.Range[
      ASheet.Cells.Item[ASheet.Range['DataRange', EmptyParam].Row, 1],
      ASheet.Cells.Item[ASheet.Range['DataRange', EmptyParam].Row + 5, 2]
    ].Formula := arrData;

AutoFill Method

How to: Copy Data and Formatting across Worksheets

Как скопировать область ячеек с сохранением всех форматов? Как скопировать только значения ячейки?

Метод Copy позволяет не только копировать содержимое области ячеек в буфер обмена (при пустом параметре), но и задать конкретный адрес ячеек для копирования. Если вы хотите вставить из буфера только некоторые параметры скопированной в БО ячейки, то для вставки используйте метод PasteSpecial, указав необходимый XlPasteType (первый аргумент).

Delphi:

    R := ASheet.Range['A1', EmptyParam];
    // скопируем ячейку "A1" в "C3" - напрямую в ячейку

    R.Copy(ASheet.Range['C3', EmptyParam]); // текущий лист
    // в соседний лист
    R.Copy((XL.Sheets[2] as _Worksheet).Range['C3', EmptyParam]);

    // скопируем через буфер обмена

    R.Copy(EmptyParam); // поместим в БО

    // вставим в ячейку "C3" в текущем листе
    ASheet.Paste(ASheet.Range['C5', EmptyParam], EmptyParam, lcid);
    // в соседний лист

    (XL.Sheets[2] as _Worksheet).Paste(
      (XL.Sheets[2] as _Worksheet).Range['C5', EmptyParam], EmptyParam, lcid);

    // вставляем только значение ячейки без форматирования
    ASheet.Range['C7', EmptyParam].PasteSpecial(xlPasteValues,
      xlPasteSpecialOperationNone, False, False);

Copy Method

PasteSpecial Method

Paste Method

CutCopyMode Property

Как скопировать область, чтобы сохранились размеры строк/столбцов?

К сожалению, при копировании не сохраняются размеры строк и столбцов. Для сохранения размеров строк и столбцов можно использовать несколько способов:

Delphi:

    // способ первый - использование метода PasteSpecial
    // скопируем область ячеек в буфер обмена
    R.Copy(EmptyParam); // поместим в БО
    // вставим в "C3" - ширина колонки не изменилась

    ASheet.Paste(ASheet.Range['C5', EmptyParam], EmptyParam, lcid);
    // специальная свтавка с XlPasteType = xlPasteColumnWidths
    ASheet.Range['C5', EmptyParam].PasteSpecial(xlPasteColumnWidths,
      xlPasteSpecialOperationNone, False, False);

    // второй способ - обращение к коллекциям Rows и Columns
    // копируем весь/все столбец(ы)
    R.EntireColumn.Copy(EmptyParam); // поместим в БО

    // обязательно должна быть указана первая строка!
    ASheet.Paste(ASheet.Range['E1', EmptyParam], EmptyParam, lcid);

    // третий способ - "копирование" свойства ColumnWidth
    R.Copy(ASheet.Range['G4', EmptyParam]);
    // Просто "копируем" ширину столбца

    ASheet.Range['G4', EmptyParam].ColumnWidth := R.ColumnWidth;

Copy Method

PasteSpecial Method

Как сделать автоперенос строк в ячейке?

Чтобы сделать перенос слов в ячейке, установите свойство WrapText объекта Range.

Delphi:

    ASheet.Range['A1', EmptyParam].WrapText := True;
    ASheet.Range['A1', EmptyParam].EntireRow.AutoFit;

WrapText Property

Как вставить несколько строк/столбцов? Как удалить несколько строк/столбцов? Как прятать/показывать строки и столбцы? Как программно изменить высоту строки или ширину столбца?

Delphi:

    // заполним ячейки данными для наглядности
    ASheet.Range['A1', EmptyParam].Formula := 1;
    R := ASheet.Range['A1:A25', EmptyParam];
    R.DataSeries(xlColumns, xlLinear, xlDay, 1, EmptyParam, EmptyParam);
    R := ASheet.Range['A1:O1', EmptyParam];
    R.DataSeries(xlRows, xlLinear, xlDay, 1, EmptyParam, EmptyParam);

    // не забывайте указывать EntireRow и EntireColumn!

    // добавим пять пустых строк после 20-й строки
    ASheet.Range['21:25', EmptyParam].EntireRow.Insert(xlShiftDown, EmptyParam);

    // удвоим ширину второго и третьего столбцов
    ASheet.Range['B:C', EmptyParam].EntireColumn.ColumnWidth :=
      ASheet.Range['B:C', EmptyParam].EntireColumn.ColumnWidth * 2;
    // удвоим высоту второй и третьей строки

    ASheet.Range['2:3', EmptyParam].EntireRow.RowHeight :=
      ASheet.Range['2:3', EmptyParam].EntireRow.RowHeight * 2;

    // удалим 4, 6 и 8 столбцы (два способа - кому что понравится)
//    ASheet.Range['D:D,F:F,H:H', EmptyParam].EntireColumn.Delete(xlShiftToLeft);
    ASheet.Range['D1,F1,H1', EmptyParam].EntireColumn.Delete(xlShiftToLeft);

ColumnWidth

RowHeight Property

Insert Method

Delete Method

Как подогнать высоту или ширину ячеек для отображения всего текста?

Для отображения всего текста в ячейке или области ячеек используйте метод AutoFit объекта Range.

Delphi:

// для строки
ASheet.Range['A1', EmptyParam].EntireRow.AutoFit;
// для столбца
ASheet.Range['A1', EmptyParam].EntireColumn.AutoFit;

AutoFit Method

ShrinkToFit Property

Как сделать автоподбор высоты строк для объединенных ячеек?

Как известно, метод AutoFit для подбора высоты объединенных ячеек не срабатывает. Для этого был придуман простой метод (взят отсюда и просто адаптирован под Delphi). Работает для объединенных ячеек в одной строке. Просто укажите одну из объединенных ячеек области (свойство WrapText должно быть включено).

Delphi:

  procedure AutoFitMergedCellRowHeight(Rng: ExcelRange);
  var

    mergedCellRgWidth: Single;
    rngWidth, possNewRowHeight: Single;
    i: Integer;
  begin
    if Rng.MergeCells then begin
      // здесь использована самописная функция перевода стиля R1C1 в A1
      if xlRCtoA1(Rng.Row, Rng.Column) = xlRCtoA1(
        Rng.Range['A1', EmptyParam].Row, Rng.Range['A1', EmptyParam].Column)
        then Rng := Rng.MergeArea;
      with Rng do begin

        if (Rows.Count = 1) and (WrapText) then begin
          (Rng.Parent as _Worksheet).Application.ScreenUpdating[lcid] := False;
          rngWidth := Cells.Item[1, 1].ColumnWidth;
          mergedCellRgWidth := 0;
          for i := 1 to Columns.Count do

            mergedCellRgWidth := Cells.Item[1, i].ColumnWidth + MergedCellRgWidth;
          MergeCells := False;
          Cells.Item[1, 1].ColumnWidth := MergedCellRgWidth;
          EntireRow.AutoFit;
          possNewRowHeight := RowHeight;
          Cells.Item[1, 1].ColumnWidth := rngWidth;
          MergeCells := True;
          RowHeight := possNewRowHeight;
          (Rng.Parent as _Worksheet).Application.ScreenUpdating[lcid] := True;
        end; // if

      end; // with
    end; // if
  end; // procedure

// вызов

AutoFitMergedCellRowHeight(ASheet.Range['F3', EmptyParam]);

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

Как программно «заморозить» строки/столбцы?

Delphi:

      // Отделить 3 строки
      XL.ActiveWindow.SplitRow := 3;
      // Отделить 1 колонку
      XL.ActiveWindow.SplitColumn := 1;
      // заморозим
      XL.ActiveWindow.FreezePanes := True;

FreezePanes Property

SplitColumn Property

SplitRow Property

Split Property

Как добавить примечание к ячейке? Как удалить примечание? Как изменить атрибуты шрифта примечания?

Комментарий — это своеобразный объект Shape, привязанный к определенному объекту Range.

Delphi:

    // Добавление примечания
    // Способ первый
    ASheet.Range['A1', EmptyParam].AddComment('Note:'#10'Hello A1!');
    // Способ второй

    ASheet.Range['A2', EmptyParam].NoteText('Note:'#10'Hello A2!', EmptyParam, EmptyParam);

    // Изменим атрибуты части текста примечания
    // обращаясь к свойствам Shape.TextFrame.Characters,
    // т.е. Comment - это некий объект Shape
    with ASheet.Range['A1', EmptyParam].Comment.Shape.TextFrame.Characters(
    // если не указать длину, то от заданной позиции и до конца текста

      7, EmptyParam) do begin
      Font.Bold := False;
      Font.Color := clNavy;
    end;

    // добавим третью строку к коментарию в A2
    ASheet.Range['A2', EmptyParam].NoteText(
      ASheet.Range['A2', EmptyParam].NoteText(EmptyParam,
      EmptyParam, EmptyParam) + #10'Третяя строка',
      EmptyParam, EmptyParam);

    // или так

    ASheet.Range['A2', EmptyParam].Comment.Text(
      ASheet.Range['A2', EmptyParam].Comment.Text(EmptyParam,
      EmptyParam, EmptyParam) + #10'Третяя строка',
      EmptyParam, EmptyParam);

    // можно показывать комментарий все время, как транспарант
    ASheet.Range['A2', EmptyParam].Comment.Visible := True; // False

    // теперь просто удалим комментарий
    ASheet.Range['A1', EmptyParam].Comment.Delete;

    // или так
    ASheet.Range['A1', EmptyParam].ClearNotes;

Comment Property

AddComment Method

NoteText Method

ClearNotes Method

How to: Add, Delete, and Display Worksheet Comments

Как добавить URL? Как сделать гиперссылку для рисунка?

Delphi:

    // добавим гиперссылки в A7 и A8

    with ASheet do Hyperlinks.Add(
      Range['A7', EmptyParam],
      'http://www.delphikingdom.com/asp/section.asp?id=16',
      EmptyParam,
      'Все материалы раздела'#10'Hello, World!',
      'Hello, World!');
    with ASheet do Hyperlinks.Add(
      Range['A8', EmptyParam],
      'http://www.delphikingdom.com/asp/nets.asp',
      EmptyParam,
      'Верхний уровень "Дерева тем"'#10'тематического каталога',
      'Тематический каталог');

    // вставим рисунок в текущую ячейку и создадим гиперсылку

    Pic := (ASheet.Pictures(EmptyParam, lcid) as Pictures).Insert(
      MyPicsPath + 'common.gif', EmptyParam);

    ASheet.Hyperlinks.Add(
      Pic.ShapeRange.Item(1),
      'http://www.delphikingdom.com/',
      EmptyParam,
      'Королевство Delphi',
      EmptyParam);

    // редактирование
    with ASheet.Range['A8', EmptyParam].Hyperlinks.Item[1] do begin

      Address := 'http://www.delphikingdom.com/asp/answer.asp?IDAnswer=23150';
      ScreenTip := 'Вопроc ¹ 23150';
      TextToDisplay := 'Как в Excel редактировать гиперссылки, содержащиеся в ячейках?';
    end;

    // удалим гиперссылку - останется только тект, указанный в TextToDisplay
    ASheet.Range['A8', EmptyParam].Hyperlinks.Item[1].Delete;

Hyperlinks Property

Hyperlinks Collection

Hyperlink Object

Как отсортировать область ячеек?

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

Delphi:

      ASheet.UsedRange[lcid].Sort(
      ASheet.Range['A1', EmptyParam], // Key1: OleVariant;
      xlAscending, // Order1: XlSortOrder;
      ASheet.Range['B1', EmptyParam], // Key2: OleVariant;
      EmptyParam, // xlSortValues

      xlAscending, // Order2: XlSortOrder;
      ASheet.Range['C1', EmptyParam], // Key3: OleVariant;
      xlAscending, // Order3: XlSortOrder;
      xlGuess, // Header: XlYesNoGuess;

      EmptyParam, // OrderCustom: OleVariant;
      False, // MatchCase: OleVariant;
      xlTopToBottom, // Orientation: XlSortOrientation;
      xlStroke // SortMethod: XlSortMethod
    );

Sort Method

How to: Sort Data in Worksheets Programmatically

Как сделать поиск значений в области ячеек или по всему листу?

Для поиска в области ячеек задайте диапазон ячеек при получении ссылки на объект Range. Если нужно искать по всему листу, то укажите UsedRange или просто одну ячейку, например «A1». Метод Find и FindNext возвращают объект Range, если значение найдено, и, если ничего не найдено, то nil (или null в C#).

Delphi:

var R: ExcelRange;
...
    S := '77';
    R := ASheet.UsedRange[lcid].Find(
      S, // What: OleVariant;
      EmptyParam, // After: OleVariant;
      xlValues, // LookIn: OleVariant;
      xlPart, // LookAt: OleVariant;

      xlByRows, // SearchOrder: OleVariant;
      xlNext, // SearchDirection: XlSearchDirection;
      False, // MatchCase: OleVariant;
      False, //MatchByte: OleVariant
      // нужно установить в True, если

      EmptyParam // SearchFormat: OleVariant
    );

    // поиск был завершен удачно, если определен объект R
    // поиск следующих ячеек с искомым текстом
    if Assigned(R) then begin

      Addr := R.Address[True, True, xlA1, EmptyParam, EmptyParam];
      repeat
        // зальем красным цветом найденные ячейки
        R.Interior.Color := RGB(255, 0, 0);
        R.Font.Color := RGB(255, 255, 220);
        // найдем следующую

        R := ASheet.UsedRange[lcid].FindNext(R);
        if Assigned(R)
          then Addr2 := R.Address[True, True, xlA1, EmptyParam, EmptyParam];
        // выход, если не найдено или адрес совпал (круг завершен)
      until not Assigned(R) or SameText(Addr, Addr2);
    end;

Find Method

FindNext Method

CellFormat Object

How to: Search for Text in Worksheet Ranges

Как, имея ссылку на ячейку, узнать имя листа, которому она принадлежит? Узнать имя книги?

Получить ссылку на объект Worksheet, содержащий данную ячейку можно из свойства Parent.

var R: ExcelRange;
...
    // получим имя листа
    R.Formula := 'Имя листа: ' + (R.Parent as _Worksheet).Name;

    // получим имя книги
    R.Offset[1, 0].Formula := 'Имя книги: ' +
      ((R.Parent as _Worksheet).Parent as _Workbook).Name;

    // получим имя книги с полным путем к ней

    R.Offset[2, 0].Formula := 'Полное имя книги: ' +
      ((R.Parent as _Worksheet).Parent as _Workbook).FullName[lcid];

    // из ячейки к объекту Excel.Application доступ только через Worksheet

    R.Offset[3, 0].Formula :=
      (R.Parent as _Worksheet).Application.OperatingSystem[lcid];

Parent Property

Полезные ссылки

Microsoft.Office.Interop.Excel Namespace

Microsoft Excel Object Model [Excel 2003 VBA Language Reference]

Automating Excel Using the Excel Object Model

Office Development — Excel

Migrating Excel VBA Solutions to Visual Studio 2005 Tools for Office

Converting Microsoft Office VBA Macros to Visual Basic .NET and C#

Microsoft Excel 2003 Language Reference

Understanding the Excel Object Model from a .NET Developer’s Perspective

Microsoft Excel Tip

Answers to Frequently Asked Questions about Microsoft Excel

Аннотация: Лекция посвящена описанию объектной модели MS Excel, относящейся к ячейкам — объект Range.

15.1. Как обратиться к ячейке

15-01-Excel Обращение к ячейкам.xlsm — пример к п. 15.1.

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

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

Можно адресовать ячейку или диапазон ячеек, указав их адреса в стиле A1. Здесь и далее мы используем метод Select объекта Range, который выделяет ячейки (листинг 15.1.)

ActiveSheet.Range("A2").Select


Листинг
15.1.
Обращаемся к ячейке по имени в стиле A1

Для обращения к диапазону ячеек нужно знать верхнюю левую и нижнюю правую границы диапазона. Например, для обращения к диапазону высотой в одну строку от A2 до E2 или к диапазону A2:E4 — понадобится такой код (листинг 15.2.)

ActiveSheet.Range("A2:E2").Select
ActiveSheet.Range("A2:E4").Select


Листинг
15.2.
Обращаемся к диапазонам

Можно воспользоваться конструкцией с использованием объекта Cells, который позволяет обращаться к отдельной ячейке по ее индексу в формате R1C1. Чтобы обратиться к ячейке A5 таким способом, нужно заметить, что она расположена в пятой строке и первом столбце (листинг 15.3.):

ActiveSheet.Cells(5,1).Select


Листинг
15.3.
Обращаемся к ячейке по номеру строки и столбца

Можно объединить использование Range и Cells, указав координаты ячеек при адресации диапазона с помощью Cells (листинг 15.4.).

ActiveSheet.Range(Cells(5, 4), _
        Cells(7, 5)).Select


Листинг
15.4.
Обращение к диапазону с использованием комбинации Range и Cells

Нам уже встречалось использование Cells для доступа к группам ячеек в цикле — в качестве индексов ячеек можно использовать переменные (листинг 15.5.)

For i = 1 To 3
        For j = 1 To 3
            ActiveSheet.Cells(i, j).Select
            Application.Wait (Now + _
            TimeValue("0:00:01"))
            p = p + 1
            Selection = p
        Next j
    Next i
ActiveSheet.Range("A1:E5").Clear


Листинг
15.5.
Обращение к ячейкам в цикле

Здесь мы циклически выделяем ячейки диапазона A1:C3, делая задержку на 1 секунду после каждого выделения и выводя количество прошедших с начала работы программы секунд. Здесь мы воспользовались для выделения ячейки уже знакомым вам методом Select, а для ввода данных в выделенную ячейку применили объект Selection, который в данном случае ссылается на выделенную ячейку. В конце мы очистили диапазон A1:E5 от введенных данных.

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

Выше мы использовали прямое обращение к ячейкам активного листа, без использования объектных переменных.)

Dim obj_MyCells As Range
Set obj_MyCells = ActiveSheet.Cells(5, 5)
obj_MyCells.Select


Листинг
15.6.
Объектная переменная и работа с ячейками

Помимо обращения к отдельным ячейкам или их диапазонам, Excel предусматривает возможность обращения к строкам и столбцам, а так же — к листу целиком.

В листинге 15.7 мы сначала выделяем столбец A, потом столбец B, используя коллекцию Columns (столбцы), 3-ю строку, используя коллекцию Rows (строки) а далее — лист целиком.

ActiveSheet.Range("A:A").Select
    ActiveSheet.Columns("B:B").Select
    ActiveSheet.Range("3:3").Select
    ActiveSheet.Rows("4:4").Select
    ActiveSheet.Cells.Select


Листинг
15.7.
Работа со столбцами, строками и всеми ячейками листа

Еще один способ обращения к ячейкам — применение именованных диапазонов (коллекция Names ) мы рассмотрим ниже. А теперь поговорим о методах и свойствах объекта Range.

15.2. Методы Range

15.2.1. Activate — активация ячейки

15-02-Range Activate.xlsm — пример к п. 15.2.1.

Позволяет выбрать ячейку в выделенном диапазоне. Даже когда выделен диапазон ячеек, активной является лишь одна из них. Чтобы изменить эту активную ячейку, и применяется данный метод. Если использовать вместо метода Activate метод Select, то ячейка будет выделена, а остальное выделение — снято. В то же время, если попытаться активировать ячейку, расположенную вне выделенного диапазона, выделение снимется, и активированная ячейка окажется выделенной.

Например, в листинге 15.8. мы сначала выделили диапазон ячеек, а потом, не снимая выделения, сделали одну из ячеек диапазона активной.

Range("A1:E5").Select
    Range("C2").Activate


Листинг
15.8.
Активация ячейки в выделенной области

15.2.2. AddComment — добавляем комментарии к ячейкам

Позволяет добавлять комментарии к ячейкам. Если вы формируете какой-нибудь Excel-документ программно, вы можете добавить в некоторые ячейки комментарии для пояснения данных, которые в них хранятся. В листинге 15.9. мы добавляем комментарий к ячейке C3.

Range("C3").AddComment ("Проверка комментария")


Листинг
15.9.
Добавляем комментарий к ячейке

В правом верхнем углу ячейки появится красный треугольник, а наведя мышь на ячейку, можно увидеть текст комментария (рис. 15.1.).

Комментарий в ячейке MS Excel

Рис.
15.1.
Комментарий в ячейке MS Excel

15.2.3. AutoFit — автонастройка ширины столбцов и высоты строк

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

Метод можно применять как к диапазону, так и к отдельным строкам или столбцам.

Например, код в листинге 15.10. позволяет автоматически подобрать ширину столбцов A, B, C, D, E, руководствуясь данными, расположенными в первой строке этих столбцов. Если в других строках столбцов будут более длинные значения — они не будут приняты во внимание.

ActiveSheet.Range("A1:E1").Columns.AutoFit


Листинг
15.10.
Автоматически настраиваем ширину столбцов по ширине данных в указанных ячейках

Мы не случайно обращаемся здесь к свойству Columns объекта Range — иначе метод AutoFit не работает. Если же в подобном вызове не задавать конкретной строки, а выполнить эту команду так (листинг 15.11.), то ширина столбцов A — E будет подстроена таким образом, чтобы наилучшим образом вместить самое длинное из значений, хранящихся в ячейках, принадлежащих столбцам.

ActiveSheet.Range("A:E").Columns.AutoFit


Листинг
15.11.
Автоматически настраиваем ширину столбцов

15.2.4. Clear, ClearComments, ClearContents, ClearFormats — очистка и удаление

Метод Clear позволяет очистить диапазон — он удаляет данные и форматирование из ячеек. Например, в листинге 15.12. мы очищаем от форматирования сначала диапазон A1:E5, а потом — весь лист.

ActiveSheet.Range("A1:E5").Clear
Activesheet.Cells.Select
Selection.Clear


Листинг
15.12.
Очистка от данных и форматирования

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

ClearContents очищает содержимое ячеек, не затрагивая форматирование. Если вы выделите ячейки и нажмете клавишу Del на клавиатуре — вы добъетесь того же эффекта.

ClearFormats очищает лишь форматирование ячеек, не затрагивая содержимого.

15.2.5. Copy, Cut, PasteSpecial — буфер обмена

Выше мы уже рассматривали команды для работы с буфером обмена в MS Excel. Метод Copy копирует содержимое диапазона в буфер обмена, Cut — вырезает, PasteSpecial осуществляет специальную вставку.

Как ни странно, объект Range не поддерживает метод Paste, осуществляющий обычную вставку, однако, этот метод поддерживает объект Worksheet.

15.2.6. Delete — удалить диапазон

Удаляет выделенный диапазон — остальные ячейки сдвигаются, занимая его место.

15.2.7. Merge, UnMerge — объединение ячеек

15-03-Range Merge.xlsm — пример к п. 15.2.7.

Merge позволяет создать одну объединенную ячейку из заданного диапазона.

UnMerge разбивает объединенную ячейку на обычные ячейки.

Объединенные ячейки удобно использовать для хранения в них названий таблиц.

В листинге 15.13. мы программно формируем таблицу шириной в 10 ячеек. Заполняем ее данными, автоматически подстраиваем ширину столбцов под введенные значения. После этого вводим в левую верхнюю ячейку строки, которая расположена над таблицей, название таблицы, и объединяем все ячейки до конца таблицы, расположенные левее строки с названием. В итоге название будет отображено в одной большой строчке, занимающей всю верхнюю часть таблицы (рис. 15.2.).

'Заполняем область C3:L2
    'случайными целыми числами
    For i = 1 To 10
        For j = 1 To 10
            ActiveSheet.Cells(i + 2, j + 2) = _
            Int(Rnd * 100)
        Next j
    Next i
    'Выравниваем размер столбцов
    ActiveSheet.Range("C:L").Columns.AutoFit
    'Записываем название таблицы
    'в ячейку верхней строчки
    Range("C2") = "Название таблицы"
    'Объединяем ячейки над таблицей
    Range("C2:L2").Merge


Листинг
15.13.
Оформление таблиц с использованием объединения ячеек

Название таблицы в объединенной ячейке

Рис.
15.2.
Название таблицы в объединенной ячейке

15.2.8. Select — выделение ячейки

15-04-Range Select.xlsm — пример к п. 7.7.2.8.

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

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

Dim obj_Range As Range
    Dim num_Sum
    'Обращаемся к каждой ячейке
    'в выделенной области
    For Each obj_Range In Selection.Cells
        num_Sum = num_Sum + Val(obj_Range)
    Next
    MsgBox ("Сумма выделенных ячеек: " & _
    num_Sum)


Листинг
15.14.
Поиск суммы чисел в диапазоне, выделенном пользователем

Содержание:

  1. Вставить новые столбцы в Excel
  2. Вставить новый столбец (сочетание клавиш)
  3. Добавить несколько новых столбцов (смежных)
  4. Добавить несколько новых столбцов (несмежных)
  5. Вставлять новые столбцы после каждого другого столбца (с использованием VBA)
  6. Добавить столбец в таблицу Excel

Добавление или удаление столбцов в Excel — это обычная задача при работе с данными в Excel. И, как и все остальное в Excel, есть несколько способов вставки столбцов. Вы можете вставить один или несколько отдельных столбцов (справа / слева от выбранного), несколько столбцов (смежных или несмежных) или столбец после каждого другого столбца в наборе данных. В каждой из этих ситуаций потребуется свой метод вставки столбца.

Примечание: все методы, показанные в этом руководстве, также будут работать, если вы хотите вставить новые строки.

Вставить новые столбцы в Excel

В этом руководстве я расскажу о следующих методах / сценариях вставки новых столбцов в Excel

  1. Вставьте один новый столбец (с помощью сочетания клавиш или параметров на ленте)
  2. Добавить несколько новых столбцов
  3. Добавляйте несмежные столбцы за один раз
  4. Вставлять новые столбцы после каждого другого столбца
  5. Вставить новый столбец в таблицу Excel

Вставить новый столбец (сочетание клавиш)

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

Ниже показано сочетание клавиш для вставки столбца в Excel:

Ctrl + Shift + (удерживая клавиши Ctrl и Shift, нажмите клавишу плюс)
Command + I, если вы используете Mac

Ниже приведены инструкции по использованию этого сочетания клавиш для добавления столбца слева от выбранного столбца:

  1. Выберите ячейку в столбце, слева от которого вы хотите добавить новый столбец
  2. Используйте сочетание клавиш Ctrl + Shift + плюс
  3. В открывшемся диалоговом окне «Вставка» выберите параметр «Весь столбец» (или нажмите клавишу C).5 способов вставки новых столбцов в Excel (включая ярлык и VBA)
  4. Щелкните OK (или нажмите клавишу Enter).

Вышеупомянутые шаги немедленно добавят новый столбец слева от выбранного столбца.

Другой способ добавить новый столбец — сначала выбрать весь столбец, а затем выполнить описанные выше действия. Когда вы выбираете весь столбец, используя Ctrl + Shift + ярлык не отображает диалоговое окно вставки. Он сразу же добавит новый столбец.

Ниже показано сочетание клавиш для выбора всего столбца (после выбора ячейки в столбце):

Ctrl + пробел (удерживая клавишу Ctrl, нажмите клавишу пробел)
После того, как вы выбрали столбец, вы можете использовать Ctrl + Shift + чтобы добавить новый столбец.

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

5 способов вставки новых столбцов в Excel (включая ярлык и VBA)

Это приведет к вставке столбца слева от столбца, в котором вы выбрали ячейку.

Добавить несколько новых столбцов (смежных)

Если вам нужно вставить несколько соседних столбцов, вы можете либо вставить один столбец и время и просто повторить тот же процесс (вы можете использовать клавишу F4, чтобы повторить последнее действие), либо вы можете вставить все эти столбцы за один раз. Предположим, у вас есть набор данных, как показано ниже, и вы хотите добавить два столбца слева от столбца B.

Ниже приведены шаги для этого

  1. Выберите два столбца (начиная с того, слева от которого вы хотите вставить столбцы)
  2. Щелкните правой кнопкой мыши в любом месте выделения
  3. Нажмите «Вставить«.

5 способов вставки новых столбцов в Excel (включая ярлык и VBA)

Вышеупомянутые шаги мгновенно вставили бы два столбца слева от столбца B. Если вы хотите вставить любое другое количество столбцов (скажем, 3, 4 или 5 столбцов), вы выбираете это количество для начала.

Добавить несколько новых столбцов (несмежных)

Приведенный выше пример является быстрым и быстрым, когда вы хотите добавить новые соседние столбцы (т. Е. Блок из 3 соседних столбцов, как показано выше). Но что, если вы хотите вставить столбцы, но они не являются смежными.

Например, предположим, что у вас есть набор данных, показанный ниже, и вы хотите вставить один столбец перед столбцом B и один перед столбцом D.

5 способов вставки новых столбцов в Excel (включая ярлык и VBA)

Хотя вы можете делать это по одному, есть способ лучше.

Ниже приведены шаги по добавлению нескольких несмежных столбцов в Excel

  1. Выберите столбцы, в которые вы хотите вставить новый столбец.
  2. Щелкните правой кнопкой мыши в любом месте выделения
  3. Щелкните Вставить.

5 способов вставки новых столбцов в Excel (включая ярлык и VBA)

Вышеупомянутые шаги мгновенно вставят столбец слева от выбранных столбцов.

5 способов вставки новых столбцов в Excel (включая ярлык и VBA)

Вставлять новые столбцы после каждого другого столбца (с использованием VBA)

Иногда вам может понадобиться добавить новый столбец после каждого другого столбца в существующем наборе данных. Хотя вы можете сделать это вручную, если вы работаете с большим набором данных, это может занять некоторое время. Более быстрый способ сделать это — использовать простой код VBA, чтобы просто вставить столбец после каждого столбца в вашем наборе данных.
Sub InsertColumn () 'Код, созданный Sumit Bansal с trumpexcel.com Dim ColCount As Integer Dim i As Integer StartCol = Selection.Columns.Count + Selection.Columns (1) .Column EndCol = Selection.Columns (1) .Column For i = StartCol To EndCol Шаг -1 Ячейки (1, i) .EntireColumn.Insert Next i End Sub
Приведенный выше код пройдет по каждому столбцу в выделенном фрагменте и вставит столбец справа от выбранных столбцов. Вы можете добавить этот код в обычный модуль, а затем запустить этот макрос оттуда. Или, если вам необходимо использовать эту функцию регулярно, вы также можете рассмотреть возможность добавления ее в личную книгу макросов, а затем добавить ее на панель быстрого доступа. Таким образом, у вас всегда будет доступ к этому коду и вы сможете запустить его одним щелчком мыши.

Примечание. Приведенный выше код также работает, если данные отформатированы как таблица Excel.

Добавить столбец в таблицу Excel

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

Чтобы вставить столбец слева от столбца B, выберите любую ячейку в столбце, щелкните правой кнопкой мыши, перейдите к параметру «Вставить» и нажмите «Столбцы таблицы слева».

5 способов вставки новых столбцов в Excel (включая ярлык и VBA)

Это вставит столбец слева от выбранной ячейки. Если вы выберете ячейку в столбце B и одну в столбце D, вы заметите, что опция «Столбцы таблицы слева» неактивна. В этом случае вам придется вставлять столбцы только по одному. Что удивительно, это работает, когда вы выбираете несмежные строки, но не со столбцами.

Итак, это некоторые из методов, которые вы можете использовать для вставки новых столбцов в Excel. Все методы, описанные в этом руководстве, также будут работать, если вы хотите вставить новые строки (хотя код VBA потребует некоторой модификации).

Надеюсь, вы нашли этот урок полезным!

Как осуществить чтение/запись данных из/в Excel на языке 1с (используя COM-объект)

Здесь можно скачать шаблонную обработку, разработанную в среде «1С:Предприятие v8″ для работы с файлами Excel: [download id=»5»] В обработке осуществляются все основные действия с файлом Excel. Даны подробные комментарии. Можно использовать в качестве шаблона для разработки собственных выгрузок/загрузок в/из Excel.

Чтение данных из Excel

Доступ из 1С к Excel производится посредством OLE. Создание COM-объекта:

 Попытка
		Эксель =Новый COMОбъект("Excel.Application"); // для v7 код будет: Эксель = СоздатьОбъект("Excel.Application");
 Исключение
		Сообщить(ОписаниеОшибки());
		Возврат;
КонецПопытки;

Теперь используя переменную Эксель можно управлять приложением Excel.

  • Внимание! Microsoft Excel должен быть установлен на компьютере!

Следующая команда откроет книгу:

	Книга = Эксель.WorkBooks.Open(ПутьКФайлу);

Перед тем, как начать считывание данных, укажем лист книги, с которого будем считывать данные:

	Лист = Книга.WorkSheets(НомерЛиста);

Нумерация листов книги начинается с 1. Общее количество листов можно получить, используя следующую команду:

	КоличествоЛистов = Книга.Sheets.Count;

Лист можно выбрать по имени листа в книге:

	Лист = Книга.WorkSheets(ИмяЛиста);

Имя листа в книге можно получить по номеру:

	ИмяЛиста = Книга.Sheets(НомерЛиста).Name;

Точно так же можно задать имя листа:

        Книга.Sheets(6).Name = "6 Резерв на отпуск";

Итак, мы открыли книгу и выбрали лист, теперь посмотрим, сколько строк и колонок на выбранном листе:

	ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
	ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;

Получим значения ячейки листа в строке НомерСтроки и в колонке НомерКолонки:

	Значение = Лист.Cells(НомерСтроки, НомерКолонки).Value;

Ниже приведен отрывок кода, запустив который мы прочитаем все данные с первой страницы:

	Эксель = СоздатьОбъект("Excel.Application");
	Книга = Эксель.WorkBooks.Open(ПутьКФайлу);
	Лист = Книга.WorkSheets(1);   

	ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
	ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;      

	Для Строка = 1 По ВсегоСтрок Цикл   

		Для Колонка = 1 По ВсегоКолонок Цикл
			Значение = СокрЛП(Лист.Cells(Строка,Колонка).Value);
		КонецЦикла;       

	КонецЦикла;

Где ПутьКФайлу — полный путь к файлу книги Excel (включая имя).

После выполнения действий необходимо закрыть книгу:

	Эксель.Application.Quit();

Выгрузка данных в Excel

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

      Книга = Excel.WorkBooks.Add();

При создании книги автоматически создаются листы (по умолчанию 3). Нам остается только выбрать нужный:

      Лист = Книга.WorkSheets(НомерЛиста);

Или добавить в книгу новый лист:

      Лист = Книга.Sheets.Add();

Добавим в ячейку на листе значение:

      Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение;

Запишем книгу:

	Попытка
		Книга.SaveAs(ПутьКФайлу);
	Исключение
		Сообщить(ОписаниеОшибки()+" Файл не сохранен!");
	КонецПопытки;

Где ПутьКФайлу — полный путь к файлу книги Excel (включая имя).

После выполнения действий необходимо закрыть книгу:

      	Эксель.Application.Quit();

Как программно сохранить файл Excel в формате 2003 года

Синтаксис команды «SaveAs» во втором параметре разрешает указать формат сохраняемого файла.
Числовое значение фрмата файла Excel 2003: FileFormatNum = -4143
Т.е. команду сохранения для этого можно написатьтак:

Книга.SaveAs(ПутьДляЗаписиФайла, -4143);

Часто используемые методы Excel

Эксель.Visible = Видимость; 0 — Excel не виден, 1 — виден.
Книга = Эксель.WorkBooks.Add(); Создание новой книги (файла) Excel.
Книга = Эксель.WorkBooks.Add(ИмяФайлаШаблона); Создание новой книги (файла) Excel по шаблону «ИмяФайлаШаблона»
Книга.SaveAs(ИмяФайла); Сохранение книги Excel.
Лист = Книга.WorkSheets.Add(); Добавление нового листа в книгу.
Книга = Эксель.WorkBooks.Open(ИмяФайла); Открытие существующей книги (файла) Excel.
Лист = Книга.WorkSheets(НомерЛиста); Установка листа в качестве рабочего с номером НомерЛиста.
Лист.Name = ИмяЛиста; Задание рабочему листу имени ИмяЛиста
Лист.PageSetup.Zoom = Масштаб; Задание параметра страницы «Масштаб» (от 10 до 400).
Лист.PageSetup.Orientation = Ориентация; Ориентация: 1 — книжная, 2 — альбомная.
Лист.PageSetup.LeftMargin = Эксель.CentimetersToPoints(Сантиметры); Задание левой границы (в сантиметрах).
Лист.PageSetup.TopMargin = Эксель.CentimetersToPoints(Сантиметры); Задание верхней границы (в сантиметрах).
Лист.PageSetup.RightMargin = Эксель.CentimetersToPoints(Сантиметры); Задание правой границы (в сантиметрах).
Лист.PageSetup.BottomMargin = Эксель.CentimetersToPoints(Сантиметры); Задание нижней границы (в сантиметрах).
Лист.Columns(НомерКолонки).ColumnWidth = Ширина; Задание ширины колонке.
Лист.Cells(НомерСтроки,НомерКолонки).ColumnWidth = 0; Скрыть всю колонку, в которой расположена ячейка
Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение; Ввод данных в ячейку.
Лист.Cells(НомерСтроки,НомерКолонки).Font.Name = ИмяШрифта; Установка шрифта в ячейке.
Лист.Cells(НомерСтроки,НомерКолонки).Font.Color = ЦветШрифта; Установка цвета шрифта в ячейке. Тип переменной ЦветШрифта — число десятичное.
Лист.Cells(НомерСтроки,НомерКолонки).Borders.Color = ЦветРамки; Установка цвета рамки в ячейке.
Лист.Cells(НомерСтроки,НомерКолонки).Interior.Color = ЦветФона; Установка цвета фона в ячейке.
Лист.Cells(НомерСтроки,НомерКолонки).Font.Size = РазмерШрифта; Установка размера шрифта в ячейке.
Лист.Cells(НомерСтроки,НомерКолонки).Font.Bold = Жирный; 1 — жирный шрифт, 0 — нормальный.
Лист.Cells(НомерСтроки,НомерКолонки).Font.Italic = Курсив; 1 — наклонный шрифт, 0 — нормальный.
Лист.Cells(НомерСтроки,НомерКолонки).Font.Underline = Подчеркнутый; 2 — подчеркнутый, 1 — нет.
Лист.Cells(НомерСтроки, НомерКолонки).NumberFormat = Формат; Установка формата данных ячейки.
Лист.Cells(НомерСтроки,НомерКолонки).Borders.Linestyle = ТипЛинии; Установка рамок ячейки. 1 — тонкая сплошная.
Лист.Cells(НомерСтроки,НомерКолонки).WrapText = Истина; Осуществлять перенос по словам в указанной ячейке
Лист.Protect(); Установка защиты на лист
Лист.UnProtect(); Снятие защиты с листа
Лист.Cells(Строка, Столбец).Locked=0; Ячейка будет доступной (и после установки защиты на лист)
ПолучитьCOMОбъект(<Имя файла>, <Имя класса COM>); Основное применение функции ПолучитьCOMОбъект — это получение COM-объекта, соответствующего файлу.

Хитрости Excel

Как выборочно разрешить / запретить редактирование ячеек листа

	//Создаем объект EXCEL
	Эксель = СоздатьОбъект("Excel.Application");
	Книга = Эксель.WorkBooks.Open(ФайлВыгрузки);
	Лист =Книга.Worksheets("Список сотрудников"); // Выбор листа

	Книга.ActiveSheet.UnProtect(); //делаем шаблон незащищенным

	// Заполняем лист

	// ...................................

	// Снимаем защиту с области ввода сумм 

	Для Перем = 1 По 10 Цикл
		// Прописываем, какие ячейки будут доступными
		Книга.ActiveSheet.Cells(Перем, 2).Locked=0;
	КонецЦикла;  

	Книга.ActiveSheet.Protect(); // ставим защиту на лист

Как запретить появление на экране всяких вопросов от Excel

Excel, чтоб вопрос не задавал:

	Excel.DisplayAlerts = False;

Как добавить лист Excel в конец списка листов книги или после конкретного листа (а не в начало книги)

Метод работает для платформ 1С v8.

	Файл = Новый COMОбъект("Excel.Application");
	Файл.DisplayAlerts = False;
	
	Попытка
		ОбщаяКнига = Файл.WorkBooks.Open(Объект.ПутьКОбщемуФайлу);
	Исключение
		Сообщить("Excel: Неудачная попытка открытия файла Excel" + ОписаниеОшибки());
		//ЗаписьЖурналаРегистрации("Excel: Неудачная попытка открытия файла Excel", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
		Возврат;
		
	КонецПопытки;
	
	КоличествоЛистов = ОбщаяКнига.Sheets.Count; //2
	ПоследнийЛист = ОбщаяКнига.Worksheets(КоличествоЛистов); // необходимо получить сам лист (не его номер)
	
	Если КоличествоЛистов < 8 Тогда // к примеру, нужно сделать так, чтобы в книге было 8 листов, если листов меньше, то добавляем их
		
		Пока 8 - КоличествоЛистов > 0 Цикл
			
			ОбщаяКнига.Sheets.Add(Null,ПоследнийЛист,Null,Null); // добавляем лист в конец книги

			КоличествоЛистов = КоличествоЛистов +1;
			ПоследнийЛист = ОбщаяКнига.Worksheets(КоличествоЛистов); // получаем ссылку на очередной последний лист книги
			
		КонецЦикла;
	КонецЕсли;

Как программно скрыть колонку файла Excel

	// ПРИМЕР как скрыть колонку программно - скроется колонка №2: 	ЛистОшибок.Cells(ПозицияШапкиФайла, 2).ColumnWidth  = 0; // скрыть колонку №2

Как программно назначить ячейке файла Excel перенос по словам

	// ПРИМЕР как осуществлять перенос в ячейке по словам программно ячейка в строке ПозицияШапкиФайла, колонке №2: 	ЛистОшибок.Cells(ПозицияШапкиФайла, 2).WrapText = Истина; // осуществлять перенос в ячейке по словам

Как обработать файл xls, если Excel не установлен на компьютере

Для этого можно использовать метод

	СоздатьОбъект("ADODB.Connection");

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

	db = СоздатьОбъект("ADODB.Connection");
	ConectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+ИмяФайла+";Extended Properties="+"Excel 8.0;";
	rs=CreateObject("ADODB.Recordset");
	db.Open(ConectionString);
	rs.ActiveConnection = db;
	rs.CursorType = 3;
	rs.LockType = 2;

	//Чтобы задать Область, надо выделить область в екселе и нажать Вставка-Имя-Присвоить...
	rs.Source = "Select * from [Лист$1]";
	rs.Open();
	КоличествоПолей = rs.Fields.Count;
	Сообщить(КоличествоПолей);
	КоличествоЗаписей = rs.RecordCount;
	Сообщить(КоличествоЗаписей);
	Если rs.Eof()=0 Тогда
		Сообщить(rs.Fields(0).Value);
		rs.MoveNext();
	Иначе ТЗ.УстановитьЗначение(1,1,rs.Fields(1).Value);
	КонецЕсли;
	rs.Close();
	db.Close();

Как указать цвет шрифта в ячейке, цвет рамки, цвет фона

Книга.Sheets(1).Cells(1,1).Borders.Color = 25525124; // цвет рамки Книга.Sheets(1).Cells(1,1).Font.Color = 255000000; // цвет шрифта Книга.Sheets(1).Cells(1,1).Interior.Color = 255045; // цвет фона

Организация автоматической обработки файлов xls из выбранной папки

// В v8 код обработки файлов выглядит примерно так:

// примеры задания пути к файлам:
ПримерПапкиВСети = "Adsf01PublicЗАГРУЗКА ЗАКАЗОВ";
ПримерПапкиЛокал = "C:1сОбмен";

// задаем путь загрузки:
ПутьЗагрузки = ПримерПапкиЛокал;

// Файлы - Массив из значений типа Файл, содержащий найденные файлы:
Файлы = НайтиФайлы(ПутьЗагрузки,"*.xls*");

// организовываем перебор файлов:
Для Каждого Файл ИЗ Файлы Цикл

	// обрабатываем файлы....
	// ...

	// В конце можно удалить бработанный файл:
	Попытка
		УдалитьФайлы(Файл.ПолноеИмя);
	Исключение
		Сообщить("Не удалось удалить файл " + ОписаниеОшибки());
	КонецПопытки;

	// или в конце можно переместить обработанный файл в специально предназначенную подпапку исходной папки:
	Попытка
		ПереместитьФайл(Файл.ПолноеИмя, ПутьЗагрузки+"Arhiv" + Файл.Имя); // папка архива: "C:1сОбменArhiv"
	Исключение
		Сообщить("Не удалось переместить файл " + ОписаниеОшибки());
	КонецПопытки;

КонецЦикла;

// в 7.7 для аналогичных действий используются команды:
ФС.НайтиПервыйФайл()
ФС.НайтиСледующийФайл()
ФС.УдалитьФайл()
ФС.ПереименоватьФайл(,,);

Создание кнопки в Excel в 7.7

	ТекущийЛист.Shapes("CommandButton").Select
	ТекущийЛист.OLEObjects("CommandButton").Object.Caption = "Кнопуля";

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

	Попытка
		Ex=CreateObject("Excel.Application");
	Исключение
		Сообщить(ОписаниеОшибки(),"!!!");
		Предупреждение("Не удалось запустить MS Excel!");
		Возврат;
	КонецПопытки;
	Состояние("Открытие файла...");
	Попытка
		Wb=Ex.WorkBooks.Add();
	Исключение
		Возврат;
	КонецПопытки;
	Ex.Visible=-1;
	Wb.Sheets(1).OLEObjects.Add("Forms.CommandButton.1",,,10, 99.75, 120.75,  "Очистить");//27.75
	st = "Private Sub CommandButton1_Click()" +  Chr(13) +
	" ThisWorkbook.Sheets(1).Columns(""E:E"").AutoFilter Field:=1, Criteria1:="">0"",
 Operator:=xlAnd" + Chr(13) + "End Sub";
	Ex.VBE.ActiveVBProject.VBComponents(Wb.Sheets(1).Name).CodeModule.AddFromString(st)

текст макроса пишется в переменную st

Как подключиться к запущенному Excel-евскому файлу в реальном времени, изменить его и даже не сохранять, а просто переключить окно на 1С и сразу же выгружать данные в табличную часть, лишь переключив окна

 Excel = ПолучитьCOMОбъект(, "Excel.Application");

При этом первый параметр нужно оставить пустым. В этом случае при этом подцепится тот файл экселя, который был открыт последним, даже если порядок переключения окон был таким:
Excel1, Excel2, IE, Проводник, 1С (т.е. что-то и было открытым между 1с и экселевским файлом) — все равно откроется Excel2, потому что он был активен последним.

Описание команды ПолучитьCOMОбъект

Глобальный контекст
ПолучитьCOMОбъект (GetCOMObject)
Синтаксис:
ПолучитьCOMОбъект(<Имя файла>, <Имя класса COM>)
Параметры:
<Имя файла> (необязательный)
Тип: Строка. Имя файла, включающее полный путь.
<Имя класса COM> (необязательный)
Тип: Строка. Имя класса COM, экземпляр которого должен быть создан или получен. Если расширение имени файла, указанное в первом параметре полностью идентифицирует класс объекта, то параметр может быть опущен.
Возвращаемое значение:
Тип: COMОбъект.
Описание:
Основное применение функции ПолучитьCOMОбъект — это получение COM-объекта, соответствующего файлу. Для этого следует в качестве первого параметра функции задать имя файла, который будет определять COM-объект. Например, фрагмент кода

Таб = ПолучитьCOMОбъект("C:DATADATA.XLS");

создает объект Excel.Application и открывает с его помощью файл документа «C:DATADATA.XLS». Если указанный файл во время выполнения данного фрагмента уже открыт с помощью MS Excel, то будет получена ссылка на уже существующий объект.
Для файлов, указываемых в качестве параметра данной функции, должно быть установлено соответствие расширения имени файла и класса COM.
Если в качестве имени файла указана пустая строка, то будет создан новый экземпляр объекта. В этом случае необходимо указать имя класса COM.
Например, фрагмент кода

Таб = ПолучитьCOMОбъект("", "Excel.Application");

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

П = ПолучитьCOMОбъект( , "Excel.Application");

Переменная П получит значение типа COMОбъект, соответствующее активному приложению MS Excel, если таковое имелось, или будет вызвано исключение, если активных экземпляров MS Excel не было.
Пример:

// Получение объекта COM, соответствующего файлу Таб = ПолучитьCOMОбъект("C:DATADATA.XLS"); // Создание нового экземпляра объекта Таб = ПолучитьCOMОбъект("", "Excel.Application"); // Получение активного объекта Таб = ПолучитьCOMОбъект( , "Excel.Application");

Ниже приведена сравнительная таблица команд — один и тот же код на 7.7 и v8 с небольшими дополнениями

Отличия:

  • команда создания самого объекта в 7.7 и v8 различна;
  • в v8 выводится запись в журнал регистрации (просто для примера, например, когда вывод сообщения на экран невозможен из-за выполнения кода в фоновом задании);
  • в v8 параллельно создается, заполняется и сохраняется копия исходного файла с комментариями об ошибках
1C 7.7 1C v8
Доступ из 1С к Excel производится посредством OLE. Создание COM-объекта:
Попытка
 Эксель = СоздатьОбъект("Excel.Application");
Исключение
 Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Попытка
 Эксель = Новый COMОбъект("Excel.Application");
Исключение
 ЗаписьЖурналаРегистрации("Excel: Неудачная попытка подключения компоненты Excel.
 | Возможно, программа Excel не установлена на данном компьютере!", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
Теперь, используя переменную «Эксель», можно управлять приложением Excel.
* Внимание! Microsoft Excel должен быть установлен на компьютере!
Следующая команда откроет книгу:
Книга = Эксель.WorkBooks.Open(ПутьКФайлу);
Попытка
Книга = Эксель.WorkBooks.Open(ИмяФЗагрузки);
Исключение
ЗаписьЖурналаРегистрации("Excel: Неудачная попытка открытия файла Excel", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
Возврат;
КонецПопытки;
Перед тем, как начать считывание данных, укажем лист книги, с которого будем считывать данные:
Лист = Книга.WorkSheets(НомерЛиста)
Нумерация листов книги начинается с 1. Общее количество листов можно получить, используя следующую команду:
КоличествоЛистов = Книга.Sheets.Count;
КоличествоЛистов = Книга.Sheets.Count;
// создание файла для записи проблем
КнигаОшибок = Эксель.WorkBooks.Add();
КнигаОшибок = Эксель.WorkBooks.Add();
// читаем книгу по листам:
Для СчетчикПоЛистам = 1 По КоличествоЛистов Цикл //цикл по листам
// если листов больше 3, то потребуется добавить лист в книгу
Если СчетчикПоЛистам > 3 Тогда
ЛистОшибок = КнигаОшибок.Sheets.Add();
Иначе
ИмяЛистаОшибок = КнигаОшибок.Sheets(СчетчикПоЛистам).Name;
ЛистОшибок = КнигаОшибок.WorkSheets(ИмяЛистаОшибок);
КонецЕсли;
//Имя листа в книге можно получить по номеру:
ИмяЛиста = Книга.Sheets(НомерЛиста).Name;
ИмяЛиста = Книга.Sheets(СчетчикПоЛистам).Name;
//Лист можно выбрать по имени листа в книге:
Лист = Книга.WorkSheets(ИмяЛиста);
Лист = Книга.WorkSheets(ИмяЛиста);
//Итак, мы открыли книгу и выбрали лист, теперь посмотрим, сколько строк и колонок на выбранном листе:
ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;
Попытка
ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row; // используем для перебора строк
Исключение
ЗаписьЖурналаРегистрации("Excel: Неудачная попытка получения количества колонок и строк Excel", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
Возврат;
КонецПопытки;
// получение значения из конкретной ячейки файла экселя:
Значение = Лист.Cells(НомерСтроки, НомерКолонки).Value;
Для счетчикПоКолонкам = 1 По ВсегоКолонок Цикл //цикл по колонкам
ЗначениеВЯчейке=Книга.Sheets(СчетчикПоЛистам).Cells(ПозицияШапкиФайла,счетчикПоКолонкам).Value;
...
// установка нового значения ячейки экселя:
Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение;
ЛистОшибок.Cells(ПозицияШапкиФайла, счетчикПоКолонкам).Value = ЗначениеВЯчейке;
// сохранение изменений в новом файле экселя:
// если такой файл уже был записан, удалим его, чтобы эксель не спросил интерактивно про перезапись
Попытка
ИмяФайлаОшибок = ВыбФайл.Путь + ВыбФайл.ИмяБезРасширения + "_bad.xls";
ФайлОш = Новый Файл(ИмяФайлаОшибок);
Если ФайлОш.Существует() Тогда
УдалитьФайлы(ИмяФайлаОшибок);
КонецЕсли;
КнигаОшибок.SaveAs(ИмяФайлаОшибок); // файл с ошибочными данными
Исключение
ДобавитьСообщениеВОшибки("Не удалось записать в файл сообщения об ошибках!"+ ОписаниеОшибки(),,, "Важно");
КонецПопытки;
// После выполнения действий закрываем книгу:
Эксель.Quit();
Эксель.Quit();

Содержание

  1. Размер ячейки
  2. Макрос для вставки строк с определенной высотой
  3. Высота строки
  4. Добавление нескольких пустых строк в таблицу Excel
  5. Описание работы
  6. Вставка произвольного количества строк
  7. Вставка строк при изменении значения в столбце
  8. Удаление пустых строк
  9. Надстройка позволяет:
  10. Как вставить/добавить заданное количество пустых/новых строк в определенные места?

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

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

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

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

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

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

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

Макрос для вставки строк с определенной высотой

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

Необходимо экспонировать группы ячеек для каждого штата. Для этого мы добавим по одной пустой строке между каждой группой розничных точек. При этом не имеет значение будет ли содержать группа объединенные ячейки или нет. Ведь некоторые группы состоят из одной строки. А также дополнительно уменьшим высоту этих пустых строк, чтобы внешний вид таблицы был стильным. Выполнить вручную все эти действия: выделение отдельных групп ячеек, вставка между ними пустых строк, а потом изменение высоты для этих же строк – это не рационально использование сил и времени. Особенно если таблица имеет десятки тысяч строк. Лучше написать свой макрос, который сам автоматически и молниеносно выполнит эту рутинную работу за Вас.

Перейдите в режим редактора макросов Visual Basic (ALT+F11):

Создайте в нем новый модуль с помощью инструмента: «Insert»-«Module». А потом запишите в него VBA-код самого макроса:

SubVstavkaStrok()
DimiAs Long
DimpustrokaAs Long
Fori = Selection.Rows.CountTo2Step-1
pustroka = Selection(i, 1).Row + 1
ActiveSheet.Rows(pustroka).Insert xlShiftDown
ActiveSheet.Rows(pustroka).RowHeight = 7
ActiveSheet.Rows(pustroka).Borders(xlInsideVertical). _
LineStyle = xlLineStyleNone
ActiveSheet.Rows(pustroka).Borders(xlEdgeLeft). _
LineStyle = xlLineStyleNone
ActiveSheet.Rows(pustroka).Borders(xlEdgeRight). _
LineStyle = xlLineStyleNone
ActiveSheet.Rows(pustroka).Interior. _
ColorIndex = xlColorIndexNone
i = i - Selection(i, 1).MergeArea.Rows.Count + 1
Next
End Sub

Теперь если мы хотим вставить по одной пустой строке между каждой объединенной и необъединенной ячейкой, которые находиться в столбце A? Тогда а в таблице отчета по продажам выделяем диапазон ячеек A:D18 и запускаем наш макрос выбрав инструмент: «РАЗРАБОТЧИК»-«Код»-«Макросы»-«VstavkaStrok»-«Выполнить». После запуска макроса таблица будет выглядеть как показано на рисунке:

Сначала в коде объявлены две переменные:

  1. i – переменная выполняет роль счетчика в цикле.
  2. pustroka – переменная будет хранить в себе очередной номер для каждой строки выделенного диапазона.

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

  1. В первой инструкции мы присваиваем для переменной pustroka номер строки которая находиться под текущей строкой.
  2. Следующая инструкция добавляет пустую строку с высотой в 7 пикселей.
  3. Удаляются в добавленной строке все вертикальные границы, а также заливка.
  4. Уменьшается значение переменной i на количество строк, которые охватывает текущая объединенная ячейка, находящаяся в первом столбце выделенного диапазона.

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

Для изменения высоты строки используйте свойство 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 пунктам.

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

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

Описание работы

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

Чтобы воспользоваться функцией перейдите на вкладку «VBA-Excel» в разделе «Ячейки и диапазоны» откройте меню «Вставить», выберите «Вставить пустые строки».

Появится диалоговое окно с выбором опций для вставки строк. Необходимо выбрать опции в соответствии с тем какая стоит задача.

Вставка произвольного количества строк

Для этого в поле «Условие» необходимо выбрать пункт «Вставить N пустых строк»
Для того что бы указать в какую строку вставлять пустые строки нужно в поле «Начиная со строки» указать номер нужной строки.
Это можно сделать двумя способами:

  • Вручную ввести номер строки.
  • Нажать кнопку «…» расположенную рядом с полем «Начиная со строки», после чего откроется окно выбора строки. Далее нужно выбрать любую ячейку находящуюся в нужной строку и нажать «Ок»

После чего в поле Количество указать сколько пустых строк нужно вставить. И нажать кнопку «Ок»

Например, нужно вставить 5 пустых строк с 7 строки. тогда ввод в диалоговое окно будет выглядеть следующим образом:

Результатом будет:

Вставка строк при изменении значения в столбце

Для этого в поле «Условие» должно быть выбрано «Вставлять по изменению значения в столбце»

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

Для указания столбца, по которому просматриваются значения, нужно в поле «Столбец» ввести имя столбца. Это можно сделать двумя способами:

  • Вручную ввести имя столбца
  • Нажать кнопку «…» расположенную рядом с полем «Столбец», после чего откроется окно выбора столбца. Далее нужно выбрать любую ячейку находящуюся в нужном столбце и нажать «Ок»

Например, вам нужно отделить каждый новый артикул в столбце А пустой строкой. Тогда диалоговое окно примет вид:

Результат:

Удаление пустых строк

Удаление строк в таблицах Excel уже рассматривалось на страницах этого сайта, удаление же пустых строк является частным случаем удаления строк, следует заметить, что удаление пустых строк, как собственно и их вставку, можно производить программно, при помощи макроса (надстройки). Обо всем этом можно прочитать подробнее.

Надстройка позволяет:

1. Находить пустые ячейки, непустые ячейки, ячейки с заданным цветом заливки, ячейки с заданными числовыми и текстовыми значениями (цифрами, буквами, символами, словами и так далее). Задавать для поиска можно как единичное значение, так и несколько значений, через знак-разделитель “;” (точка с запятой);

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

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

4. осуществлять вставку новых строк ниже каждой второй, третьей, пятой, n-ной строки выбранного диапазона (шаг задается пользователем);

5. вставлять пустые строки при каждой смене значения в заданном столбце;

6. вставлять пустые строки ниже каждой заполненной ячейки в заданном столбце;

7. задавать диапазон для вставки строк, для этого предусмотрено несколько режимов:

а) используемый диапазон листа — диапазон активного листа, включающий в себя все ячейки, находящиеся между первой заполненной и последней заполненной ячейкой;

б) используемые диапазоны — отличается от предыдущего режима тем, что обработка данных производится в используемом диапазоне каждого листа рабочей книги;

в) диапазон листа — диапазон, который выберет пользователь;

г) диапазоны листов — это одноименные диапазоны на всех листа рабочей книги.

*Внимательно выбирайте диапазон для получения желаемого результата!

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

Для числовых значений: равно/не равно, больше/не больше, меньше/не меньше.

Для текстовых значений: совпадает/не совпадает, содержит/не содержит, начинается/не начинается, заканчивается/не заканчивается.

Я написал макрос, который ищет столбец для ячейки, которая содержит текст “AddCompany”, а затем для каждой такой ячейки, вставляет новую строку в другой лист, а затем копирует и вставляет значение смежной ячейки (которая содержит имя компании) в эту новую строку.

В моей копии я использую составленные имена в ячейках “Test Company 1” через “Test Company 4” для проверки макроса. Макрос правильно вставляет 4 новые строки, но только последняя компания “Test Company 4” вставлена. И он вставляется в неправильную ячейку, в строке непосредственно под вновь вставленными строками.

Конечным результатом является то, что макрос вставляет строки с 9 по 12 и вставляет “Test Company 4” в строку 13, которая уже содержит имя (которое я не хочу менять).

Я хочу, чтобы макрос делал это, чтобы вставить “новую” строку (просто будет 9-я строка в этом случае, чтобы она поместилась в большую таблицу) для каждой найденной “AddCompany”, затем вставьте название компании в соседнюю ячейку, и повторить до завершения. Вновь вставленные строки с 9 по 12 должны отображать каждую тестовую компанию в конце.

Как вставить/добавить заданное количество пустых/новых строк в определенные места?

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

1. Выбор искомого значения, которым могут являться пустые ячейки, непустые ячейки, ячейки с заданным цветом заливки, ячейки с заданным числом, а также ячейки с заданным текстом (быквы, символы);

2. вставка заданного количества пустых строк как выше, так и ниже строк с искомым значением;

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

4. вставка новых строк ниже каждой второй, третьей, пятой, n-ной строки выбранного диапазона (шаг задается пользователем);

5. вставлять пустые строки при каждой смене значения в заданном столбце;

6. вставлять пустые строки между заполненными (после каждой заполненной ячейки в столбце с заданным номером);

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

а) используемый диапазон листа – диапазон активного листа, включающий в себя все ячейки, находящиеся между первой заполненной и последней заполненной ячейкой;

б) используемые диапазоны – отличается от предыдущего режима тем, что обработка данных производится в используемом диапазоне каждого листа рабочей книги;

в) диапазон листа – диапазон, который выберет пользователь;

г) диапазоны листов – это одноименные диапазоны на всех листа рабочей книги.

*Внимательно выбирайте диапазон для получения желаемого результата!

8. выбор необходимых условий для значений ячеек.

Для числовых значений: равно/не равно, больше/не больше, меньше/не меньше.

Для текстовых значений: совпадает/не совпадает, содержит/не содержит, начинается/не начинается, заканчивается/не заканчивается.

Программа выполняет проверку всех ячеек заданного диапазона и при выполнении выбранного условия вставляет нужное пользователю количество пустых строк над/под строкой (на выбор), содержащей ячейку с заданным значением. На выбор пользователя представлено множество условий для значений ячеек, с помощью которых можно определить места для вставки новых строк, а также предоставлен выбор диапазонов для обработки данных. Для большей гибкости поиск ячеек с нужными значениями можно осуществлять раздельно, как по текстовым значениям ячеек, так и по числовым. Предусмотрен также поиск как пустых, так и непустых ячеек. Этот макрос позволяет также добавлять новые строки в заданном количестве в каждую n-ую строку выбранного диапазона. Если, к примеру, вставить по две пустые строки ниже каждой второй строки диапазона А2:А24, т ополучим следующий результат:

Источники

  • https://vremya-ne-zhdet.ru/vba-excel/razmer-yacheyki-vysota-stroki-shirina-stolbtsa-avtopodbor/
  • https://exceltable.com/vba-macros/makros-dlya-dobavleniya-strok
  • http://macros-vba.ru/nadstrojki/excel/105-kak-vstavit-dobavit-udalit-novye-pustye-stroki
  • https://micro-solution.ru/projects/addin_vba-excel/insert_rows
  • https://9726552.ru/makros-vstavit-stroku-posle-stroki-so-znachenijami/

Как вставить ячейку в эксель

Как вставить ячейку в excel между ячейками

Добавление столбца в Microsoft Excel

​Смотрите также​ используйте горячие клавиши​Щелкните правой кнопкой мышки​ установить одинаковый размер​ строке не достигнут​Кликаем по прямоугольнику, расположенному​ выделенного диапазона по​ можно заменить на​ столбцами. Excel позволяет​ замены содержимого ячеек,​

​Сочетание клавиш: CTRL+C.​ ошибки. Для нас​

​ Затем, скопируем эту​​ все вместе).​ есть), но галочка​

Вставка столбца

​ в Экселе не​«Столбец»​Для работы в Microsoft​ CTRL+SHIFT+«плюс» предварительно выделив​ по заголовку столбца​ ячеек, как конкретного​ удовлетворяющей вас высоты.​ между горизонтальной и​ высоте стал равным.​ другие варианты.​ пространства для новой​

Способ 1: вставка через панель координат

​ щелкните правой кнопкой​Щелкните правой кнопкой мыши​ важно, чтобы эта​ формулу вправо на​

    ​Когда выделим все​ у этого пункта​ нужно для этого​и жмем на​ Excel первоочередной задачей​ их.​ A. Из появившегося​ диапазона или таблицы,​ Затем отпустите кнопку​ вертикальной панелями координат.​​ Теперь нам нужно​​Находясь во вкладке​

  • ​ строки или столбца.​ мыши строку или​ строку или столбец​ статья была вам​
  • Способ 2: добавление через контекстное меню ячейки

    ​ нужное количество столбцов.​ нужные строки, отпускаем​ отсутствует, то нужно​ проводить отдельную операцию​

      ​ кнопку​ является научиться вставлять​Примечание. Новые строки всегда​ контекстного меню выберите​ так и листа​ мыши.​ Как видим, после​ будет подравнять его​«Файл»​​Скопируйте строки или столбцы,​​ столбец снизу или​

  • ​ снизу или справа​ полезна. Просим вас​Например, в нашей​ клавишу «Ctrl». Нажимаем​ установить её. Если​ для каждого элемента,​
    • ​«OK»​
    • ​ строки и столбцы​
    • ​ добавляются сверху над​
    • ​ опцию «Вставить»​

    ​ в целом. Самое​​После этих действий все​​ этого весь текущий​ по ширине. Для​​, жмем на пункт​​ которые требуется транспонировать.​

  • ​ справа от того​ от того места,​
  • Способ 3: кнопка на ленте

    ​ уделить пару секунд​ таблице два столбца.​ на выделенную строку​

      ​ же все настройки​ так как можно​.​ в таблицу. Без​​ выделенными строками.​​Теперь можно заполнить новый​ главное при выполнении​ элементы выделенного диапазона​ лист выделяется полностью.​​ этого, не снимая​​«Параметры»​​Выберите целевой ячейке (первую​​ места, куда требуется​ куда необходимо переместить​ и сообщить, помогла​​ Мы копируем формулу​​ правой мышкой. Выбираем​

  • ​ выставлены правильно, то​ данную процедуру объединить​После этих действий колонка​
  • Способ 4: применение горячих клавиш

    ​ этого умения практически​В процессе работы с​ столбец номерами позиций​ данной процедуры –​ будут иметь такую​

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

  • ​ будет добавлена.​ невозможно работать с​ Excel, удалять строки​ прайса.​ это правильно выделить​ же высоту, что​ способ выделения всего​​ меню через кнопку​​В открывшемся окне параметров​ столбца, в которую​ выделенный элемент, а​ элемент, а затем​ с помощью кнопок​Теперь выделяем ячейки​ функцию «Вставить» -​ кнопку​Нужно сначала выделить столько​​Вставку столбцов можно производить,​​ табличными данными. Давайте​ и столбцы листа​​​​ тот диапазон, размеры​
  • ​ и ячейка, над​​ листа. Для этого​

    Способ 5: вставка нескольких столбцов

    ​«Формат»​ Excel делаем переход​ нужно вставить данные)​ затем в контекстном​ выполните одно из​ внизу страницы. Для​ C1 и D1​ «Строку». Получится так.​«OK»​

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

  • ​ которой вы проводили​ просто набираем на​на ленте. На​ в пункт​ для строк или​ меню выберите команду​ указанных ниже действий.​ удобства также приводим​ и копируем (протягиваем)​
  • Способ 6: добавление столбца в конце таблицы

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

      ​После данных действий выделенный​ на панели координат,​Выделяем ячейку, слева от​

    ​Скачать последнюю версию​​ стоит попрактиковаться.​​ двух столбцов: количество​​ к единому значению.​​Если вставить скопированную таблицу​Ctrl+A​​ блоке​​. В центральной части​На вкладке​или​ столбцы, выберите в​ (на английском языке).​ конца таблицы. Получится​

    ​.​ диапазон был отформатирован​ сколько столбцов нужно​ которой планируется добавить​ Excel​Для наглядного примера удалим​ и единицы измерения​ Сам ввод параметров​ на лист обычным​.​«Размер ячейки»​ окна находим блок​​Главная​​Вставить скопированные ячейки​ контекстном меню команду​При перемещении или копировании​ так.​Выделяем столбцы с​ как таблица.​ добавить.​ столбец. Находясь во​Урок:​ из нашего прайс-листа​ (шт. кг. л.​ высоты и ширины​​ способом, то чаще​​После того, как вся​

    ​выбираем пункт​ параметров​в группе​

  • ​.​Вставить вырезанные ячейки​ строк и столбцов​Таблицу Excel можно​ нажатой клавишей «Ctrl»​Теперь для того, чтобы​Затем применить одно из​ вкладке​Как добавить столбец в​
  • ​ нумерацию позиций товара​ упак.). Чтобы одновременно​ ячеек можно разделить​ всего столбцы у​ область листа была​«Ширина столбца…»​«Экран»​Редактирование​Примечание:​.​ приложение Excel перемещает​ настроить так, что​ (каждый столбец отдельно).​ включить новый столбец​ действий через контекстное​«Главная»​ таблицу Microsoft Word​ и столбец единиц​ добавить два столбца,​

    Вставить пустые строки в Excel через одну.

    Перемещение и копирование ячеек, строк и столбцов

    ​ кнопкой мышки и​​Автор: Максим Тютюшев​ ленте во вкладке​Выделяем лист в целом​«OK»​После того, как вы​ в столбце C​Когда указатель примет вид​на вкладке​ образом содержимое перемещенные​ здесь.​ столбцов не во​ лист Excel как​ в середине таблицы.​«Вставить столбцы на лист»​ от таблицы.​ способом, только нужно​ выберите опцию «Вставить».​Создавая разного рода новые​«Главная»​ или диапазон ячеек​

    ​.​ определились со значением,​ и пытаетесь вставить​, выполните одно​Главная​ или скопированные ячейки​Можно вставить в​ всей таблице, то​ в середину таблицы,​ Их можно использовать​

    ​.​Одним из самых простых​ выбирать в соответствующее​Примечание. Столбцы всегда добавляются​ таблицы, отчеты и​в блоке инструментов​ на горизонтальной панели​Как видим, после выполненных​ жмите на кнопку​ их в строку,​ из указанных ниже​в группе​ и все ячейки,​ таблицу пустые столбцы.​

    ​ можно использовать другие​

    ​ так и в​ и для вставки​После этого колонка будет​ способов вставки является​​ меню инструмента. А​​ в левую сторону.​​ прайсы, нельзя заранее​​«Буфер обмена»​ координат теми способами,​ манипуляций ячейки выделенной​«OK»​

    ​ перекрывающая столбца C,​ действий.​

    ​Буфер обмена​ которые указывают на​ Установить в них​ способы. Смотрите об​

    ​ крайние диапазоны. Чтобы​ столбцов в конце​

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

    ​ Excel отображает сообщение​Задача​​(или нажать клавиши​​ них могут отображаться​​ формулы, написать любые​​ этом статью «Как​​ добавление было максимально​ ​ таблицы, но в​

    ​ панель координат Excel.​ – без изменений.​ появляется столько, сколько​ строк и столбцов.​ данных действий после​ речь выше. Устанавливаем​ одинаковыми по размеру.​Таким образом, можно установить​ об ошибке. Конечная​

    ​Необходимые действия​ CTRL+V), содержимое конечных​ #REF! значение ошибки.​​ данные. Затем, скрыть​​ добавить строку, столбец​

    ​ простым и удобным,​ этом случае придется​Также новую колонку можно​​Кликаем в горизонтальной панели​​ Только нужно их​

    ​ было их предварительно​​ Использование программы Excel​ выделения набрать на​ курсор на границу​​Существует альтернативный вариант данного​ ​ меру, в которой​​ область вставленного столбца​​Перемещение ячеек​​ ячеек будет заменено.​​ В этом случае​ эти столбцы, строки​ в Excel».​

    Перемещение и копирование строк и столбцов с помощью мыши

    ​ лучше всего создать,​ произвести соответствующее форматирование.​ добавить с помощью​

    ​ координат с наименованиями​ соответственно выделять по​

    ​ выделено. Порядок столбцов​ – это в​ клавиатуре сочетание клавиш​ столбцов на горизонтальной​ способа. Можно выделить​ пользователь лучше всего​ ​ или строки должны​Перетащите ячейки в другое​Выделите строки или столбцы,​

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

    ​ панели координат. При​​ на горизонтальной панели​ ориентируется. Именно эта​ быть из-за пределов​ место.​ которые вы хотите​ изменить ссылки. Подробнее​ Как это сделать,​

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

    ​ столбец в Excel​​ их выделения. Например,​ в процессе которой​Выделяем ячейку на том​ должен появится крест,​

    Перемещение и копирование ячеек

    ​ ширину которых нужно​ будет регулироваться в​Зачастую, при работе с​

    ​Удерживая нажатой клавишу OPTION​Выполните одно из указанных​ в формулах​

    ​ «Как скрыть столбцы​ ​Таблица, как в​ данных в диапазон​ она сразу воспринималась​

    Как добавить ячейки в таблицу в Excel (Эксель)

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

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

    Для повторения вставок ячеек кликайте выбранные места и нажимайте CTRL+Y.

    Задача успешно выполнена. Таким простым образом, выполняется добавление новых ячеек в таблицы в Excel. Необходимо помнить, что при добавлении ячеек происходит процесс перемещения значения одних ячеек на другие. Это надо принимать во внимание, если лист заполненный больше, чем наполовину. В таком случае может возникнуть неприятная ситуация, при которой ячейки закончатся и осуществляемый процесс станет причиной удаления актуальных данных.

    Вставка и удаление строк и столбцов

    В этом курсе:

    Добавляйте и удаляйте строки и столбцы, чтобы лучше упорядочить лист.

    Примечание: В Microsoft Excel установлены следующие ограничения на количество строк и столбцов: 16 384 столбца в ширину и 1 048 576 строк в высоту.

    Вставка и удаление столбца

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

    Вы также можете щелкнуть правой кнопкой мыши в верхней части столбца и выбрать команду Вставить или Удалить.

    Вставка и удаление строки

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

    Вы также можете щелкнуть номер строки правой кнопкой мыши и выбрать команду Вставить или Удалить.

    Параметры форматирования

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

    Если кнопка Параметры вставки не отображается, а затем в группе вырезание, копирование и вставка выберите пункт > файл > Дополнительно >, установите флажок Показать кнопки параметров вставки .

    Например, чтобы вставить новую ячейку между ячейками «Лето» и «Зима»:

    Щелкните ячейку «Зима».

    На вкладке Главная щелкните стрелку под кнопкой Вставить и выберите команду Вставить ячейки (со сдвигом вниз).

    Новая ячейка добавляется над ячейкой «Зима»:

    Вставка строк

    Чтобы вставить одну строку : щелкните правой кнопкой мыши всю строку, над которой требуется вставить новую, и выберите команду Вставить строки.

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

    вставку столбцов

    Чтобы вставить один новый столбец, выполните указанные ниже действия. Щелкните правой кнопкой мыши весь столбец справа от того места, куда вы хотите добавить новый столбец. Например, чтобы вставить столбец между столбцами B и C, щелкните правой кнопкой мыши столбец C и выберите команду Вставить столбцы.

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

    Удаление ячеек, строк и столбцов

    Если вам больше не нужны какие-либо ячейки, строки или столбцы, вот как удалить их:

    Выделите ячейки, строки или столбцы, которые вы хотите удалить.

    На вкладке Главная щелкните стрелку под кнопкой Удалить и выберите нужный вариант.

    При удалении строк или столбцов следующие за ними строки и столбцы автоматически сдвигаются вверх или влево.

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

    Дополнительные сведения

    Вы всегда можете задать вопрос специалисту Excel Tech Community, попросить помощи в сообществе Answers community, а также предложить новую функцию или улучшение на веб-сайте Excel User Voice.

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

    Разделяем ячейки в Excel

    Вы оформляете таблицу со сложной шапкой, в которой количество столбцов разное на разных строках, и пропустили столбец. В текстовом редакторе вы бы разбили ячейку, но в Excel, оказывается, это невозможно. Как быть? Или в вашей таблице имеется графа, а вам нужно разделить ее на три». В решении и первого, и второго вопроса вам поможет эта статья.

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

    Нетрудно заметить, что графу «Количество баллов» нужно разделить на четыре части. Но разбивка столбцов не предусмотрена. Поэтому:

    в третьей строке оформите подзаголовки;

    выделите ячейки с С1 до F1;

    нажмите кнопку объединения ячеек;

      проделайте такие же действия для второй строки (ячейки с С2 до F2);

      объедините ячейки с А1 до А3;

      объедините ячейки с В1 до В3;

      установите центрирование (по горизонтали и по вертикали);

      в ячейку А4 введите номер (1.1.) и объедините ее с ячейкой А5;

      выделите ячейки с В4 по F5 и щелкните по кнопке Перенести текст;

    Кстати, если вам нужно «заставить» программу перенести текст в ячейке с нужного символа на другую строку, то перед первым символом переносимого текста щелкните мышкой и нажмите одновременно клавиши ALT и ENTER.

    Этот же прием пригодиться вам, если нужно в одной и той же ячейке оформить название граф и строк. Разделить их можно косой границей. Для этого:

    расположите текст в ячейке в две строки (первую строку пробелами немного сместите вправо);

    щелкните по кнопке Границы и выберите пункт Нарисовать сетку;

    проведите косую линию в ячейке Н2.

    Рассмотрим пример, когда имеется текст в ячейке, и этот текст нужно разнести по столбцам:

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

    выделите ячейку в графе, которую нужно разделить на столбцы (в примере это первая строка зоны заголовков);

    нажмите на Текст по столбцам — кнопку, размещенную на вкладке Данные;

    если слова разделены, например, запятыми, а в будущих заголовках разделители не нужны, то выберите опцию «с разделителями» и перейдите на следующий шаг;

      выберите соответствующий разделитель и опять Далее;

      укажите первую ячейку, начиная с которой должен расположиться текст, затем кнопку Готово.

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

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

    Добавление ячеек в Microsoft Excel

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

    Процедура добавления ячеек

    Сразу обратим внимание на то, как именно с технологической стороны выполняется процедура добавления ячеек. По большому счету то, что мы называем «добавлением», по сути, является перемещением. То есть, ячейки просто сдвигаются вниз и вправо. Значения, которые находятся на самом краю листа, таким образом, при добавлении новых ячеек удаляются. Поэтому нужно за указанным процессом следить, когда лист заполняется данными более, чем на 50%. Хотя, учитывая, что в современных версиях Excel имеет на листе 1 миллион строк и столбцов, на практике такая необходимость наступает крайне редко.

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

    Итак, теперь перейдем к конкретным способам добавления элементов на лист.

    Способ 1: Контекстное меню

    Одним из самых распространенных способов добавления ячеек в Экселе является использование контекстного меню.

    1. Выделяем элемент листа, куда хотим вставить новую ячейку. Кликаем по нему правой кнопкой мыши. Запускается контекстное меню. Выбираем в нем позицию «Вставить…».

    После этого открывается небольшое окошко вставки. Так как нас интересует именно вставка ячеек, а не целых строк или столбцов, то пункты «Строку» и «Столбец» мы игнорируем. Производим выбор между пунктами «Ячейки, со сдвигом вправо» и «Ячейки, со сдвигом вниз», в соответствии со своими планами по организации таблицы. После того, как выбор произведен, жмем на кнопку «OK».

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

    Если был выбран вариант и «Ячейки, со сдвигом вниз», то таблица изменится следующим образом.

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

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

    Способ 2: Кнопка на ленте

    Добавить элементы на лист Excel можно также через кнопку на ленте. Посмотрим, как это сделать.

      Выделяем элемент на том месте листа, где планируем произвести добавление ячейки. Перемещаемся во вкладку «Главная», если находимся в данный момент в другой. Затем кликаем по кнопке «Вставить» в блоке инструментов «Ячейки» на ленте.

  • После этого элемент будет добавлен на лист. Причем, в любом случае он будет добавлен со смещением вниз. Так что данный способ все-таки менее гибок, чем предыдущий.
  • С помощью этого же способа можно производить добавление групп ячеек.

      Выделяем горизонтальную группу элементов листа и жмем на знакомую нам иконку «Вставить» во вкладке «Главная».

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

      Выделяем вертикальную группу элементов и жмем на кнопку «Вставить».

  • Как видим, в отличие от предыдущих вариантов, в этом случае была добавлена группа элементов со сдвигом вправо.
  • Что же будет, если мы этим же способом добавим массив элементов, имеющий как горизонтальную, так и вертикальную направленность?

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

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

      Выделяем элемент или группу элементов, на место которой хотим произвести вставку. Щелкаем не по знакомой нам кнопке «Вставить», а по треугольнику, который изображен справа от неё. Открывается список действий. Выбираем в нем пункт «Вставить ячейки…».

    После этого открывается уже знакомое нам по первому способу окошко вставки. Выбираем вариант вставки. Если мы, как было сказано выше, хотим произвести действие со сдвигом вниз, то ставим переключатель в позицию «Ячейки, со сдвигом вниз». После этого жмем на кнопку «OK».

  • Как видим, элементы были добавлены на лист со сдвигом вниз, то есть, именно так, как мы задали в настройках.
  • Способ 3: Горячие клавиши

    Самый быстрый способ добавить элементы листа в Экселе – это воспользоваться сочетанием горячих клавиш.

      Выделяем элементы, на место которых хотим произвести вставку. После этого набираем на клавиатуре комбинацию горячих клавиш Ctrl+Shift+=.

    Вслед за этим откроется уже знакомое нам небольшое окошко вставки элементов. В нем нужно выставить настройки смещения вправо или вниз и нажать кнопку «OK» точно так же, как мы это делали уже не раз в предыдущих способах.

  • После этого элементы на лист будут вставлены, согласно предварительным настройкам, которые были внесены в предыдущем пункте данной инструкции.
  • Как видим, существуют три основных способа вставки ячеек в таблицу: с помощью контекстного меню, кнопок на ленте и горячих клавиш. По функционалу эти способы идентичные, так что при выборе, прежде всего, учитывается удобство для самого пользователя. Хотя, безусловно, наиболее быстрый способ – это применения горячих клавиш. Но, к сожалению, далеко не все пользователи привыкли держать существующие комбинации горячих клавиш Экселя у себя в памяти. Поэтому далеко не для всех этот быстрый способ будет удобен.

    Отблагодарите автора, поделитесь статьей в социальных сетях.

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