繁体   English   中英

如何将单元格地址存储到VBA中的变量以不断更改范围限制

[英]How to store a cell address to variable in VBA to continually change Range limits

我正在尝试编写一个宏,该宏在整个工作表中搜索一个值,然后在整个工作表中存储该值和所有命中位置。 稍后,我将对位置和值进行一些处理,但是我需要首先使这一点起作用。

最初,我将Range.Find函数与迭代一起使用,并注意到我返回的是相同的值。 然后,我每次尝试查找值时都尝试更改范围。 我将采用先前找到的值的地址,并将其设为范围的下限。

在某种程度上,这是可行的,但最后我得到了一个无限循环。 我的循环的最终条件是Range.Find什么都没找到(因为工作表的大小总是在变化,我不知道真正的上限是多少)。 发生的是Range.Find会停留在最后一个值上,并拒绝从该位置移动,无论我在范围内进行了什么更改。

我最近处理此问题的尝试是还更改了After:=输入,以查看是否会迫使程序继续运行。 最终破坏了我已经拥有的过程,现在我陷入了第一个值的无限循环中。 因此,自然而然地,我只是为了使它能够再次工作而将其删除。 没运气。

这是代码:[代码]

Sub SearchLibrary()
'
' SearchLibrary Macro
' Searches MC library for inputed value and returns all related inforamtion 
in Search sheet
'
' Keyboard Shortcut: Ctrl+s
'

'Search code to find all matching values and corresponding headers

' Define variables
Dim searchn As Integer ' The value input for the search
If IsNumeric(Sheets("Search").Range("C2")) Then
   searchn = Sheets("Search").Range("C2").Value
End If

Dim i As Integer ' Simple counter for loops (column number)
i = 0
Dim j As Integer 'Simple counter for loops (row number)
Dim Data As Worksheet ' Define the search area as all of the sheet MC Library
Worksheets("MC library").Activate
Set Data = Sheets("MC library")
Dim loc As Range
Dim rang As Range
Dim spce As Range
Dim mass() As Single
Dim Found As Variant
Set rang = Sheets("MC library").Range("C3:Z500")
Set loc = Sheets("MC library").Range("C3")

On Error Resume Next
Do
    Set Found = rang.Find(What:=searchn, LookIn:=xlValues, LookAt:= _
        xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _
        False, SearchFormat:=False)
    MsgBox (Found)
    Set loc = Sheets("MC library").Range(Found.Address)
    If Found > 0 Then
        ReDim Preserve mass(i)
        mass(i) = Found
        i = i + 1
        Set rang = Sheets("MC library").Range(loc, "Z500")
    End If

Loop Until Found Is Nothing

End Sub

[/码]

这些都是正在进行中的工作,因此其中有些事情并不重要。 Do循环是真正的问题所在。

searchn从一个单元格中调用一个值,该值是用户搜索的输入,通常是一个四位数的数字。 MsgBox行仅用于调试,不会在最终版本中使用。

任何建议和帮助将不胜感激。 最大的问题(我认为)是找到一种方法来将单元格的位置存储在变量中,然后使用它来更改范围。

这是一个有效的查找程序

Sub findAll()

    Dim aaa As Range

    With ActiveSheet.Cells
        Set aaa = .Find(3, LookIn:=xlValues)  ' find number 3
        If Not aaa Is Nothing Then
            firstFind = aaa.Address
            Do
                Debug.Print aaa.Address, aaa.Value
                Set aaa = .FindNext(aaa)
            Loop While aaa.Address <> firstFind 
        End If
    End With

End Sub
Sub SearchLibrary()

    Dim searchn
    Dim shtData As Worksheet
    Dim hits As Collection, hit

    searchn = Sheets("Search").Range("C2").Value

    If Len(searchn) = 0 Or Not IsNumeric(searchn) Then
        MsgBox "Search term should be numeric!", vbExclamation
        Exit Sub
    End If

    Set shtData = Worksheets("MC library")

    Set hits = FindAll(shtData.Range("C3:Z500"), searchn)
    For Each hit In hits
        Debug.Print hit.Address, hit.Value
    Next hit

End Sub



Public Function FindAll(rng As Range, v) As Collection
    Dim rv As New Collection, f As Range
    Dim addr As String
    Set f = rng.Find(what:=v, after:=rng.Cells(1), _
        LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, _
        SearchDirection:=xlNext, MatchCase:=False)
    If Not f Is Nothing Then addr = f.Address()
    Do Until f Is Nothing
        rv.Add f
        Set f = rng.FindNext(after:=f)
        If f.Address() = addr Then Exit Do
    Loop
    Set FindAll = rv
End Function

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM