2016-10-19 1 views
1

Ich versuche zu automatisieren Buchung Buchungsjournaleinträge zu einem Hauptbuch, und habe Probleme mit dem Offset, nachdem ich neue Zeilen hinzufügen. Meine Arbeitsmappe hat zwei Blätter, Journal und Ledger, und mein Ziel ist es, jeden Journaleintrag zu lesen und den Eintrag dem richtigen T-Account im Journal hinzuzufügen, indem ich eine neue Zeile hinzufüge. Die meisten der kopierten Einträge funktionieren, aber das Makro führt zu Problemen, sobald sich die Verschiebung ändert. Ich habe erwogen, .Find als eine bessere Option zu verwenden, da verschiedene T-Konten unterschiedliche Verrechnungswerte benötigen, je nachdem wie viele vorherige Konten über ihnen liegen. Wie kann ich dieses Offset-Zeilenproblem lösen?Offset-Problemumgehung in Excel VBA

Hier ist ein Link zu der Excel File, und unten ist mein Code in 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 

BEARBEITEN. Wenn ich die Range.Find Lösung verfolgen möchte, wie kann ich auf dieses Range/Zelle-Ergebnis zugreifen? Jetzt bekomme ich "Laufzeitfehler '91': Objektvariable oder Mit Blockvariable nicht gesetzt".

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' klingt wie eine gute Idee, wenn Sie die Konten unter einander haben müssen. Schauen Sie sich die '.End (xlDown)' Methode an. Es wird Ihnen helfen, die letzte Zeile eines Kontos zu finden, sobald Sie die erste Zeile gefunden haben. – arcadeprecinct

+0

Wie würde ich verhindern, dass ".End (xlDown)" weiter zum nächsten darunter liegenden Konto geht? – cpage

+0

Ich würde annehmen, dass Sie mindestens eine leere Zeile zwischen Konten haben. '.End (xlDown)' stoppt dort (wenn es auf eine nicht leere Zelle angewendet wird), deshalb sollte es nicht verwendet werden, um die allerletzte Zeile in einer Spalte zu finden. – arcadeprecinct

Antwort

0

Antwort auf Ihre editierten Frage:

Der Fehler, den Sie erhalten, weil .Find nichts gefunden und kehrte Nothing. Wenn Sie versuchen, auf die Eigenschaften von Nothing zuzugreifen, wird die Fehlermeldung "Object variable oder With block variable not set" ausgegeben.

.Find nicht mit verbundenen Zellen gut umgehen. Die einfache Lösung in Ihrem Fall ist es, den Suchbereich so zu erweitern, dass er die gesamte verbundene Zelle enthält.

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 

änderte es den Namen des Zeilenvariable, so dass keine Verwechslung zwischen dem Eigentum und Ihren Variable row gibt. Sie können sehen, dass die VBE bereits verwirrt ist, da sie die Eigenschaft in Kleinbuchstaben setzt.