Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.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
Excel电子表格检查哪一行包含数据_Excel_Vba - Fatal编程技术网

Excel电子表格检查哪一行包含数据

Excel电子表格检查哪一行包含数据,excel,vba,Excel,Vba,我有一个vb.net应用程序,可以从中打开包含数据的excel电子表格。我复制所有数据并将其插入sql server。我在查找最后一排时遇到了一个小问题。我现在是这样做的 Dim lastRow As Long = 0 lastRow = xlws.Cells.SpecialCells(XlCellType.xlCellTypeLastCell, Type.Missing).Row 这会为我找到最后一行,但通常情况下,电子表格可能包含与我试图插入到表中的内容无关的数据-在这种情况下,它是电子表

我有一个vb.net应用程序,可以从中打开包含数据的excel电子表格。我复制所有数据并将其插入sql server。我在查找最后一排时遇到了一个小问题。我现在是这样做的

Dim lastRow As Long = 0
lastRow = xlws.Cells.SpecialCells(XlCellType.xlCellTypeLastCell, Type.Missing).Row
这会为我找到最后一行,但通常情况下,电子表格可能包含与我试图插入到表中的内容无关的数据-在这种情况下,它是电子表格最后一行的保密声明。所以我要做的是将最后一行设置为实际数据的最后一行。这就是它看起来的样子

在本例中,我希望最后一行被识别为第11行,而不是第13行。问题是——报告的格式可能略有不同(对于机密性声明),因此经常会从A列或B列开始合并(可能),或者他们可能会将其写到其他地方

另一件事是数据的A列和B列(在第11行结束)有时可能没有值。我该怎么做这样的事

编辑: 这就是我想说的-恨后藤但是

LastRowCheck:

  If CStr(excel.Cells(lastRow, 4).Value) = "" And CStr(excel.Cells(lastRow, 5).value) = "" And CStr(excel.Cells(lastRow, 6).value) = "" Then
                lastRow += -1
  goto LastRowCheck
  End If
那么:

Sub TheTrueLastRow()
    Dim i As Long

    For i = 1 To Rows.Count
        If Cells(i, "B").Value = "" Or Cells(i, "E").Value = "" Then
            lastRow = i - 1
            Exit For
        End If
    Next i
    MsgBox lastRow
End Sub

那么:

Sub TheTrueLastRow()
    Dim i As Long

    For i = 1 To Rows.Count
        If Cells(i, "B").Value = "" Or Cells(i, "E").Value = "" Then
            lastRow = i - 1
            Exit For
        End If
    Next i
    MsgBox lastRow
End Sub

可能是这样的:

Sub Test()

    MsgBox LastRow(ThisWorkbook.Worksheets(2))

End Sub

Public Function LastRow(wrkSht As Worksheet) As Long

    Dim rLastCell As Range
    Dim lLastCol As Long, lLastRow As Long
    Dim rCol As Range

    On Error Resume Next
    With wrkSht
        lLastCol = .Cells.Find("*", , , , xlByColumns, xlPrevious).Column
        lLastRow = .Cells.Find("*", , , , xlByRows, xlPrevious).Row

        If lLastCol = 0 Then lLastCol = 1
        If lLastRow = 0 Then lLastRow = 1

        Set rLastCell = .Cells(lLastRow, lLastCol)

        'Look at each column, if the last cell is merged then look up from there,
        'otherwise leave the last row as it is.
        For Each rCol In .Range(.Cells(rLastCell.Row, 1), rLastCell).Columns
            If rCol.MergeCells Then
                LastRow = rCol.End(xlUp).Row
                Exit For
            Else
                LastRow = rLastCell.Row
            End If
        Next rCol
    End With
    On Error GoTo 0

End Function
编辑:刚刚注意到,它将在此时失败(如果最后一列比前两列短)

另一件事是数据的A列和B列(在第11行结束)可能会 有时没有价值。我该怎么做这样的事


也许是这样的:

Sub Test()

    MsgBox LastRow(ThisWorkbook.Worksheets(2))

End Sub

Public Function LastRow(wrkSht As Worksheet) As Long

    Dim rLastCell As Range
    Dim lLastCol As Long, lLastRow As Long
    Dim rCol As Range

    On Error Resume Next
    With wrkSht
        lLastCol = .Cells.Find("*", , , , xlByColumns, xlPrevious).Column
        lLastRow = .Cells.Find("*", , , , xlByRows, xlPrevious).Row

        If lLastCol = 0 Then lLastCol = 1
        If lLastRow = 0 Then lLastRow = 1

        Set rLastCell = .Cells(lLastRow, lLastCol)

        'Look at each column, if the last cell is merged then look up from there,
        'otherwise leave the last row as it is.
        For Each rCol In .Range(.Cells(rLastCell.Row, 1), rLastCell).Columns
            If rCol.MergeCells Then
                LastRow = rCol.End(xlUp).Row
                Exit For
            Else
                LastRow = rLastCell.Row
            End If
        Next rCol
    End With
    On Error GoTo 0

End Function
编辑:刚刚注意到,它将在此时失败(如果最后一列比前两列短)

另一件事是数据的A列和B列(在第11行结束)可能会 有时没有价值。我该怎么做这样的事


如果您有一个列,该列在表的每一行中都有数据,并且该列与所需数据之间有一个空单元格

xlws.Range(“B1”).End(Excel.XlDirection.xlDown).Row

或者,如果列的末尾没有不需要的数据,则可以采用自底向上的方法

范围(“B”&xlws.Rows.Count).End(Excel.XlDirection.xlUp).Row


如果您有一个列,该列在表的每一行中都有数据,并且该列与所需数据之间有一个空单元格

xlws.Range(“B1”).End(Excel.XlDirection.xlDown).Row

或者,如果列的末尾没有不需要的数据,则可以采用自底向上的方法

范围(“B”&xlws.Rows.Count).End(Excel.XlDirection.xlUp).Row


快速和肮脏:找到每行的最后一行,然后使用
Max
查找最新的行,忽略第13行中的数据类型,检查
Max
最后一行是否合并。如果您可以定义您(人类)如何使用数据确定最后一行,我们可以对VBA进行编码以进行相同的确定@Gary的学生-我理解,所以基本上我想将最后一行设置为最后一行,其中first/last/dob列包含数据-因为这些列总是有一些内容,您会尝试
lastRow=xlws.Range(“C1”).CurrentRegion.Rows.Count
(将其调整到您确实期望某些值的位置)…@A.S.H请参见editquick and dirty:查找每行的最后一行,然后使用
Max
查找最新的行,忽略第13行中的数据类型,检查
Max
最后一行是否合并。如果您可以定义您(人类)如何使用数据确定最后一行,我们可以对VBA进行编码以进行相同的确定@Gary的学生-我理解,所以基本上我想将最后一行设置为最后一行,其中first/last/dob列包含数据-因为这些列总是有一些内容,您会尝试
lastRow=xlws.Range(“C1”).CurrentRegion.Rows.Count
(将其调整到您确实期望某些值的位置)…@A.S.H see edit提出了类似的建议,请参见编辑。谢谢你,我也想出了类似的东西,请看编辑。谢谢你