Доброго времени суток подскажите п-та решение, начал писать макрос на автоматическое составление необходимого отчёта, возникли трудности как сделать так что бы данные переносились в другую книгу созданную макросом, по принципу ВПР. Привожу то что уже написал, если у кого-то есть решение как можно сделать поделитесь п-та. Прошу строго не судить за очень корявый код, макрос первый в моей жизни который я пытаюсь сделать сам.
Сам макрос
[vba]
Код
Sub аналитика()
Dim New_Wb As Workbook Set New_Wb = Workbooks.Add Dim Date1 As String Date1 = Date New_Wb.Activate MsgBox Date1
Доброго времени суток подскажите п-та решение, начал писать макрос на автоматическое составление необходимого отчёта, возникли трудности как сделать так что бы данные переносились в другую книгу созданную макросом, по принципу ВПР. Привожу то что уже написал, если у кого-то есть решение как можно сделать поделитесь п-та. Прошу строго не судить за очень корявый код, макрос первый в моей жизни который я пытаюсь сделать сам.
Сам макрос
[vba]
Код
Sub аналитика()
Dim New_Wb As Workbook Set New_Wb = Workbooks.Add Dim Date1 As String Date1 = Date New_Wb.Activate MsgBox Date1
Оптимизация кода это конечно очень да же хорошо, и это безусловно будет сделано после того в нем прибудет 100% функционал. Сейчас необходимо добиться именно этого. На данном этапе необходимо решить проблему по вводу данных из исходной книги в которой написан макрос во вновь создаваемую причём там где стоит метка "1" будет относится к первому блоку, а там где стоит "2" ко второму блоку. Начал уже сам придумывать, но пока не совсем успешно. Написал нижеприведённую вещь в дополнение к макросу из первого поста, но как то он не работает.
[vba]
Код
Workbooks("Книга1.xlsm").Sheets("Лист1").Activate ' Активирует лист книги
Dim a As Variant, i As Long, b As Variant, k As Long ' Описывает переменные a = Лист1.Range("A3:D1000") ' Задаёт параметры массива For i = 1 To 1000 If a(3, i) = 1 Then ' Выполнят поиск "1" в 3 столбике вышеописанного массива b = a(1, i) ' Если сбывается условие то присваивает переменной "b" значение из 1 столбика End If Next
Все это не совсем сказать что работает но думаю что принцип понятен. Подскажите как можно реализовать данный алгоритм.
[/spoiler]
Оптимизация кода это конечно очень да же хорошо, и это безусловно будет сделано после того в нем прибудет 100% функционал. Сейчас необходимо добиться именно этого. На данном этапе необходимо решить проблему по вводу данных из исходной книги в которой написан макрос во вновь создаваемую причём там где стоит метка "1" будет относится к первому блоку, а там где стоит "2" ко второму блоку. Начал уже сам придумывать, но пока не совсем успешно. Написал нижеприведённую вещь в дополнение к макросу из первого поста, но как то он не работает.
[vba]
Код
Workbooks("Книга1.xlsm").Sheets("Лист1").Activate ' Активирует лист книги
Dim a As Variant, i As Long, b As Variant, k As Long ' Описывает переменные a = Лист1.Range("A3:D1000") ' Задаёт параметры массива For i = 1 To 1000 If a(3, i) = 1 Then ' Выполнят поиск "1" в 3 столбике вышеописанного массива b = a(1, i) ' Если сбывается условие то присваивает переменной "b" значение из 1 столбика End If Next
Sub Мяу() Dim ar, a() Dim oDic As Object, d As Object Dim i&, x& Set oDic = CreateObject("Scripting.Dictionary") ar = ThisWorkbook.Sheets(1).Range("C4").CurrentRegion.Value For i = 1 To UBound(ar) If Len(ar(i, 3)) Then If oDic.exists(ar(i, 3)) Then Set d = oDic.Item(ar(i, 3)) ReDim a(1) a(0) = ar(i, 2) a(1) = ar(i, 4) d.Item(d.Count) = a Set oDic.Item(ar(i, 3)) = d Else Set d = CreateObject("Scripting.Dictionary") ReDim a(1) a(0) = ar(i, 2) a(1) = ar(i, 4) d.Item(d.Count) = a Set oDic.Item(ar(i, 3)) = d End If End If Next With Workbooks.Add(1) With .Sheets(1) .Range("C3").Value = "Сменно-суточное задание на пилоотрезные станки" .Range("C4").Value = "Дата" .Range("H1").Value = "Утверждаю" .Range("A6").Value = "Наименование оборудования" .Columns("A").ColumnWidth = 18 .Columns("B").ColumnWidth = 38.89 .Range("B6").Value = "шифр" .Range("C6").Value = "Количество" .Range("D6").Value = "операция" For i = 1 To oDic.Count x = .Cells(Rows.Count, 2).End(xlUp).Row + 1 x = x - (x > 7) .Cells(x, 1).Resize(oDic(i).Count + 1).Merge .Cells(x, 2).Resize(oDic(i).Count, 2).Value = Application.Transpose(Application.Transpose(oDic(i).Items)) Next End With .SaveAs Filename:="D:\" & Format(Date, "dd_mm_yyyy") & ".xlsx", FileFormat:=51 End With End Sub
[/vba]
Надо помяукать [vba]
Код
Sub Мяу() Dim ar, a() Dim oDic As Object, d As Object Dim i&, x& Set oDic = CreateObject("Scripting.Dictionary") ar = ThisWorkbook.Sheets(1).Range("C4").CurrentRegion.Value For i = 1 To UBound(ar) If Len(ar(i, 3)) Then If oDic.exists(ar(i, 3)) Then Set d = oDic.Item(ar(i, 3)) ReDim a(1) a(0) = ar(i, 2) a(1) = ar(i, 4) d.Item(d.Count) = a Set oDic.Item(ar(i, 3)) = d Else Set d = CreateObject("Scripting.Dictionary") ReDim a(1) a(0) = ar(i, 2) a(1) = ar(i, 4) d.Item(d.Count) = a Set oDic.Item(ar(i, 3)) = d End If End If Next With Workbooks.Add(1) With .Sheets(1) .Range("C3").Value = "Сменно-суточное задание на пилоотрезные станки" .Range("C4").Value = "Дата" .Range("H1").Value = "Утверждаю" .Range("A6").Value = "Наименование оборудования" .Columns("A").ColumnWidth = 18 .Columns("B").ColumnWidth = 38.89 .Range("B6").Value = "шифр" .Range("C6").Value = "Количество" .Range("D6").Value = "операция" For i = 1 To oDic.Count x = .Cells(Rows.Count, 2).End(xlUp).Row + 1 x = x - (x > 7) .Cells(x, 1).Resize(oDic(i).Count + 1).Merge .Cells(x, 2).Resize(oDic(i).Count, 2).Value = Application.Transpose(Application.Transpose(oDic(i).Items)) Next End With .SaveAs Filename:="D:\" & Format(Date, "dd_mm_yyyy") & ".xlsx", FileFormat:=51 End With End Sub
Огромное спасибо все работает, если не затруднит скиньте код в личном сообщении с комментариями, так как аналогичных задач достаточно много, возможно придётся немного видоизменять.
Огромное спасибо все работает, если не затруднит скиньте код в личном сообщении с комментариями, так как аналогичных задач достаточно много, возможно придётся немного видоизменять.ILYA_SERGEEVICH_1987