2016-06-06 8 views
2

Я пытаюсь выполнить простые данные, введенные в два текстовых поля в пользовательской форме, а затем добавить эти данные в таблицу с именем «AvantAct». Я хочу, чтобы данные вводились в первую пустую строку в таблице каждый раз, когда выполняется пользовательская форма. Интересно, что в первый раз, когда я это сделал, он работал безупречно. Однако после выхода из книги, а затем, возвращаясь к ней позже, я, похоже, получаю: -Ошибка времени выполнения '91' При добавлении данных пользовательской формы в таблицу

Ошибка времени выполнения '91': переменная объекта или с переменной блока не установлена.

Когда я отладка следующая строка подсвечиваются:

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

Я хотел бы добавить, что моя таблица в настоящее время является пустым (только что установлен) стол. Он имеет 8 столбцов (с заголовками), одну пустую строку (от вставки) и общую строку.

Любые предложения?

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

Есть ли еще кода, которого нет здесь? Это работает для меня, разница заключается в том, что у меня не было 'Me.TxtDate.Value', когда он останавливается там, отображаются ли текущие окна в ближайшее окно? '? Me.TxtDate.Value' –

+0

Единственным другим кодом является установка значения по умолчанию и фокуса для txtboxes. И нет, это не показывает значение – Aaron

+0

Можете ли вы показать код, который у вас есть? – Aaron

ответ

0

Проблема возникает из-за наличия пустого стола для начала.

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

Поскольку граф был не больше нуля (он равен нулю) lrow никогда не установлен, следовательно, ошибка.

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

Кроме того, ваш вопрос спрашивает: -

Я хочу, чтобы данные, введенные в первой пустой строке

Код не делает этого, код проверки только последнюю строку и добавление строки, если она еще не была пуста, поэтому в списке из 5 строк третья строка была пустой, третья строка не будет использоваться, но вместо нее будет добавлена ​​строка внизу. Нижеследующее будет делать то, что вы ожидаете: -

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

Аах там мы идем. Это работает точно так же, как я надеялся. Я фактически сузил его до той же самой причины, о которой вы указали, но еще не получил ее полностью исправленной. Спасибо за отличную работу! – Aaron

+0

Теперь, есть способ ссылаться на значение в ячейке в одной из строк, которая была создана таким образом? Например, если я проверил этот процесс и добавил одну (единственную) строку в таблицу. Затем я хотел добавить еще одну строку, используя тот же процесс, за исключением того, что вместо использования значения txtbox я хотел использовать значение из ячейки в исходной строке. – Aaron

+0

Вы можете использовать статическую переменную (объявляйте как 'Static' вместо' dim'), чтобы запомнить последнюю строку и использовать ее таким образом. Если вы застряли, начните новый вопрос, чтобы мы могли видеть, как далеко вы добрались :) –