- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 vba 脚本,用于处理一组数据,如下所示。它会选择用户名,在本例中为“管理员”,然后转到另一个电子表格并搜索该用户名。一旦找到它,它就会返回到另一个电子表格并向下移动一个单元格,并在另一个电子表格的该单元格内搜索文本。在与列(包含用户名)和行(包含另一组数据)相交的单元格中,它标记为“X”。然后,它循环遍历这组数据,对该用户名下的每条数据执行此操作。然后它转移到下一组具有相同格式的数据,并再次执行相同的过程。或者至少应该是这样。有关此脚本的所有内容都有效,除了在到达第一组数据的底部(这是一个空单元格)之后,它没有正确设置范围以查找下一个匹配项。由于某种原因,FindNext
调用找到“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”导致问题的怀疑是正确的。最好避免使用
ActiveCell和
Activate和
Select`语句,除非您绝对需要它们。最好直接使用对象。
我认为如果您将 Until
语句放在第二个 Do Loop
中的 Do
旁边,而不是放在 Loop 旁边
它也会工作得更好。
最后,由于您在代码中使用多个查找,FindNext
命令使用您在 Find
对话框中输入的最后一个内容,因此您需要调整该语句以及做你想做的事。
请参阅下面我重构的代码,如果它不能解决问题,请告诉我。请注意我如何限定所有变量,更改第二个循环中的 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
关于vba - VBA 中的 FindNext 无法继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33440767/
我正在我的应用程序后台下载视频。如果用户在下载过程中重启了应用/设备,有什么方法可以在他们下次启动应用时从他们中断的地方继续下载? 最佳答案 这主要取决于文件服务器的配置(HTTP、FTP 等)。 现
我正在试验 WPF 动画,但有点卡住了。这是我需要做的: 鼠标悬停: 淡入(2 秒内从 0% 到 100% 不透明度) MouseOut: 暂停 2 秒 淡出(2 秒内从 100% 到 0% 不透明度
我的问题是这个线程的延续: Ant: copy the same fileset to multiple places 我是映射器的新手。有人(carej?)可以分享一个使用映射器来做到这一点的例子吗
继续previous question我希望能够显示一些事件指示器即使主线程被阻塞。(基于this article)。 基于所附代码的问题: 使用 Synchronize(PaintTargetWin
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度的了解。包括尝试的解决方案、为什么它们不起作用以及预期结果
我有一个场景,其中有一个线程在等待和执行任务之间循环。但是,我想中断线程的等待(如果愿意,可以跳过其余的等待)并继续执行任务。 有人知道如何做到这一点吗? 最佳答案 我认为你需要的是实现 wait()
这是我的代码架构: while (..) { for (...; ...;...) for(...;...;...) if ( )
import java.util.Scanner; public class InteractiveRectangle { public static void main(String[] args)
如何将 continue 放入具有函数的列表理解中? 下面的示例代码... import pandas as pd l = list(pd.Series([1,3,5,0,6,8])) def inv
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
我正在用 python 开发一个程序,遇到了一个我不知道如何解决的问题。我的意图是使用 with 语句,避免使用 try/except。 到目前为止,我的想法是能够使用 continue 语句,就像在
我对下一段代码的执行感到困惑: label: for (int i = 0; i < 100; i++) { if (i % 2 == 0) c
这很好用: #include int main(){ volatile int abort_counter = 0; volatile int i = 0; while (i
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
如果不满足某些条件,我会尝试跳到循环的下一次迭代。问题是循环仍在继续。 我哪里出错了? 根据第一条评论更新了代码示例。 foreach ($this->routes as $route =>
如果不满足某些条件,我会尝试跳到循环的下一次迭代。问题是循环仍在继续。 我哪里出错了? 根据第一条评论更新了代码示例。 foreach ($this->routes as $route =>
Android项目中的一个需求:通过线程读取文件内容,并且可以控制线程的开始、暂停、继续,来控制读文件。在此记录下。 直接在主线程中,通过wait、notify、notifyAll去控制读文件的线
link text 我得到了引用计数的概念 所以当我执行“del astrd”时,引用计数降为零并且 astrd 被 gc 收集? 这是示例代码。这些代码是我在昨天的问题之后开发的:link text
我想首先检查我的 Range 是否有 #NA 错误,然后在退出宏之前显示包含错误的单元格地址。这是我到目前为止所做的。 现在,如果出现错误,我想显示 MsgBox警告用户错误并停止程序的其余部分执行,
while( (c = fgetc(stdin)) != EOF ){ count++; if (count == lineLen - 1){ moreChars =
我是一名优秀的程序员,十分优秀!