2016-10-19 10 views
1

会計勘定転記の転記を自動化しようとしていますが、新しい行を追加した後でoffsettingに苦労しています。私のワークブックにはJournalとLedgerという2つのシートがあります。私の目標は、各ジャーナルエントリを読んで、新しい行を追加して元帳の正しいTアカウントにエントリを追加することです。ほとんどのコピーエントリは機能しますが、マクロはオフセットが変更されると問題になります。私はより良いオプションとして.Findを使用することを検討していました。なぜなら、異なるTアカウントは、それ以前のアカウントの数に応じて異なるオフセット値を必要とするからです。このオフセット行の問題を解決するにはどうすればよいですか?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ソリューションを追求する場合、どのようにこのRange/cell結果にアクセスできますか?今すぐ "実行時エラー '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

アカウント間に少なくとも1つの空の行があると仮定します。 '.End(xlDown)'は、(空でないセルに適用された場合に)そこで停止します。なぜなら、列の最後の行を見つけるために使用すべきではないからです。 – arcadeprecinct

答えて

0

回答:

.Findは何かを見つけるとNothingを返さなかったため、表示されるエラーです。 Nothingのプロパティにアクセスしようとすると、 "Object variableまたはWithブロック変数が設定されていません"というエラーが表示されます。

.Findよく結合されたセルを処理しません。あなたの場合の簡単な解決策は、マージされたセル全体を含むように検索範囲を拡張することです。

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 

財産とあなたの変数rowの間に混乱がありませんので、私は、行変数の名前を変更しました。プロパティが小文字に設定されているので、VBEがすでに混乱していることがわかります。