Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.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 查找符合特定条件的范围内的所有值,并返回每行VBA_Excel_Vba_For Loop_Search - Fatal编程技术网

Excel 查找符合特定条件的范围内的所有值,并返回每行VBA

Excel 查找符合特定条件的范围内的所有值,并返回每行VBA,excel,vba,for-loop,search,Excel,Vba,For Loop,Search,我正在寻找一些代码来搜索某个区域,并返回该区域中符合特定条件的每个单元格的行号,然后列出这些行 以前我只需要第一个值,所以一直在使用代码: Dim Criteria1 As Single Dim Criteria2 As Single Dim Required As Integer Dim Range1 As Range Dim GearNeg1 As Integer SetColumn = 24 Set Range1 = Sheets("X").Range("A2:BT72").Column

我正在寻找一些代码来搜索某个区域,并返回该区域中符合特定条件的每个单元格的行号,然后列出这些行

以前我只需要第一个值,所以一直在使用代码:

Dim Criteria1 As Single
Dim Criteria2 As Single
Dim Required As Integer
Dim Range1 As Range
Dim GearNeg1 As Integer

SetColumn = 24
Set Range1 = Sheets("X").Range("A2:BT72").Columns(SetColumn).Cells
Criteria1 = Sheets("X").Range("P111").Value
Criteria2 = Sheets("X").Range("Q111").Value

For Each Cell In Range1

    If Cell.Value < Criteria1 And Cell.Value > Criteria2 Then

        Required = Cell.row

        Exit For

    End If
Next
Dim标准1作为单个
模糊标准2作为单一标准
Dim必需为整数
变暗范围1作为范围
Dim GearNeg1为整数
SetColumn=24
设置范围1=图纸(“X”).范围(“A2:BT72”).列(设置列).单元格
标准1=板材(“X”).范围(“P111”).值
标准2=板材(“X”).范围(“Q111”).值
对于范围1中的每个单元格
如果Cell.ValueCriteria2,则
必需=Cell.row
退出
如果结束
下一个

我一直在尝试添加一个for循环,以将符合条件的值的所有行值返回到列表中。但是,我很挣扎,每次似乎只能找到第一个值。

这是一个最小的示例,返回范围
A1:A30
的行,其中包含
X

Public Sub TestMe()

    Dim rowValues As String
    Dim myCell As Range

    For Each myCell In Worksheets(1).Range("A1:A30")
        If myCell = "X" Then
            rowValues = Trim(rowValues & " " & myCell.Row)
        End If
    Next myCell

    Debug.Print rowValues

End Sub

这里通过连接返回:
rowValues=Trim(rowValues&&&myCell.Row)
,需要
Trim()
来减少第一次连接时的第一个

您可以将范围读取到数组中,循环数组并将符合条件的行连接到字符串中。我使用从第2行开始的事实,并且我使用基于1的数组来确定行,即,我将1添加到I的值,I是数组中限定值所在的索引

你也可以使用

required = required & "," & i + ws.Range("A2:BT72").Row - LBound(arr)
VBA:

选项显式
公共子测试()
Dim criteria1为单个,criteria2为单个,必需为字符串
Dim arr(),ws作为工作表,setColumn作为长,i作为长
设置ws=ThisWorkbook.Worksheets(“X”)
setColumn=24
arr=Application.Transpose(ws.Range(“A2:BT72”).Columns(setColumn).Value)
准则1=ws.范围(“P111”)值
准则2=ws.范围(“Q111”)值
对于i=LBound(arr)到UBound(arr)
如果arr(i)<标准1和arr(i)>标准2,则
必需=必需&“,”&i+1
如果结束
下一个
必需=替换$(必需,,,vbNullString,1,1)
调试。需要打印
端接头

为什么要这样做:设置范围1=图纸(“X”).范围(“A2:BT72”).列(设置列).单元格?设置列是否变化?另外,使用Long not Integer可以避免潜在的溢出。谢谢你的建议,是的,setcolumn会根据问题的不同而变化。谢谢QHarr,这很好!我的下一步是搜索这些行,并在两个已知列上找到两个值。你对此有什么建议吗?使用范围查找法。
Option Explicit
Public Sub test()
    Dim criteria1 As Single, criteria2 As Single, required As String
    Dim arr(), ws As Worksheet, setColumn As Long, i As Long

    Set ws = ThisWorkbook.Worksheets("X")
    setColumn = 24
    arr = Application.Transpose(ws.Range("A2:BT72").Columns(setColumn).Value)

    criteria1 = ws.Range("P111").Value
    criteria2 = ws.Range("Q111").Value

    For i = LBound(arr) To UBound(arr)
        If arr(i) < criteria1 And arr(i) > criteria2 Then
            required = required & "," & i + 1
        End If
    Next

    required = Replace$(required, ",", vbNullString, 1, 1)

    Debug.Print required
End Sub