[英]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.