2016-10-10 8 views
0

Hello StackOverflow сообщества,MS Excel VBA - Перебор столбцов и строк

Я должен признаться, что я прежде всего кода в MS Access и имеют очень ограниченный опыт MS Excel VBA.

Моя текущая цель: у меня есть «Отчет о расходах», который отправляется мне с выводами, этот отчет содержит много столбцов с разными именами учетных записей, которые могут быть заполнены или могут быть пустыми.

Мой первый шаг - начать с первой записи (строка 14; колонка АК содержит личную информацию об удержании), затем перейти к первой учетной записи вычета (счета вычитания начинаются с столбца L и пробега до столбца DG), если проверка каждая ячейка равна NULL, если она затем продолжает двигаться вправо. Если есть значение, мне нужно скопировать его во внешнюю книгу «Шаблон расчета», начиная со строки 2 (колонка J для самого вывода), а также копировать некоторую личную информацию из исходной строки в «Отчет о расходах», относящуюся к этому вычету (currRow: столбец C, E, F из «отчета о расходах» в «Таблицы расчета заработной платы», столбцы B, C, D).

Затем перейдите вправо, пока следующая ячейка не будет содержать значение, и повторите этот процесс в новой строке в шаблоне расчета заработной платы. После того, как был выполнен последний столбец (DG), я хочу перейти к следующей строке (строка 15) и снова запустить процесс до «LastRow» в моем «Used Range».

Я очень благодарен за любые отзывы, объяснения или ссылки, которые могут указывать на мою цель. Заранее благодарю за то, что вы нашли время, чтобы прочитать это!

Текущее состояние кода:

`< Sub LoadIntoPayrollTemplate() 
Dim rng As Range 
Dim currRow As Integer 
Dim UsedRng As Range 
Dim LastRow As Long 



Set UsedRng = ActiveSheet.UsedRange 
currRow = 14 


Set wb = ActiveWorkbook '"Expense Report" 
Set wb2 = MyFilepath '"Payroll Template" 


'Copied from another procedure, trying to use as reference   
LastRow = rng(rng.Cells.Count).Row 
Range("A14").Select 
Do Until ActiveCell.Row = LastRow + 1 
    If (ActiveCell.Value) <> prev Then 

     currRow = currRow + 1 

    End If 

    ActiveCell.Offset(1, 0).Select 
Loop 

With Worksheets("Collections") 
    lstRow = .Cells(.Rows.Count, 1).End(xlUp).Row 
    Set rng = .Range(.Cells(14, 12), Cells(lstRow, 111)) 
End With 

End Sub>` 

ответ

1

Следующий код может делать то, что вы после:

Sub LoadIntoPayrollTemplate() 
    Dim currRowIn As Long 
    Dim currColIn As Long 
    Dim currRowOut As Long 
    Dim wb As Workbook 
    Dim wb2 As Workbook 

    Set wb = ActiveWorkbook '"Expense Report" 
    Set wb2 = Workbooks.Open(Filename:=MyFilepath & "\" & "Payroll Template.xlsx") 
    'or perhaps 
    'Set wb2 = Workbooks.Open(Filename:=wb.path & "\" & "Payroll Template.xlsx") 

    With wb.ActiveSheet 
     currRowOut = 1 
     For currRowIn = 14 To .UsedRange.Row + .UsedRange.Rows.Count - 1 
      For currColIn = 12 To 111 
       If Not IsEmpty(.Cells(currRowIn, currColIn)) Then 
        currRowOut = currRowOut + 1 
        'I'm not sure which worksheet you want to write the output to 
        'so I have just written it to the first one in Payroll Template 
        wb2.Worksheets(1).Cells(currRowOut, "J").Value = .Cells(currRowIn, currColIn).Value 
        wb2.Worksheets(1).Cells(currRowOut, "B").Value = .Cells(currRowIn, "C").Value 
        wb2.Worksheets(1).Cells(currRowOut, "C").Value = .Cells(currRowIn, "E").Value 
        wb2.Worksheets(1).Cells(currRowOut, "D").Value = .Cells(currRowIn, "F").Value 

       End If 
      Next 
     Next 
    End With 

    'Save updated Payroll Template 
    wb2.Save 

End Sub 
+0

работал отлично! Большое спасибо – Ace16150s