Есть таблица (для примера подойдет и с одной колонкой): 1 2 2 3 3 3 Нужно вставить пустую стоку после изменения значения в столбце. Итоговая таблица должна выглядеть так: 1
2 2
3 3 3
Есть таблица (для примера подойдет и с одной колонкой): 1 2 2 3 3 3 Нужно вставить пустую стоку после изменения значения в столбце. Итоговая таблица должна выглядеть так: 1
Какой в этом смысл? Вы будете потом любоваться на пустые строки? Или следующим Вашим вопросом станет поставить туда итоги по каждому значению? Так итоги и сразу можно поставить. Или ещё зачем? Какова конечная цель?
Цитата (SergeyKorotun)
Нужно вставить пустую стоку
Какой в этом смысл? Вы будете потом любоваться на пустые строки? Или следующим Вашим вопросом станет поставить туда итоги по каждому значению? Так итоги и сразу можно поставить. Или ещё зачем? Какова конечная цель?Serge_007
Нужно отделить данные разных клиентов, чтобы после распечатки их можно было разрезать по пустой строке. В приведенной таблице значения 1,2,3 и есть идентификаторы клиентов. Следующим вопросом было бы: как задать нужную мне высоту вставляемых пустых строк или как вместо одной строки вставить несколько пустых строк.
Нужно отделить данные разных клиентов, чтобы после распечатки их можно было разрезать по пустой строке. В приведенной таблице значения 1,2,3 и есть идентификаторы клиентов. Следующим вопросом было бы: как задать нужную мне высоту вставляемых пустых строк или как вместо одной строки вставить несколько пустых строк.SergeyKorotun
А пример можно? Если макросом сложно, то покажите как реализовать с помощью сводной таблицы. Таблицу присоединил. Разделить по значениям в 1 столбце.
А пример можно? Если макросом сложно, то покажите как реализовать с помощью сводной таблицы. Таблицу присоединил. Разделить по значениям в 1 столбце.SergeyKorotun
'1. При вставке строк на Excel-лист нужно 'обязательно отключать обновление монитора, чтобы 'код работал быстро. Application.ScreenUpdating = False
'2. Быстрее работать с VBA-таблицей (по научному - VBA-массив), 'чем с Excel-листом, поэтому помещаем данные 'из Excel-листа в VBA-таблицу. tblA() = Range("A1:A6").Value
'Двигаемся по VBA-таблице от последней строки 'к первой - так проще будет писать код. For i = UBound(tblA, 1) To 2 Step -1 'Если данные в текущей ячейке VBA-таблицы 'отличаются от данных в вышестоящей ячейке. If tblA(i, 1) <> tblA(i - 1, 1) Then
'4. Вставляем на Excel-лист пустую строку. 'Порядковые номера строк в VBA-таблице и Excel-листе совпадают. 'Shift:=xlShiftDown - смещение текущей 'строки в Excel-листе вниз. 'Есть ещё вариант "xlShiftToRight" - смещение вправо. 'CopyOrigin:=xlFormatFromRightOrBelow - форматировать 'вставленную строку также, как и строку ниже. 'Есть ещё вариант "xlFormatFromLeftOrAbove" - 'форматировать также, как строку, которая находится 'над вставленной строкой. Rows(i).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow
'1. При вставке строк на Excel-лист нужно 'обязательно отключать обновление монитора, чтобы 'код работал быстро. Application.ScreenUpdating = False
'2. Быстрее работать с VBA-таблицей (по научному - VBA-массив), 'чем с Excel-листом, поэтому помещаем данные 'из Excel-листа в VBA-таблицу. tblA() = Range("A1:A6").Value
'Двигаемся по VBA-таблице от последней строки 'к первой - так проще будет писать код. For i = UBound(tblA, 1) To 2 Step -1 'Если данные в текущей ячейке VBA-таблицы 'отличаются от данных в вышестоящей ячейке. If tblA(i, 1) <> tblA(i - 1, 1) Then
'4. Вставляем на Excel-лист пустую строку. 'Порядковые номера строк в VBA-таблице и Excel-листе совпадают. 'Shift:=xlShiftDown - смещение текущей 'строки в Excel-листе вниз. 'Есть ещё вариант "xlShiftToRight" - смещение вправо. 'CopyOrigin:=xlFormatFromRightOrBelow - форматировать 'вставленную строку также, как и строку ниже. 'Есть ещё вариант "xlFormatFromLeftOrAbove" - 'форматировать также, как строку, которая находится 'над вставленной строкой. Rows(i).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow
VBA не знаю, но интуиция подсказывает что для реальной таблицы в tblA() = Range("A1:A6").Value нужно только A1:A6 изменить на начальную и конечную ячейку обрабатываемого столбца реальной таблицы? А как изменить высоту вставляемой строки (или указать конкретное значение, или задать множитель, на который нужно умножить высоту предыдущей или следующей строки )? Rows(i).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow поместить в цикл?
PS Один из вариантов решения - повторный запуск макроса. Каждый следующий запуск добавляет по две строки.
VBA не знаю, но интуиция подсказывает что для реальной таблицы в tblA() = Range("A1:A6").Value нужно только A1:A6 изменить на начальную и конечную ячейку обрабатываемого столбца реальной таблицы? А как изменить высоту вставляемой строки (или указать конкретное значение, или задать множитель, на который нужно умножить высоту предыдущей или следующей строки )? Rows(i).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow поместить в цикл?
PS Один из вариантов решения - повторный запуск макроса. Каждый следующий запуск добавляет по две строки.SergeyKorotun
Сообщение отредактировал SergeyKorotun - Суббота, 22.06.2013, 12:40
SergeyKorotun, в VBA-Excel нет готового инструмента для определения последней строки с данными на Excel-листе, чтобы указать макросу, с какими строками работать.
Существует много всяких способов определения последней строки, с которой надо работать на Excel-листе.
Предложу такой способ для книги из сообщения № 5.
[vba]
Код
Sub Procedure_1()
Dim tblA() As Variant Dim myLastRow As Long Dim i As Long
Application.ScreenUpdating = False
'Определяем последнюю строку с данными по столбцу "A". 'Макрос сделает действие аналогичное тому, 'как в Excel сделать активной последнюю ячейку 'в столбце "A" и нажать сочетание 'клавиш "Ctrl + стрелка вверх". myLastRow = Cells(Rows.Count, "A").End(xlUp).Row
tblA() = Range("A1:A" & myLastRow).Value
For i = UBound(tblA, 1) To 2 Step -1 If tblA(i, 1) <> tblA(i - 1, 1) Then
SergeyKorotun, в VBA-Excel нет готового инструмента для определения последней строки с данными на Excel-листе, чтобы указать макросу, с какими строками работать.
Существует много всяких способов определения последней строки, с которой надо работать на Excel-листе.
Предложу такой способ для книги из сообщения № 5.
[vba]
Код
Sub Procedure_1()
Dim tblA() As Variant Dim myLastRow As Long Dim i As Long
Application.ScreenUpdating = False
'Определяем последнюю строку с данными по столбцу "A". 'Макрос сделает действие аналогичное тому, 'как в Excel сделать активной последнюю ячейку 'в столбце "A" и нажать сочетание 'клавиш "Ctrl + стрелка вверх". myLastRow = Cells(Rows.Count, "A").End(xlUp).Row
tblA() = Range("A1:A" & myLastRow).Value
For i = UBound(tblA, 1) To 2 Step -1 If tblA(i, 1) <> tblA(i - 1, 1) Then
как с помощью макроса вставить не пустую строку, а например строку, состоящую из n символов "-"
Мне, как "формулисту", милее вариант пройтись циклом по получившемуся после вставки пустых ячеек диапазону и в каждую пустую ячейку вставить функцией листа rept("-",n) ИМХО
ЗЫ Кстати, Скрипт, это ответ и на Ваш вопрос
Цитата (SergeyKorotun)
как с помощью макроса вставить не пустую строку, а например строку, состоящую из n символов "-"
Мне, как "формулисту", милее вариант пройтись циклом по получившемуся после вставки пустых ячеек диапазону и в каждую пустую ячейку вставить функцией листа rept("-",n) ИМХО
ЗЫ Кстати, Скрипт, это ответ и на Ваш вопрос Serge_007
'После этой строки макроса Rows(i).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow 'вставить:
'Всавить пустую строку Rows(i).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow 'И после второй вставленной строки цикл от 1 до количества колонок в таблице 'и в теле цикла вставка в текущую ячейку хотя бы одного символа "-" 'чтобы были направляющие для ножниц 'или если возможно подсчитать количество символов в сроке, то без цикла 'в первую ячейку вставить посчитанное количество "-"
В итоге строки таблицы будут разбиты на группы, разделенные пустой строкой строкой из каким то набором символов "-" в зависимости от выбранного алгоритма и еще одной пустой строкой
[admin]Оформляйте коды тегами![/admin]
Надо немного изменить макрос пользователя Скрипт
'После этой строки макроса Rows(i).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow 'вставить:
'Всавить пустую строку Rows(i).Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromRightOrBelow 'И после второй вставленной строки цикл от 1 до количества колонок в таблице 'и в теле цикла вставка в текущую ячейку хотя бы одного символа "-" 'чтобы были направляющие для ножниц 'или если возможно подсчитать количество символов в сроке, то без цикла 'в первую ячейку вставить посчитанное количество "-"
В итоге строки таблицы будут разбиты на группы, разделенные пустой строкой строкой из каким то набором символов "-" в зависимости от выбранного алгоритма и еще одной пустой строкой
Можно сделать так, чтобы Название столбца вначале или запрашивалось бы, или подставлялся бы предварительно выделенный столбец, чтобы не учить пользователя править макрос.
[vba]
Код
Dim nameColumn As String ... вызов формы, чтобы пользователь ввел имя столбца (если можно считать имя выделенного столбца, эта строка не нужна) ... nameColumn = значению из формы или из выделенного столбца tblA() = Range(& nameColumn "1:" & nameColumn & myLastRow).Value
[/vba]
[admin]Используйте теги при оформлении кода![/admin] Поправил. Я не считал тот текст кодом. Там была формулировка задания какие изменения нужно внести в код.
Цитата (Скрипт)
tblA() = Range("A1:A" & myLastRow).Value
Можно сделать так, чтобы Название столбца вначале или запрашивалось бы, или подставлялся бы предварительно выделенный столбец, чтобы не учить пользователя править макрос.
[vba]
Код
Dim nameColumn As String ... вызов формы, чтобы пользователь ввел имя столбца (если можно считать имя выделенного столбца, эта строка не нужна) ... nameColumn = значению из формы или из выделенного столбца tblA() = Range(& nameColumn "1:" & nameColumn & myLastRow).Value
[/vba]
[admin]Используйте теги при оформлении кода![/admin] Поправил. Я не считал тот текст кодом. Там была формулировка задания какие изменения нужно внести в код.SergeyKorotun
Сообщение отредактировал SergeyKorotun - Воскресенье, 23.06.2013, 15:36
Иногда надо группировать по значениям не одного поля, а по нескольким. Хотел сам изменения в код внести, но после сегодняшней правки не сумею. Если можно внесите изменения в последний скрипт для группировки по 2 соседних столбцах. Курсором будет выделена ячейка первого столбца, участвующего в группировке. И приведите другие значения свойства LineStyle и Weight
Иногда надо группировать по значениям не одного поля, а по нескольким. Хотел сам изменения в код внести, но после сегодняшней правки не сумею. Если можно внесите изменения в последний скрипт для группировки по 2 соседних столбцах. Курсором будет выделена ячейка первого столбца, участвующего в группировке. И приведите другие значения свойства LineStyle и WeightSergeyKorotun
Иногда надо группировать по значениям не одного поля, а по нескольким.
вы под словом "поле" подразумеваете слово "столбец"? В программе "Excel" столбцы называются столбцами. Это в программе "Access" столбец называется полем.
Или вы подразумеваете что-то другое?
Цитата (SergeyKorotun)
Иногда надо группировать по значениям не одного поля, а по нескольким.
вы под словом "поле" подразумеваете слово "столбец"? В программе "Excel" столбцы называются столбцами. Это в программе "Access" столбец называется полем.