Добрый день, уважаемые форумчане! Помогите, пожалуйста, по следующему вопросу. Есть книга, в которой данные из одной таблицы (лист "Исходные данные") нужно представить формате другой таблицы (лист "Результат"). Сейчас, я делаю лист "Результат" вручную в следующем порядке: на листе "Нужный формат" из списка (ячейка "B1") выбираю нужный магазин. После того, как таблица пересчиталась, копирую данные магазина в лист "Результат". Затем, возвращаюсь в "Нужный формат", выбираю следующий магазин, копирую на лист "Результат" и так далее. Структуры листов "Исходные данные", "Нужный формат", "Результат" статичны. Проблема в том, что в примере лишь малая часть данных. На самом деле, таблицы гораздо больше, и магазинов также больше. Подскажите, пожалуйста, возможно ли сделать так, чтобы можно было задавать список магазинов заранее, к примеру, на листе "Список магазинов" в таблице "Список для поиска", чтобы данные из того списка поочередно попадали в список на лист "Нужный формат" (ячейка "B1"), и после того, как таблица в "Нужном формате" пересчитывалась, данные копировались бы на лист "Результат"? Если Вас не затруднит, не могли бы Вы в коде написать комментарии. Заранее огромное спасибо за любую подсказку!
Добрый день, уважаемые форумчане! Помогите, пожалуйста, по следующему вопросу. Есть книга, в которой данные из одной таблицы (лист "Исходные данные") нужно представить формате другой таблицы (лист "Результат"). Сейчас, я делаю лист "Результат" вручную в следующем порядке: на листе "Нужный формат" из списка (ячейка "B1") выбираю нужный магазин. После того, как таблица пересчиталась, копирую данные магазина в лист "Результат". Затем, возвращаюсь в "Нужный формат", выбираю следующий магазин, копирую на лист "Результат" и так далее. Структуры листов "Исходные данные", "Нужный формат", "Результат" статичны. Проблема в том, что в примере лишь малая часть данных. На самом деле, таблицы гораздо больше, и магазинов также больше. Подскажите, пожалуйста, возможно ли сделать так, чтобы можно было задавать список магазинов заранее, к примеру, на листе "Список магазинов" в таблице "Список для поиска", чтобы данные из того списка поочередно попадали в список на лист "Нужный формат" (ячейка "B1"), и после того, как таблица в "Нужном формате" пересчитывалась, данные копировались бы на лист "Результат"? Если Вас не затруднит, не могли бы Вы в коде написать комментарии. Заранее огромное спасибо за любую подсказку!Leojse
Leojse, эта операция называется Редизайнер таблиц. Можно воспользоваться поиском и найти готовые макросы. Я предлагаю немного другой способ - через сводную таблицу. Посмотрите видео (задача не Ваша, но алгоритм тот же), результат в файле
Leojse, эта операция называется Редизайнер таблиц. Можно воспользоваться поиском и найти готовые макросы. Я предлагаю немного другой способ - через сводную таблицу. Посмотрите видео (задача не Ваша, но алгоритм тот же), результат в файле Pelena
Pelena, огромное Вам спасибо за ответ! Я попробовал сделать, как указано в видео. Да, всё получилось. Как вариант, конечно, лучше, чем то, что я делаю сейчас. Таблица сформировалась по всем магазинам. Далее, необходимо пользоваться фильтром и убирать ненужные магазины. Дело в том, что объемы данных очень велики. Наименование магазинов всегда порядка ста штук и я вручную эти наименования перебираю (хотя есть электронный список этих магазинов) через выпадающий список. Попробовал записать в VBA операцию - выбор значения из списка. VBA вообще ничего не записал. Pelena, пожалуйста, подскажите, хотя бы, как выбрать значение в выпадающем списке из VBA?
Pelena, огромное Вам спасибо за ответ! Я попробовал сделать, как указано в видео. Да, всё получилось. Как вариант, конечно, лучше, чем то, что я делаю сейчас. Таблица сформировалась по всем магазинам. Далее, необходимо пользоваться фильтром и убирать ненужные магазины. Дело в том, что объемы данных очень велики. Наименование магазинов всегда порядка ста штук и я вручную эти наименования перебираю (хотя есть электронный список этих магазинов) через выпадающий список. Попробовал записать в VBA операцию - выбор значения из списка. VBA вообще ничего не записал. Pelena, пожалуйста, подскажите, хотя бы, как выбрать значение в выпадающем списке из VBA?Leojse
возможно ли сделать так, чтобы можно было задавать список магазинов заранее
Я бы на листе Исходные данные в каком-либо столбце проставил признак (например +), который бы указывал, что данные по выбранному магазину надо переносить на лист Результат. Затем запускаем макрос, который переносит данные.
Цитата
возможно ли сделать так, чтобы можно было задавать список магазинов заранее
Я бы на листе Исходные данные в каком-либо столбце проставил признак (например +), который бы указывал, что данные по выбранному магазину надо переносить на лист Результат. Затем запускаем макрос, который переносит данные.Kuzmich
Kuzmich, Pelena, спасибо за подсказки! Попробовал редизайн по ссылке в сообщении 6 от Pelena. Всё же на выходе получается не то, что нужно. В примере лишь маленький фрагмент реальной таблицы на листе "Результат". На самом деле, структура там и вовсе, мягко говоря, не очень хорошая - где-то нужно превратить часть исходной таблицы в "плоскую", где-то часть таблицы нужно оставить двумерной. Поэтому я и сделал таблицу-"Результат" через ВПР со списком. Всё же, прошу помощи в коде для моих нужд. Ход мыслей у меня такой - определить диапазон списка для отбора данных (лист "Список магазинов", столбец D). Затем, в ячейку "B1" листа "Нужный формат" вставляем содержимое первой ячейки (лист "Список магазинов", ячейка D2). Таблица пересчитывается. Выделяем диапазон таблицы без шапки и копируем на лист "Результат". После копирования таблицы, в ячейку "B1" листа "Нужный формат" вставляем следующее значение из "Списка магазинов" (ячейка D3) и так далее. Полагаю, что это цикл в цикле, и поэтому вообще теряюсь, как это можно сделать. К моему стыду, в модуле всего пара строк. Пожалуйста, помогите решить задачу.
Kuzmich, Pelena, спасибо за подсказки! Попробовал редизайн по ссылке в сообщении 6 от Pelena. Всё же на выходе получается не то, что нужно. В примере лишь маленький фрагмент реальной таблицы на листе "Результат". На самом деле, структура там и вовсе, мягко говоря, не очень хорошая - где-то нужно превратить часть исходной таблицы в "плоскую", где-то часть таблицы нужно оставить двумерной. Поэтому я и сделал таблицу-"Результат" через ВПР со списком. Всё же, прошу помощи в коде для моих нужд. Ход мыслей у меня такой - определить диапазон списка для отбора данных (лист "Список магазинов", столбец D). Затем, в ячейку "B1" листа "Нужный формат" вставляем содержимое первой ячейки (лист "Список магазинов", ячейка D2). Таблица пересчитывается. Выделяем диапазон таблицы без шапки и копируем на лист "Результат". После копирования таблицы, в ячейку "B1" листа "Нужный формат" вставляем следующее значение из "Списка магазинов" (ячейка D3) и так далее. Полагаю, что это цикл в цикле, и поэтому вообще теряюсь, как это можно сделать. К моему стыду, в модуле всего пара строк. Пожалуйста, помогите решить задачу.Leojse
У меня получилось последовательно вставлять значения в ячейку "B1" листа "Нужный формат". Точнее, цикл вставляет поочередно значения в ячейку B1. Подскажите, пожалуйста, а как копировать таблицу на лист "результат" после вставки первого значения, затем второго и так далее?
У меня получилось последовательно вставлять значения в ячейку "B1" листа "Нужный формат". Точнее, цикл вставляет поочередно значения в ячейку B1. Подскажите, пожалуйста, а как копировать таблицу на лист "результат" после вставки первого значения, затем второго и так далее?Leojse
Ход мыслей у меня такой - определить диапазон списка для отбора данных (лист "Список магазинов", столбец D).
При активном листе "Список магазинов" запустите макрос (в стандартном модуле) [vba]
Код
Sub iPerenos() Dim i As Long Dim iLastRow As Long Dim FoundCell As Range Dim Result As Worksheet Dim j As Integer Set Result = ThisWorkbook.Worksheets("Результат") iLastRow = Result.Cells(Result.Rows.Count, "A").End(xlUp).Row + 1 Result.Range("A2:C" & iLastRow).ClearContents With Worksheets("Исходные данные") iLastRow = Cells(Rows.Count, "D").End(xlUp).Row For i = 2 To iLastRow Set FoundCell = .Columns(1).Find(Cells(i, "D"), , xlValues, xlWhole) If Not FoundCell Is Nothing Then Result.Range("A" & Result.Cells(Result.Rows.Count, "A").End(xlUp).Row + 1).Resize(12) = FoundCell .Range(.Cells(1, "B"), .Cells(1, "M")).Copy Result.Range("B" & Result.Cells(Result.Rows.Count, "B").End(xlUp).Row + 1).PasteSpecial _ xlPasteValues, , Transpose:=True .Range(.Cells(FoundCell.Row, "B"), .Cells(FoundCell.Row, "M")).Copy Result.Range("C" & Result.Cells(Result.Rows.Count, "C").End(xlUp).Row + 1).PasteSpecial _ xlPasteValues, , Transpose:=True End If Next End With End Sub
[/vba]
Цитата
Ход мыслей у меня такой - определить диапазон списка для отбора данных (лист "Список магазинов", столбец D).
При активном листе "Список магазинов" запустите макрос (в стандартном модуле) [vba]
Код
Sub iPerenos() Dim i As Long Dim iLastRow As Long Dim FoundCell As Range Dim Result As Worksheet Dim j As Integer Set Result = ThisWorkbook.Worksheets("Результат") iLastRow = Result.Cells(Result.Rows.Count, "A").End(xlUp).Row + 1 Result.Range("A2:C" & iLastRow).ClearContents With Worksheets("Исходные данные") iLastRow = Cells(Rows.Count, "D").End(xlUp).Row For i = 2 To iLastRow Set FoundCell = .Columns(1).Find(Cells(i, "D"), , xlValues, xlWhole) If Not FoundCell Is Nothing Then Result.Range("A" & Result.Cells(Result.Rows.Count, "A").End(xlUp).Row + 1).Resize(12) = FoundCell .Range(.Cells(1, "B"), .Cells(1, "M")).Copy Result.Range("B" & Result.Cells(Result.Rows.Count, "B").End(xlUp).Row + 1).PasteSpecial _ xlPasteValues, , Transpose:=True .Range(.Cells(FoundCell.Row, "B"), .Cells(FoundCell.Row, "M")).Copy Result.Range("C" & Result.Cells(Result.Rows.Count, "C").End(xlUp).Row + 1).PasteSpecial _ xlPasteValues, , Transpose:=True End If Next End With End Sub
Подскажите, пожалуйста, не могли бы Вы посмореть мой код и поправить его, чтобы всё корректно работало. Код, который написал Kuzmich, работает, никаких претензий нет, но всё-таки мне самому хочется также решить решить задачу с тем кодом, который я смог написать сам. Сейчас код копирует последний из списка магазин. Возможно ли как-то оптимизировать мой код, чтобы после каждой подстановки данные копировались на лист результат? Читал про Step, но не смог применить.
Сам разобрался. Спасибо всем еще раз!
Подскажите, пожалуйста, не могли бы Вы посмореть мой код и поправить его, чтобы всё корректно работало. Код, который написал Kuzmich, работает, никаких претензий нет, но всё-таки мне самому хочется также решить решить задачу с тем кодом, который я смог написать сам. Сейчас код копирует последний из списка магазин. Возможно ли как-то оптимизировать мой код, чтобы после каждой подстановки данные копировались на лист результат? Читал про Step, но не смог применить.
Sub Выборка() Dim lLastRow As Long Dim i&, Inp1 As Range 'подстановка значений в лист "Нужный формат" Set Inp1 = Worksheets("Нужный формат").Range("B1") lLastRow = Worksheets("Список магазинов").Cells(Rows.Count, 4).End(xlUp).Row With Sheets("Список магазинов") For i = 2 To lLastRow Inp1 = .Cells(i, "D") 'копирование данных на лист "Результат" Dim YLastRow As Long YLastRow = Worksheets("Результат").Cells(Rows.Count, 1).End(xlUp).Row Worksheets("Нужный формат").Range("A3:C14").Copy With Worksheets("Результат").Cells(YLastRow + 1, 1) .PasteSpecial Paste:=xlPasteValues .PasteSpecial Paste:=xlPasteFormats End With Next End With End Sub
[/vba]
Цитата
с тем кодом, который я смог написать сам.
[vba]
Код
Sub Выборка() Dim lLastRow As Long Dim i&, Inp1 As Range 'подстановка значений в лист "Нужный формат" Set Inp1 = Worksheets("Нужный формат").Range("B1") lLastRow = Worksheets("Список магазинов").Cells(Rows.Count, 4).End(xlUp).Row With Sheets("Список магазинов") For i = 2 To lLastRow Inp1 = .Cells(i, "D") 'копирование данных на лист "Результат" Dim YLastRow As Long YLastRow = Worksheets("Результат").Cells(Rows.Count, 1).End(xlUp).Row Worksheets("Нужный формат").Range("A3:C14").Copy With Worksheets("Результат").Cells(YLastRow + 1, 1) .PasteSpecial Paste:=xlPasteValues .PasteSpecial Paste:=xlPasteFormats End With Next End With End Sub