EXCEL VBA调试:搜索整个工作簿

时间:2018-08-21 07:53:31

标签: excel vba

我正在为Excel中的数据库处理VBA宏。我有一个工作表,用于存储诸如姓名,电子邮件等信息。(遗憾的是,这些工作表未在所有工作表中始终放在同一列中,但是电子邮件地址的范围是“ B:F”) ,此数据库分为多个工作表。除了所有这些工作表,我还得到了另一个工作表(下面的代码中为“ Sheet2”),该工作表存储了已分配给我的时事通讯的所有电子邮件地址。 (此工作表中唯一的信息是“ A”列中的电子邮件地址)。

我正在使用的VBA应该遍历订阅了新闻通讯(“ Sheet2”)的所有电子邮件地址,并检查它们是否存储在“数据库” 中-其他表。如果不是,则发出警告-在电子邮件旁边的单元格中写“ NOTFOUND”

由于某种原因,VBA在行上给我一个运行时错误“对象不支持此属性或方法”:

使用表格(sheetIndex).Range(“ B:F”)

最初,我认为这样做的原因是我尚未激活表格,但仍然出现错误。

到目前为止我想出的代码:

Sub Search_for_emails()

Dim scanstring As String
Dim foundscan As Range
Dim lastRowIndex As Long
Dim ASheet As Worksheet

Set ASheet = Sheets("Sheet2")

lastRowInteger = ASheet.Range("A1", ASheet.Range("A1").End(xlDown)).Rows.Count

For rowNum = 1 To lastRowInteger
    scanstring = Sheets("Sheet2").Cells(rowNum, 1).Value
    For sheetIndex = 1 To ThisWorkbook.Sheets.Count
        Sheets(sheetIndex).Activate
        If Sheets(sheetIndex).Name <> "Sheet2" Then
            With Sheets(sheetIndex).Range("B:F")
                Set foundscan = .Find(What:=scanstring, LookIn:=xlValues, LookAt:=xlWhole, _
                    SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                    MatchCase:=False, SearchFormat:=False)
            End With
            If foundscan Is Nothing Then
                ASheet.Cells(rowNum, 2).Value = "NOTFOUND"

            Else

                ' ASheet.Cells(rowNum, 2).Value = foundscan.Rows.Count

            End If
        End If
    Next
Next rowNum

结束子

1 个答案:

答案 0 :(得分:2)

一些要点:

  • You should avoid Activate-不需要。
  • 您应该始终限定诸如 sheetrange,否则Excel将使用 active 工作簿/ 工作表,而这并不总是您想要的。
  • SheetsWorksheets集合之间存在差异。例如,Chart工作表没有单元格,因此也没有Range
  • 您要声明变量lastRowIndex,但使用lastRowInteger。为避免此类错误,请始终将Option Explicit放在代码的顶部。

将您的Sub更改为

Sub Search_for_emails()

    Dim scanstring As String
    Dim foundscan As Range
    Dim lastRowIndex As Long, rowNum As Long
    Dim ASheet As Worksheet

    Set ASheet = ThisWorkbook.Worksheets("Sheet2")
    lastRowIndex = ASheet.Range("A1", ASheet.Range("A1").End(xlDown)).Rows.Count

    For rowNum = 1 To lastRowIndex
        Dim ws As Worksheet
        For Each ws In ThisWorkbook.Worksheets
            If ws.Name <> "Sheet2" Then
                With ws.Range("B:F")
                    Set foundscan = .Find(What:=scanstring, LookIn:=xlValues, LookAt:=xlWhole, _
                        SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                        MatchCase:=False, SearchFormat:=False)
                End With
                If foundscan Is Nothing Then
                    ASheet.Cells(rowNum, 2).Value = "NOTFOUND"
                Else
                    ' ASheet.Cells(rowNum, 2).Value = foundscan.Rows.Count

                End If
            End If
        Next
    Next rowNum
End Sub