问题
Background
My code does some loops over ranges, however, each interaction should be performed in the range excluding the cell just performed. I think the easier way to do so is to remove the cell from the stored range.
Problem
I have not been able to find a way to remove cell from the stored object
Code
The question is general but, for the matters it would be something like
Sub Sample()
Dim RangeToAnalyze As Range
Dim CounterRange As Long
Dim ExcludeCell As Range 'sample on what is desired to achieve
Set RangeToAnalyze = Selection 'this is based on some other criteria but, in order to reproduce it easier that's why selection
For CounterRange = 1 To 5
Set ExcludeCell = RangeToAnalyze.Find("text")
'now here I would like to find the next cell, but it should exclude the first one in order to go to the next one
Set RangeToAnalyze = RangeToAnalyze.Exclude(ExcludeCell) 'this is what I want to do, so when looping it could jump to the next find (This function is "sample" this is what I am looking to do
Next CounterRange
End Sub
回答1:
One approach could be this
Function getExcluded(ByVal rngMain As Range, rngExc As Range) As Range
Dim rngTemp As Range
Dim rng As Range
Set rngTemp = rngMain
Set rngMain = Nothing
For Each rng In rngTemp
If rng.Address <> rngExc.Address Then
If rngMain Is Nothing Then
Set rngMain = rng
Else
Set rngMain = Union(rngMain, rng)
End If
End If
Next
Set getExcluded = rngMain
End Function
Test the function
Sub test()
MsgBox getExcluded(Range("A1:M10000"), Range("a10")).Address
End Sub
回答2:
You would be better to use a For... Each loop I suspect. This should be a starting place:
Sub Sample()
Dim RangeToAnalyze As Range
Dim rngCell as Range
Set RangeToAnalyze = Range("Selection")
For each rngCell in RangeToAnalyze
'Your other code/actions here
Next rngCell
'more code here
End Sub
This should then perform your actions on each cell and move on to the next one and automatically stop at the last cell.
You can also nest this inside another For... Each loop to cycle different ranges as well and so on.
回答3:
To find the 5th "text"
you can use .FindNext
Set ExcludeCell = RangeToAnalyze.Find("text")
Dim CounterRange As Long
For CounterRange = 1 To 5
If Not ExcludeCell Is Nothing Then
Select Case CounterRange
Case 1:
Case 2:
Case 3:
Case 4:
Case 5:
End Select
End If
Set ExcludeCell = RangeToAnalyze.FindNext
Next CounterRange
'If Not ExcludeCell Is Nothing And CounterRange = 5 Then MsgBox ExcludeCell.Address
Another alternative can be to replace the found "text"
with something else temporarily
For CounterRange = 1 To 5
Set ExcludeCell = RangeToAnalyze.Find("text")
If Not ExcludeCell Is Nothing Then
Select Case CounterRange
Case 1:
Case 2:
Case 3:
Case 4:
Case 5:
End Select
End If
Next CounterRange
' use RangeToAnalyze
RangeToAnalyze.Replace "not text", "text"
Alternative to the alternative is to store the 5 "text"
ranges into one Range with Union
, clear the values of that range, and then set them back to "text"
when done
来源:https://stackoverflow.com/questions/39103551/remove-cell-from-range-object