Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否使用VBA循环搜索更改的值列表并将其删除?_Vba_Loops_Excel - Fatal编程技术网

是否使用VBA循环搜索更改的值列表并将其删除?

是否使用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:=

我一直在处理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:=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行,等等)。有什么想法吗?谢谢你的回答,我不认为我用我应该的方式来表达我的问题,哈哈。我的代码复杂的原因是