2016-08-23 122 views
3

背景
我的代碼不超過範圍有些循環中除去細胞,但是,每個相互作用應在的範圍內不包括剛剛執行的細胞上進行。我認爲更簡單的方法是從存儲的範圍中刪除單元格。
問題
我一直沒能找到一種方法,從存儲對象中刪除單元格
代碼
的問題是一般,但是,對於問題它會像從範圍(對象)

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

時據我所知,沒有本地的方式來做這個功能。儘管你有幾個選擇。你可以創建一個UDF,它將從一個範圍中刪除一個單元格,你可以改變你如何定義你的範圍,或者你可以像平常一樣循環範圍,並檢查「文本」,如果單元格包含文本那麼不要在該單元上運行代碼,循環跳到下一個。我個人推薦最後一個選項,它將需要對當前代碼進行最少量的調整,並且仍然可以快速運行。 – tigeravatar

+0

我想UDF是一種方法,你只是給了我一個關於如何去做的想法。太糟糕了,沒有辦法以本地方式來做到這一點。 – Sgdva

+0

你不會喜歡這個答案,但是你將不得不做一堆'Intersect'或'Union'。你想找到第五個「文本」嗎? – Slai

回答

2

一種方法可能是這

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 

測試功能

Sub test() 

    MsgBox getExcluded(Range("A1:M10000"), Range("a10")).Address 

End Sub 
+1

這就是我正在處理的第一條評論,是的,這就是我一直在尋找的東西! – Sgdva

+0

有關進一步的參考,我只是發現,如果解析爲rngMain的參數是整列/行,它將不起作用,它應該被限制在調用此函數 – Sgdva

2

你會更好地使用For ... Each循環我懷疑。這應該是一個開始的地方:

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 

這應該然後對每個細胞進行自己的行爲,並移動到下一個和最後一個單元格自動停止。

您也可以將此嵌套在另一個For ...每個循環以循環不同的範圍等等。

+0

我想這是一個解決方案的事情,但是,我需要控制'爲每個'的週期。我可以添加一個計數器,但如果是這樣的話,我會回到「For/To」邏輯 – Sgdva

+0

@Sgdva,您需要以什麼方式控制循環?你可以在for ... each之後添加if語句以移至代碼的另一部分或退出循環。 –

+0

邏輯是一個循環,通過一個「查找」,而不是每個,代碼將需要很長的時間來分析每個單元,而不是執行查找,基於它的發生,觸發另一個事件(如果發現的文本是第5個那麼。 。)例如 – Sgdva

1

要找到5 "text"可以使用.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 

另一種方法可以替換找到"text"暫時與別的東西

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" 

替代方案是將5米"text"範圍存儲到一個範圍與Union,清除範圍的值,然後將它們回"text"

+0

上謝謝!但是,這是所有內部元素的循環,我必須使這個邏輯爲1,2,3,n ...這就是爲什麼我需要一些常規來調用,取決於需要的情況。 – Sgdva