2016-10-19 5 views
1

회계 회계 분개 항목을 회계 원장에 전기하는 작업을 자동화하고 새 행을 추가 한 후 오프셋 작업에 어려움을 겪고 있습니다. 내 통합 문서에는 Journal 및 Ledger라는 두 개의 시트가 있으며 저의 목표는 각 저널 항목을 읽고 새 행을 추가하여 원장의 올바른 T- 계정에 항목을 추가하는 것입니다. 대부분의 복사 항목이 작동하지만 옵셋이 변경되면 매크로가 문제가됩니다. 다른 T- 계정은 이전 계정이 얼마나 많은지에 따라 서로 다른 오프셋 값이 필요하기 때문에 더 나은 옵션으로 .Find을 사용하는 것을 고려하고있었습니다. 이 오프셋 행 문제를 어떻게 해결할 수 있습니까?Excel VBA에서 대안 상쇄

여기는 Excel File에 대한 링크이며, 아래는 VBA의 코드입니다.

Sub RowInsert() 

Dim offset As Integer 
offset = 0 

Dim counter As Integer 
For counter = 0 To 1 

Dim account As String 
account = Worksheets("Journal").Cells(counter + 2, 2) 


Dim a As Double 

If Worksheets("Journal").Cells(counter + 2, 2) = "Cash" Then 
Worksheets("Ledger").Rows(4 + offset).Insert Shift:=xlDown 

offset = offset + 1 

Worksheets("Ledger").Cells(6 + offset, 1).Value = Worksheets("Journal").Cells(counter + 2, 1).Value 

    If Worksheets("Journal").Cells(counter + 2, 3).Value = Null Then 
    Worksheets("Ledger").Cells(6 + offset, 3).Value = Worksheets("Journal").Cells(counter + 2, 4).Value 
    Else 
    Worksheets("Ledger").Cells(6 + offset, 2).Value = Worksheets("Journal").Cells(counter + 2, 3).Value 
    End If 

ElseIf Worksheets("Journal").Cells(counter + 2, 2) = "Equipment" Then 
Worksheets("Ledger").Rows(8 + offset).Insert Shift:=xlDown 

offset = offset + 1 

Worksheets("Ledger").Cells(6 + offset, 1).Value = Worksheets("Journal").Cells(counter + 2, 1).Value 

    If Worksheets("Journal").Cells(counter + 2, 3).Value = Null Then 
    Worksheets("Ledger").Cells(6 + offset, 3).Value = Worksheets("Journal").Cells(counter + 2, 4).Value 
    Else 
    Worksheets("Ledger").Cells(6 + offset, 2).Value = Worksheets("Journal").Cells(counter + 2, 3).Value 
    End If 

End If 
Next counter 
End Sub 

EDIT. Range.Find 솔루션을 찾으려면 어떻게이 범위/셀 결과에 액세스 할 수 있습니까? 지금은 "런타임 오류 '91': 개체 변수 또는 With 블록 변수가 설정되지 않았습니다". 편집 된 질문에

Sub RowInsert() 

Dim counter As Integer 
For counter = 0 To 1 

Dim account As String 
account = Worksheets("Journal").Cells(counter + 2, 2) 


Dim a As Double 

If Worksheets("Journal").Cells(counter + 2, 2) = "Cash" Then 

    Dim entries As Integer 
    entries = 0 
    Dim Header As Range 
    Dim row As Long 

    With Worksheets("Ledger").Range("a1:a100") 

     Set Header = .Find("Cash") 
     ` Error here when try to use the Range Header 
     row = Header.row + entries 

     Rows(row).Insert Shift:=xlDown 

     Cells(row, 1) = Worksheets("Journal").Cells(counter + 2, 1).Value 

    End With 

End If 
Next counter 

End Sub 
+1

'Find '는 계정을 서로 아래에 두어야하는 경우 좋은 생각입니다. '.End (xlDown)'메소드를 살펴보십시오. 첫 번째 행을 찾으면 계정의 마지막 행을 찾는 데 도움이됩니다. – arcadeprecinct

+0

'.End (xlDown)'이 그 아래의 다음 계정으로 계속 연결되지 않게하려면 어떻게해야합니까? – cpage

+0

계정간에 빈 행이 하나 이상 있다고 가정합니다. '.End (xlDown)'은 비어 있지 않은 셀에 적용되면 멈 춥니 다. 그래서 열의 맨 마지막 줄을 찾는 데 사용해서는 안됩니다. – arcadeprecinct

답변

0

답변 :

.Find 아무것도 찾아 Nothing을 반환하지 않았기 때문에 나타나는 오류입니다. Nothing의 속성에 액세스하려고하면 "개체 변수 또는 With 블록 변수가 설정되지 않았습니다"오류가 발생합니다.

.Find 잘 병합 된 셀을 처리하지 못합니다. 귀하의 경우에있어 쉬운 솔루션은 전체 병합 된 셀을 포함하도록 검색 범위를 확장하는 것입니다. 재산 와 변수 row 사이에 혼란이 없기 때문에

Dim Header As Range 
Dim lastRow As Long 

With Worksheets("Ledger").Columns("A:C") 

    Set Header = .Find("Cash") 
    lastRow = Header.Row + entries 
    'I would prefer something like 
    'lastRow = Worksheets("Ledger").Cells(Header.Row, "B").End(xlDown).Row (not tested) 

    Rows(lastRow).Insert Shift:=xlDown 

    Worksheets("Ledger").Cells(lastRow, 1) = Worksheets("Journal").Cells(counter + 2, 1).Value 
End With 

나는 행 변수의 이름을 바 꾸었습니다. VBE가 소문자로 속성을 설정함에 따라 이미 혼란 스럽다는 것을 알 수 있습니다.