根据excel中单元格的值获取整行

根据excel中单元格的值获取整行,excel,vba,Excel,Vba,我试图根据任意单元格的值,获得一整行数据,具体范围从E到BH。 例如,如果在单元格P,3上有红色值,我希望选择从E3到BH,3的整个范围 此外,如果F9中的单元格上有黄色值,则我希望选择从E9到BH9的整行 到目前为止我都试过了 这是我从字符串文本中获取行的尝试,但它不起作用。我计划以与类似的方式获取行和列,以便根据文本从erow获取到bhrow的行 Dim rng1 As Range Set rng1 = Sheets("Table").UsedRange.Find(&qu

我试图根据任意单元格的值,获得一整行数据,具体范围从E到BH。 例如,如果在单元格P,3上有红色值,我希望选择从E3到BH,3的整个范围

此外,如果F9中的单元格上有黄色值,则我希望选择从E9到BH9的整行

到目前为止我都试过了 这是我从字符串文本中获取行的尝试,但它不起作用。我计划以与类似的方式获取行和列,以便根据文本从erow获取到bhrow的行

Dim rng1 As Range
Set rng1 = Sheets("Table").UsedRange.Find("my text", xlValues, xlWhole)
Debug.Print "row is: " & rng1
也许使用和。注意,您还应该使用if Not rng1 Nothing测试查找是否成功

使用rng1的较短备选方案。行:

也许使用和。注意,您还应该使用if Not rng1 Nothing测试查找是否成功

使用rng1的较短备选方案。行:

选择行范围 注意关键部分:

Const CopyColsAddress As String = "E:BH"
Set ccrg = ws.Columns(CopyColsAddress)
ccrg.Rows(i) 
代码

选择行范围 注意关键部分:

Const CopyColsAddress As String = "E:BH"
Set ccrg = ws.Columns(CopyColsAddress)
ccrg.Rows(i) 
代码


晚到派对,试图展示另一种方法,展示2019+版的动态可能性,以及对Union range函数的巧妙使用:

Sub ExampleCall()
    '[0] define search item
    Const SearchItem As String = "My text"
    Dim rng As Range: Set rng = Sheet1.UsedRange                   ' Project's sheet Code(Name)
    '[1] evaluate condition
    Dim condition$: condition = "=IF(" & rng.Address & "=""" & SearchItem & """,ROW(" & rng.Address & "),"""")"
    Dim chk: chk = Evaluate(condition)
    '[2] get findings
    Dim rng1 As Range: Set rng1 = Range("E" & rng.Rows.Count + 1)  ' set dummy range (avoiding later checks for Is Nothing)
    Dim i As Long
    For i = 1 To UBound(chk)
        If Not IsError(Application.Average(Application.Index(chk, i, 0))) Then
            Set rng1 = Union(rng1, Intersect(Rows(i), Range("E:BH")))
            '' ... or do something with data field row Application.Index(chk, i, 0)
            '  ...
        End If
    Next i
    '[3] select rows with findings (after removing dummy from union range)
    If rng1.Areas.Count > 1 Then rng1.Areas(1).Delete ' delete dummy
    rng1.Select

End Sub


晚到派对,试图展示另一种方法,展示2019+版的动态可能性,以及对Union range函数的巧妙使用:

Sub ExampleCall()
    '[0] define search item
    Const SearchItem As String = "My text"
    Dim rng As Range: Set rng = Sheet1.UsedRange                   ' Project's sheet Code(Name)
    '[1] evaluate condition
    Dim condition$: condition = "=IF(" & rng.Address & "=""" & SearchItem & """,ROW(" & rng.Address & "),"""")"
    Dim chk: chk = Evaluate(condition)
    '[2] get findings
    Dim rng1 As Range: Set rng1 = Range("E" & rng.Rows.Count + 1)  ' set dummy range (avoiding later checks for Is Nothing)
    Dim i As Long
    For i = 1 To UBound(chk)
        If Not IsError(Application.Average(Application.Index(chk, i, 0))) Then
            Set rng1 = Union(rng1, Intersect(Rows(i), Range("E:BH")))
            '' ... or do something with data field row Application.Index(chk, i, 0)
            '  ...
        End If
    Next i
    '[3] select rows with findings (after removing dummy from union range)
    If rng1.Areas.Count > 1 Then rng1.Areas(1).Delete ' delete dummy
    rng1.Select

End Sub


这个建议的解决方案使用过滤器来识别目标行,将它们提取到字典中,并将字典发布到名为Output的工作表中

桌子

输出

这个建议的解决方案使用过滤器来识别目标行,将它们提取到字典中,然后将字典发布到名为Output的工作表中

桌子

输出

不清楚您是否只想识别包含所需值的行,即:第3行,或是在第3行的某处提取行。请澄清。是的,很抱歉我不清楚。我想识别包含数据的行并提取该行。这有点像使用文本作为水平数据库的主键,以获取E到BH范围内的其他datatext。不清楚您是否只想标识包含所需值的行,即:第3行,或者在第3行的某个位置提取该行。请澄清。是的,很抱歉我不清楚。我想识别包含数据的行并提取该行。这有点像使用文本作为水平数据库的主键来获取范围E到BHE中的其他datatext。Find方法缺少后面的第二个参数。它应该类似于:Set rng1=SheetsTable.UsedRange.Findmy text,xlValues,xlWhole@EEM-说得好,改为命名参数。这永远不会失败…还可以使用rng1:Set theNewRange=range:BH.Rowsrng1.rowThank,绝对正确。您帮助我设置了范围。查找方法缺少后面的第二个参数。它应该类似于:Set rng1=SheetsTable.UsedRange.Findmy text,xlValues,xlWhole@EEM-说得好,改为命名参数。这永远不会失败…还可以使用rng1:Set theNewRange=range:BH.Rowsrng1.rowThank,绝对正确。你帮我设定了范围谢谢你的解决方案。我一定会试试看,似乎OP说的是基于任何单元格的值。这意味着要搜索所有单元格。@EEM:我的答案是基于前三句话,放弃了其余的,因为它不再提到红色或黄色。我的错。我从未注意到Find参数是错误的。很好,谢谢你的解决方案。我一定会试试看,似乎OP说的是基于任何单元格的值。这意味着要搜索所有单元格。@EEM:我的答案是基于前三句话,放弃了其余的,因为它不再提到红色或黄色。我的错。我从未注意到Find参数是错误的。非常感谢你的邀请。和往常一样,令人震惊的“缺乏知识”。我一定会尝试采用“愚蠢的想法”。我不理解评估,因为我很少使用它,当然,平均值/指数组合:还没有!我一定要自己解决这个问题。我一两天后再给你打电话。顺便说一句,我更喜欢ColumnsE:BH.Rowsi不需要交集,没什么大不了的。注意:Application.Evaluate将公式应用于活动工作表,因此建议激活工作表或包含工作表。名称作为范围的一部分,即Table!&地址。您可以通过在另一张工作表处于活动状态的情况下运行该过程并在Dim chk:chk=Evaluatecondition@EEM-欣赏这些宝贵的提示;特别是因为通常我都在准备完全合格的参考资料。非常感谢你的邀请。和往常一样,令人震惊的“缺乏知识”。我一定会尝试采用“愚蠢的想法”。我不理解评估,因为我很少使用它,当然,平均值/指数组合:还没有!我一定要自己解决这个问题。我会再打给你的
再过一两天你就回来了。顺便说一句,我更喜欢ColumnsE:BH.Rowsi不需要交集,没什么大不了的。注意:Application.Evaluate将公式应用于活动工作表,因此建议激活工作表或包含工作表。名称作为范围的一部分,即Table!&地址。您可以通过在另一张工作表处于活动状态的情况下运行该过程并在Dim chk:chk=Evaluatecondition@EEM-欣赏这些宝贵的提示;特别是因为通常我正在规划完全限定的范围参考。通过过滤器/字典方法+:通过过滤器/字典方法+:Rem帮助,巩固和丰富上述解决方案+:
Sub ExampleCall()
    '[0] define search item
    Const SearchItem As String = "My text"
    Dim rng As Range: Set rng = Sheet1.UsedRange                   ' Project's sheet Code(Name)
    '[1] evaluate condition
    Dim condition$: condition = "=IF(" & rng.Address & "=""" & SearchItem & """,ROW(" & rng.Address & "),"""")"
    Dim chk: chk = Evaluate(condition)
    '[2] get findings
    Dim rng1 As Range: Set rng1 = Range("E" & rng.Rows.Count + 1)  ' set dummy range (avoiding later checks for Is Nothing)
    Dim i As Long
    For i = 1 To UBound(chk)
        If Not IsError(Application.Average(Application.Index(chk, i, 0))) Then
            Set rng1 = Union(rng1, Intersect(Rows(i), Range("E:BH")))
            '' ... or do something with data field row Application.Index(chk, i, 0)
            '  ...
        End If
    Next i
    '[3] select rows with findings (after removing dummy from union range)
    If rng1.Areas.Count > 1 Then rng1.Areas(1).Delete ' delete dummy
    rng1.Select

End Sub

Sub Get_Rows()
Const kFml As String = "= ""|"" & #WSH!#RNG & ""|""" 'Wrap the values between "|" to ensure exact matches only
Dim Dtn As Object
Dim aTarget As Variant, aData As Variant, aDataX As Variant
Dim aRowTrg As Variant, aRowFnd As Variant
Dim vValue As Variant, sFml As String, lRow As Long

    With ThisWorkbook.Sheets("Table")
        
        Rem Get Target Values Array (Two methods pick one)
        Rem 1. 'Provided (hard-coded)
        'aTarget = [{"Red","Yellow"}]
        Rem 2. Obtained from a range - adjust as required
        sFml = Replace(Replace(kFml, "#WSH", .Name), "#RNG", "B2:B3")
        aTarget = Application.Transpose(Application.Evaluate(sFml))
        
        Rem Get Data Range to Array
        With Application.Intersect(.UsedRange, .Range("E:BH"))
            aData = .Value
            sFml = Replace(Replace(kFml, "#WSH", .Worksheet.Name), "#RNG", .Address)
            aDataX = Application.Evaluate(sFml)
    
    End With: End With
    
    Set Dtn = CreateObject("Scripting.Dictionary")
    With Dtn
    
        Rem Add Header to Dictionary
        .Add 1 + .Count, Application.Index(aData, 1, 0)
    
        Rem Search & Add Rows to Dictionary
        For lRow = 2 To UBound(aData)
            
            Rem Set Target Row
            aRowTrg = Application.Index(aDataX, lRow, 0)
            For Each vValue In aTarget
                
                Rem Filter Row with Value
                aRowFnd = Filter(aRowTrg, vValue, True)
                If UBound(aRowFnd) > -1 Then
                    
                    Rem Add Target Row to Dictionary
                    .Add 1 + .Count, Application.Index(aData, lRow, 0)
                    Exit For
                
        End If: Next: Next
        
        Rem Post Dictionary to Sheet [Output] Range [E:BH]
        ThisWorkbook.Sheets("Output").Range("E:BH").Rows(1).Resize(.Count).Value = _
            Application.Index(Dtn.items, 0, 0)
    
    End With

End Sub