Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 查找最后一个空行不适用于一张图纸_Vba_Excel - Fatal编程技术网

Vba 查找最后一个空行不适用于一张图纸

Vba 查找最后一个空行不适用于一张图纸,vba,excel,Vba,Excel,我心碎了。我花了几天的时间试图弄清楚为什么会发生这种情况: 填写用户表单后,会有一个按钮来填充相应的电子表格。工作表由第一个组合框(catSel.value)确定。要查找最后一个空行,我使用下面代码的rngSrch部分 如果Application.WorksheetFunction.CountA(Acell.EntireRow)=0返回为false,并且未运行firstBlankRow=Acell.row,则在一张工作表上执行 我尝试过删除工作表并创建一个新的工作表(复制一个有效的工作表),更改

我心碎了。我花了几天的时间试图弄清楚为什么会发生这种情况:

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

如果Application.WorksheetFunction.CountA(Acell.EntireRow)=0返回为false,并且未运行
firstBlankRow=Acell.row,则在一张工作表上执行

我尝试过删除工作表并创建一个新的工作表(复制一个有效的工作表),更改名称并注释/更改代码

知道为什么会这样吗?另外
ws.Range(“A”&firstBlankRow)=Me.equipId.value
返回时出现
运行时错误“1004”:对象“\u工作表”的方法“Range”失败

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

在代码的这一部分思考

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列):


如果您有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

这就行了!但是,它转到了A列中的第一个空单元格。有没有办法让它查找第一个完全空的行?@ShawnTaylor-根据您放入表格中的数据判断,如果行中有任何内容,我预计A列将始终填充,但我已经更新了答案,以适应一行中没有一列可以保证填充的情况。
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