VBA错误13类型不匹配

时间:2015-03-25 18:43:08

标签: excel vba excel-vba

我在五个不同的工作簿上使用三张500K +行表,在我提取所需数据的路上,我想出了以下代码:

Sub Macro3()

Dim lngFirstRow As Long, lngLastRow As Long, cRow As Long, lngNextDestRow As Long
Dim jbs As Date
Dim shSrc As Worksheet, shDest As Worksheet

Set shDest = ActiveWorkbook.Sheets("Sheeet1")  '''Feuille de destination (sheetDestination)
lngNextDestRow = 2

   For Each shSrc In ThisWorkbook.Worksheets
   Nom = shSrc.Name
    If Nom <> "Sheeet2" Then
        With shSrc

            lngFirstRow = 2
            lngLastRow = .Cells.Find(What:="*", after:=.Cells.Cells(1), LookAt:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row

            For cRow = lngFirstRow To lngLastRow Step 1
                jbs = .Cells(cRow, 2)
                    If jbs <> .Cells(cRow - 1, 2).Value Then
                        .Range("B" & cRow).Copy Destination:=shDest.Range("A" & lngNextDestRow)
                        .Range("D" & cRow).Copy Destination:=shDest.Range("B" & lngNextDestRow)
                        .Range("D" & cRow + 1).Copy Destination:=shDest.Range("C" & lngNextDestRow)
                        .Range("E" & cRow).Copy Destination:=shDest.Range("D" & lngNextDestRow)
                        .Range("E" & cRow + 1).Copy Destination:=shDest.Range("E" & lngNextDestRow)
                        .Range("F" & cRow).Copy Destination:=shDest.Range("F" & lngNextDestRow)
                        .Range("F" & cRow + 1).Copy Destination:=shDest.Range("G" & lngNextDestRow)
                        lngNextDestRow = lngNextDestRow + 1
                    End If
            Next cRow
        End With
    End If
Next shSrc
End Sub

这就是我需要的。我只是一点一点地修改它,以便更快地处理五个工作簿。在这里,我在同一工作簿的新工作表中提取数据。

1)它似乎有效,但在整个过程完成后我不断得到&#34; jbs = .Cells(cRow,2)&#34;突出显示和错误13类型。知道如何解决这个问题吗?

2)有人向我提供了这一行:

lngLastRow = .Cells.Find(What:="*", after:=.Cells.Cells(1), LookAt:=xlPart,    LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row

有没有办法找到数据列表中最后一个填充行的编号?

2 个答案:

答案 0 :(得分:2)

  1. jbs被声明为Date。当您收到错误时,.Cells(cRow,2)指的是一个不包含可以转换为日期的日期或浮点数的单元格。
  2. 假设您不关心第2列中您正在查看的值,请替换:

                jbs = .Cells(cRow, 2)
                    If jbs <> .Cells(cRow - 1, 2).Value Then
    

    使用:

                    If .Cells(cRow, 2) <> .Cells(cRow - 1, 2) Then
    

    这消除了声明jbs和完全输入。

    1. lngLastRow = .UsedRange.Rows.Count

答案 1 :(得分:0)

在工作表上找到最后使用过的单元格的行

您正在使用的lngLastRow代码将返回工作表上最后一个使用过的单元格的一行。不一定是列中最后使用的单元格&#34; B&#34;您稍后将在代码中进行比较,例如:If jbs <> .Cells(cRow - 1, 2).Value Then...

在列&#34; B&#34;

中查找最后使用过的单元格的行

如果你想在列#34; B&#34;中找到最后使用的行。用这种方法使用:lngLastRow = .columns(2).Find(What:="*", LookAt:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False).Row
这应该摆脱循环错误,因为它将适当地停止它应该。


来源:

  1. Application.Columns Property
  2. Range.Find Method