Здравствуйте. Для упрощения работы нужна помощь. Сделал документ excel в которой генерируются наименования товара и присваиваемые ему номера кодов в зависимости от вводных данных. На первом листе "Вводные для печати" формируется таблица данных, на втором листе "На печать" итоговая таблица. В зависимости от данных количество строк может быть разным, когда 5, когда 1005 единиц товара. Вот эту таблицу каждый раз вручную приходится копировать и экспортировать в новый фаил excel (софт принтера может использовать эти таблицы, но не различает данные и пустые ячейки в которых прописана только формула). Каталог и имя экспортируемого фаила должны быть такими C:\Печать этикеток\Этикетки на печать.xlsx) В вложении максимально упрощеная заготовка с описанием.
Здравствуйте. Для упрощения работы нужна помощь. Сделал документ excel в которой генерируются наименования товара и присваиваемые ему номера кодов в зависимости от вводных данных. На первом листе "Вводные для печати" формируется таблица данных, на втором листе "На печать" итоговая таблица. В зависимости от данных количество строк может быть разным, когда 5, когда 1005 единиц товара. Вот эту таблицу каждый раз вручную приходится копировать и экспортировать в новый фаил excel (софт принтера может использовать эти таблицы, но не различает данные и пустые ячейки в которых прописана только формула). Каталог и имя экспортируемого фаила должны быть такими C:\Печать этикеток\Этикетки на печать.xlsx) В вложении максимально упрощеная заготовка с описанием.Александр7034
Sub Экспорт() Dim wb As Workbook, arr(), DataArr, i As Long, j As Long, item As Long, cnt As Long Application.DisplayAlerts = False Application.ScreenUpdating = False With ThisWorkbook.Sheets("На печать") DataArr = Application.Transpose(.Cells(1, 1).CurrentRegion) i = 1: cnt = 1 item = Application.Match(0, .Columns(2), 0) Do For j = 1 To UBound(DataArr, 1) ReDim Preserve arr(1 To UBound(DataArr, 1), 1 To cnt) arr(j, cnt) = DataArr(j, i) Next j i = i + 1 cnt = cnt + 1 Loop While i < item
Set wb = Application.Workbooks.Add wb.Sheets(1).Cells(1, 1).Resize(UBound(arr, 2), UBound(arr, 1)) = Application.Transpose(arr) wb.SaveAs "C:\Печать этикеток\Этикетки на печать.xlsx" wb.Close True End With Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub
[/vba]
или короче: [vba]
Код
Sub Экспорт_2() Dim wb As Workbook, item Application.DisplayAlerts = False Application.ScreenUpdating = False With ThisWorkbook.Sheets("На печать") item = Application.Match(0, .Columns(2), 0) Set wb = Application.Workbooks.Add .Range(.Cells(1, 1), .Cells(item - 1, 3)).Copy wb.Sheets(1).Cells(1, 1) wb.SaveAs "C:\Печать этикеток\Этикетки на печать.xlsx" wb.Close True End With Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub
[/vba]
можно так: [vba]
Код
Sub Экспорт() Dim wb As Workbook, arr(), DataArr, i As Long, j As Long, item As Long, cnt As Long Application.DisplayAlerts = False Application.ScreenUpdating = False With ThisWorkbook.Sheets("На печать") DataArr = Application.Transpose(.Cells(1, 1).CurrentRegion) i = 1: cnt = 1 item = Application.Match(0, .Columns(2), 0) Do For j = 1 To UBound(DataArr, 1) ReDim Preserve arr(1 To UBound(DataArr, 1), 1 To cnt) arr(j, cnt) = DataArr(j, i) Next j i = i + 1 cnt = cnt + 1 Loop While i < item
Set wb = Application.Workbooks.Add wb.Sheets(1).Cells(1, 1).Resize(UBound(arr, 2), UBound(arr, 1)) = Application.Transpose(arr) wb.SaveAs "C:\Печать этикеток\Этикетки на печать.xlsx" wb.Close True End With Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub
[/vba]
или короче: [vba]
Код
Sub Экспорт_2() Dim wb As Workbook, item Application.DisplayAlerts = False Application.ScreenUpdating = False With ThisWorkbook.Sheets("На печать") item = Application.Match(0, .Columns(2), 0) Set wb = Application.Workbooks.Add .Range(.Cells(1, 1), .Cells(item - 1, 3)).Copy wb.Sheets(1).Cells(1, 1) wb.SaveAs "C:\Печать этикеток\Этикетки на печать.xlsx" wb.Close True End With Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub
Доброго времени суток, форумчане. Прошу помощи, поскольку только начал разбираться с VBA, а сделать надо срочно....Имеется таблица. Во втором столбце встречаются одинаковые фамилии. Нужно создать новую таблицу, которая при вызове макросы создает таблицу, в которой находятся одинаковые значения из столбца 2, а в остальных столбцах новой таблицы остальные значения из первой таблицы. (если это возможно, то только те значения, которые соответствуют, где одно из значений в столбце "а" соответствует необходимому значению месяца. Для наглядности приложил файл. Буду очень благодарен за любую помощь!!!
Доброго времени суток, форумчане. Прошу помощи, поскольку только начал разбираться с VBA, а сделать надо срочно....Имеется таблица. Во втором столбце встречаются одинаковые фамилии. Нужно создать новую таблицу, которая при вызове макросы создает таблицу, в которой находятся одинаковые значения из столбца 2, а в остальных столбцах новой таблицы остальные значения из первой таблицы. (если это возможно, то только те значения, которые соответствуют, где одно из значений в столбце "а" соответствует необходимому значению месяца. Для наглядности приложил файл. Буду очень благодарен за любую помощь!!!Al1978
Sub macro_1() Dim Dict As Object, item, j, h, a Dim arr, lstRow As Long Set Dict = CreateObject("Scripting.Dictionary") With Dict .CompareMode = vbTextCompare End With arr = Application.Transpose(Application.InputBox("Выберите диапазон для преобразования", Type:=8))
For j = LBound(arr, 2) To UBound(arr, 2) If Not Dict.exists(arr(2, j)) Then Dict.Add arr(2, j), arr(3, j) & ";" & arr(1, j) & ";" & arr(4, j) Else Dict.item(arr(2, j)) = _ Dict.item(arr(2, j)) & "|" & arr(3, j) & ";" & arr(1, j) & ";" & arr(4, j) End If Next j With Sheets("Лист2") ' Лист2 поменять на нужное имя листа lstRow = .Cells(.Rows.Count, 1).End(xlUp).Row For Each h In Dict.keys item = Split(Dict.item(h), "|") .Cells(lstRow, 1).Resize(UBound(item) + 1, 1) = h For Each a In item a = Split(a, ";") .Cells(lstRow, 2).Resize(1, UBound(a) + 1) = a lstRow = lstRow + 1 Next a Next h End With End Sub
[/vba] Потом объединить ячейки по Фамилии.
Al1978, приветствую! Можно так: [vba]
Код
Sub macro_1() Dim Dict As Object, item, j, h, a Dim arr, lstRow As Long Set Dict = CreateObject("Scripting.Dictionary") With Dict .CompareMode = vbTextCompare End With arr = Application.Transpose(Application.InputBox("Выберите диапазон для преобразования", Type:=8))
For j = LBound(arr, 2) To UBound(arr, 2) If Not Dict.exists(arr(2, j)) Then Dict.Add arr(2, j), arr(3, j) & ";" & arr(1, j) & ";" & arr(4, j) Else Dict.item(arr(2, j)) = _ Dict.item(arr(2, j)) & "|" & arr(3, j) & ";" & arr(1, j) & ";" & arr(4, j) End If Next j With Sheets("Лист2") ' Лист2 поменять на нужное имя листа lstRow = .Cells(.Rows.Count, 1).End(xlUp).Row For Each h In Dict.keys item = Split(Dict.item(h), "|") .Cells(lstRow, 1).Resize(UBound(item) + 1, 1) = h For Each a In item a = Split(a, ";") .Cells(lstRow, 2).Resize(1, UBound(a) + 1) = a lstRow = lstRow + 1 Next a Next h End With End Sub
Спасибо то что нужно. А что нужно прописать в короткий код что бы ширина таблиц была заданной? А то после экспорта столбцы стандартные, соответствено текст в ячейках не помещается.
Спасибо то что нужно. А что нужно прописать в короткий код что бы ширина таблиц была заданной? А то после экспорта столбцы стандартные, соответствено текст в ячейках не помещается.Александр7034
Сообщение отредактировал Serge_007 - Четверг, 05.05.2022, 09:51
Александр7034, прошу прощения за долгий ответ, не увидел сразу Ваше сообщение [vba]
Код
wb.Sheets(1).Columns.AutoFit ' вот эту строку
[/vba] см. код ниже: [vba]
Код
Sub Экспорт_2() Dim wb As Workbook, item Application.DisplayAlerts = False Application.ScreenUpdating = False With ThisWorkbook.Sheets("На печать") item = Application.Match(0, .Columns(2), 0) Set wb = Application.Workbooks.Add .Range(.Cells(1, 1), .Cells(item - 1, 3)).Copy wb.Sheets(1).Cells(1, 1) wb.Sheets(1).Columns.AutoFit ' вот эту строку wb.SaveAs "C:\Печать этикеток\Этикетки на печать.xlsx" wb.Close True End With Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub
[/vba]
Александр7034, прошу прощения за долгий ответ, не увидел сразу Ваше сообщение [vba]
Код
wb.Sheets(1).Columns.AutoFit ' вот эту строку
[/vba] см. код ниже: [vba]
Код
Sub Экспорт_2() Dim wb As Workbook, item Application.DisplayAlerts = False Application.ScreenUpdating = False With ThisWorkbook.Sheets("На печать") item = Application.Match(0, .Columns(2), 0) Set wb = Application.Workbooks.Add .Range(.Cells(1, 1), .Cells(item - 1, 3)).Copy wb.Sheets(1).Cells(1, 1) wb.Sheets(1).Columns.AutoFit ' вот эту строку wb.SaveAs "C:\Печать этикеток\Этикетки на печать.xlsx" wb.Close True End With Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub
Подозреваю дело в том что в отличии от примера состоящего из двух листов (Вводные для печати и на печать) в проекте у меня 4 листа. Хотя и сделал листы с точно такими же именами, видимо другое количество листов ведет к ошибке.
jun, а не подскажите, при копировании кода уже в мой проект, выходит сообщение об ошибке при выполнении и выделена следующая строка в debug
Подозреваю дело в том что в отличии от примера состоящего из двух листов (Вводные для печати и на печать) в проекте у меня 4 листа. Хотя и сделал листы с точно такими же именами, видимо другое количество листов ведет к ошибке.Александр7034
Сообщение отредактировал Александр7034 - Пятница, 13.05.2022, 14:02
Александр7034, можете подсказать, какая ошибка? Что пишет? Может быть item не определилась из-за того что отсутствуют нули во втором столбце после значений? Можно посмотреть в Locals Window (Alt + F11 -> View -> Locals Window)
Александр7034, можете подсказать, какая ошибка? Что пишет? Может быть item не определилась из-за того что отсутствуют нули во втором столбце после значений? Можно посмотреть в Locals Window (Alt + F11 -> View -> Locals Window)jun
Так и оказалось, опытным путем выяснил что нули являются завершающий строкой. А не подскажите какую строку в вашем коде выше нужно прописать, что бы появлялась надпись "выполнено", а то по началу так хорошо импортировалось без всяких надписей, что подумал код не работает, так как визуально ни чего не произошло.
Так и оказалось, опытным путем выяснил что нули являются завершающий строкой. А не подскажите какую строку в вашем коде выше нужно прописать, что бы появлялась надпись "выполнено", а то по началу так хорошо импортировалось без всяких надписей, что подумал код не работает, так как визуально ни чего не произошло.Александр7034
Сообщение отредактировал Serge_007 - Вторник, 17.05.2022, 09:03