Excel VBA:在工作表中查找值,偏移列以查找相同的值

Excel VBA:在工作表中查找值,偏移列以查找相同的值,vba,excel,Vba,Excel,很抱歉我太生疏了,但是我遇到了一点关于我编写的一些excel vba代码的问题。它的目的是清理一个包含数百个条目的excel工作表 格式始终相同,D、E和F列有时在所有三个列中都有相同的单词(单词purge)。在这种情况下,我希望删除该行 我尝试使用将我的范围定义为D,并使用.Find功能搜索我的相关项目。然后从那里偏移查找偏移查找 唉,我的程序已经从告诉我编码错误转变为永远运行(冻结)而没有结果。我会发布我的代码,这样也许我的情况更清楚 附言。 如果有人能帮我修复代码,并解释我做错了什么以及为

很抱歉我太生疏了,但是我遇到了一点关于我编写的一些excel vba代码的问题。它的目的是清理一个包含数百个条目的excel工作表

格式始终相同,D、E和F列有时在所有三个列中都有相同的单词(单词purge)。在这种情况下,我希望删除该行

我尝试使用将我的范围定义为D,并使用.Find功能搜索我的相关项目。然后从那里偏移查找偏移查找

唉,我的程序已经从告诉我编码错误转变为永远运行(冻结)而没有结果。我会发布我的代码,这样也许我的情况更清楚

附言。 如果有人能帮我修复代码,并解释我做错了什么以及为什么,我将不胜感激

谢谢大家

    Sub DeleteRows()
    Dim strPath As String
    Dim strFile As String
    Dim wbk As Workbook
    Dim wsh As Worksheet
    Dim strFind As String
    Dim SrchRng
    Dim x As Range
    Dim y
    Dim z



    'searches directory for any and all excel files
    With Application.FileDialog(msoFileDialogFolderPicker)
    If .Show Then
        strPath = .SelectedItems(1)
    Else
        MsgBox "No folder selected!", vbExclamation
        Exit Sub

        End If
        End With

    If Right(strPath, 1) <> "\" Then
    strPath = strPath & "\"
      End If
    Application.ScreenUpdating = False
    strFile = Dir(strPath & "*.xls*")
    Do While strFile <> ""
    Set wbk = Workbooks.Open(Filename:=strPath & strFile, AddToMRU:=False)

    For Each wsh In wbk.Worksheets
    'end directory search


    'supposed to search column d, offset column +1 in same row, 
    'then do same for a third row.
    'if all three cells contain "PURGE" then delete cell

         Set SrchRng = ActiveSheet.Range("D1", 
    ActiveSheet.Range("D65536").End(xlUp))
        Do
            Set x = SrchRng.Find("PURGE", LookIn:=xlValues)
            Set y = ActiveCell.Offset(0, 1).Find("PURGE", LookIn:=xlValues)
            Set z = ActiveCell.Offset(0, 2).Find("PURGE", LookIn:=xlValues)

          If Not x Is Nothing And Not y Is Nothing And Not z Is Nothing Then         x.EntireRow.Delete
            Loop While Not x Is Nothing

            Next
            For Each wsh In wbk.Worksheets


            Next wsh

            wbk.Close SaveChanges:=True
            strFile = Dir



            Application.ScreenUpdating = True
    End Sub
子删除行()
将strPath设置为字符串
作为字符串的Dim strFile
将wbk设置为工作簿
将wsh设置为工作表
Dim strFind As字符串
暗SrchRng
Dim x As范围
暗淡的
暗z
'在目录中搜索任何和所有excel文件
使用Application.FileDialog(msoFileDialogFolderPicker)
如果,那就表演吧
strPath=.SelectedItems(1)
其他的
MsgBox“未选择文件夹!”,请使用感叹号
出口接头
如果结束
以
如果正确(strPath,1)“\”则
strPath=strPath&“\”
如果结束
Application.ScreenUpdating=False
strFile=Dir(strPath&“*.xls*”)
当strFile“”时执行
设置wbk=Workbooks.Open(文件名:=strPath&strFile,AddToMRU:=False)
对于wbk.工作表中的每个wsh
'结束目录搜索
'应该搜索同一行中的d列,偏移列+1,
'然后对第三排执行相同的操作。
'如果所有三个单元格都包含“清除”,则删除该单元格
设置SrchRng=ActiveSheet.Range(“D1”,
活动页。范围(“D65536”)。结束(xlUp))
做
设置x=SrchRng.Find(“清除”,查找:=xlValues)
设置y=ActiveCell.Offset(0,1).Find(“清除”,LookIn:=xlValues)
设置z=ActiveCell.Offset(0,2)。查找(“清除”,查找:=xlValues)
如果不是x什么都不是y什么都不是z什么都不是x.EntireRow.Delete
循环而不是x什么都不是
下一个
对于wbk.工作表中的每个wsh
下一个wsh
wbk.Close SaveChanges:=True
strFile=Dir
Application.ScreenUpdating=True
端接头

我个人会在excel中编写公式,计算是否需要删除某一行。(行的任何列是否包含您要查找的单词)。一旦我知道公式正确工作,我会在最后一列中使用vba将其添加到文件中


在最后一列中输入公式后,我将对此行进行排序,并删除我需要的任何行。然后删除新列并保存文件。

看看这个。这将使用
FindNext
Offset
(不完全确定您为什么试图在一个单元格上使用
Find
)这将查找值
PURGE
,如果旁边的两个单元格也是
PURGE
,则删除该行。如果没有,它将继续下去

此外,这一行
Do,而strFile“
在某个点需要一个
循环
,尽管不确定您想要它在哪里

Option Explicit

Sub DeleteRows()
    Dim wbk As Workbook
    Dim wsh As Worksheet
    Dim strPath As String, strFile As String, strFind As String, firstAddress As String
    Dim x As Range, y As Range, z As Range
    Dim DelRng As Range


    'searches directory for any and all excel files
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show Then
            strPath = .SelectedItems(1)
        Else
            MsgBox "No folder selected!", vbExclamation
            Exit Sub
        End If
    End With

    If Right(strPath, 1) <> "\" Then
        strPath = strPath & "\"
    End If

    With Application
        .ScreenUpdating = False
        ' Stops xlsm files on Open event
        .EnableEvents = False
        ' uncomment to hide any deletion message boxes
        ' .DisplayAlerts = False
    End With

    strFile = Dir(strPath & "*.xls*")

    Do While Len(strFile) > 0

        Set wbk = Workbooks.Open(Filename:=strPath & strFile, AddToMRU:=False)

        For Each wsh In wbk.Worksheets
            'end directory search
            'supposed to search column d, offset column +1 in same row,
            'then do same for a third row.
            'if all three cells contain "PURGE" then delete cell

            With wsh.Columns(4)
                Set x = .Find("PURGE", Lookat:=xlPart)
                If Not x Is Nothing Then
                    firstAddress = x.Address
                    Do
                        If InStr(1, x.Offset(0, 1), "purge", vbTextCompare) > 0 And InStr(1, x.Offset(0, 2), "purge", vbTextCompare) > 0 Then
                            If DelRng Is Nothing Then
                                Set DelRng = x
                            Else
                                Set DelRng = Union(DelRng, x)
                            End If
                        End If
                        Set x = .FindNext(x)
                    Loop While Not x Is Nothing And x.Address <> firstAddress
                End If
            End With
        Next wsh
        If Not DelRng Is Nothing Then DelRng.EntireRow.Delete

        wbk.Close SaveChanges:=True
        strFile = Dir()
    Loop

    With Application
        .DisplayAlerts = True
        .EnableEvents = True
        .ScreenUpdating = True
    End With
End Sub
选项显式
子行()
将wbk设置为工作簿
将wsh设置为工作表
Dim strPath作为字符串,strFile作为字符串,strFind作为字符串,firstAddress作为字符串
尺寸x为范围,y为范围,z为范围
暗德尔恩As范围
'在目录中搜索任何和所有excel文件
使用Application.FileDialog(msoFileDialogFolderPicker)
如果,那就表演吧
strPath=.SelectedItems(1)
其他的
MsgBox“未选择文件夹!”,请使用感叹号
出口接头
如果结束
以
如果正确(strPath,1)“\”则
strPath=strPath&“\”
如果结束
应用
.ScreenUpdate=False
'在打开事件时停止xlsm文件
.EnableEvents=False
'取消注释以隐藏任何删除消息框
'.DisplayAlerts=False
以
strFile=Dir(strPath&“*.xls*”)
当Len(strFile)>0时执行
设置wbk=Workbooks.Open(文件名:=strPath&strFile,AddToMRU:=False)
对于wbk.工作表中的每个wsh
'结束目录搜索
'应该搜索同一行中的d列,偏移列+1,
'然后对第三排执行相同的操作。
'如果所有三个单元格都包含“清除”,则删除该单元格
带wsh.Columns(4)
设置x=.Find(“清除”,查找:=xlPart)
如果不是,那么x什么都不是
firstAddress=x.地址
做
如果InStr(1,x.Offset(0,1),“清除”,vbTextCompare)>0且InStr(1,x.Offset(0,2),“清除”,vbTextCompare)>0,则
如果DelRng什么都不是那么
设置DelRng=x
其他的
设置DelRng=Union(DelRng,x)
如果结束
如果结束
集合x=.FindNext(x)
循环而不是x为Nothing,x.Address为firstAddress
如果结束
以
下一个wsh
如果不是DelRng,则DelRng.EntireRow.Delete为Nothing
wbk.Close SaveChanges:=True
strFile=Dir()
环
应用
.DisplayAlerts=True
.EnableEvents=True
.ScreenUpdate=True
以
端接头

你的
循环,而不是x什么都不是
什么都不做。如果它以“不是x什么都不是”开始,那么它将永远尝试运行。谢谢你,汤姆!你让我看到了另一种做事的方式!您的新代码发生的情况是:首先,我被告知