Потихоньку вникаю в тонкости VBA, но столкнулся со следующей задачей:
Есть таблица, которая содержит работы по месяцам, не в каждом месяце есть работы по машинам (те присутствуют пустые ячейки), хочу домучать макрос который бы открывал шаблон плана работ на месяц-вносил туда в соседние ячейки "вид работ"(1ячейка) и "Тип машины" (2ячейка), затем создавал новый файл в новой папке расположения файла.(с этим проще-разобрался как)
В шаблоне уже есть обязательные записи в таблице, те внести нужно после них, также в идеальном рабочем варианте в другой столбец вносилась бы фамилия человека(она не меняется). Блоки сохранения нового файла в определенную папке у меня есть, бодаюсь с именем файла.
- Форма фиксированная, в принципе могу сам создать слева новый скрытый(можно сгруппировать) столбец в котором пропишу машины, чтобы поиск был по нему, возможно это будет полезно, но не уверен. В примере прикладываю часть таблицы и примерный шаблон, заранее благодарен за любую помощь!
Доброго времени суток!
Потихоньку вникаю в тонкости VBA, но столкнулся со следующей задачей:
Есть таблица, которая содержит работы по месяцам, не в каждом месяце есть работы по машинам (те присутствуют пустые ячейки), хочу домучать макрос который бы открывал шаблон плана работ на месяц-вносил туда в соседние ячейки "вид работ"(1ячейка) и "Тип машины" (2ячейка), затем создавал новый файл в новой папке расположения файла.(с этим проще-разобрался как)
В шаблоне уже есть обязательные записи в таблице, те внести нужно после них, также в идеальном рабочем варианте в другой столбец вносилась бы фамилия человека(она не меняется). Блоки сохранения нового файла в определенную папке у меня есть, бодаюсь с именем файла.
- Форма фиксированная, в принципе могу сам создать слева новый скрытый(можно сгруппировать) столбец в котором пропишу машины, чтобы поиск был по нему, возможно это будет полезно, но не уверен. В примере прикладываю часть таблицы и примерный шаблон, заранее благодарен за любую помощь!Valeriy89
Kuzmich, Наименование работ состоит из 2-х столбцов , в одном вносятся вид работ, а рядом соответствующий тип машины, т.е. за январь на лист план_работ_шаблон в ячейку b6 будет внесена запись ТО-2 (из столбца январь), а в ячейку с6 запись LC 200 112 (из первого столбца, который я создам отдельно и пропишу в нем наименование машин, который будет соответствовать объединенным ячейкам в столбце Е листа график) и т.д., т.е. будет формироваться в столбце наименование работ фраза "ТО-2 LC 200 112". Цельного макроса нет, есть куски по функциям, а именно переноса столбцов и удаления пустых строк, нумерации строк и заполнения фамилии нет, тяжело у меня с циклами к сожалению)
Kuzmich, Наименование работ состоит из 2-х столбцов , в одном вносятся вид работ, а рядом соответствующий тип машины, т.е. за январь на лист план_работ_шаблон в ячейку b6 будет внесена запись ТО-2 (из столбца январь), а в ячейку с6 запись LC 200 112 (из первого столбца, который я создам отдельно и пропишу в нем наименование машин, который будет соответствовать объединенным ячейкам в столбце Е листа график) и т.д., т.е. будет формироваться в столбце наименование работ фраза "ТО-2 LC 200 112". Цельного макроса нет, есть куски по функциям, а именно переноса столбцов и удаления пустых строк, нумерации строк и заполнения фамилии нет, тяжело у меня с циклами к сожалению)Valeriy89
Зачем вам создавать новый файл, когда можно в этой же книге для отчетов создать листы с названиями месяцев: январь, февраль, ...., декабрь. Написание такое же как на листе график. Тогда при внесении в график каких-либо данных за определенный месяц, их можно переносить в соответствующий лист, будет отчет за каждый месяц.
Зачем вам создавать новый файл, когда можно в этой же книге для отчетов создать листы с названиями месяцев: январь, февраль, ...., декабрь. Написание такое же как на листе график. Тогда при внесении в график каких-либо данных за определенный месяц, их можно переносить в соответствующий лист, будет отчет за каждый месяц.Kuzmich
Посмотрите пример, я там создал лист январь. При внесении ТО на лист График в столбец с январем, данные автоматически переносятся на лист "январь"
Посмотрите пример, я там создал лист январь. При внесении ТО на лист График в столбец с январем, данные автоматически переносятся на лист "январь"Kuzmich
Kuzmich, добавлять он добавляет, а как сделать, чтобы он скажем так заново заполнял строки? Сейчас при внесении изменений в график в план работ январь заносятся работы, но те что уже были внесены не удаляются, если они были изменены или удалены Т.е. сейчас добавляются все изменения как в накопительный список
Kuzmich, добавлять он добавляет, а как сделать, чтобы он скажем так заново заполнял строки? Сейчас при внесении изменений в график в план работ январь заносятся работы, но те что уже были внесены не удаляются, если они были изменены или удалены Т.е. сейчас добавляются все изменения как в накопительный списокValeriy89
Kuzmich, И как занести данный макрос например на кнопку Почему-то ругается эксель, я так понимаю Private Sub Worksheet_Change(ByVal Target As Range) это не просто название Suba?)
Kuzmich, И как занести данный макрос например на кнопку Почему-то ругается эксель, я так понимаю Private Sub Worksheet_Change(ByVal Target As Range) это не просто название Suba?)Valeriy89
я так понимаю Private Sub Worksheet_Change(ByVal Target As Range)
Это макрос на событие изменения листа. Можно просто привязать к кнопке. Вы опишите, что вы желаете видеть в отчете январь? Можно внести данные на лист График, нажать кнопочку и перенести все данные по январю. Что дальше делать с данными на листе График?
Цитата
я так понимаю Private Sub Worksheet_Change(ByVal Target As Range)
Это макрос на событие изменения листа. Можно просто привязать к кнопке. Вы опишите, что вы желаете видеть в отчете январь? Можно внести данные на лист График, нажать кнопочку и перенести все данные по январю. Что дальше делать с данными на листе График?Kuzmich
Kuzmich, если подробнее, в примере график - это кусок из большого файла, машины это для примера (у меня огромный перечень оборудования, на котором проводят ТО), в моем файле (на большом графике я реализовал макрос создания акта о проведении ТО-в шаблон в той же книге у меня заносятся данные из формы, создается папка в расположении книги с определенным именем, т.е. сократил себе времязатраты на типовую задачу) хотел бы реализовать форму с кнопками январь, февраль и т.д. (или списком), при нажатии на которую будет формироваться план работ по шаблону (аналогично актам). В общем хочу иметь следующее: 1. форму в которой я выбираю месяц (или проще нажимаю на кнопку с месяцем) и формируется новый документ по шаблону в тойже папке 2. хотел бы универсальную форму макроса, чтобы например при удалении в графике оборудования или наоборот увеличении его количества макрос так же корректно работал (т.е. без жесткой привязки диапозона таблицы) 3. Чтобы в создаваемом файле после внесения всех работ вставлялась фраза "Должность ____место подписи______ ФИО" - через наприимер пару строчек. А по созданию листов в той же книге с планами на месяц: в файле будет очень много листов, поэтому будет усложнен поиск нужного листа. Возможно сумбур, но бьюсь, ищу в интернете куски кода, но не могу добиться итога.
Kuzmich, если подробнее, в примере график - это кусок из большого файла, машины это для примера (у меня огромный перечень оборудования, на котором проводят ТО), в моем файле (на большом графике я реализовал макрос создания акта о проведении ТО-в шаблон в той же книге у меня заносятся данные из формы, создается папка в расположении книги с определенным именем, т.е. сократил себе времязатраты на типовую задачу) хотел бы реализовать форму с кнопками январь, февраль и т.д. (или списком), при нажатии на которую будет формироваться план работ по шаблону (аналогично актам). В общем хочу иметь следующее: 1. форму в которой я выбираю месяц (или проще нажимаю на кнопку с месяцем) и формируется новый документ по шаблону в тойже папке 2. хотел бы универсальную форму макроса, чтобы например при удалении в графике оборудования или наоборот увеличении его количества макрос так же корректно работал (т.е. без жесткой привязки диапозона таблицы) 3. Чтобы в создаваемом файле после внесения всех работ вставлялась фраза "Должность ____место подписи______ ФИО" - через наприимер пару строчек. А по созданию листов в той же книге с планами на месяц: в файле будет очень много листов, поэтому будет усложнен поиск нужного листа. Возможно сумбур, но бьюсь, ищу в интернете куски кода, но не могу добиться итога.Valeriy89
Kuzmich, если вместо Private Sub Worksheet_Change(ByVal Target As Range) вставить в макрос Private Sub CommandButton21_Click(), пишет ошибку Compile Error Variable not defined
Kuzmich, если вместо Private Sub Worksheet_Change(ByVal Target As Range) вставить в макрос Private Sub CommandButton21_Click(), пишет ошибку Compile Error Variable not definedValeriy89
В моем макросе переменная определена в названии процедуры (ByVal Target As Range) Если делать через кнопку CommandButton21_Click(), то переменную надо определять в коде макроса, ну и надо менять алгоритм работы, т.к. Target - это была ячейка, в которую вносилось значение ТО (столбец где январь). Чтобы не рассуждать абстрактно, приведите пример с реальной структурой листа График.
Цитата
пишет ошибку Compile Error Variable not defined
В моем макросе переменная определена в названии процедуры (ByVal Target As Range) Если делать через кнопку CommandButton21_Click(), то переменную надо определять в коде макроса, ну и надо менять алгоритм работы, т.к. Target - это была ячейка, в которую вносилось значение ТО (столбец где январь). Чтобы не рассуждать абстрактно, приведите пример с реальной структурой листа График.Kuzmich
а как сделать, чтобы он скажем так заново заполнял строки?
Попробуйте вставить такой макрос вместо предыдущего [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Cells.Count > 1 Then Exit Sub 'выделено больше одной ячейки If Not Intersect(Target, Range("E9:P24")) Is Nothing Then Dim iMonth As String Dim i As Integer Dim iLastRow As Integer Dim iLastRowГрафик As Integer iMonth = Cells(8, Target.Column) iLastRowГрафик = Cells(Rows.Count, 4).End(xlUp).Row + 1 With Sheets(iMonth) iLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 If iLastRow > 5 Then .Range(.Cells(5, 1), .Cells(iLastRow, 5)).ClearContents End If For i = 9 To iLastRowГрафик If Not IsEmpty(Cells(i, 5)) Then iLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 If iLastRow = 5 Then .Cells(5, 1) = 1 Else .Cells(iLastRow, 1) = .Cells(iLastRow - 1, 1) + 1 End If .Cells(iLastRow, 2) = Cells(i, 5) .Cells(iLastRow, 3) = Cells(i, 4) .Cells(iLastRow, 4) = "Иванов И.И." End If Next End With End If End Sub
[/vba]
Цитата
а как сделать, чтобы он скажем так заново заполнял строки?
Попробуйте вставить такой макрос вместо предыдущего [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Cells.Count > 1 Then Exit Sub 'выделено больше одной ячейки If Not Intersect(Target, Range("E9:P24")) Is Nothing Then Dim iMonth As String Dim i As Integer Dim iLastRow As Integer Dim iLastRowГрафик As Integer iMonth = Cells(8, Target.Column) iLastRowГрафик = Cells(Rows.Count, 4).End(xlUp).Row + 1 With Sheets(iMonth) iLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 If iLastRow > 5 Then .Range(.Cells(5, 1), .Cells(iLastRow, 5)).ClearContents End If For i = 9 To iLastRowГрафик If Not IsEmpty(Cells(i, 5)) Then iLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 If iLastRow = 5 Then .Cells(5, 1) = 1 Else .Cells(iLastRow, 1) = .Cells(iLastRow - 1, 1) + 1 End If .Cells(iLastRow, 2) = Cells(i, 5) .Cells(iLastRow, 3) = Cells(i, 4) .Cells(iLastRow, 4) = "Иванов И.И." End If Next End With End If End Sub
Kuzmich, структура точно такая же (я в примере для восприятия заменил только на LC, MB), т.е. в столбце Е внесены наименования оборудования (левее от столбца Е просто обобщенное описание или системы или местоположения), а уже со столбца с F по P по месяцам заполнены работы. Еще раз выложу с вашим последним макросом.
Kuzmich, структура точно такая же (я в примере для восприятия заменил только на LC, MB), т.е. в столбце Е внесены наименования оборудования (левее от столбца Е просто обобщенное описание или системы или местоположения), а уже со столбца с F по P по месяцам заполнены работы. Еще раз выложу с вашим последним макросом.Valeriy89
Kuzmich, он вносит если вручную меняешь, при копировании не хочет, да и хотелось бы все делать по форме с кнопки, плюс ко всему если внизу в шаблоне вписать Должность_подпись_ФИО, то при переносе данных он удаляет эту фразу из шаблона, у меня есть пример, но не смог с ним разобраться, если выручите может быть у Вас получится изменить код под мою форму (там довольно корректно переносит данные и фразы оставляет и не меняет формы и тд)
Kuzmich, он вносит если вручную меняешь, при копировании не хочет, да и хотелось бы все делать по форме с кнопки, плюс ко всему если внизу в шаблоне вписать Должность_подпись_ФИО, то при переносе данных он удаляет эту фразу из шаблона, у меня есть пример, но не смог с ним разобраться, если выручите может быть у Вас получится изменить код под мою форму (там довольно корректно переносит данные и фразы оставляет и не меняет формы и тд)Valeriy89
Wasilic, Отличный вариант, только хотелось бы формировать план на любой месяц на лист 1, причем делать это с кнопки, т.е. нажимаю кнопку "План работ", она открывает форму где или 12 кнопок по месяцам или через комбобокс и переход по кнопке "Сформировать". На лист хочу для того, чтобы уменьшить количество листов в книге. Т.е. как нужно задать выборку не по выбранному столбцу, а по заранее заданному (чтобы сделать поиск конкретно по январю, февралю и тд)? А по формированию нового файла в нужную папку использую следующий код (как у меня реализовано для формирования Акта о выполнении ТО): [vba]
Код
Private Sub CommandButton1_Click() Sheets("Шаблон").Select ' Присваиваем значения нашим ячейкам, по именам которые мы задавали
Range("oborudov").Value = TextBox1.Value
' Копируем все Cells.Select Selection.Copy ' Создаем новую книгу или делаем ее активной If NewBook = "" Then Workbooks.Add NewBook = ActiveWorkbook.Name Else Workbooks(NewBook).Activate Cells(1, 1).Select End If ' Вставляем данные в эту книгу Application.DisplayAlerts = False ActiveSheet.Paste Application.CutCopyMode = False
On Error Resume Next ' название подпапки, в которую по-умолчанию будет предложено сохранить файл Const REPORTS_FOLDER = "Отчёты\" ' создаём папку для файла, если её ещё нет MkDir ThisWorkbook.Path & "\" & REPORTS_FOLDER ' выбираем стартовую папку ChDrive Left(ThisWorkbook.Path, 1): ChDir ThisWorkbook.Path & "\" & REPORTS_FOLDER
' вывод диалогового окна для запроса имени сохраняемого файла Filename = Application.GetSaveAsFilename("отчёт.xls", "Отчёты Excel (*.xls),", , _ "Введите имя файла для сохраняемого отчёта", "Сохранить") ' если пользователь отказался от выбора имени файла - отменяем сохранение листа в файл If VarType(Filename) = vbBoolean Then Exit Sub
' копируем активный лист (при этом создаётся новая книга) Err.Clear: ActiveSheet.Copy: DoEvents If Err Then Exit Sub ' произошла какая-то ошибка при попытке копирования листа
' убеждаемся, что активной книгой является копия листа If ActiveWorkbook.Worksheets.Count = 1 And ActiveWorkbook.Path = "" Then ' сохраняем файл под заданным именем в формате Excel 2003 ActiveWorkbook.SaveAs Filename, xlWorkbookNormal
' закрываем сохранённый файл ' (удалить следующую строку, если закрывать созданный файл не требуется) ActiveWorkbook.Close False End If ActiveWorkbook.Close False 'закрываем скопированный лист UserForm1.Hide ' закрытие формы Sheets("Данные").Select ' переход обратно к листу с кнопкой MsgBox "Создание акта выполнено успешно" End Sub
[/vba] [moder]Оформляйте коды тегами (кнопка #). Исправила на первый раз[/moder]
Wasilic, Отличный вариант, только хотелось бы формировать план на любой месяц на лист 1, причем делать это с кнопки, т.е. нажимаю кнопку "План работ", она открывает форму где или 12 кнопок по месяцам или через комбобокс и переход по кнопке "Сформировать". На лист хочу для того, чтобы уменьшить количество листов в книге. Т.е. как нужно задать выборку не по выбранному столбцу, а по заранее заданному (чтобы сделать поиск конкретно по январю, февралю и тд)? А по формированию нового файла в нужную папку использую следующий код (как у меня реализовано для формирования Акта о выполнении ТО): [vba]
Код
Private Sub CommandButton1_Click() Sheets("Шаблон").Select ' Присваиваем значения нашим ячейкам, по именам которые мы задавали
Range("oborudov").Value = TextBox1.Value
' Копируем все Cells.Select Selection.Copy ' Создаем новую книгу или делаем ее активной If NewBook = "" Then Workbooks.Add NewBook = ActiveWorkbook.Name Else Workbooks(NewBook).Activate Cells(1, 1).Select End If ' Вставляем данные в эту книгу Application.DisplayAlerts = False ActiveSheet.Paste Application.CutCopyMode = False
On Error Resume Next ' название подпапки, в которую по-умолчанию будет предложено сохранить файл Const REPORTS_FOLDER = "Отчёты\" ' создаём папку для файла, если её ещё нет MkDir ThisWorkbook.Path & "\" & REPORTS_FOLDER ' выбираем стартовую папку ChDrive Left(ThisWorkbook.Path, 1): ChDir ThisWorkbook.Path & "\" & REPORTS_FOLDER
' вывод диалогового окна для запроса имени сохраняемого файла Filename = Application.GetSaveAsFilename("отчёт.xls", "Отчёты Excel (*.xls),", , _ "Введите имя файла для сохраняемого отчёта", "Сохранить") ' если пользователь отказался от выбора имени файла - отменяем сохранение листа в файл If VarType(Filename) = vbBoolean Then Exit Sub
' копируем активный лист (при этом создаётся новая книга) Err.Clear: ActiveSheet.Copy: DoEvents If Err Then Exit Sub ' произошла какая-то ошибка при попытке копирования листа
' убеждаемся, что активной книгой является копия листа If ActiveWorkbook.Worksheets.Count = 1 And ActiveWorkbook.Path = "" Then ' сохраняем файл под заданным именем в формате Excel 2003 ActiveWorkbook.SaveAs Filename, xlWorkbookNormal
' закрываем сохранённый файл ' (удалить следующую строку, если закрывать созданный файл не требуется) ActiveWorkbook.Close False End If ActiveWorkbook.Close False 'закрываем скопированный лист UserForm1.Hide ' закрытие формы Sheets("Данные").Select ' переход обратно к листу с кнопкой MsgBox "Создание акта выполнено успешно" End Sub
[/vba] [moder]Оформляйте коды тегами (кнопка #). Исправила на первый раз[/moder]Valeriy89
Сообщение отредактировал Pelena - Суббота, 19.12.2015, 23:26