Добрый день уважаемые форумчане! Вопрос Вам мой покажется возможно глупым, но если кто либо отзовется и поможет, буду благодарен.
Суть проблемы следующая: Есть массив информации на одном из листов книги (Area1), этот самый массив нужно преобразовать в итоговую таблицу, по заданным критериям (собака, кот, попугай), вид которой представлен на (Лист4). Файл прикладываю
Проблему формирования итоговой таблицы я решил формулами массива! Но проблема в том, что остается много пустых строк (которые конечно можно скрыть (написал макрос) - но все же это не удобно. А решить свою проблему макросом я пока не смог, мои начинания на этом поприще пока не позволяют мне это сделать.
Суть макроса, как мне представляется: создать итоговую таблицу, как у меня (в самом макросе задать переменные: собака, кот, попугай, или вынести их на отдельный лист), и по этим переменным искать значения в исходном листе. После нахождения одной из переменных (f.e. собака) - макрос находил бы последнюю строку, добавлял следующей критерий (переменную), и по нему заполнял дальше массив. В общем нужен вид, как в прикрепленном файле. Думаю в нем будет понятнее
P.S. я возможно несколько наглею, прося о такой помощи. Поэтому не судите строго
Добрый день уважаемые форумчане! Вопрос Вам мой покажется возможно глупым, но если кто либо отзовется и поможет, буду благодарен.
Суть проблемы следующая: Есть массив информации на одном из листов книги (Area1), этот самый массив нужно преобразовать в итоговую таблицу, по заданным критериям (собака, кот, попугай), вид которой представлен на (Лист4). Файл прикладываю
Проблему формирования итоговой таблицы я решил формулами массива! Но проблема в том, что остается много пустых строк (которые конечно можно скрыть (написал макрос) - но все же это не удобно. А решить свою проблему макросом я пока не смог, мои начинания на этом поприще пока не позволяют мне это сделать.
Суть макроса, как мне представляется: создать итоговую таблицу, как у меня (в самом макросе задать переменные: собака, кот, попугай, или вынести их на отдельный лист), и по этим переменным искать значения в исходном листе. После нахождения одной из переменных (f.e. собака) - макрос находил бы последнюю строку, добавлял следующей критерий (переменную), и по нему заполнял дальше массив. В общем нужен вид, как в прикрепленном файле. Думаю в нем будет понятнее
P.S. я возможно несколько наглею, прося о такой помощи. Поэтому не судите строгоMax16
Тут просто перенесли данные с одного листа на другой в соответствии с животинами. Это при условии совпадения столбцов с датами. [vba]
Код
Sub uuu() 'объявляем переменные Dim a() 'динамический массив (пока что безразмерный) Dim i&, j&, rw& 'длинные целые числа (счётчики) '------------------- 'присваиваем переменной значения диапазона с листа 'массив сам примет нужные размеры a = Sheets("Area1").UsedRange.Value With Sheets("Лист4") 'ссылка на объект для упрощения синтаксиса 'в пределах конструкции With ... End With, если будет нужно ссылаться на "лист4" пишем точку For rw = 3 To .Cells(Rows.Count, 2).End(xlUp).Row 'цикл от 3 до номера последней непустой ячейки во 2-м столбце If .Cells(rw, 2) <> "" Then 'если значение ячейки не пусто то For i = 1 To UBound(a) 'цикл по массиву от 1 до наибольшего индекса 1-го измерения массива (строки) 'сравниваем значение из массива со значением во 2-м столбце, ищем животное If a(i, 1) = .Cells(rw, 2) Then 'если значение элемента массива равно значению ячейки то rw = rw + 1 'увеличиваем счётчик строк For j = 1 To UBound(a, 2) 'цикл от 1 до наибольшего индекса 2-го измерения массива (столбцы) 'вносим значения в соответствующие ячейки из массива на лист .Cells(rw, j + 1) = a(i, j) 'j + 1 потому что в массиве <=15 в 3-м столбце а на листе 4 в 4-м Next End If Next End If Next End With MsgBox "Фсё гуд!" 'сообщеньице End Sub
[/vba]
Тут просто перенесли данные с одного листа на другой в соответствии с животинами. Это при условии совпадения столбцов с датами. [vba]
Код
Sub uuu() 'объявляем переменные Dim a() 'динамический массив (пока что безразмерный) Dim i&, j&, rw& 'длинные целые числа (счётчики) '------------------- 'присваиваем переменной значения диапазона с листа 'массив сам примет нужные размеры a = Sheets("Area1").UsedRange.Value With Sheets("Лист4") 'ссылка на объект для упрощения синтаксиса 'в пределах конструкции With ... End With, если будет нужно ссылаться на "лист4" пишем точку For rw = 3 To .Cells(Rows.Count, 2).End(xlUp).Row 'цикл от 3 до номера последней непустой ячейки во 2-м столбце If .Cells(rw, 2) <> "" Then 'если значение ячейки не пусто то For i = 1 To UBound(a) 'цикл по массиву от 1 до наибольшего индекса 1-го измерения массива (строки) 'сравниваем значение из массива со значением во 2-м столбце, ищем животное If a(i, 1) = .Cells(rw, 2) Then 'если значение элемента массива равно значению ячейки то rw = rw + 1 'увеличиваем счётчик строк For j = 1 To UBound(a, 2) 'цикл от 1 до наибольшего индекса 2-го измерения массива (столбцы) 'вносим значения в соответствующие ячейки из массива на лист .Cells(rw, j + 1) = a(i, j) 'j + 1 потому что в массиве <=15 в 3-м столбце а на листе 4 в 4-м Next End If Next End If Next End With MsgBox "Фсё гуд!" 'сообщеньице End Sub
Но я к своему сожалению не до конца смог разобраться с Вашим макросом. Я понял следующее:
[vba]
Код
Sub uuu() 'задаем переменные массиву и значениям: i,j Dim a() Dim i&, j& '--------------- 'задаем переменную a как массив (лист "Area1") a = Sheets("Area1").UsedRange.Value
'Задаем массив (с 3 строки 2 столбца до конца)для "Листа4" With Sheets("Лист4") For rw = 3 To .Cells(Rows.Count, 2).End(xlUp).Row
'Если в заданном массиве ячейка не пуста, то If .Cells(rw, 2) <> "" Then
'Находим совпадение этой непустой ячейки на "Листе4" (с ячейкой на листе "Area1") For i = 1 To UBound(a) If a(i, 1) = .Cells(rw, 2) Then
'Далее. Строку принимаем равной (последняя строка +1) rw = rw + 1 'Вот тут я не совсем понимаю!!! Мы опять задаем массив для "Area1" для поиска 2-го значения? For j = 1 To UBound(a, 2) 'Почему мы в качестве столбца задаем данные по строке (j)? .Cells(rw, j + 1) = a(i, j) Next End If Next End If Next End With MsgBox "Фсё гуд!"
[/vba]
Если Вы мне укажите, правильно ли я его (макрос) понимаю, буду признателен! Ну и простите мою неграмотность в VBA - но насколько я знал, UBound считает предел по строке, но как я понимаю, здесь эта функция считает столбцы?
Уважаемый wild_pig, спасибо за помощь.
Но я к своему сожалению не до конца смог разобраться с Вашим макросом. Я понял следующее:
[vba]
Код
Sub uuu() 'задаем переменные массиву и значениям: i,j Dim a() Dim i&, j& '--------------- 'задаем переменную a как массив (лист "Area1") a = Sheets("Area1").UsedRange.Value
'Задаем массив (с 3 строки 2 столбца до конца)для "Листа4" With Sheets("Лист4") For rw = 3 To .Cells(Rows.Count, 2).End(xlUp).Row
'Если в заданном массиве ячейка не пуста, то If .Cells(rw, 2) <> "" Then
'Находим совпадение этой непустой ячейки на "Листе4" (с ячейкой на листе "Area1") For i = 1 To UBound(a) If a(i, 1) = .Cells(rw, 2) Then
'Далее. Строку принимаем равной (последняя строка +1) rw = rw + 1 'Вот тут я не совсем понимаю!!! Мы опять задаем массив для "Area1" для поиска 2-го значения? For j = 1 To UBound(a, 2) 'Почему мы в качестве столбца задаем данные по строке (j)? .Cells(rw, j + 1) = a(i, j) Next End If Next End If Next End With MsgBox "Фсё гуд!"
[/vba]
Если Вы мне укажите, правильно ли я его (макрос) понимаю, буду признателен! Ну и простите мою неграмотность в VBA - но насколько я знал, UBound считает предел по строке, но как я понимаю, здесь эта функция считает столбцы?Max16
123
Сообщение отредактировал Max16 - Четверг, 02.06.2016, 11:02
Уважаемый wild_pig, я уже замучил Вас... В любом случае Вы очень здорово меня выручили) Но если Вам не трудно уделите немного внимания. Я доработал немного Ваш код, по аналогии, вынеся на отдельный лист критерии: кот, собака, попугай Благодаря этому итоговая таблица формируется без пробелов, и удобно менять критерии. Но мне нужно вставить после каждого критерия (после всех котов, собак и попугаев), строку [итого:]. Я попытался ставить код в конце макроса, но он сначала формирует массив по заданным условиям и только потом ставит строку [итого]
Собственно вот подправленный макрос: [vba]
Код
Sub uuu() Dim a() Dim b() Dim i&, j&, q& '--------------- a = Sheets("Area1").UsedRange.Value b = Sheets("Критерий").UsedRange.Value 'присвоил переменное значение диапазону Лист:"Критерий"
With Sheets("Лист4") For rw = 3 To .Cells(Rows.Count, 2).End(xlUp).Row If .Cells(rw, 2) <> "" Then For i = 1 To UBound(a) For q = 1 To UBound(b) 'цикл по массиву от 1 до наибольшего индекса 1-го измерения массива
If a(i, 1) = b(q, 1) Then 'Если значение элекмента массива ("Area1") = значению элекмента массива ("Критерий"), то rw = rw + 1
For j = 1 To UBound(a, 2) .Cells(rw, j + 1) = a(i, j) .Cells(rw + 1, 2).FormulaR1C1 = "Итого:" 'Пытался добавить строку [итого], но он ее добавляет после того как сформирует массив по критериям Next End If Next Next End If Next Dim lLastRow As Long End With MsgBox "Фсё гуд!" End Sub
[/vba]
Пример также прикладываю
Уважаемый wild_pig, я уже замучил Вас... В любом случае Вы очень здорово меня выручили) Но если Вам не трудно уделите немного внимания. Я доработал немного Ваш код, по аналогии, вынеся на отдельный лист критерии: кот, собака, попугай Благодаря этому итоговая таблица формируется без пробелов, и удобно менять критерии. Но мне нужно вставить после каждого критерия (после всех котов, собак и попугаев), строку [итого:]. Я попытался ставить код в конце макроса, но он сначала формирует массив по заданным условиям и только потом ставит строку [итого]
Собственно вот подправленный макрос: [vba]
Код
Sub uuu() Dim a() Dim b() Dim i&, j&, q& '--------------- a = Sheets("Area1").UsedRange.Value b = Sheets("Критерий").UsedRange.Value 'присвоил переменное значение диапазону Лист:"Критерий"
With Sheets("Лист4") For rw = 3 To .Cells(Rows.Count, 2).End(xlUp).Row If .Cells(rw, 2) <> "" Then For i = 1 To UBound(a) For q = 1 To UBound(b) 'цикл по массиву от 1 до наибольшего индекса 1-го измерения массива
If a(i, 1) = b(q, 1) Then 'Если значение элекмента массива ("Area1") = значению элекмента массива ("Критерий"), то rw = rw + 1
For j = 1 To UBound(a, 2) .Cells(rw, j + 1) = a(i, j) .Cells(rw + 1, 2).FormulaR1C1 = "Итого:" 'Пытался добавить строку [итого], но он ее добавляет после того как сформирует массив по критериям Next End If Next Next End If Next Dim lLastRow As Long End With MsgBox "Фсё гуд!" End Sub
Уважаемый wild_pig, таблицу необходимого вида я прикладываю к сообщению:
Область данных,та же (Area1) Критерии [кот, собака, попугай] вынесены на отдельный лист (Лист!Критерии) На листе4 - итоговая таблица. В начале имеем только строку 2 остальное подгружается макросом: Собственно таблица заполняется в соответствии с порядком расположения критериев
P.S. Итоговый вид таблицы, на листе4. Для наглядности я выделили красным цветом: критерий, синей заливкой: итого
Уважаемый wild_pig, таблицу необходимого вида я прикладываю к сообщению:
Область данных,та же (Area1) Критерии [кот, собака, попугай] вынесены на отдельный лист (Лист!Критерии) На листе4 - итоговая таблица. В начале имеем только строку 2 остальное подгружается макросом: Собственно таблица заполняется в соответствии с порядком расположения критериев
P.S. Итоговый вид таблицы, на листе4. Для наглядности я выделили красным цветом: критерий, синей заливкой: итогоMax16
Sub uuu() Dim a(), b() Dim i&, ii&, rw&, x&, lr& '----------------------------- 'берём диапазоны в массивы a = Sheets("Area1").UsedRange.Value b = Sheets("Критерий").UsedRange.Value
With Sheets("Лист4") rw = 3 'номер первой строки для выгрузки lr = .UsedRange.Rows.Count 'номер последней строки диапазона If lr > 3 Then 'если последняя строка больше первой то .Rows(rw & ":" & lr).Delete 'удаляем строки с первой по последнюю End If For i = 2 To UBound(b) 'идём по массиву с критериями .Cells(rw, 2) = b(i, 1) 'вносим название группы .Cells(rw, 2).Font.Bold = True 'делаем жирным шрифт rw = rw + 1 'увеличиваем счётчик строк x = 1 'сбрасываем в начало счётчик позиций в группе For ii = 2 To UBound(a) 'проходим по массиву с данными 'если значение не пусто и совпадает с названием группы то If a(ii, 1) <> "" And a(ii, 1) = b(i, 1) Then .Cells(rw, 1) = x 'пишем номер позиции For j = 1 To UBound(a, 2) 'вносим строку из массива на лист .Cells(rw, j + 1) = a(ii, j) Next rw = rw + 1 'увеличиваем счётчик строк x = x + 1 'увеличиваем счётчик позиций End If Next .Cells(rw, 2) = "Итого " & LCase(b(i, 1)) & ":" 'вносим итого .Cells(rw, 2).Font.Bold = True 'делаем шрифт жирным rw = rw + 1 'увеличиваем счётчик строк Next End With MsgBox "Готово!" 'радостная весть End Sub
[/vba] В Аrea1 нет значений больше 130 дней, зачем на Лист4 есть? Дальше будем думать что и как в итого считать?
[vba]
Код
Sub uuu() Dim a(), b() Dim i&, ii&, rw&, x&, lr& '----------------------------- 'берём диапазоны в массивы a = Sheets("Area1").UsedRange.Value b = Sheets("Критерий").UsedRange.Value
With Sheets("Лист4") rw = 3 'номер первой строки для выгрузки lr = .UsedRange.Rows.Count 'номер последней строки диапазона If lr > 3 Then 'если последняя строка больше первой то .Rows(rw & ":" & lr).Delete 'удаляем строки с первой по последнюю End If For i = 2 To UBound(b) 'идём по массиву с критериями .Cells(rw, 2) = b(i, 1) 'вносим название группы .Cells(rw, 2).Font.Bold = True 'делаем жирным шрифт rw = rw + 1 'увеличиваем счётчик строк x = 1 'сбрасываем в начало счётчик позиций в группе For ii = 2 To UBound(a) 'проходим по массиву с данными 'если значение не пусто и совпадает с названием группы то If a(ii, 1) <> "" And a(ii, 1) = b(i, 1) Then .Cells(rw, 1) = x 'пишем номер позиции For j = 1 To UBound(a, 2) 'вносим строку из массива на лист .Cells(rw, j + 1) = a(ii, j) Next rw = rw + 1 'увеличиваем счётчик строк x = x + 1 'увеличиваем счётчик позиций End If Next .Cells(rw, 2) = "Итого " & LCase(b(i, 1)) & ":" 'вносим итого .Cells(rw, 2).Font.Bold = True 'делаем шрифт жирным rw = rw + 1 'увеличиваем счётчик строк Next End With MsgBox "Готово!" 'радостная весть End Sub
[/vba] В Аrea1 нет значений больше 130 дней, зачем на Лист4 есть? Дальше будем думать что и как в итого считать?wild_pig
Здравствуйте, Господа! Нужна помощь в написании макроса для excel 2016, для переноса ячеек с одного листа на другой, если выполняется условие. Я в этом деле совсем начинающий, начальство нагибает закончить файл по спецодежде, а парень который начинал его делать уволился. Буду признателен!!! Очень сильно!!! SOS!!! Для примера скидываю файлик "пример", в нем на листе "сотрудники", условие, если в столбце "Е" ячейки <= СЕГОДНЯ, то данная ячейка подсвечивается, это я допер. Теперь мне нужно с помощью макроса, чтобы тот сотрудник который подсветился автоматически попадал на лист "экзамен", помогите мне пожалуйста для примера, а свой глобальный файл я догоню доработаю!!! Заранее всем благодарен.
Здравствуйте, Господа! Нужна помощь в написании макроса для excel 2016, для переноса ячеек с одного листа на другой, если выполняется условие. Я в этом деле совсем начинающий, начальство нагибает закончить файл по спецодежде, а парень который начинал его делать уволился. Буду признателен!!! Очень сильно!!! SOS!!! Для примера скидываю файлик "пример", в нем на листе "сотрудники", условие, если в столбце "Е" ячейки <= СЕГОДНЯ, то данная ячейка подсвечивается, это я допер. Теперь мне нужно с помощью макроса, чтобы тот сотрудник который подсветился автоматически попадал на лист "экзамен", помогите мне пожалуйста для примера, а свой глобальный файл я догоню доработаю!!! Заранее всем благодарен.Budkay91