Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.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/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
Excel 如何修改此代码以仅搜索可见的行和列_Excel_Vba_Search_Visible - Fatal编程技术网

Excel 如何修改此代码以仅搜索可见的行和列

Excel 如何修改此代码以仅搜索可见的行和列,excel,vba,search,visible,Excel,Vba,Search,Visible,我有一个userform,允许用户选择哪些行和列与要检查的用户相关。我正在使用这段代码,但它会搜索所有行和列,因此不会删除正确的行。有谁能提出一个解决方案来解决这一问题,它将适用于行和列?谢谢 Dim RowToTest As Long Dim MySheet As Worksheet Dim ProjectedDate As Date Dim ColToTest As Long Dim TempKeep As Integer TempKeep = 0 ProjectedDate = Date

我有一个userform,允许用户选择哪些行和列与要检查的用户相关。我正在使用这段代码,但它会搜索所有行和列,因此不会删除正确的行。有谁能提出一个解决方案来解决这一问题,它将适用于行和列?谢谢

Dim RowToTest As Long
Dim MySheet As Worksheet
Dim ProjectedDate As Date
Dim ColToTest As Long
Dim TempKeep As Integer
TempKeep = 0

ProjectedDate = Date + 60

For Each MySheet In ThisWorkbook.Sheets
    For RowToTest = MySheet.Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1
        For ColToTest = MySheet.Cells(2, Columns.Count).End(xlToLeft).Column To 15 Step -1
            With MySheet.Cells(RowToTest, ColToTest)
                If IsDate(MySheet.Cells(RowToTest, ColToTest).Value) Then
                    If .Value < ProjectedDate Then
                        TempKeep = 1
                    End If
                End If
            End With
        Next ColToTest
        If TempKeep = 0 Then
            MySheet.Rows(RowToTest).EntireRow.Delete
        End If
        TempKeep = 0
    Next RowToTest
Next
Dim RowToTest尽可能长
将我的工作表设置为工作表
投影日期为日期
暗淡的阴凉如长
Dim TempKeep为整数
TempKeep=0
项目日期=日期+60
对于此工作簿中的每个MySheet.Sheets
对于RowToTest=MySheet.Cells(Rows.Count,1)。结束(xlUp)。行到2步骤-1
对于ColToTest=MySheet.Cells(2,Columns.Count).End(xlToLeft).Column到15步骤-1
使用MySheet.Cells(rowtost、ColToTest)
如果是IsDate(MySheet.Cells(RowToTest,ColToTest.Value),则
如果.Value
您可以通过其
.Rows
.Columns
属性检查单元格是否隐藏,如下所示:

If CelToCheck.Rows.Hidden or CelToCheck.Columns.Hidden Then
    'Your code if hidden
Else
    'Code if not hidden
End if
在你的情况下,CelToCheck是

MySheet.Cells(RowToTest, ColToTest)
或者,您可以设置一个范围变量,并仅使用

For each CL in RangeVariable.SpecialCells(xlCellTypeVisible)
    'Your code
Next CL

我打算使用
.Hidden
属性,提出与JvdV相同的建议。可以在代码中使用它,例如:

Dim RowToTest尽可能长
将我的工作表设置为工作表
投影日期为日期
暗淡的阴凉如长
Dim TempKeep为整数
TempKeep=0
项目日期=日期+60
对于此工作簿中的每个MySheet.Sheets
对于RowToTest=MySheet.Cells(Rows.Count,1)。结束(xlUp)。行到2步骤-1
对于ColToTest=MySheet.Cells(2,Columns.Count).End(xlToLeft).Column到15步骤-1
使用MySheet.Cells(rowtost、ColToTest)
如果是IsDate(MySheet.Cells(RowToTest,ColToTest.Value),则
如果.Value
这样做不一定需要函数,但会使代码重用更容易

函数isHiddenRow(sht为工作表,rowNr为长)为布尔值
出错时继续下一步
isHiddenRow=sht.Rows(rowNr).Hidden
端函数
函数isHiddenCol(sht为工作表,colNr为长)为布尔值
出错时继续下一步
isHiddenCol=短列(colNr).隐藏
端函数
PS:根据您的工作表中有多少数据,通常直接在工作表上循环不是一个很好的主意。如果有数千行,请考虑使用<代码>数组< /> >

编辑:添加了一个替代方法,使用数组执行相同的操作

选项显式
子delVisibleRows()
将我的工作表设置为工作表
Dim ProjectedDate As Date:ProjectedDate=日期+60
调暗R为长,C为长,lRow为长,lCol为长
将数据作为变量
像字符串一样的模糊排列
用于此工作簿中的每个MySheet。用于每个工作表的“工作表”
用我的纸
lRow=.Cells(.Rows.Count,1).End(xlUp).Row'获取最后一行
lCol=.Cells(2,.Columns.Count).End(xlToLeft).Column'获取最后一列
arrData=.Range(.Cells(1,1),.Cells(lRow,lCol))'将数据分配给数组
对于R=2到lRow,从2开始遍历所有行
对于C=15到lCol,从15开始遍历所有列-如果少于15列,则可能会导致问题
如果IsDate(arrData(R,C))和arrData(R,C)
我很快意识到它对隐藏列不起作用,只对行进行测试。如果隐藏相同的列,则可以对列进行测试。。。问题是,如果行或列未隐藏,则会出现错误。让我适当地更新一下。是的,这就是我暗示的;)@GrantGilson,顺便说一下,你应该考虑添加< <代码>出口> <代码> >代码>因为此时您已经决定不删除此行,所以继续循环该行中的其余列是没有意义的,因此您可以提前退出并跳到循环中的下一行。这将减少很多不必要的迭代。这是一个很好的建议!跑步已经需要一段时间了,所以我会试试这个。这对我来说很有效,我非常感激。我用了第一个街区。谢谢again@GrantGilson如果这回答了你的问题,请考虑把它标记为回答。有关更多信息,请参阅