是否使用VBA循环搜索更改的值列表并将其删除?
我一直在处理excel工作表,我使用宏基本上运行“查找功能”,在单独的工作表中查找单词/短语,然后删除该单词/短语所在的整个列。目前,由于我的上一篇文章()我有以下内容:是否使用VBA循环搜索更改的值列表并将其删除?,vba,loops,excel,Vba,Loops,Excel,我一直在处理excel工作表,我使用宏基本上运行“查找功能”,在单独的工作表中查找单词/短语,然后删除该单词/短语所在的整个列。目前,由于我的上一篇文章()我有以下内容: Dim strFind As String Dim rngFind As Range Dim i As Integer strFind = Sheets("Instructions").Range("E56").Value Set rngFind = Sheets("Forecast").Cells.Find(What:=
Dim strFind As String
Dim rngFind As Range
Dim i As Integer
strFind = Sheets("Instructions").Range("E56").Value
Set rngFind = Sheets("Forecast").Cells.Find(What:=strFind, LookAt:=xlPart)
check if value is found
Do While Not rngFind Is Nothing
If Not rngFind Is Nothing Then
i = 0
Do While rngFind.Offset(0, i + 1) = ""
i = i + 1
Loop
rngFind.Resize(1, i + 1).EntireColumn.Delete Shift:=xlShiftToLeft
Loop
End If
这非常适用于引用单元格C53(用户在其中输入单词/短语),然后转到“预测”表,删除单词/短语所在的列以及右侧的后续列,直到下一个填充列。然而,我需要它做两件事
- 目前它只找到一次单词,即使它可能在工作表中存在多次,我需要它删除所有单词-基本上它是“查找下一个”而不是“查找所有”。我在考虑做一个循环,这样一旦它找到一个并删除该列,它就会再次找到同一个单词并删除该列(以及它旁边的后续空行),直到该单词不再出现在工作表上
- 其次,我需要它来查找多个单词/短语。现在它引用单元格'C53',但我需要它继续到'C54',然后做同样的事情,然后是'C55',然后是'C56',等等,直到它到达一个单元格,其中只有一个'0'。问题是,列C中的列表大小总是不同的(但总是从C53开始)。一旦它达到“0”(不是空白单元格),我需要它停止
非常感谢您对这个“循环初始”问题的任何帮助!我对VBA非常陌生,我刚刚被赋予了这样做的任务。非常感谢我认为你在这里有很好的基础。 非常感谢您对这个“循环初始”问题的任何帮助 我认为这样做应该有助于你的第一点(未经测试,但这是使用另一个
Do
循环的想法,直到rngFind什么都不是):
对于第二点,在数组中存储要搜索的值列表。可以对逗号分隔的字符串使用Split函数来创建数组。适用于较小的列表。否则,您可能需要使用不同的方法来创建数组
根据评论更新:
然后,在上面的For/Next
循环中循环遍历数组中的值:
For each val in valsToSearch
strFind = val
Set rngFind = Sheets("Forecast").Cells.Find(What:=strFind, LookAt:=xlPart)
Do While Not rngFind Is Nothing '## Makes sure the value is found before operating the rest of the loop
i = 0
Do While rngFind.Offset(0, i + 1) = ""
i = i + 1
Loop
rngFind.Resize(1, i + 1).EntireColumn.Delete Shift:=xlShiftToLeft
'## Find the NEXT instanct of strFind within rngFind
Set rngFind = Sheets("Forecast").Cells.FindNext(What:=strFind, LookAt:=xlPart)
Loop
Next
我认为你在这里有很好的基础。
非常感谢您对这个“循环初始”问题的任何帮助
我认为这样做应该有助于你的第一点(未经测试,但这是使用另一个Do
循环的想法,直到rngFind什么都不是):
对于第二点,在数组中存储要搜索的值列表。可以对逗号分隔的字符串使用Split函数来创建数组。适用于较小的列表。否则,您可能需要使用不同的方法来创建数组
根据评论更新:
然后,在上面的For/Next
循环中循环遍历数组中的值:
For each val in valsToSearch
strFind = val
Set rngFind = Sheets("Forecast").Cells.Find(What:=strFind, LookAt:=xlPart)
Do While Not rngFind Is Nothing '## Makes sure the value is found before operating the rest of the loop
i = 0
Do While rngFind.Offset(0, i + 1) = ""
i = i + 1
Loop
rngFind.Resize(1, i + 1).EntireColumn.Delete Shift:=xlShiftToLeft
'## Find the NEXT instanct of strFind within rngFind
Set rngFind = Sheets("Forecast").Cells.FindNext(What:=strFind, LookAt:=xlPart)
Loop
Next
我一直在做一个excel工作表,我用一个宏
基本上运行一个“查找函数”在单独的页面上查找单词/短语
然后删除该单词/短语所在的整个列
位于
如果我理解正确-在我看来,您的潜艇过于复杂:
Sub DeleteColumnsWithString()
Dim strFind As String
Dim rngFind As Range
strFind = Sheets("Instructions").Range("C53").Value
Do
Set rngFind = Sheets("Forecast").Cells.Find(What:=strFind, LookAt:=xlPart)
If Not rngFind Is Nothing Then
rngFind.EntireColumn.Delete
End If
Loop Until rngFind Is Nothing
End Sub
如果要执行多个字符串,可以按如下方式执行:
Sub DeleteColumnsWithAnyOfTheseStrings()
Dim strFind As String
Dim rngFind As Range
Dim SearchTerms As Range
Set SearchTerms = Sheets("Instructions").Range("C53:C55")
For Each Cell In SearchTerms.Cells
strFind = Cell.Value
Do
Set rngFind = Sheets("Forecast").Cells.Find(What:=strFind, LookAt:=xlPart)
If Not rngFind Is Nothing Then
rngFind.EntireColumn.Delete
End If
Loop Until rngFind Is Nothing
Next Cell
End Sub
根据您的评论更新:
Sub DeleteColumnsWithTheseStringsAndToTheRightBlanksColumns()
Dim strFind As String
Dim rngFind As Range
Dim strFindAddress As String
Dim SearchTerms As Range
Dim Counter As Long
Set SearchTerms = Sheets("Instructions").Range("C53:C55")
For Each Cell In SearchTerms.Cells
Counter = 0
strFind = Cell.Value
Do
Set rngFind = Sheets("Forecast").Cells.Find(What:=strFind, LookAt:=xlPart)
If Not rngFind Is Nothing Then
strFindAddress = rngFind.Address
Do
Range(strFindAddress).EntireColumn.Delete
Counter = Counter + 1
Loop Until Range(strFindAddress).Value <> "" Or Counter >= 100
End If
Loop Until rngFind Is Nothing
Next Cell
End Sub
使用字符串和右侧空白列()删除子列
Dim strFind As字符串
变暗rngFind As范围
Dim strFindAddress作为字符串
将搜索项设置为范围
昏暗的柜台一样长
设置SearchTerms=表格(“说明”).范围(“C53:C55”)
对于SearchTerms中的每个单元格。单元格
计数器=0
strFind=Cell.Value
做
设置rngFind=Sheets(“Forecast”).Cells.Find(What:=strFind,LookAt:=xlPart)
如果不是rngFind,那就什么都不是了
strFindAddress=rngFind.Address
做
范围(strFindAddress).entireclumn.Delete
计数器=计数器+1
循环直到范围(strFindAddress)。值“”或计数器>=100
如果结束
循环直到rngFind为空
下一个细胞
端接头
我一直在做一个excel工作表,我用一个宏
基本上运行一个“查找函数”在单独的页面上查找单词/短语
然后删除该单词/短语所在的整个列
位于
如果我理解正确-在我看来,您的潜艇过于复杂:
Sub DeleteColumnsWithString()
Dim strFind As String
Dim rngFind As Range
strFind = Sheets("Instructions").Range("C53").Value
Do
Set rngFind = Sheets("Forecast").Cells.Find(What:=strFind, LookAt:=xlPart)
If Not rngFind Is Nothing Then
rngFind.EntireColumn.Delete
End If
Loop Until rngFind Is Nothing
End Sub
如果要执行多个字符串,可以按如下方式执行:
Sub DeleteColumnsWithAnyOfTheseStrings()
Dim strFind As String
Dim rngFind As Range
Dim SearchTerms As Range
Set SearchTerms = Sheets("Instructions").Range("C53:C55")
For Each Cell In SearchTerms.Cells
strFind = Cell.Value
Do
Set rngFind = Sheets("Forecast").Cells.Find(What:=strFind, LookAt:=xlPart)
If Not rngFind Is Nothing Then
rngFind.EntireColumn.Delete
End If
Loop Until rngFind Is Nothing
Next Cell
End Sub
根据您的评论更新:
Sub DeleteColumnsWithTheseStringsAndToTheRightBlanksColumns()
Dim strFind As String
Dim rngFind As Range
Dim strFindAddress As String
Dim SearchTerms As Range
Dim Counter As Long
Set SearchTerms = Sheets("Instructions").Range("C53:C55")
For Each Cell In SearchTerms.Cells
Counter = 0
strFind = Cell.Value
Do
Set rngFind = Sheets("Forecast").Cells.Find(What:=strFind, LookAt:=xlPart)
If Not rngFind Is Nothing Then
strFindAddress = rngFind.Address
Do
Range(strFindAddress).EntireColumn.Delete
Counter = Counter + 1
Loop Until Range(strFindAddress).Value <> "" Or Counter >= 100
End If
Loop Until rngFind Is Nothing
Next Cell
End Sub
使用字符串和右侧空白列()删除子列
Dim strFind As字符串
变暗rngFind As范围
Dim strFindAddress作为字符串
将搜索项设置为范围
昏暗的柜台一样长
设置SearchTerms=表格(“说明”).范围(“C53:C55”)
对于SearchTerms中的每个单元格。单元格
计数器=0
strFind=Cell.Value
做
设置rngFind=Sheets(“Forecast”).Cells.Find(What:=strFind,LookAt:=xlPart)
如果不是rngFind,那就什么都不是了
strFindAddress=rngFind.Address
做
范围(strFindAddress).entireclumn.Delete
计数器=计数器+1
循环直到范围(strFindAddress)。值“”或计数器>=100
如果结束
循环直到rngFind为空
下一个细胞
端接头
谢谢你的回答,我想我的问题的措辞不是我应该说的,哈哈。我的代码如此复杂的原因是,它会找到单词所在的列并将其删除,但也会删除该列右侧的列(第1行),直到下一个填充的单元格。解释起来有点混乱。对于第二部分,我喜欢范围的想法,但我正在处理的范围总是在变化(有时是100行,有时只有70行,等等)。有什么想法吗?谢谢你的回答,我不认为我用我应该的方式来表达我的问题,哈哈。我的代码复杂的原因是