2013-08-13 2 views
0

그래서 어제 나는 내 첫 번째 질문을 올렸고, 벽돌 더미처럼 쓰러졌다. 그러나 나 자신을 털어 내고, 가루를 벗고, 잘하면이 질문은 받아 들일 만하다. :-)Excel VBA : 컴파일러 오류

나는 모니터링해야하는 건강 설문지 목록에서 데이터 중복을 제거하려고하는데, 내가 어려움을 겪고있는 것은 하나의 열에서 중복 된 것을 찾은 다음 3 개의 인접한 열에 대해서도 동일한 행의 데이터가 중복되었는지 확인하는 것이 었습니다. 검색된 '중복 열'을 저장하는 것은 나를 떨쳐 버리는 비트였습니다.

다른 유사한 기능의 스크립트에서 함께 자른 코드가 있습니다. 이제 디버그 모드에서 오류가 계속 발생합니다 ... VBA에 대한 많은 경험이 없으므로 옵션이 부족합니다.

변수 g 및 형식이 일치하지 않습니다. firstAddress입니다. 왜 이들은 문제를 일으키는가? ???

firstAddress.Row으로 전화를 걸거나 잘못된 나무를 짖을 수 있습니까?

여기에 코드 조각입니다 :

g = .Find(Range("G" & i).Text, LookIn:=xlValues) 
      If Not g Is Nothing Then 
       firstAddress = g.Address 
       dupRow = firstAddress.Row 

그리고 여기에 전체 코드를 아래입니다. 어떤 도움을 많이 주시면 감사하겠습니다!

Sub FindCpy() 
Dim lw As Long 
Dim i As Integer 
Dim sh As Worksheet 
Dim dupRow As Integer 
Dim g As Integer 
Dim firstAddress As Integer 


'Used for the new worksheet we are pasting into 
Dim objNewSheet As Worksheet 
Dim rngNextAvailbleRow As Range 

'Used to narrow down the logical operators for duplicates 
Dim rngFirst As Range 

'Set the ranges 
rngFirst = Range("G" & 1, "G" & lw) 

Set sh = Sheets("Completed") 
lw = Range("A" & Rows.Count).End(xlUp).Row 

For i = 1 To lw 'Find duplicates from the list. 
    If Application.CountIf(Range("A" & i & ":A" & lw), Range("A" & i).Text) = "Complete" Then 

    'if COMPLETE, check the rest of the sheet for any 'in progress' duplicates... 
    With Worksheets("Still In Progress").rngFirst 
     g = .Find(Range("G" & i).Text, LookIn:=xlValues) 
     If Not g Is Nothing Then 
      firstAddress = g.Address 
      dupRow = firstAddress.Row 
      If Range("H" & dupRow).Text = Range("H" & i).Text _ 
      And Range("I" & dupRow).Text = Range("I" & i).Text _ 
      And Range("J" & dupRow).Text = Range("J" & i).Text Then 

     'select the entire row 
     Range.EntireRow.Select 

     'copy the selection 
     Selection.Cut 

     'Now identify and select the new sheet to paste into 
     Set objNewSheet = ThisWorkbook.Worksheets("Completed") 
     objNewSheet.Select 

     'Looking at your initial question, I believe you are trying to find the next  available row 
     Set rngNextAvailbleRow = objNewSheet.Range("A1:A" & objNewSheet.Cells(Rows.Count, "A").End(xlUp).Row) 

     Range("A" & rngNextAvailbleRow.Rows.Count + 1).Select 
     ActiveSheet.Paste 

     'delete the initial row 
     rngCell.EntireRow.Delete 

     Set g = .FindNext(g) 
      Loop While Not g Is Nothing And g.Address <> firstAddress 
     End If 
    End With 
Next i 
End Sub 
+0

Sub보다 먼저 Option Explicit를 추가하고 Integer가 아닌 Dim g As Range를 추가하십시오. – pnuts

+0

감사합니다. 나는 g가 정수를 반환 할 것이라고 생각했지만, 여러분이 맞습니다. 범위는 찾고자하는 것이 었습니다. 지금 Range.EntireRow.Select는 인수가 선택 사항이 아니기 때문에 유효하지 않습니다 ...이 코드 줄은 이전에 작동했습니다 ... 어떤 생각이 들었습니까? – user2674568

+0

아마도 Range (R, 1)입니다. 범위보다는 오히려. ? – pnuts

답변

0

나는 코드를주의 깊게 검토했습니다. 여러 가지 문제가있었습니다. 이 중 일부는 해결할 수 있었다고 생각합니다. 내가 의도 한 것을 추측 한 곳이 있었지만, 그 중 한 곳에서 방금 마크했습니다. 당신은 당신이 정의되지 않습니다 범위 ...

첫 번째 문제는 라인입니다 삭제하는 당신은, 당신이 뭘하려고했는지 설명 할 필요가 다음 CountIf 함수는 숫자를 반환

If Application.CountIf(Range("A" & i & ":A" & lw), Range("A" & i).Text) = "Complete" Then 

을; 이 숫자를 문자열 "Complete"와 비교합니다. 나는 당신이이 줄을 지나갈 수 있다고 생각하지 않는다. 그래서 나머지 코드는 (정확하거나 틀림없이) 실행되지 않을 것이다. 라인이 "Complete"로 표시 될지 확신 할 수 없기 때문에이 라인에서 무엇을하려하는지 명확하게 밝히지는 않겠지 만, A & i의 셀에 문자열이있는 경우 나머지 코드를 실행하는 데 관심이 있다고 가정하면 그때는 아마 제대로은 End 일치 종료되지 않은 If - Then, WithLoop 구조의 숫자가 있었다

If Range("A" & i).Text = "Complete" Then 

하고 싶은, 그것에서 "완료". 나는 이것을 바로 잡으려고 노력했다. 적절한 들여 쓰기를 사용하면 이와 같은 문제를 찾는 데 정말로 도움이됩니다. 코드의 상단에 Option Explicit를 사용 - 스페이스 바를 당신의 친구입니다 ... Find 방법은 개체를 반환

때문에,이 함수를 사용하는 올바른 방법은 그것과는 별도로

Set g = .Find(Range("G" & i).Text, LookIn:=xlValues) 

입니다 가능한 가장 제한적인 (올바른) 유형의 변수를 정의하십시오. 내가 이것을했을 때 나는 교정 할 수없는 오류를 발견했다. - rngCell 변수는 선언도하지도 않고 설정도되지 않았다 ... 그것은 얼마나 도움이되는지를 보여준다.또한 오타를 잡기위한 좋은 - VBA 행복하게 당신이

myVar에 = 1 있는 MsgBox myVra + 1

메시지 때문에 오타, 1하지 2 것입니다 ... 사실 같은 것을 쓸 수있게된다 Explicit을 그 옵션이 있어야합니다.은 VBA 팀이 내린 수많은 불가사의 한 디자인 결정 중 하나입니다.

다음은 "대부분의 오류가 수정 된"코드입니다. 적어도 컴파일 할 때처럼 컴파일 될 것입니다.하지만 나머지 오류를 어떻게 처리해야하는지 알아야합니다 ("Complete"로 표시된 셀을 사용하여 수행하려는 작업에 대해 정확히 짐작할 수는 없습니다).

댓글 환영합니다.

Option Explicit 

Sub FindCpy() 
Dim lw As Long 
Dim i As Integer 
Dim sh As Worksheet 
Dim dupRow As Integer 
Dim g As Range 
Dim firstAddress As Range 

'Used for the new worksheet we are pasting into 
Dim objNewSheet As Worksheet 
Dim rngNextAvailbleRow As Range 

'Used to narrow down the logical operators for duplicates 
Dim rngFirst As Range 

'Set the ranges 
rngFirst = Range("G" & 1, "G" & lw) 

Set sh = Sheets("Completed") 
lw = Range("A" & Rows.Count).End(xlUp).Row 

For i = 1 To lw 'Find duplicates from the list. 
' If Application.CountIf(Range("A" & i & ":A" & lw), Range("A" & i).Text) = "Complete" Then 
    If Range("A" & i).Text = "Complete" Then 
    'if COMPLETE, check the rest of the sheet for any 'in progress' duplicates... 
    With Worksheets("Still In Progress").rngFirst 
     Set g = .Find(Range("G" & i).Text, LookIn:=xlValues) 
     If Not g Is Nothing Then 
      firstAddress = g.Address 
      dupRow = firstAddress.Row 
      If Range("H" & dupRow).Text = Range("H" & i).Text _ 
      And Range("I" & dupRow).Text = Range("I" & i).Text _ 
      And Range("J" & dupRow).Text = Range("J" & i).Text Then 

      'select the entire row 
      g.EntireRow.Select 

      'copy the selection 
      Selection.Cut 

      'Now identify and select the new sheet to paste into 
      Set objNewSheet = ThisWorkbook.Worksheets("Completed") 
      objNewSheet.Select 

      'Looking at your initial question, I believe you are trying to find the next  available row 
      Set rngNextAvailbleRow = objNewSheet.Range("A1:A" & objNewSheet.Cells(Rows.Count, "A").End(xlUp).Row) 

      Range("A" & rngNextAvailbleRow.Rows.Count + 1).Select 
      ActiveSheet.Paste 

      'delete the initial row 
      rngCell.EntireRow.Delete ' <<<<<< the variable rngCell was never defined. Cannot guess what you wanted to do here! 

      Do 
       Set g = .FindNext(g) 
       Loop While Not g Is Nothing And g.Address <> firstAddress 

      End If ' entire row matched 
     End If ' Not g Is Nothing 
     End With ' With Worksheets("Still in Progress") 
    End If  ' CountIf = "Complete" 

    Next i 

End Sub 

또 다른 유용한 트릭 : 당신이 Range("A" & rngNextAvailbleRow.Rows.Count + 1).Select로하고있는대로 "가능한 다음 행에 붙여 넣기"때, 나는 보통은 편리한 대신이 같은 뭔가를 찾을 수 :

Dim destination As Range 
Set destination = Worksheets("Sheetname").Range("A1") 

그리고 때를 뭔가를 붙여 넣어야 :

destination.Select 
ActiveSheet.Paste 
Set destination = destination.Offset(1,0) 

이 방법 destination는 항상 "나는 붙여 넣을 수 있습니다 다음 장소"를 가리키고 있습니다. 나는 그것이 도움이되고 깨끗한 것을 느낀다.