2015-01-31 3 views
-2

VBA의 배열에 익숙해 지려고합니다. 나는 다른 시트에 "1"이 들어있는 줄을 복사하여 목록의 끝에 놓은 다음 원래 시트에서 지우고 싶습니다. 다음은 함께 작성한 코드입니다. 작동하지 않습니다.Excel VBA에서 배열을 반복 함

아무도 도와 줄 수 있습니까?

Sub array1() 
Dim Oblast() As Variant 
Dim dimension1 As Long 
Dim i As Long 
Dim dvojPole() As Variant 

Worksheets("live_position").Activate 

Oblast = Range("A2", Range("A1").End(xlDown)) 
dimension1 = UBound(Oblast, 1) 
ReDim dvojPole(1 To dimension1, 1 To 2) 

For i = 1 To dimension1 
Set dest = Worksheets("closed").Range("A1").End(xlDown).Offset(1, 0) 
    If dvojPole(i, 1) = 1 Then 
     dvojPole(i, 1).EntireRow.Copy Destination:=dest 
     dvojPole(i, 1).EntireRow.Delete 
    End If 

Next i 
End Sub 
+3

의미가 없습니다 .... –

+0

코드를 사용해 보셨습니까? –

+0

@ 루덱 "문제가 해결되지 않았습니다 : 문제에 대한 설명이 충분하지 않습니다. _ 코드가 원하는 것을 설명해야합니다. 현재 수행중인 작업과 해결해야 할 작업을 설명해야합니다. –

답변

0

아래의 예를 고려하십시오. 배열을 올바르게 정의하지 않았고 값을 반복하지 않았습니다. 여기에서 핵심은 범위에서 반복하기 위해 셀 값 위치와 실제 셀 값을 참조하는 것입니다.

On Error GoTo ErrHandle: 
    Dim Oblast() As Variant 
    Dim xlcell As Range, cleanupRng As Range 
    Dim i As Integer, j As Integer, k As Integer, l As Integer, counter As Integer 

    ' DEFINE DIMENSION OF ARRAY 
    ReDim Oblast(0 To Range("A2", Range("A1").End(xlDown)).Count) 

    ' INSERT VALUES (CELL LOCATION) IN ARRAY 
    i = 0 
    For Each xlcell In Range("A2", Range("A1").End(xlDown)) 
     Oblast(i) = xlcell.Address(False, False, xlA1) 
     i = i + 1 
    Next xlcell 

    j = Worksheets("closed").Range("A1").End(xlDown).Row + 1 

    ' ITERATE ACROSS ARRAY 
    For k = LBound(Oblast) To UBound(Oblast) - 1 
     If Range(Oblast(k)) = 1 Then 
      Range(Oblast(k)).Copy Destination:=Worksheets("closed").Range("A" & j) 
      Range(Oblast(k)).EntireRow.ClearContents 
     End If 
    j = j + 1 
    Next k 

    ' DELETING CLEARED ROWS 
    Set cleanupRng = Range("A1:A" & ActiveSheet.UsedRange.Rows.Count) 

    l = 1 
    For counter = 1 To ActiveSheet.UsedRange.Rows.Count 
     If Len(cleanupRng.Cells(l)) = 0 Then 
      cleanupRng.Cells(l).EntireRow.Delete 
     Else 
      l = l + 1 
     End If 
    Next counter 
    Exit Sub 

ErrHandle: 
    MsgBox Err.Number & " - " & Err.Description 
    Exit Sub 
+0

고맙다 Parfait! 좋아 보인다. "Range (Oblast (k)) = 1 Then If" 그것을 고치십시오 : (. "ClearContents"에 관해서는 이것은 정확하게 wh가 아니다. 나는 찾고있다. 나는 그 라인을 제거해야합니다. 배열을 사용할 때 범위를 반복 할 때 루프를 바닥부터 반복 할 필요가 없다고 생각했습니다. 이것은 배열을 사용할 때 이점 중 하나가되어야합니다. – Ludek

+0

'ClearContents' 대신'.Delete'를 사용하십시오. –

+0

아니요, 장점이 없습니다. 컬렉션에서 항목을 제거 할 때마다 뒤로 물러서십시오. 이 경우 배열을 사용하는 대신 워크 시트/범위 개체를 사용하는 것이 더 나을 것입니다. 실제로 배열을 중간 단계로 사용하여 추가 작업을 만듭니다. –