会計勘定転記の転記を自動化しようとしていますが、新しい行を追加した後で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
あなたがお互いの下にアカウントを持っている必要がある場合、 '.Find'はいいアイデアのように聞こえます。 '.End(xlDown)'メソッドを見てください。最初の行を見つけたら、アカウントの最後の行を見つけるのに役立ちます。 – arcadeprecinct
'.End(xlDown)'がその下の次のアカウントに続かないようにするには? – cpage
アカウント間に少なくとも1つの空の行があると仮定します。 '.End(xlDown)'は、(空でないセルに適用された場合に)そこで停止します。なぜなら、列の最後の行を見つけるために使用すべきではないからです。 – arcadeprecinct