Excel vba нумерация ячеек

Автоматическое нумерация ячеек до заданного значения

ksplinter

Дата: Среда, 28.10.2015, 17:33 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 10


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Здравствуйте.
В ячейках B3 и B4 заданы числа, допустим 48 и 22 соответственно. Необходимо, чтобы при нажатии на кнопку запуска макроса автоматически нумеровались строка 1 с ячейки Е1 от 1 до 22 и столбец D c ячейки D2 от 1 до 48, т.е. как бы образовывалась таблица, в которую потом вносились значения.
Не подскажете, как это сделать? Весь инет перерыл, не нашел ничего подобного.
Заранее спасибо.

 

Ответить

pechkin

Дата: Среда, 28.10.2015, 18:28 |
Сообщение № 2

Группа: Проверенные

Ранг: Обитатель

Сообщений: 323


Репутация:

48

±

Замечаний:
0% ±


2003

Здравствуйте! Посмотрите…

К сообщению приложен файл:

4958785.xls
(22.5 Kb)

 

Ответить

Wasilich

Дата: Среда, 28.10.2015, 18:58 |
Сообщение № 3

Группа: Друзья

Ранг: Старожил

Сообщений: 1232


Репутация:

326

±

Замечаний:
0% ±


2003

Чуть короче
[vba]

Код

Sub Tаблица()
  Dim i&
  For i = 2 To Range(«B3») + 1
    Cells(i, 4).Value = i — 1
  Next
  For i = 5 To Range(«B4») + 4
    Cells(1, i).Value = i — 4
  Next
End Sub

[/vba]

 

Ответить

ksplinter

Дата: Среда, 28.10.2015, 19:18 |
Сообщение № 4

Группа: Пользователи

Ранг: Новичок

Сообщений: 10


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Спасибо большое, работает!
Последняя просьба, если не затруднит. Было бы здорово, если при нажатии на кнопку макроса, автоматически менялось заполнение ячеек в зависимости от введенных данных. Если вводить значения большие предыдущих, то все нормально — новые ячейки заполняются. А вот если вводить значения меньше предыдущих, то старые заполненные значения остаются.

 

Ответить

Wasilich

Дата: Среда, 28.10.2015, 19:29 |
Сообщение № 5

Группа: Друзья

Ранг: Старожил

Сообщений: 1232


Репутация:

326

±

Замечаний:
0% ±


2003

Ну установите очистку столбца и строки в начале кода.
[vba]

Код

Sub Tаблица()
  Dim i&
  Range(«D1:D150»).ClearContents
  Range(«D1:CC1»).ClearContents
  For i = 2 To Range(«B3») + 1
    Cells(i, 4).Value = i — 1
  Next
  For i = 5 To Range(«B4») + 4
    Cells(1, i).Value = i — 4
  Next
End Sub

[/vba]

Сообщение отредактировал WasilicСреда, 28.10.2015, 19:43

 

Ответить

sv2014

Дата: Среда, 28.10.2015, 19:34 |
Сообщение № 6

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 226


Репутация:

61

±

Замечаний:
0% ±


Excel 2013

ksplinter, добрый вечер,протестируйте такой макрос,кнопка test на Лист2

[vba]

Код

Sub test()
   Dim i%
   For i = 2 To 49
      Range(«D» & i) = i — 1
   Next
   For i = 1 To 22
    Range(«E1:Z1»).Cells(i) = i
  Next
End Sub

[/vba]

 

Ответить

sv2014

Дата: Среда, 28.10.2015, 20:30 |
Сообщение № 7

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 226


Репутация:

61

±

Замечаний:
0% ±


Excel 2013

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

[vba]

Код

Sub test()
   очистить
   Dim i%
  For i = 2 To Range(«B3»)
    Range(«D» & i+1) = i
  Next
For i = 1 To Range(«B4»)
  Range(«D1»).Offset(, i) = i
Next
End Sub

[/vba]

Sub очистить()
Dim i1%, t$, a%
i1 = Range(«D» & Cells.Rows.Count).End(xlUp).Row
Range(«D2:D» & i1).ClearContents
a = Range(«B4»)
t = Split(Range(«D1»).Offset(, a).Address, «$»)(1)
Range(«D1:» & t & «1»).ClearContents
End Sub

К сообщению приложен файл:

3324041.xlsm
(25.1 Kb)

Сообщение отредактировал sv2014Среда, 28.10.2015, 21:07

 

Ответить

RAN

Дата: Среда, 28.10.2015, 20:39 |
Сообщение № 8

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

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

:D Я его и так, и эдак, со словами, и без слов…
Если все нормально, как быть со старыми?
А если не нормально, что с новыми делать?


Быть или не быть, вот в чем загвоздка!

 

Ответить

ksplinter

Дата: Среда, 28.10.2015, 20:41 |
Сообщение № 9

Группа: Пользователи

Ранг: Новичок

Сообщений: 10


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Всем спасибо, воспользовался кодом от Wasilic

Сообщение отредактировал ksplinterСреда, 28.10.2015, 20:41

 

Ответить

Цитата
написал:
Sub AddNum()    Dim objC as Range    For each objC in Selection        objC.Value = objC.Offset(1, -2) & » » & objC.Offset(1, -3)    Next objCEnd Sub

Это прекрасно, черт возьми. Но, возможно я не правильно задал вопрос. Как на уровне VBA сделать это автоматически, чтоб к столбцу А, в каждую ячейку добавлялась нумерация в каждую ячейку.  Чтоб не создавать лишние столбцы.
Условно:
Формирую отчет-> нажимаю в надстройке кнопку-> происходит нумерация в каждую ячейку.
Вот есть допустим 10 ячеек, значит в 10 ячеек добавляет нумерацию. Если 20 ячеек, значит в 20. Без всяких выделений.
Все сделал, кроме этого момента(

Изменено: Daniel Defo07.11.2022 00:54:35

Макросом пронумеровать ячейки

Модератор:Naeel Maqsudov

vadim245

Сообщения:99
Зарегистрирован:11 май 2007, 15:46

Нужен макрос, который последовательные строки (например с 1 по XXXXX) пронумерует по порядку.
Для этого предварительно добавляю пустую колонку.
Вариант написать
1
2
3
а затем протянуть до конца не годится — это делать нужно часто и строк несколько тысяч.

Genyaa

Сообщения:307
Зарегистрирован:11 окт 2006, 17:24
Откуда:Moscow
Контактная информация:

20 сен 2007, 11:57

Нужен макрос? Напиши его!

Можно же эту операцию записать макрорекордером… в чем проблема то?

Всякое решение плодит новые проблемы.

russian imigration

Сообщения:34
Зарегистрирован:02 май 2006, 08:31
Контактная информация:

20 сен 2007, 12:00

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

Код: Выделить всё

Sub number()
  Const StartValue = 1                  'с какого числа начинать нумерацию
  Const EndValue = 50000             'каким числом заканчивать нумерацию
  Dim i As Integer

  ActiveCell.Value = StartValue         'запись в выбранную ячейку начала
  For i = StartValue + 1 To EndValue
     ActiveCell(i, 1).Value = i         'запись со второго по последнее число
  Next
End Sub

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

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

Аватара пользователя

Игорь Акопян

Сообщения:1419
Зарегистрирован:13 окт 2004, 17:11
Откуда:СПБ
Контактная информация:

20 сен 2007, 14:31

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

оно же через макрорекордер:
[syntax=vb]
Sub Макрос1()
Selection.DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, _
Step:=1, Stop:=100, Trend:=False
End Sub

[/syntax]

Изображение

Avsha

Сообщения:664
Зарегистрирован:08 сен 2005, 13:47
Откуда:KZ

20 сен 2007, 15:14

Осмелюсь дополнить вариант от Игорь Акопян

чтобы не ставить единицу и не менять ограничение прогрессии…

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

Код: Выделить всё

Sub Макрос1()
    Selection.Cells(1, 1).Value = 1
    Selection.DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, _
        Step:=1, Trend:=False
End Sub

И не забываем использовать Shift+Ctrl стрелки вверх-вниз для быстрого выделения диапазона.

Последнее время на работе занималась приведением excel-файлов к виду, при котором пользователь может допустить наименьшее количество ошибок при заполнении. До этого первый и последний раз я сталкивалась с visual basic в школе, причем не применительно к Ms Excel, поэтому потребовалось некоторое время на то, чтобы понять, как делать простые и, и тем более не очень, вещи. Эта статейка может помочь людям, оказавшимся в похожей ситуации, быстрее войти в курс дела. Демо-экселька прилагается.


Основы

Самый первый вопрос, который у меня возник, после того как вкладка «Разработчик» была добавлена (подробнее тут, например) и открыт встроенный vba-редактор, это куда собственно писать код. По умолчанию в книге есть модули страниц, модуль книги и один общий модуль. Существуют также модули формы и классов, но сейчас речь не о них. Все вполне логично: обработку событий на объекты страницы пишем в соответствующий лист страницы, обработку событий для книги — в модуль книги, а общие функции для всех листов — в общий модуль. При этом имеет смысл создать еще модули для отделения функционала по смыслу.

Также сразу возникает вопрос, а как элементарно обратиться к ячейке, найти ее значение и перезаписать его. Очень просто:

‘ в ячейку А1 пишем «add note» + значение ячейки B1
Cells(1,1).Value = «add note » & Cells(1,2).Value

For Each oCell In Range(«A1:A10»).Cells
     ‘обработка 
     oCell.Value = oCell.Row ‘ присвоили номер строки   
Next 

Моим следующим вопросом было каким образом вернуть значение из функции. В vba есть два типа функций: sub и function. Разница в том, что function как раз и умеет возвращать значение, для этого в коде функции надо написать ИмяФункции = возвращаемое_значение:

Public Function insertRow()
    Dim position As Integer
    ‘…
    insertRow = position ‘возвращаемое значение

End Function

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

If ActiveSheet.Index = 1 _
   Or ActiveSheet.Index = 4 Then
        ‘ действия
End If

Нарочно и не придумаешь.

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

Dim сoll As New Collection
сoll.Add («элемент1»)‘добавляем элемент
сoll.Add («элемент2»)‘размер увеличивается динамически
‘ по умолчанию индекс начинается с 1, можно изменить
MsgBox (сoll.Item(1)) элемент1
сoll.Remove (1) ‘ удаляем первый элемент
MsgBox (сoll.Count)‘выводим размер коллекции

Чтобы когда мы творим беспредел с нашим excel-файликом посредством vba, он предательски не корчился и напоказ не дергал строками и столбцами перед пользователем (например, при удалении и скрытии интервалов), можно отключать прорисовку:

Application.ScreenUpdating = False ‘ значение True включает

Автоматическая нумерация строк таблицы

Одной из первых моих мелких подзадач стала нумерация строк таблицы. Можно, конечно, при добавлении строки вставлять номер функцией, но хотелось по возможности чтобы это происходило само собой. Как выяснилось, нумеровать ячейки можно формулой =СТРОКА(ячейка), которая возвращает номер строки ячейки-параметра. Например, формула =СТРОКА(А1), вставленная в произвольную ячейку, выведет 1, строка =СТРОКА(А3) — цифру 3. 

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

‘проставляем формулу нумерации

Range(«A7»).FormulaR1C1 = Range(«A6»).FormulaR1C1 

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

Тут может возникнуть одна неприятность. Пусть наша последовательность ячеек с формулами начинается  не с первой строки, а например, с третьей. Тогда в третьей строке будет формула =Строка(А1), во второй — =Строка(А2), в 10 — =Строка(А10) и т.д. Тогда при удалении строки 6 формула в теперешней строке 9 выдаст ошибку «неверная ссылка». 

Это потому, что формула в строке А9 крайне смущена тем, что ссылается на удаленную ячейку. Поэтому если строки в таблице буду удаляться и добавляться, лучше сделать ссылку на ячейки другой страницы (=СТРОКА(Лист2!А1)).

Кнопки вставки и удаления строк

Также неочевидными оказались некоторые нюансы при вставке и удалении строк в таблице по нажатию на соответствующие кнопки (под таблицей будем понимать визуально выделенный  диапазон ячеек, содержащий связанные по смыслу данные). Например, у нас на листе есть две таблицы, у каждой есть кнопка «добавить строку». При добавлении для каждой строки появляется кнопка «удалить».

Само по себе добавление и удаление по имени кнопки сложности не представляет:

Private Sub InsertButton1_Click(position as Integer)
   ‘вставка строки перед строкой с номером position
   Rows(position).Insert
End Sub


Private Sub DeleteButton1_Click()
   Dim position as Integer
   ‘ ищем номер строки кнопки удаления
   position = _            ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row  
   ‘ удаление кнопки
   ActiveSheet.Shapes(Application.Caller).Delete 
   ‘ удаление строки с номером position
   Rows(position).Delete
End Sub

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

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

Нам нужен уникальный идентификатор. Чтобы не заниматься генерацией уникальных хэшей, можно, например, использовать имяКнопки_номерСтроки_текущаяДата. 

newButtonId = «delButton» & insertedRowNumber & Now()

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

Проверка листа на правильное заполнение 

Задача состоит в том, чтобы при сохранении файла проверять содержимое ячеек на всех листах и если какие-то помеченные как обязательные остались незаполненными, выдавать предупреждение пользователю. Для визуального выделения в зависимости от результата проверки содержимого ячеек на соответствие требованиям в excel можно использовать условное форматирование. Казалось бы, все просто: если мы используем условное форматирование и незаполненные ячейки (или неправильно заполненные, которые мы не смогли проверить при вводе с помощью меню «проверка данных») подкрашиваем, например, красным, то при сохранении все что нам нужно сделать — пройтись по всем ячейкам и проверить их цвет.

Но проблема вот в чем — если мы берем colorIndex или color ячейки, нам возвращается исходный цвет, не тот, на который он изменился при помощи условного форматирования.

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

Первый способ: в одном столбце, напротив каждой строки таблицы, формулой вычисляется, правильно ли заполнена строка. Тогда, проходясь по этому столбцу, мы можем сказать, в какой строке проблема. А при помощи условного форматирования проблемные ячейки могут подсвечиваться красным. Этого достаточно, если не надо точно знать, в какой ячейке проблема. При необходимости можно дальше обрабатывать эту строку по ячейкам. Способ хорош, если разные строки проверяются на разные условия (даже в рамках одной таблицы).

usedRows = ActiveSheet.UsedRange.Rows.Count
usedCols = ActiveSheet.UsedRange.Columns.Count
‘ переводим последний столбец из цифры в букву
usedColsInNumb = Split(Cells(1, usedCols).Address, «$»)(1)

For Each cell In ActiveSheet.Range(«A1:» & usedColsInNumb & usedRows).Cells

   ‘ если колонка с результатом формулы проверки заполнена

   If Len(cell.Value) > 0 Then 

       ‘ если строка неправильно заполнена

       If cell.Value = «ЛОЖЬ» Then 

            ‘ сохраняем в массив, отражающий правильность 
            ‘ заполнения каждой строки
            notFilled(cell.Row) = True 

       End If

   End If

Next

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

For Each cell In Sheets(i).Range(«A2:» & usedColsInNumb & usedRows).Cells

    ‘ проверяем выделенные цветом ячейки на пустоту

    If cell.Interior.Color = Sheets(5).Cells(1, 6).Interior.Color   And Len(cell.Value) = 0 Then

        ‘ обработка незаполненной ячейки

    End If

Next

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

‘ ищем смежные с текущей ячейки в виде интервала, eg «A1:B10»

mergedInterv = Cells(cell.Row, cell.Column).MergeArea.Address(RowAbsolute:=False, ColumnAbsolute:=False)

‘ разбиваем адрес на первую и последнюю из смежных

splitAr = Split(mergedInt, «:»)

‘ если текущая ячейка входит в объединенные

If UBound(splitAr) = 1 Then 

      splitAr2 = Split(cell.Address, «$»)

      ‘ если первая из диапазона смежных равна текущей ячейке

      If splitAr(0) = splitAr2(1) & splitAr2(2) Then

          ‘ обработка незаполненной смежной ячейки

      End If

Else 

    ‘ если текущая ячейка не является смежной

End If

При нахождении последней используемой строки или столбца следует учесть, что если вы каким-то образом успели «поиспользовать» интервал (пусть даже выделили и очистили формат), то он все равно считается использованным. Придется удалить эти строки и столбцы.

Прилагаю демо-эксельку. Тестировалась в русифицированном MS Excel 2007.

Автоматическая нумерация строк в Excel по порядку с помощью VBA

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

ручная нумерация строк

Вот так делается ручная нумерация строк

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

нумерация строк используя макрос vba

excel vba автоматическая нумерация строк

Работоспособный макрос нумерации строк в excel по порядку приведен ниже:


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' Обновить нумерацию
If ActiveCell.Column = 10 And Cells(ActiveCell.Row, ActiveCell.Column).Value = "Обновить нумерацию" And ActiveCell.Row = 2 Then
' ссылка на лист книги в котором обновляем нумерацию
Set pr = Workbooks("planero-s-avtomaticheskoj-numeraciej-strok.xlsm").Worksheets("Проекты")
i = 0 ' для работоспособности цикла
j = 1 ' номер задачи
k = 1 ' номер подзадачи
' проходим вниз по странице до тех пор, пока есть записи в ячейке "B3" или "C3"
Do While pr.Range("B3").Offset(i, 0) > 0 Or pr.Range("D3").Offset(i, 0) > 0
' если ячейка "В3"+i содержит текст
If pr.Range("B3").Offset(i, 0) > 0 Then
' нумеруем ее
pr.Range("A3").Offset(i, 0) = j
' выделяем номер жирным
pr.Range("A3").Offset(i, 0).Font.Bold = True
' увеличиваем переменную j на единицу
j = j + 1
' обнуляем номер подзадачи
k = 1
' если ячейка "B3"+i пустая, следовательно мы имеем дело с подзадачей
Else
' если ячейка "D3"+i содержит текст
If pr.Range("D3").Offset(i, 0) > 0 Then
' нумеруем ее
pr.Range("C3").Offset(i, 0) = k
' увеличиваем номер подзадачи на единицу
k = k + 1
End If
End If
' увеличиваем i на +1 чтобы проверить следующию ячейку (расположенную ниже) на наличие записи
i = i + 1
Loop
' убираем курсор с кнопки
pr.Cells(ActiveCell.Row, ActiveCell.Column - 2).Select
End If
End Sub

Первым делом привязываем запуск макроса при нажатии на кнопку «Обновить нумерацию». Далее запускаем цикл и выполняем его до тех пор, пока ячейка B3 и D3 содержит текст. При этом последовательно перемещаемся к ниже идущим ячейкам от B3 и D3, используя Offset и переменную i: .offset(i, 0). Одновременно с этим, нумеруем задачи (если B3+i содержит текст) и подзадачи (если B3+i не содержит текст, при этом содержит текст D3+i). Ну и напоследок убираем курсор с кнопки «Обновить нумерацию».

Саму экселевсую книгу с макросом автоматической нумерации можно скачать по этой ссылке. На этом все. Остались вопросы – задавайте их в комментариях. С другими кейсами по автоматизации можно ознакомиться здесь.

Комментарии 2

© планеро.ru

Содержание

  1. Автоматическая нумерация строк в Excel по порядку с помощью VBA
  2. Сборник полезностей
  3. пятница, 1 февраля 2013 г.
  4. Excel VBA. На старт
  5. Основы
  6. Автоматическая нумерация строк таблицы
  7. Кнопки вставки и удаления строк
  8. Проверка листа на правильное заполнение
  9. Автоматическая нумерация vba excel
  10. Автоматическая нумерация vba excel
  11. Автоматическая нумерация vba excel

Автоматическая нумерация строк в Excel по порядку с помощью VBA

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

Вот так делается ручная нумерация строк

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

excel vba автоматическая нумерация строк

Работоспособный макрос нумерации строк в excel по порядку приведен ниже:

Первым делом привязываем запуск макроса при нажатии на кнопку «Обновить нумерацию». Далее запускаем цикл и выполняем его до тех пор, пока ячейка B3 и D3 содержит текст. При этом последовательно перемещаемся к ниже идущим ячейкам от B3 и D3, используя Offset и переменную i: .offset(i, 0) . Одновременно с этим, нумеруем задачи (если B3+i содержит текст) и подзадачи (если B3+i не содержит текст, при этом содержит текст D3+i). Ну и напоследок убираем курсор с кнопки «Обновить нумерацию».

Саму экселевсую книгу с макросом автоматической нумерации можно скачать по этой ссылке. На этом все. Остались вопросы – задавайте их в комментариях. С другими кейсами по автоматизации можно ознакомиться здесь.

Источник

Сборник полезностей

пятница, 1 февраля 2013 г.

Excel VBA. На старт

Основы

‘ в ячейку А1 пишем «add note» + значение ячейки B1
Cells(1,1).Value = «add note » & Cells(1,2).Value

For Each oCell In Range(«A1:A10»).Cells
‘обработка
oCell.Value = oCell.Row ‘ присвоили номер строки
Next

Public Function insertRow()
Dim position As Integer
‘.
insertRow = position ‘возвращаемое значение

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

If ActiveSheet.Index = 1 _
Or ActiveSheet.Index = 4 Then
‘ действия
End If

Нарочно и не придумаешь.

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

Dim сoll As New Collection
сoll .Add («элемент1») ‘добавляем элемент
сoll .Add («элемент2») ‘размер увеличивается динамически
‘ по умолчанию индекс начинается с 1, можно изменить
MsgBox ( сoll .Item(1)) ‘ элемент1
сoll . Remove (1) ‘ удаляем первый элемент
MsgBox ( сoll .Count) ‘выводим размер коллекции

Автоматическая нумерация строк таблицы

Это потому, что формула в строке А9 крайне смущена тем, что ссылается на удаленную ячейку. Поэтому если строки в таблице буду удаляться и добавляться, лучше сделать ссылку на ячейки другой страницы (=СТРОКА(Лист2!А1)).

Кнопки вставки и удаления строк

Само по себе добавление и удаление по имени кнопки сложности не представляет:

Private Sub InsertButton1_Click( position as Integer )
‘вставка строки перед строкой с номером position
Rows(position).Insert
End Sub

Private Sub DeleteButton1_Click()
Dim position as Integer
‘ ищем номер строки кнопки удаления
position = _ ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row
‘ удаление кнопки
ActiveSheet.Shapes(Application.Caller).Delete
‘ удаление строки с номером position
Rows(position).Delete
End Sub

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

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

Проверка листа на правильное заполнение

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

Первый способ: в одном столбце, напротив каждой строки таблицы, формулой вычисляется, правильно ли заполнена строка. Тогда, проходясь по этому столбцу, мы можем сказать, в какой строке проблема. А при помощи условного форматирования проблемные ячейки могут подсвечиваться красным. Этого достаточно, если не надо точно знать, в какой ячейке проблема. При необходимости можно дальше обрабатывать эту строку по ячейкам. Способ хорош, если разные строки проверяются на разные условия (даже в рамках одной таблицы).

Источник

Автоматическая нумерация vba excel

Подскажите, пожалуйста, возможно ли решить макросами одну задачу?

В настоящее время решаю вопрос нумерации стандартными формулами. Но столкнулся с таким вопросом, что когда добавляю строку или переношу строку в другое место (выше или ниже) нумерация сбивается.

При добавлении строки внутри таблицы и занесении информации со второй колонки в любую ячейку необходимо чтобы в колонке «А» менялась нумерация
Если строка пустая со второго столбца пусть будет 100 столбцов то нумерация не меняется.

Возможно ли сделать автоматическую нумерацию без ручного запуска макроса?

P.S. кросса не будет, обещаю

Подскажите, пожалуйста, возможно ли решить макросами одну задачу?

В настоящее время решаю вопрос нумерации стандартными формулами. Но столкнулся с таким вопросом, что когда добавляю строку или переношу строку в другое место (выше или ниже) нумерация сбивается.

При добавлении строки внутри таблицы и занесении информации со второй колонки в любую ячейку необходимо чтобы в колонке «А» менялась нумерация
Если строка пустая со второго столбца пусть будет 100 столбцов то нумерация не меняется.

Возможно ли сделать автоматическую нумерацию без ручного запуска макроса?

P.S. кросса не будет, обещаю Anis625

Сообщение Добрый вечер.

Подскажите, пожалуйста, возможно ли решить макросами одну задачу?

В настоящее время решаю вопрос нумерации стандартными формулами. Но столкнулся с таким вопросом, что когда добавляю строку или переношу строку в другое место (выше или ниже) нумерация сбивается.

При добавлении строки внутри таблицы и занесении информации со второй колонки в любую ячейку необходимо чтобы в колонке «А» менялась нумерация
Если строка пустая со второго столбца пусть будет 100 столбцов то нумерация не меняется.

Возможно ли сделать автоматическую нумерацию без ручного запуска макроса?

P.S. кросса не будет, обещаю Автор — Anis625
Дата добавления — 30.01.2018 в 18:33

Anis625 Дата: Среда, 31.01.2018, 08:32 | Сообщение № 2

Как вариант добавил пользовательскую формулу СЧСТРОК().

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

Как вариант добавил пользовательскую формулу СЧСТРОК().

Возможно ли сделать автоматическое проставление формулы при заполнении строки любыми значениями без ручного запуска макроса (чтобы не протягивать формулу)? Anis625

Сообщение Как вариант добавил пользовательскую формулу СЧСТРОК().

Возможно ли сделать автоматическое проставление формулы при заполнении строки любыми значениями без ручного запуска макроса (чтобы не протягивать формулу)? Автор — Anis625
Дата добавления — 31.01.2018 в 08:32

Источник

Автоматическая нумерация vba excel

ksplinter, добрый вечер,протестируйте такой макрос,кнопка test на Лист2

ksplinter, добрый вечер,протестируйте такой макрос,кнопка test на Лист2

Сообщение ksplinter, добрый вечер,протестируйте такой макрос,кнопка test на Лист2

sv2014 Дата: Среда, 28.10.2015, 20:30 | Сообщение № 7

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

Sub очистить()
Dim i1%, t$, a%
i1 = Range(«D» & Cells.Rows.Count).End(xlUp).Row
Range(«D2:D» & i1).ClearContents
a = Range(«B4»)
t = Split(Range(«D1»).Offset(, a).Address, «$»)(1)
Range(«D1:» & t & «1»).ClearContents
End Sub

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

Sub очистить()
Dim i1%, t$, a%
i1 = Range(«D» & Cells.Rows.Count).End(xlUp).Row
Range(«D2:D» & i1).ClearContents
a = Range(«B4»)
t = Split(Range(«D1»).Offset(, a).Address, «$»)(1)
Range(«D1:» & t & «1»).ClearContents
End Sub sv2014

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

Источник

Автоматическая нумерация vba excel

Предположим, я пронумеровал строки от 1 до 20 в столбце, теперь, когда я вставляю или удаляю строку из диапазона данных, я хочу, чтобы список номеров можно было перенумеровать автоматически. Можно ли выполнить эту задачу в Excel?

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

1. Введите эту формулу: = СТРОКА () — 1 в ячейку A2, а затем перетащите маркер заполнения вниз к ячейкам, в которых вы хотите пронумеровать строки, см. снимок экрана:

Внимание: Если ваш список номеров начинается с первой ячейки, вы можете изменить формулу как = СТРОКА () , вы можете прибавить или вычесть из формулы, если ваши числа не совпадают с фактической строкой, например, = СТРОКА () — 3 , = СТРОКА () + 10 .

2. Затем создайте таблицу для этого диапазона данных, выберите диапазон данных и щелкните Вставить > Настольные, а затем в Создать таблицу диалоговое окно, отметьте В моей таблице есть заголовки если в вашем диапазоне есть заголовки, см. снимок экрана:

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

За исключением вышеуказанного метода формулы, вы также можете завершить его кодом VBA.

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

2. Щелкните правой кнопкой мыши вкладку листа и выберите Просмотреть код из контекстного меню во всплывающем Microsoft Visual Basic для приложений окна, скопируйте и вставьте следующий код в пустое окно модуля.

Код VBA: автоматическая нумерация строк после вставки или удаления строк:

3. Затем сохраните и закройте этот код, когда вы вводите первую цифру 1 в ячейку A1, порядковые номера от 1 до 20 будут заполнены автоматически. Если вы вставляете или удаляете строки из диапазона, номер серии сразу будет автоматически перенумерован.

Внимание: В приведенном выше коде буква A указывает букву столбца, которую вы хотите заполнить порядковым номером, 1 К 20 это строки, которые вы хотите пронумеровать, и A21 это ссылка на ячейку рядом с вашей последней пронумерованной ячейкой. Вы можете менять их по своему усмотрению.

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

Kutools for Excel‘s Вставить пулю и яnsert нумерация функции могут помочь вам быстро вставить маркированный и нумерационный список в столбец ячеек. Нажмите, чтобы загрузить Kutools for Excel!

Kutools for Excel: с более чем 300 удобными надстройками Excel, которые можно попробовать бесплатно без ограничений в течение 30 дней. Загрузите и бесплатную пробную версию прямо сейчас!

Источник

Adblock
detector

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