2016-10-16 2 views
-1

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

После заполнения формы пользователя есть кнопка для заполнения соответствующей электронной таблицы. Лист определяется первым полем со списком (catSel.value). Чтобы найти последнюю пустую строку, я использую часть кода rngSrch ниже.

На одном листе If Application.WorksheetFunction.CountA(Acell.EntireRow) = 0 возвращается как ложное и firstBlankRow = Acell.row не запускается.

Я пробовал удаление листа и создание нового (копирование, которое работает), изменение имени и комментирование/изменение кода.

Любые идеи, почему это происходит? Также ws.Range("A" & firstBlankRow) = Me.equipId.value возвращается с Run-time Error ‘1004’: method ‘Range’ of object ’_worksheet’ failed

Private Sub AddCont_Click() 

Dim firstBlankRow As Long 
Dim ws As Worksheet 
Dim srchRng As Range 
Dim Acell As Range 

Set ws = Worksheets(CatSel.value) 

On Error GoTo Err 


With ws 
    Set srchRng = .UsedRange.Columns(1).Find("") 
    If Not srchRng Is Nothing Then 
     Set srchRng =.UsedRange.Columns(1).SpecialCells(xlCellTypeBlanks) 
     For Each Acell In srchRng 
      If Application.WorksheetFunction.CountA(Acell.EntireRow) = 0  Then 
       firstBlankRow = Acell.row 
       Exit For 

      End If 

     Next 
    Else 
     If Application.WorksheetFunction.CountA(Cells(.Rows.Count, 1).EntireRow) = 0 Then 
      MsgBox "Please start a new sheet" 
     Else 
      firstBlankRow = .UsedRange.SpecialCells(xlCellTypeBlanks).row + 1 

     End If 
    End If 



'Equipment ID 
    ws.Range("A" & firstBlankRow) = Me.equipId.value 
'Parent or Next Level 
    ws.Range("B" & firstBlankRow) = Me.NextLev.value 
'Keyword 
    ws.Range("C" & firstBlankRow) = Me.KeySel.value 
'Cost Center 
    ws.Range("E" & firstBlankRow) = Me.CostSel.value 
'Department 
    ws.Range("F" & firstBlankRow) = Me.DepartSel.value 
'Location 1 
    ws.Range("G" & firstBlankRow) = Me.Loc1.value 
'Location 2 
    ws.Range("H" & firstBlankRow) = Me.Loc2.value 
'Location 3 
    ws.Range("I" & firstBlankRow) = Me.Loc3.value 
'Location 4 
    ws.Range("J" & firstBlankRow) = Me.Loc4.value 
'Beginning of specs 
'L5 
    ws.Range("L" & firstBlankRow) = Me.L3Sel.value 
'M5 
    ws.Range("M" & firstBlankRow) = Me.M3Sel.value 
'N5 
    ws.Range("N" & firstBlankRow) = Me.N3sel.value 
'O5 
    ws.Range("O" & firstBlankRow) = Me.O3Sel.value 
'P5 
    ws.Range("P" & firstBlankRow) = Me.P3Sel.value 
'Q5 
    ws.Range("Q" & firstBlankRow) = Me.Q3Sel.value 
'R5 
    ws.Range("R" & firstBlankRow) = Me.R3Sel.value 
'S5 
    ws.Range("S" & firstBlankRow) = Me.S3Sel.value 
'T5 
    ws.Range("T" & firstBlankRow) = Me.T3Sel.value 
'U5 
    ws.Range("U" & firstBlankRow) = Me.U3Sel.value 

    MsgBox ("successfully Added") 

End With 

Err: MsgBox ("something went wrong") 

End Sub 

ответ

1

Я думаю в этой части кода

Set srchRng = .UsedRange.Columns(1).Find("") 
If Not srchRng Is Nothing Then 
    Set srchRng =.UsedRange.Columns(1).SpecialCells(xlCellTypeBlanks) 
    For Each Acell In srchRng 
     If Application.WorksheetFunction.CountA(Acell.EntireRow) = 0  Then 
      firstBlankRow = Acell.row 
      Exit For 

     End If 

    Next 
Else 
    If Application.WorksheetFunction.CountA(Cells(.Rows.Count, 1).EntireRow) = 0 Then 
     MsgBox "Please start a new sheet" 
    Else 
     firstBlankRow = .UsedRange.SpecialCells(xlCellTypeBlanks).row + 1 

    End If 
End If 

вы пытаетесь найти первую пустую строку, так что вы можете вставить новую запись.

Если да, то я предлагаю вам заменить этот код:

If IsEmpty(.Cells(.Rows.Count, 1)) Then 
    firstBlankRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 
Else 
    MsgBox "Please start a new sheet" 
    Exit Sub 
End If 

Этот код будет выглядеть последний непустой ячейки в столбце А и установить переменную firstBlankRow, чтобы указать на строку после нее.


Если ваши записи иногда имеют пустое значение в столбце А, но у вас есть еще один столбец, который может быть гарантирована всегда имеет значение, просто изменить код выше, чтобы сослаться на этот столбец вместо в колонку 1. Например (Предполагается, что столбец D всегда заполняется):

If IsEmpty(.Cells(.Rows.Count, "D")) Then 
    firstBlankRow = .Cells(.Rows.Count, "D").End(xlUp).Row + 1 
Else 
    MsgBox "Please start a new sheet" 
    Exit Sub 
End If 

Если у вас есть записи, где нет столбца гарантированно не пусто, возможно, этот код будет работать:

firstBlankRow = .Rows.Count + 1 
If IsEmpty(.Cells(.Rows.Count, "A")) Then 
    For firstBlankRow = .Cells(.Rows.Count, "A").End(xlUp).Row + 1 To .Rows.Count 
     If Application.WorksheetFunction.CountA(.Rows(firstBlankRow)) = 0 Then 
      Exit For 
     End If 
    Next 
End If 
If firstBlankRow = .Rows.Count + 1 Then 
    MsgBox "Please start a new sheet" 
    Exit Sub 
End If 
+0

Так что это работал! НО, Он попал в первую пустую ячейку в столбце A. Любой способ заставить это искать первую полностью пустую строку? –

+0

@ShawnTaylor - Судя по данным, которые вы помещали в листы, я ожидал, что столбец A будет всегда заполняться, если что-то было в строке, но я обновил ответ, чтобы удовлетворить ситуацию, когда ни один из столбцов в строке может быть гарантировано заполнено. – YowE3K