2016-08-26 3 views
1

있음 Excel에서 네 개의 열이 있습니다. 첫 번째 열에 숫자가 있고 두 번째 열은 비어 있고 세 번째 열은 숫자를 포함하고 네 번째 열은 텍스트를 포함합니다.EXCEL VBA : 열 및 복사 루핑

첫 번째 열의 각 값을 확인하고 세 번째 열에 있는지 확인하고 싶습니다. 일치하는 경우 해당하는 세 번째 열 옆에있는 네 번째 열의 값을 해당 첫 번째 열 옆의 두 번째 열에 복사해야합니다.

컴파일 오류가 발생합니다. 다음이없는 다음. 여기 내 코드는 지금까지 있습니다 :

Sub Compare() 

    Dim colA As Integer, colB As Integer 

    colA = Columns("A:A").Rows.Count 
    colB = Columns("C:C").Rows.Count 


     For I = 2 To colA 'loop through column A 

      For j = 2 To colB 'loop through column C 

       ' If a match is found: 
       If Worksheets("Sheet1").Cells(I, 1) = Workshee("Sheet1").Cells(j, 3) Then 
        ' Copy 
        Worksheets("Sheet1").Cells(j, 4) = Worksheets("Sheet1").Cells(I, 2) 
        'Exit For 

      Next j 

     Next I 

End Sub 
+1

당신은'If'를 닫지 않습니다. 'Next j' 전에'End If'를 추가하십시오. Btw, "For Without For"에 대한 빠른 Google 검색은 같은 대답을했을 것입니다. – arcadeprecinct

+1

VBA가 필요하지 않습니다. 두 번째 열에 적절한 수식을 사용하면 충분합니다. VLOOKUP() 및 IFERROR() 검색 –

+0

열 A와 B의 전체 행을 반복하면서 해당 값을 정수로 설정합니다. Long으로 선언하십시오. 적절한 LastRow 문도 사용하십시오. –

답변

2

으로 이미 당신은 또한 VLookUp 또는 INDEX/MATCH의 조합으로이 작업을 수행 할 수 위의 댓글에서 지적했다. 그러나 VBA를 계속 사용하려면 코드를 약간 조정해야합니다. 둘 다 할 것입니다

Option Explicit 

Sub Compare() 

Dim ws As Worksheet 
Dim i As Long, j As Long 
Dim colA As Long, colC As Long 

Set ws = ThisWorkbook.Worksheets("Sheet1") 
colA = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row 
colC = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row 

'loop through column A 
For i = 2 To colA 
    'loop through column C 
    For j = 2 To colC 
     ' If a match is found: 
     If ws.Cells(i, 1).Value2 = ws.Cells(j, 3).Value2 Then 
      ' Copy column B to Column D as written in your code above 
      ws.Cells(j, 4).Value2 = ws.Cells(i, 2).Value2 
      ' or copy column D to Column B as written in the question/post 
      ws.Cells(i, 2).Value2 = ws.Cells(j, 4).Value2 
      'Exit For 
     End If 
    Next j 
Next i 

ws.Range("D2:D" & colC).FormulaR1C1 = "=INDEX(R2C2:R" & colA & "C2,MATCH(RC[-1],R2C1:R" & colA & "C1,0))" 

End Sub 

위의 코드 :

  1. VBA를 방법 및
  2. 당신을위한 INDEX/MATCH 수식을 작성합니다.

원하지 않는 코드 세그먼트 만 삭제하면됩니다.

+0

감사합니다. 이것은 컴파일 오류를 준다. 유효하지 않거나 규정되지 않은 참조가 표시됩니다. 왜 그럴 수 있니? – kit

+0

죄송합니다, 실수. 나는 With 문으로 코드를 작성한 다음 Set ws = ThisWorkbook.Worksheets ("Sheet1")'으로 변경했습니다. 그래서'ws.' 대신'.'로 시작하는 몇 가지 방법이있었습니다. 나는 그것을 바꿨다. 이제는 효과가 있습니다. – Ralph

+0

두 개 이상의 일치 항목이있는 경우 VBA 솔루션과 수식이있는 솔루션간에 차이가 있음에 유의하십시오. 수식에는 VBA 솔루션이 마지막 일치를 제공하는 동안 첫 번째 일치 항목이 표시됩니다 (일치하는 항목이 발견 될 때마다 'D'의 값을 덮어 씁니다). – Ralph

0

코드 사용을 주장하는 경우이 고정 버전을 사용하십시오. 그것은 테스트되지 않은 있지만 잘 작동합니다.

Sub Compare() 
Dim LastRowA As Long, LastRowB As Long, i As Long, j As Long 

With Worksheets("Sheet1") 
    LastRowA = .Range("A" & Rows.Count).End(xlUp).Row 
    LastRowC = .Range("C" & Rows.Count).End(xlUp).Row 

    For i = 2 To LastRowA 

     For j = 2 To LastRowC 

       If .Cells(i, 1) = .Cells(j, 3) Then .Cells(i, 2) = .Cells(j, 4): Exit For 

     Next j 

    Next i 

End With 

End Sub 

오류가 있으면 알려주세요.

+0

고마워요. 그것은 말합니다 : 컴파일 오류 : 하위 또는 함수 정의되지 않았습니다 – kit

+0

@kit 편집 된 답변을보십시오. 지금 고쳐졌습니다 –

+0

@ 랄프 아니, 그런 일은하지 않았다. 나는 그것을 한 적이 없어 & 나는 결코 것입니다. OP 아래 내 의견을 참조하십시오. 내가 너를 복사했다고 생각하면이 대답을 모두 지울거야. 진실은 OP 코드를 복사하고 그에 따라 편집합니다. 이 답변을 쓰는 ​​동안 당신이 대답을 먼저 게시한지 얼마되지 않았습니다. 그리고 나는이 질문에 처음으로 대답하는 것을 후회합니다. 그래도 조언 주셔서 감사합니다. –