2011-11-30 15 views
10

W jaki sposób przechodzę przez komórki od B1 do J1 i dodam je do zakresu, jeśli spełniają określone kryteria. Na przykład.Przeprowadź pętle w komórkach i dodaj do zakresu

Dim Range1 As Range 
For i = 1 to 9 
If Range("A1").Offset(1,i) meets a certain criteria Then 
**Add that cell to Range1** 
End If 
Next i 

Nie jestem pewien, jak podejść do części dodawania niektórych komórek do zakresu 1.

Dzięki za pomoc!

Odpowiedz

23

Coś takiego korzystania Union skleić razem Twój zakres

  1. Uwaga For each pętle są szybsze niż podejście For i = 1 to x
  2. Możesz również móc korzystać SpecialCells, aby określić nowy zakres natychmiast (któreś z półwyrobów, błędy, dowolne wzory, itp)

    Sub Test() 
        Dim rng1 As Range 
        Dim rng2 As Range 
        Dim c As Range 
        Set rng1 = Range("B1:J1") 
    
        For Each c In rng1 
        ' Add cells to rng2 if they exceed 10 
        If c.Value > 10 Then 
         If Not rng2 Is Nothing Then 
         ' Add the 2nd, 3rd, 4th etc cell to our new range, rng2 
         ' this is the most common outcome so place it first in the IF test (faster coding) 
          Set rng2 = Union(rng2, c) 
         Else 
         ' the first valid cell becomes rng2 
          Set rng2 = c 
         End If 
        End If 
        Next 
    End Sub 
    
+0

jesteś pewny "Czy każda pętla jest szybsza niż w przypadku podejścia For i = 1 do x"? Myślałem inaczej https://stackoverflow.com/questions/365615/in-net-which-loop-runs-faster-for-or-foreach – curious

+1

'Dla każdego' jest szybsze dla zakresu,' Dla każdego 'szybciej dla zapętlenia poprzez wariantową tablicę – brettdj

+0

o ok. thanx w celu wyjaśnienia – curious

1

Używam tej metody w trybie natychmiastowym, gdy nie chcę dodawać kodu do arkusza.

strX="": _ 
For Each cllX in Range(ActiveCell, Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, ActiveCell.Column)): _ 
strX=strX & iif(cllX.text="","",iif(strX="","",",")& cllX.address): _ 
Next: _ 
Range(strX).Select 

Ale chociaż jest to intuicyjne, działa tylko dla 35 do 50 komórek. Po tym, VBA zwraca błąd 1004.

Run-time error '1004': 
Application-defined or object-defined error 

Jest bardziej wytrzymała używać funkcję Unii.

Set rngX=ActiveCell: _ 
For Each cllX in Range(ActiveCell, Cells(cells.SpecialCells(xlCellTypeLastCell).Row, ActiveCell.Column)): _ 
Set rngX=iif(cllX.text="", rngX, Union(rngX, cllX)): _ 
Next: _ 
rngX.Select 

Jest tak krótki i intuicyjny, po prostu wyrzucam go po każdym użyciu.