Давеча уважаемые devilkurs и MBT помогли очень просто решить вопрос с созданием реестра по данным из ячеек на разных листах Тут . Сегодня захотелось большего ))): Столкнулся с вопросом, как по заполненной таблице исходных данных заполнить акт скрытых работ определенной формы. Имеем книгу в которой: 1. 1-й лист - "Реестр" 2. 2-й лист - Исходные данные 3. 3-й и далее Формы актов. Необходимо при запуске макроса: 1. Заполнить необходимые ячейки на листе №3 данными из шапки Исходных данных - постоянные для всех актов в данной книге и переменными данными из первой строки основных сведений о предъявляемых работах. 2. При заполнении 2-ой и т.д. строки - создать новую копию листа №3 и заполнить ее соотв. данными и т.д. Пример в приложении. Форма акта где требуется автоматическое заполнение выделена зеленым и заполнена через формулы так как хотелось-бы. Заодно есть проблема с переносом предложения в другую ячейку. Не могу понять в чем проблема, на примере понятно. При значении менее 30 символов работает, а более вылетает в #знач Помогите, кто может. Сам в макросах из разряда потыкать, а вдруг получится.
Давеча уважаемые devilkurs и MBT помогли очень просто решить вопрос с созданием реестра по данным из ячеек на разных листах Тут . Сегодня захотелось большего ))): Столкнулся с вопросом, как по заполненной таблице исходных данных заполнить акт скрытых работ определенной формы. Имеем книгу в которой: 1. 1-й лист - "Реестр" 2. 2-й лист - Исходные данные 3. 3-й и далее Формы актов. Необходимо при запуске макроса: 1. Заполнить необходимые ячейки на листе №3 данными из шапки Исходных данных - постоянные для всех актов в данной книге и переменными данными из первой строки основных сведений о предъявляемых работах. 2. При заполнении 2-ой и т.д. строки - создать новую копию листа №3 и заполнить ее соотв. данными и т.д. Пример в приложении. Форма акта где требуется автоматическое заполнение выделена зеленым и заполнена через формулы так как хотелось-бы. Заодно есть проблема с переносом предложения в другую ячейку. Не могу понять в чем проблема, на примере понятно. При значении менее 30 символов работает, а более вылетает в #знач Помогите, кто может. Сам в макросах из разряда потыкать, а вдруг получится. Webbear
devilkurs, Очередной раз огромное спасибо, Вроде все работает как надо, с мелочами хочу попробовать разобраться сам. Чтобы оттолкнуться от чего-то, есть несколько вопросов: 1. Лист Шаблон используется как форма в которой указаны все условно постоянные данные? 2. Например в строке кода [vba]
[/vba] как реализована последовательность сбора Фамилия - Должность и как эта последовательность меняется? 3.При создании реестра как правильно добавить дополнительные листы в исключение в строке [vba]
Код
If Sh.Name <> "Реестр" Then
[/vba]? [vba]
Код
If Sh.Name <> "Реестр" And "Основные параметры" And "ШАБЛОН" Then
[/vba] сработает?
devilkurs, Очередной раз огромное спасибо, Вроде все работает как надо, с мелочами хочу попробовать разобраться сам. Чтобы оттолкнуться от чего-то, есть несколько вопросов: 1. Лист Шаблон используется как форма в которой указаны все условно постоянные данные? 2. Например в строке кода [vba]
[/vba] как реализована последовательность сбора Фамилия - Должность и как эта последовательность меняется? 3.При создании реестра как правильно добавить дополнительные листы в исключение в строке [vba]
Код
If Sh.Name <> "Реестр" Then
[/vba]? [vba]
Код
If Sh.Name <> "Реестр" And "Основные параметры" And "ШАБЛОН" Then
[/vba] Это работает следующим образом: В Temp сохраняется массив из 3-х строк, которые формируются в Функции Строка. Входные данные в функцию -Текст который надо разбить на подстроки - размер/длина первой строки - размер/длина второй строки
В Функции Текст разбивается на куски, которые "помещаются" в ячейки в Акте. В данном выше примере в ячейку О53 вставляется текст длиной до 40 символов, а остальной текст вставляется в ячейку А54
[/vba] Это работает следующим образом: В Temp сохраняется массив из 3-х строк, которые формируются в Функции Строка. Входные данные в функцию -Текст который надо разбить на подстроки - размер/длина первой строки - размер/длина второй строки
В Функции Текст разбивается на куски, которые "помещаются" в ячейки в Акте. В данном выше примере в ячейку О53 вставляется текст длиной до 40 символов, а остальной текст вставляется в ячейку А54devilkurs
Сообщение отредактировал devilkurs - Среда, 28.09.2016, 17:35
а если строк в которых надо разбить текст будет 3 или более?
Там где у Вас предусмотрено на 2 строки, то будет текст обрезать чтоб вместилось в первую строку, а остальной текст вставлять во вторую. Там где у Вас предусмотрено на 3 строки, то будет вмещать в первые две, а третью вставлять весь остаток
а если строк в которых надо разбить текст будет 3 или более?
Там где у Вас предусмотрено на 2 строки, то будет текст обрезать чтоб вместилось в первую строку, а остальной текст вставлять во вторую. Там где у Вас предусмотрено на 3 строки, то будет вмещать в первые две, а третью вставлять весь остатокdevilkurs
Совершенство не знает предела Допустим, что работа актированная актом №2 оказалась не такой уж и скрытой, как казалось на первый взгляд. Удаляем ее из Основных данных. Как реализовать удаление и созданного акта при повторном нажатии кнопки "Заполнить"?
Совершенство не знает предела Допустим, что работа актированная актом №2 оказалась не такой уж и скрытой, как казалось на первый взгляд. Удаляем ее из Основных данных. Как реализовать удаление и созданного акта при повторном нажатии кнопки "Заполнить"?Webbear
Если я правильно понимаю, самый простой способ, это после каждого нового события нажатия кнопки "Заполнить" первым делом должны удалиться все существующие листы, а потом уже создаться заново по обновленным данным. Или есть еще более простой способ?
И еще,чуть не забыл: Месяц выполнения и окончания работ всегда январь! [vba]
Если я правильно понимаю, самый простой способ, это после каждого нового события нажатия кнопки "Заполнить" первым делом должны удалиться все существующие листы, а потом уже создаться заново по обновленным данным. Или есть еще более простой способ?
И еще,чуть не забыл: Месяц выполнения и окончания работ всегда январь! [vba]
devilkurs, не сочтите за труд, очень хочу разобраться а не в слепую использовать вашу работу. Объясните дураку общие принципы и алгоритмы. Вопросы прямо в коде:
[vba]
Код
Sub Автозаполнение() Dim ПредЗастр, ПредСтроит, ПредСтроитВыпРаб, ArrОбъект, ArrАкты, Sh_Шаблон, y%, i%, Temp, Indik As Boolean Application.ScreenUpdating = False 'Выключили обновление Экрана для ускорения обработки
With Sheets("Основные параметры") 'Присваиваем значения и задаем порядок обращения к данным Ф.И.О.- Должность? ПредЗастр = .[J2].Value & " - " & .[A2].Value ПредСтроит = .[J4].Value & " - " & .[A4].Value ПредСтроитВыпРаб = .[J6].Value & " - " & .[A6].Value
ArrОбъект = .Range("A9").Resize(10, 20).Value '? ArrАкты = .Range("A30").Resize(10, .Cells(.Rows.Count, 2).End(xlUp).Row).Value '? End With
Set Sh_Шаблон = Sheets("ШАБЛОН") 'Присваиваем имя листу, не проверяя перед этим существует ли этот лист, т.к нам это не надо
For y = 1 To UBound(ArrОбъект, 1) 'Используем функцию для определения верхней границы массива. Не понимаю что за y If ArrОбъект(y, 8) <> "" Then 'Как следствие, понимаю только, что далее пошла проверка 'на наличие номера акта в i-той строке 2-го столбца и еслиномера нет, то дальше 'не могу понять, суть выполняемой операции Case худо-бедно понятно, а Indik вводит в ступор а как 'итог: избегаем создания дубликатов. For i = 1 To UBound(ArrАкты, 1) If ArrАкты(i, 2) <> "" And ArrАкты(i, 2) <> " " Then Indik = True For Each Sh In Sheets Select Case Sh.Name Case "Реестр", "Основные параметры", "ШАБЛОН" Case Else If Sh.[B51] = ArrАкты(i, 2) Then Sh.Select Indik = False Exit For End If End Select Next Sh
If Indik Then Sh_Шаблон.Copy After:=Sheets(Worksheets.Count) 'скопируем лист АСР(как шаблон) в новый лист и в конец книги Set Sh = ActiveSheet
On Error Resume Next Sh.Name = "АСР " & i If Err Then Err.Clear Sh.Name = "АСР " & i & "_" & Replace(Time, ":", "-") End If On Error GoTo 0 End If
[/vba]
devilkurs, не сочтите за труд, очень хочу разобраться а не в слепую использовать вашу работу. Объясните дураку общие принципы и алгоритмы. Вопросы прямо в коде:
[vba]
Код
Sub Автозаполнение() Dim ПредЗастр, ПредСтроит, ПредСтроитВыпРаб, ArrОбъект, ArrАкты, Sh_Шаблон, y%, i%, Temp, Indik As Boolean Application.ScreenUpdating = False 'Выключили обновление Экрана для ускорения обработки
With Sheets("Основные параметры") 'Присваиваем значения и задаем порядок обращения к данным Ф.И.О.- Должность? ПредЗастр = .[J2].Value & " - " & .[A2].Value ПредСтроит = .[J4].Value & " - " & .[A4].Value ПредСтроитВыпРаб = .[J6].Value & " - " & .[A6].Value
ArrОбъект = .Range("A9").Resize(10, 20).Value '? ArrАкты = .Range("A30").Resize(10, .Cells(.Rows.Count, 2).End(xlUp).Row).Value '? End With
Set Sh_Шаблон = Sheets("ШАБЛОН") 'Присваиваем имя листу, не проверяя перед этим существует ли этот лист, т.к нам это не надо
For y = 1 To UBound(ArrОбъект, 1) 'Используем функцию для определения верхней границы массива. Не понимаю что за y If ArrОбъект(y, 8) <> "" Then 'Как следствие, понимаю только, что далее пошла проверка 'на наличие номера акта в i-той строке 2-го столбца и еслиномера нет, то дальше 'не могу понять, суть выполняемой операции Case худо-бедно понятно, а Indik вводит в ступор а как 'итог: избегаем создания дубликатов. For i = 1 To UBound(ArrАкты, 1) If ArrАкты(i, 2) <> "" And ArrАкты(i, 2) <> " " Then Indik = True For Each Sh In Sheets Select Case Sh.Name Case "Реестр", "Основные параметры", "ШАБЛОН" Case Else If Sh.[B51] = ArrАкты(i, 2) Then Sh.Select Indik = False Exit For End If End Select Next Sh
If Indik Then Sh_Шаблон.Copy After:=Sheets(Worksheets.Count) 'скопируем лист АСР(как шаблон) в новый лист и в конец книги Set Sh = ActiveSheet
On Error Resume Next Sh.Name = "АСР " & i If Err Then Err.Clear Sh.Name = "АСР " & i & "_" & Replace(Time, ":", "-") End If On Error GoTo 0 End If
'далее идет работа с размещением текстовых данных в необходимых диапазонах ячеек с переносом строк 'и по прежнему это y? With Sh Temp = Строка(ArrОбъект(y, 1), 85, 1000) .[A15] = Temp(1): .[A16] = Temp(2)
End With End If Next i End If Next y Application.ScreenUpdating = True End Sub 'тут вообще финиш, для чего создается этот массив? Private Function Строка(sText, iSt As Integer, iEnd As Integer) Dim Arr(3), Temp If Len(sText) <= iSt Then Arr(1) = sText: GoTo ExitF: Temp = Left(sText, InStrRev(Left(sText, iSt), " ") - 1) Arr(1) = Temp If Len(Temp) + 2 < Len(sText) And Len(Temp) + 2 + iEnd < Len(sText) Then Temp = Mid(sText, Len(Temp) + 2, InStrRev(Mid(sText, Len(Temp) + 2, Len(Temp) + 2 + iEnd), " ") - 1) Arr(2) = Temp If Len(Arr(1)) + Len(Arr(2)) < Len(sText) Then Arr(3) = Mid(sText, Len(Arr(1)) + Len(Arr(2)) + 3) End If Else Arr(2) = Mid(sText, Len(Temp) + 2) End If ExitF: Строка = Arr End Function
[/vba]
Ооо! Получилось Продолжение:
[vba]
Код
'далее идет работа с размещением текстовых данных в необходимых диапазонах ячеек с переносом строк 'и по прежнему это y? With Sh Temp = Строка(ArrОбъект(y, 1), 85, 1000) .[A15] = Temp(1): .[A16] = Temp(2)
End With End If Next i End If Next y Application.ScreenUpdating = True End Sub 'тут вообще финиш, для чего создается этот массив? Private Function Строка(sText, iSt As Integer, iEnd As Integer) Dim Arr(3), Temp If Len(sText) <= iSt Then Arr(1) = sText: GoTo ExitF: Temp = Left(sText, InStrRev(Left(sText, iSt), " ") - 1) Arr(1) = Temp If Len(Temp) + 2 < Len(sText) And Len(Temp) + 2 + iEnd < Len(sText) Then Temp = Mid(sText, Len(Temp) + 2, InStrRev(Mid(sText, Len(Temp) + 2, Len(Temp) + 2 + iEnd), " ") - 1) Arr(2) = Temp If Len(Arr(1)) + Len(Arr(2)) < Len(sText) Then Arr(3) = Mid(sText, Len(Arr(1)) + Len(Arr(2)) + 3) End If Else Arr(2) = Mid(sText, Len(Temp) + 2) End If ExitF: Строка = Arr End Function
Webbear, пока комментировал код нашел недочет свой. Исправил. Окончательный код в файле. Комментарии там же. Не судите строго, комментатор из меня "великий". Я самоучка, и как понимаю - так и написал ))))))))
Кстати отдельно спасибо за значения на листе Основные параметры. Посмеялся )))))
Webbear, пока комментировал код нашел недочет свой. Исправил. Окончательный код в файле. Комментарии там же. Не судите строго, комментатор из меня "великий". Я самоучка, и как понимаю - так и написал ))))))))
Кстати отдельно спасибо за значения на листе Основные параметры. Посмеялся )))))devilkurs