2016-06-06 7 views
2

Ich versuche, einfache Daten in zwei Textfelder in einem Benutzerformular eingegeben und dann diese Daten zu einer Tabelle mit dem Namen "AvantAct" hinzugefügt werden. Ich möchte die Daten in die erste leere Zeile in der Tabelle jedes Mal eingegeben werden, wenn das Benutzerformular ausgeführt wird. Interessanterweise funktionierte das erste Mal, als ich das tat, einwandfrei. Aber nachdem ich die Arbeitsmappe verlassen habe und dann später wieder darauf zugreife, scheint ich folgendes zu bekommen: -Laufzeitfehler '91' Beim Hinzufügen von Benutzerformulardaten zu Tabelle

Laufzeitfehler '91': Objektvariable oder Mit Blockvariable nicht gesetzt.

Wenn ich debuggen die folgende Zeile markiert ist:

tbl.DataBodyRange(lrow2, 1). Value = Me.TxtDate.Value 

ich, dass meine Tabelle derzeit hinzufügen sollte ein leer ist (frisch eingeführt) Tisch. Es hat 8 Spalten (mit Kopfzeilen), eine leere Zeile (vom Einfügen) und eine Gesamtzeile.

Irgendwelche Vorschläge?

Private Sub SubmitButton_Click() 

Dim ws As Worksheet 
Dim tbl As ListObject 
Dim TxtDate As Date 
Dim TxtPmt As Currency 
Dim col As Integer 
Dim lrow As Range 
Dim lrow2 As Long 


Set ws = ActiveWorkbook.Worksheets("Avant") 
Set tbl = ws.ListObjects.Item("AvantAct") 

If tbl.ListRows.Count > 0 Then 
    Set lrow = tbl.ListRows(tbl.ListRows.Count).Range 
    For col = 1 To lrow.Columns.Count 
     If Trim(CStr(lrow.Cells(1, col).Value)) <> "" Then 
      tbl.ListRows.Add 
      Exit For 
     End If 
    Next col 
End If 

lrow2 = tbl.ListRows.Count 
tbl.DataBodyRange(lrow2, 1).Value = Me.TxtDate.Value 
tbl.DataBodyRange(lrow2, 3).Value = Me.TxtPmt.Value 

Unload Me 

End Sub 
+0

Gibt es mehr Code, der nicht hier ist? Es funktioniert für mich der Unterschied ist, dass ich 'Me.TxtDate.Value' nicht hatte, wenn es dort stoppt, zeigt das unmittelbare Fenster Ihnen den Wert an? '? Me.TxtDate.Value' –

+0

Der einzige andere Code ist das Setzen des Standardwertes und Fokus für die Txtboxen. Und nein, es zeigt nicht den Wert – Aaron

+0

Können Sie den Code zeigen, den Sie arbeiten? – Aaron

Antwort

0

Das Problem kommt von einer leeren Tabelle zu Beginn mit.

If tbl.ListRows.Count > 0 Then 
    Set lrow = tbl.ListRows(tbl.ListRows.Count).Range 
    ... 
End If 

Da die Zählung nicht größer als Null ist (es Null war) waren lrow nie eingestellt wurde, daher die Fehler.

If tbl.ListRows.Count = 0 Then 
    tbl.ListRows.Add 
else 
    Set lrow = tbl.ListRows(tbl.ListRows.Count).Range 
    ... 
End If 

Darüber hinaus Ihre Frage stellt: -

Ich möchte die Daten in die erste leere Zeile

eingegeben

Der Code wird dies nicht tun, wird der Code nur die Überprüfung letzte Reihe, und eine Reihe hinzufügend, wenn sie nicht bereits leer war, also in einer Liste, wo aus 5 Reihen die dritte Reihe leer war, die dritte Reihe nicht benutzt würde, aber eine Reihe unten würde stattdessen hinzugefügt werden. Das folgende würde tun, was Sie erwarten: -

Private Sub SubmitButton_Click() 
Dim ws   As Worksheet 
Dim tbl   As ListObject 
Dim TxtDate  As Date 
Dim TxtPmt  As Currency 
Dim col   As Integer 
Dim lrow  As Range 
Dim lrow2  As Long 
Dim BlnYesNo As Boolean 

Set ws = ActiveWorkbook.Worksheets("Avant") 
Set tbl = ws.ListObjects.Item("AvantAct") 

If tbl.ListRows.Count = 0 Then 
    tbl.ListRows.Add 
    lrow2 = 1 
Else 
    For lrow2 = 1 To tbl.ListRows.Count 
     Set lrow = tbl.ListRows(lrow2).Range 

      'If it stays true, we must add a row 
      BlnYesNo = True 

      For col = 1 To lrow.Columns.Count 
       If Trim(CStr(lrow.Cells(1, col).Value)) <> "" Then 
        BlnYesNo = False 
        Exit For 
       End If 
      Next 

      If BlnYesNo Then Exit For 

     Set lrow = Nothing 
    Next 

    'If its false then all rows had data and we need to add a row 
    If Not BlnYesNo Then 
     tbl.ListRows.Add 
     lrow2 = tbl.ListRows.Count 
    End If 

End If 

tbl.DataBodyRange(lrow2, 1).Value = "A" 
tbl.DataBodyRange(lrow2, 3).Value = "B" 

Set tbl = Nothing 
Set ws = Nothing 

End Sub 
+0

Aahh da gehen wir. Das funktioniert genau so, wie ich es mir erhofft hatte. Ich hatte es tatsächlich auf die gleiche Wurzel eingegrenzt, weil Sie darauf hingewiesen hatten, aber es noch nicht vollständig behoben hatte. Danke für die hervorragende Arbeit! – Aaron

+0

Gibt es nun eine Möglichkeit, einen Wert in einer Zelle in einer der so erstellten Zeilen zu referenzieren? Zum Beispiel, wenn ich diesen Prozess durchlaufen und eine (die einzige) Zeile zu meiner Tabelle hinzugefügt habe. Dann wollte ich mit demselben Prozess eine weitere Zeile hinzufügen, mit der Ausnahme, dass ich anstelle eines txtbox-Wertes einen Wert aus einer Zelle in der ursprünglichen Zeile verwenden wollte. – Aaron

+0

Sie könnten eine statische Variable verwenden (deklarieren Sie als 'Static' anstelle von' Dim'), um sich an die letzte Zeile zu erinnern und sie so zu verwenden. Wenn Sie stecken bleiben, beginnen Sie eine neue Frage, damit wir sehen können, wie weit Sie gekommen sind :) –

Verwandte Themen