在vba FindNext不能继续前进

我有一个vba脚本,可以像下面那样查看一组数据。 它挑出用户名,在这种情况下,“pipe理员”,然后转到另一个电子表格,并search该用户名。 一旦find它,它就会回到另一个电子表格并下到一个单元格,然后在另一个电子表格的该单元格中search该文本。 在与列(包含用户名)和行(包含另一组数据)相交的单元格中,它将标记为“X”。 然后它循环遍历这组数据,对这个用户名下的每个数据进行这个操作。 然后移动到下一组数据,这些数据是相同的格式,并重复执行相同的过程。 或者至less应该这样。 关于这个脚本的一切工作除了到达第一组数据的底部,这是一个空单元格,它没有设置范围权find下一个匹配。 由于某些原因, FindNext调用find“Users,Builtin”,这是第一组数据中的最后一个数据。 我真的很困惑,为什么发生这种情况。 我有一种感觉,这可能与我如何使用ActiveCell但我真的不知道。 任何帮助这个问题将不胜感激!

脚本:

 Sub AssignGroups() Dim membership As Worksheet Dim wb As Workbook Dim groups As Worksheet Dim nameRow As Long Dim fullNameString As String Dim nameRange As Range Dim groupRange As Range Dim nameRange2 As Range Dim nameIndex As Long Dim userNameString As String Dim barIndex As Long Set wb = ActiveWorkbook Set membership = Sheets("User Group Membership") Set groups = Sheets("User Assigned to Groups") Set nameRange = membership.Range("A:A").Find("user -name", LookAt:=xlPart) If Not nameRange Is Nothing Then firstAddress = nameRange.Address Do membership.Activate nameRow = nameRange.Row MsgBox (nameRow) fullNameString = membership.Cells(nameRow, "A").Value 'MsgBox (fullNameString) nameIndex = InStr(fullNameString, "user -name") barIndex = InStr(fullNameString, "|") 'MsgBox (nameIndex) 'MsgBox (barIndex) userNameString = Mid(fullNameString, nameIndex + 12, ((barIndex - 4) - (nameIndex + 12))) groups.Activate Set nameRange2 = groups.Range("A:CH").Find(userNameString) nameColumn = nameRange2.Column membership.Activate membership.Cells(nameRow, "A").Activate Do ActiveCell.Offset(1).Activate If Not IsEmpty(ActiveCell.Value) Then cellValue = ActiveCell.Value groups.Activate Set groupRange = groups.Range("A:CH").Find(cellValue, , , LookAt:=xlWhole) groupRow = groupRange.Row groups.Cells(groupRow, nameColumn).Activate ActiveCell.Value = "X" membership.Activate End If Loop Until IsEmpty(ActiveCell.Value) Set nameRange = membership.Range("A:A").FindNext(nameRange) MsgBox (nameRange.Address) Loop While Not nameRange Is Nothing Or nameRange.Address <> firstAddress End If End Sub 

数据:

 C:\Documents and Settings\Administrator.CHESCONETAD>dsquery user -name "Administrator" | dsget user -memberof -expand Administrators,Builtin Domain Admins,Users Domain Users,Users EMLibrary Users,Users Enterprise Admins,Users Exchange Organization Administrators,OU=Microsoft Exchange Security Groups Exchange Public Folder Administrators,OU=Microsoft Exchange Security Groups Exchange Recipient Administrators,OU=Microsoft Exchange Security Groups Exchange View-Only Administrators,OU=Microsoft Exchange Security Groups Group Policy Creator Owners,Users Schema Admins,Users SophosAdministrator,Users Users,Builtin 

您对“ActiveCell is causing your problems. It's best to avoid ”的怀疑是正确的is causing your problems. It's best to avoid 除非你绝对需要,否则is causing your problems. It's best to avoid ActiveCell and Activate and Select语句。 直接处理对象最好。

我认为,如果您将Until语句放在第二个Do Loop中的Do Loop旁边,而不是在Loop旁边,那么它会更好。

最后,因为在代码中使用了多个查找,所以FindNext命令使用了在“ Find对话框中input的最后一个Find ,所以您还需要调整该语句以完成您想要的操作。

看看下面我重构的代码,让我知道如果它不能解决问题。 请注意,我是如何限定所有variables的,在第二个循环中更改了Until置入,并调整了.FindNext行。

 Sub AssignGroups() Dim membership As Worksheet Dim wb As Workbook Dim groups As Worksheet Dim nameRow As Long Dim fullNameString As String Dim nameRange As Range Dim groupRange As Range Dim nameRange2 As Range Dim nameIndex As Long Dim userNameString As String Dim barIndex As Long Set wb = ActiveWorkbook Set membership = Sheets("User Group Membership") Set groups = Sheets("User Assigned to Groups") With membership Set nameRange = .Range("A:A").Find("user -name", LookAt:=xlPart) If Not nameRange Is Nothing Then firstAddress = nameRange.Address Do nameRow = nameRange.Row 'MsgBox (nameRow) fullNameString = .Cells(nameRow, "A").Value 'MsgBox (fullNameString) nameIndex = InStr(fullNameString, "user -name") barIndex = InStr(fullNameString, "|") 'MsgBox (nameIndex) 'MsgBox (barIndex) userNameString = Mid(fullNameString, nameIndex + 12, ((barIndex - 4) - (nameIndex + 12))) With groups Set nameRange2 = .Range("A:CH").Find(userNameString) nameColumn = nameRange2.Column End With Do Until IsEmpty(.Cells(nameRow, "A").Offset(1)) cellValue = .Cells(nameRow, "A").Offset(1) With groups Set groupRange = .Range("A:CH").Find(cellValue, , , LookAt:=xlWhole) groupRow = groupRange.Row .Cells(groupRow, nameColumn).Value = "X" End With nameRow = nameRow + 1 Loop Set nameRange = .Range("A:A").Find("user -name", After:=nameRange, LookAt:=xlPart) MsgBox (nameRange.Address) Loop While Not nameRange Is Nothing Or nameRange.Address <> firstAddress End If End Sub