VBA使用单元格值而不是单元格名称

时间:2018-07-20 11:35:31

标签: excel vba excel-vba

我知道有单元格名称时可以选择一个范围。例如VBA中的Range(A1:B30).select

有没有一种方法可以选择一个单元格中写入值的范围?我知道以下代码不起作用,但只有您知道我的意思。 Range(217:216,9).select

我想搜索一个值并指定范围,但是我该怎么做呢?

我已经在网上搜索了,但是找不到解决方案。我也尝试记录宏,但是它只记录了带有单元名称的代码。我是VBA的新手,在其他地方找不到我的问题的解决方案。我希望你能理解我的意思。

4 个答案:

答案 0 :(得分:4)

说我们有

enter image description here

,我们希望该范围的值介于(包括) 10 20 之间。这段代码:

Sub RangeFromValues()
    Dim v1 As Long, v2 As Long
    Dim r1 As Range, r2 As Range, rng As Range

    v1 = 10
    v2 = 20
    Set r1 = Range("A:A").Find(what:=v1, after:=Range("A1"))
    Set r2 = Range("A:A").Find(what:=v2, after:=r1)

    Set rng = Range(r1, r2)
    rng.Select
End Sub

将产生:

enter image description here

答案 1 :(得分:2)

Public Sub TestMe()
    Range("1:10").Cells.SpecialCells(xlCellTypeConstants).Select
End Sub

仅选择前10行中不是公式的值:

enter image description here

要选择公式,请输入xlCellTypeFormulas而不是xlCellTypeConstants。请注意,如果您Select一无所有,则会引发错误。

答案 2 :(得分:1)

另一种方法,您只需要指定x(下边界),y(上边界)和rngTest(您要选择单元格的范围)即可:

Sub Test()
    Dim x As Long, y As Long
    Dim rngTest As Range
    Set rngTest = Range("A1:J20"): x = 5: y = 10
    Call RangebyValue(x, y, rngTest)
End Sub
Private Sub RangebyValue(ByVal x As Long, _
                         ByVal y As Long, _
                         ByVal rngTest As Range)
    Dim vArr(), i As Long, j As Long, rngSelect As Range
    vArr = rngTest.Value
    For i = LBound(vArr, 1) To UBound(vArr, 1)
        For j = LBound(vArr, 2) To UBound(vArr, 2)
            If vArr(i, j) >= x And vArr(i, j) <= y Then
                If Not rngSelect Is Nothing Then
                    Set rngSelect = Union(rngSelect, rngTest.Cells(i, j))
                Else
                    Set rngSelect = rngTest.Cells(i, j)
                End If
            End If
        Next j
    Next i
    rngSelect.Select
End Sub

enter image description here enter image description here

答案 3 :(得分:0)

我认为@Vityata的解决方案可以很好地选择具有任何值的所有单元格。如果您要查找特定值,

@Foxfire和Burns和Burns之后, 我建议使用通过这些单元格的循环。 例如:

Sub findTheNine()
    Dim rng As Range
    For Each rng In Range("I7:L11")
        If rng.Value = 9 Then
            rng.Select
        End If
    Next rng
End Sub

但是,这只会选择您要查找的'9'中的一个