2016-08-23 125 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