查找最后一个空行仅仅适用于一个工作表

时间:2016-10-16 00:51:24

标签: vba excel-vba excel

我的思绪被打破了。我花了试图弄清楚为什么会发生这种情况:

填写用户表单后,会有一个按钮来填充相应的电子表格。工作表由第一个组合框(catSel.value)确定。要查找最后一个空行,请使用下面代码的rngSrch部分。

在一张工作表If Application.WorksheetFunction.CountA(Acell.EntireRow) = 0上显示为false并且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 个答案:

答案 0 :(得分: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

该代码将查找A列中的最后一个非空单元格,并将firstBlankRow变量设置为指向其后的行。

如果您的记录有时在A列中有空值,但您有另一列可以保证始终具有值,只需更改上述代码即可引用该列而不是第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

如果您有 no 列保证非空的记录,则此代码可能会有效:

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