2014-10-29 2 views
2

스프레드 시트의 맨 아래부터 스프레드 시트의 맨 위로 범위를 탐색해야합니다. 범위가 불 연속적 일 수는 있지만 겹침을 제거했습니다 (행 순서에만 관심이 있으므로 열을 "A"로 축소했습니다). 그리고 범위를 "Overall_Range"에 배치했습니다. 영역은 임의의 순서로 범위에 올 수 있으므로 Get_Loop_Order 함수를 작성하여 영역을 아래에서 위로 처리해야하는 순서로 배열을 반환합니다. 내 계획은 바로이 같은 (바닥이 위로로) 각 영역을 반복했다 : 나는 Range.Rows에 각각에 대한이 역순으로 처리되지 않습니다 것을 깨달았다Excel VBA Range.Rows 반복되는 행의 반복자 순서

Loop_Order = Get_Loop_Order(Overall_Range) 
For A = LBound(Loop_Order) To UBound(Loop_Order) 
    For Each this_row In Overall_Range.Areas(Loop_Order(A)).Rows 
    ... do stuff ... 
    Next this_row 
Next A 

(사실, 내가 보장이 없다 내가 아는 한 순서의 모든 것).

특정 행 순서로 발생하도록 보장되는 범위를 반복하는 방법이 있다면 누구에게 알 수 있습니까? Excel VBA 용어 인 "Selection"과 혼동되어서는 안되는 단어 "select"의 사용을 선택하면 위 코드는 "Overall_Range"를 사용합니다.) 범위는 아래에서 위로 (A10 : A2) 범위에 있습니다. 순서대로 위에서 아래로 범위를 선택하면 (A2 : A10)이 순서대로됩니다. 나는 유니온 (A10 : A2, A1 : A2)과 같은 일을한다면 어떻게 될지 전혀 모른다. 나는 물건을 처리 할 순서가있는 배열을 반환하는 또 다른 함수를 작성해야한다고 생각하지만 다른 사람이 다른 해결책을 가지고 있다면 그것을 좋아할 것입니다. 도울 수 있니?

업데이트 : 여기에 몇 가지 더 많은 테스트를했다

코드입니다 :
Dim my_range As Range 'Range being tested 
Dim N As Long   'Loop variable when numbers are needed 
Dim M As Range  'Loop variable when ranges are needed 

Set my_range = ActiveSheet.Range("A2:A10") 

ActiveSheet.Range("B1").Value = "A2:A10" 
ActiveSheet.Range("B1").Font.Bold = True 
ActiveSheet.Range("B1").HorizontalAlignment = xlCenter 
ActiveSheet.Range("B1:C1").Merge 
ActiveSheet.Range("B2").Value = "Row Index" 
ActiveSheet.Range("B2").Font.Bold = True 
ActiveSheet.Range("B2").HorizontalAlignment = xlCenter 
ActiveSheet.Range("C2").Value = "Row Iterator" 
ActiveSheet.Range("C2").Font.Bold = True 
ActiveSheet.Range("C2").HorizontalAlignment = xlCenter 

For N = 1 To my_range.Rows.Count 
    ActiveSheet.Range("B" & N + 2).Value = my_range.Rows(N).Row 
Next N 

N = 1 
For Each M In my_range.Rows 
    ActiveSheet.Range("C" & N + 2).Value = M.Row 
    N = N + 1 
Next M 

Set my_range = ActiveSheet.Range("A10:A2") 

ActiveSheet.Range("D1").Value = "A10:A2" 
ActiveSheet.Range("D1").Font.Bold = True 
ActiveSheet.Range("D1").HorizontalAlignment = xlCenter 
ActiveSheet.Range("D1:E1").Merge 
ActiveSheet.Range("D2").Value = "Row Index" 
ActiveSheet.Range("D2").Font.Bold = True 
ActiveSheet.Range("D2").HorizontalAlignment = xlCenter 
ActiveSheet.Range("E2").Value = "Row Iterator" 
ActiveSheet.Range("E2").Font.Bold = True 
ActiveSheet.Range("E2").HorizontalAlignment = xlCenter 

For N = 1 To my_range.Rows.Count 
    ActiveSheet.Range("D" & N + 2).Value = my_range.Rows(N).Row 
Next N 

N = 1 
For Each M In my_range.Rows 
    ActiveSheet.Range("E" & N + 2).Value = M.Row 
    N = N + 1 
Next M 

Set my_range = Union(ActiveSheet.Range("A10:A2"), ActiveSheet.Range("A1:A2")) 

ActiveSheet.Range("F1").Value = "UNION(A10:A2,A1:A2)" 
ActiveSheet.Range("F1").Font.Bold = True 
ActiveSheet.Range("F1").HorizontalAlignment = xlCenter 
ActiveSheet.Range("F1:G1").Merge 
ActiveSheet.Range("F2").Value = "Row Index" 
ActiveSheet.Range("F2").Font.Bold = True 
ActiveSheet.Range("F2").HorizontalAlignment = xlCenter 
ActiveSheet.Range("G2").Value = "Row Iterator" 
ActiveSheet.Range("G2").Font.Bold = True 
ActiveSheet.Range("G2").HorizontalAlignment = xlCenter 

For N = 1 To my_range.Rows.Count 
    ActiveSheet.Range("F" & N + 2).Value = my_range.Rows(N).Row 
Next N 

N = 1 
For Each M In my_range.Rows 
    ActiveSheet.Range("G" & N + 2).Value = M.Row 
    N = N + 1 
Next M 

Set my_range = Union(ActiveSheet.Range("A10:A2"), ActiveSheet.Range("A1:A2"), ActiveSheet.Range("A11:A12")) 

ActiveSheet.Range("H1").Value = "UNION(A10:A2,A13:A15,A11:A12)" 
ActiveSheet.Range("H1").Font.Bold = True 
ActiveSheet.Range("H1").HorizontalAlignment = xlCenter 
ActiveSheet.Range("H1:I1").Merge 
ActiveSheet.Range("H2").Value = "Row Index" 
ActiveSheet.Range("H2").Font.Bold = True 
ActiveSheet.Range("H2").HorizontalAlignment = xlCenter 
ActiveSheet.Range("I2").Value = "Row Iterator" 
ActiveSheet.Range("I2").Font.Bold = True 
ActiveSheet.Range("I2").HorizontalAlignment = xlCenter 

For N = 1 To my_range.Rows.Count 
    ActiveSheet.Range("H" & N + 2).Value = my_range.Rows(N).Row 
Next N 

N = 1 
For Each M In my_range.Rows 
    ActiveSheet.Range("I" & N + 2).Value = M.Row 
    N = N + 1 
Next M 

결과

는 한숨 ... 나는 이미지를 게시 할 수 없기 때문에 내가 게시 할 수 없습니다 뭔가있다 ... 그들이 보여 범위가 얼마나 미치는지에 관계없이 행 컬렉션을 통해 액세스 할 때 행 순서대로 표시됩니다.

이것은 행 컬렉션을 통해 액세스 할 때 범위와 관련하여 어떤 미친 짓을하던간에 행이 일관되게 반환된다는 것을 보여줍니다. 나는 이것이 (코멘트에 제안 된대로) 범위를 거꾸로 뒤로 움직이는 접근 방식이 효과가있을 것이라고 생각하고있다.

+3

왜 당신은 아마 당신이 (선택한 행뿐만 아니라 확인하실 수 있습니다 아니라 예? – Rory

+0

에 대해 "N 들어 = Range.Rows.Count 1 단계 -1'보다 Each'를 들어'사용해야 할 'A2 : A10'이 선택되었을 때'2 '가 될 것입니다. 또는 당신이 선택하는 맨 위의 행 - 맨 위 또는 맨 아래에서 선택되었는지 여부)뿐만 아니라 activecell 행 (선택된 첫 번째 행에 대한 행이 될 것입니다) 진짜 답변이 아니라 방향성 도움이 될 것입니다. – guitarthrower

+0

@Rory : 이것은 좋은 제안이며 선택 항목이 맨 위 또는 맨 아래에서 시작되었는지 여부를 결정한 후에 사용할 수 있습니다 .. – guitarthrower

답변

2

이 코드는 트릭을 수행해야합니다.

VBA 관점에서 Range("A2:A10")Range("A10:A2")은 정확히 동일합니다 (예 : 동일한 주소 : $A$2:$A$10). 한 가지 또는 다른 루프를 반복하려면 다른 인수를 전달해야합니다.

편집

그것은 Overall_Range 당신이 제공하는 다음 Up 또는 Down의 방향이 다음 For 문에서 사용할 변수에 값을 할당합니다.

선택 항목을 사용하지 않았습니다.

Option Explicit 

Sub LoopOrderTest() 
    Dim Overall_Range As Range 
    Dim sLoopDir As String 
    Dim iTtlRows As Integer 
    Dim iLoopStep As Integer 
    Dim iLoopFrom As Integer 
    Dim iLoopTo As Integer 
    Dim n As Integer 

    Set Overall_Range = Range("A2:A10") 
    sLoopDir = "Up" 'or "Down" 

    iTtlRows = Overall_Range.Rows.Count 'Get total rows 

    'Assign for loop control items based on sLoopDir value 
    If sLoopDir = "Up" Then 
     iLoopFrom = 1 
     iLoopTo = iTtlRows 
     iLoopStep = 1 
    ElseIf sLoopDir = "Down" Then 
     iLoopFrom = iTtlRows 
     iLoopTo = 1 
     iLoopStep = -1 
    End If 

    Dim i As Integer 'used only to put items in cells for testing 
    i = 1 

    For n = iLoopFrom To iLoopTo Step iLoopStep 
     'do stuff. 
     'for now just print a number showing the order that the loop works through 
     Overall_Range.Cells(n, 1).Value = i 
     i = i + 1 
    Next n 
End Sub 

여기에 sLoopDir = "Up"을 설정하고 코드를 실행하면 어떻게되는지 보여줍니다. 오름차순의 숫자는 위에서 아래로 반복됩니다.

top to bottom

이 내가 sLoopDir = "Down"을 설정하고 코드를 실행하면 어떻게되는지 보여줍니다. 내림차순으로 번호가 아래에서 위로 반복됩니다.

bottom to top

+0

당신의 솔루션은 ActiveCell을 전혀 고려하지 않고 작동한다고 생각합니다. 범위를 역순으로 처리해야합니다. 그러나 "A2 : A10"은 "A10 : A2"(예 : $ A $ 2 : $ A $ 10)와 정확히 같은 범위를 반환한다는 사실을 통찰력을 통해 확인했습니다. – bfish

+0

우수. 귀하의 질문은 양방향을 요구 했으므로 그에 대한 응답을 받았습니다. 다행이 당신을 위해 일했다. – guitarthrower