Здравствуйте! Прошу помощи в нелегком для меня освоении ВБА! С логикой вроде бы мне все ясно, а вот как эту логику перевести на язык ВБА - ...? Возникло желание автоматизировать процесс подготовки документов для списания техники. Так как в конторе запрещено использовать сторонние приложения приходится все это придумывать в экселе. С помощью формул делал, но это не то чего хотелось бы и не все возможно сделать... Есть два файла Инвентаризация и Утиль. Инвентаризация - основная таблица с данными; а вот Утиль - файл с документами для утилизации. Пожелания описаны на страничках файла Утиль. Не откажите, пожалуйста, лузеру (т.е. мне), естественно у кого есть время и желание помочь... Заранее признателен и благодарен!
Здравствуйте! Прошу помощи в нелегком для меня освоении ВБА! С логикой вроде бы мне все ясно, а вот как эту логику перевести на язык ВБА - ...? Возникло желание автоматизировать процесс подготовки документов для списания техники. Так как в конторе запрещено использовать сторонние приложения приходится все это придумывать в экселе. С помощью формул делал, но это не то чего хотелось бы и не все возможно сделать... Есть два файла Инвентаризация и Утиль. Инвентаризация - основная таблица с данными; а вот Утиль - файл с документами для утилизации. Пожелания описаны на страничках файла Утиль. Не откажите, пожалуйста, лузеру (т.е. мне), естественно у кого есть время и желание помочь... Заранее признателен и благодарен!urlchik
urlchik, для одного листа "ПротКом", я написал макрос, для других попробуйте сами по образцу
[vba]
Код
Option Explicit
Sub Spisanie() ' макрос вставить в книгу Утиль.xlsm Dim outData As Worksheet Dim inData As Worksheet Dim rRow As Range Dim iRow&
Set outData = Workbooks("Инвентаризация.xlsx").Worksheets("инв") 'лист откуда берем Set inData = ThisWorkbook.Worksheets("ПротКом") 'лист куда вставляем в книге Утиль
iRow = 5 'первая строка с данными в протоколе For Each rRow In outData.UsedRange.Rows If rRow.Cells(10) = inData.Cells(4, 10) Then inData.Rows(iRow).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrBelow ' Вставляем строку 'переносим данные удовлетворяющие условию "Март" inData.Cells(iRow, 1) = iRow - 4 inData.Cells(iRow, 2) = rRow.Cells(2) inData.Cells(iRow, 3) = rRow.Cells(3) inData.Cells(iRow, 4) = rRow.Cells(4) inData.Cells(iRow, 5) = Year(rRow.Cells(5)) inData.Cells(iRow, 6) = CDate(rRow.Cells(6)) iRow = iRow + 1 End If Next rRow End Sub End Sub
[/vba]
urlchik, для одного листа "ПротКом", я написал макрос, для других попробуйте сами по образцу
[vba]
Код
Option Explicit
Sub Spisanie() ' макрос вставить в книгу Утиль.xlsm Dim outData As Worksheet Dim inData As Worksheet Dim rRow As Range Dim iRow&
Set outData = Workbooks("Инвентаризация.xlsx").Worksheets("инв") 'лист откуда берем Set inData = ThisWorkbook.Worksheets("ПротКом") 'лист куда вставляем в книге Утиль
iRow = 5 'первая строка с данными в протоколе For Each rRow In outData.UsedRange.Rows If rRow.Cells(10) = inData.Cells(4, 10) Then inData.Rows(iRow).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrBelow ' Вставляем строку 'переносим данные удовлетворяющие условию "Март" inData.Cells(iRow, 1) = iRow - 4 inData.Cells(iRow, 2) = rRow.Cells(2) inData.Cells(iRow, 3) = rRow.Cells(3) inData.Cells(iRow, 4) = rRow.Cells(4) inData.Cells(iRow, 5) = Year(rRow.Cells(5)) inData.Cells(iRow, 6) = CDate(rRow.Cells(6)) iRow = iRow + 1 End If Next rRow End Sub End Sub
С ДрагМетом разобрался. Теперь бы с актом разобраться. Чтоб по очереди вставлял данные из ПротКом и кидал на печать... Тут, как я понимаю нужен цикл... а это для меня еще страшнее :-(
С ДрагМетом разобрался. Теперь бы с актом разобраться. Чтоб по очереди вставлял данные из ПротКом и кидал на печать... Тут, как я понимаю нужен цикл... а это для меня еще страшнее :-(urlchik
urlchik, попробуйте преобразовать этот же макрос. For Each rRow In outData.UsedRange.Rows ... Next - это и есть цикл по строкам. Только добавьте в код строку селекта ячейки внутри таблицы. Типа [vba]
Код
inData.Range("B5").Select
[/vba]чтобы UsedRange правильно определился.
Макрорекодером запишите печать на ваш принтер(будет что-то типа ActiveWindow.SelectedSheets.PrintOut Copies:=1 ...) и вставьте в конце цикла, если надо печатать каждую строку отдельно(но тогда уберите добавление строк) или по выходу из цикла, если надо печатать все строки одновременно.
urlchik, попробуйте преобразовать этот же макрос. For Each rRow In outData.UsedRange.Rows ... Next - это и есть цикл по строкам. Только добавьте в код строку селекта ячейки внутри таблицы. Типа [vba]
Код
inData.Range("B5").Select
[/vba]чтобы UsedRange правильно определился.
Макрорекодером запишите печать на ваш принтер(будет что-то типа ActiveWindow.SelectedSheets.PrintOut Copies:=1 ...) и вставьте в конце цикла, если надо печатать каждую строку отдельно(но тогда уберите добавление строк) или по выходу из цикла, если надо печатать все строки одновременно.boa
Сообщение отредактировал boa - Вторник, 12.06.2018, 20:02