我正在为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
结束子
答案 0 :(得分:2)
一些要点:
Activate
-不需要。sheet
或range
,否则Excel将使用 active 工作簿/
工作表,而这并不总是您想要的。 Sheets
和Worksheets
集合之间存在差异。例如,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