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