2016-11-03 2 views
2

그래서 나는 많은 다른 장소에서 온라인으로 .activate을 사용하지 말거나 명령을 읽었습니다. 문제는 내 프로그램이 무겁게 그들에 의존합니다..activate/.select를 사용하지 않고 프로그램 작성. VBA

먼저 배경을 알려 드리겠습니다. 나는 직업의 일부를 자동화하는 프로그램을 작성 중이다. 몇 달 전에이 특정 부분의 코드를 이미 작성했으며 완벽하게 작동했습니다. 그러나 이제는 작업에 사용되는 코드를 업데이트하려고 시도하면서 오류가 발생합니다. 즉 ActiveCell.PasteSpecial의 인스턴스입니다. 문제를 일으키는 것이 .activate이라는 것을 읽었습니다. 왜 이것이 문제를 일으키는 원인일까요? 주요 질문으로

나는 특정 셀에서 계좌 번호를 4 일

  1. 을 내 코드가 필요합니다.
  2. 외부 프로그램에서 복사 한 "sheet2"붙여 넣기 텍스트 날짜를 "A1"로 활성화하고 붙여 넣은 데이터를 기반으로 "sheet2"의 다른 셀에서 텍스트 데이터를 수집합니다.
  3. "sheet1"붙여 넣기 데이터를 수집하고 다음 계좌 번호를받습니다.
  4. Excel과 키보드 입력 만 허용하는 다른 프로그램간에 전환하십시오. 이 단계는 성가신 일이지만 도움이 필요한 단계는 아닙니다.

여기에 제가 지금까지 가지고있는 코드가 있습니다. .activate없이 끝내려고 할 때 방금 잃어버린 단계의 대부분을 수행하는 방법을 안다.

Sub Macro1() 
' 
' Macro1 Macro 
' 

' 
     'find missing emails 
Dim e As Range, Rang As Range 
Set Rang = Range("A2:A100") 

AppActivate "Microsoft Excel" 
Worksheets("Email_List").Activate 
Range("A1").Activate 

For Each e In Rang 
    If Not IsEmpty(e.Value) = True Then 
     ActiveCell.Offset(1, 0).Activate 
     Sleep 700 
     ActiveCell.Offset(0, 3).Activate 
     Sleep 700 
     If IsEmpty(ActiveCell.Value) Then 
      ActiveCell.Offset(0, -3).Activate 
      Sleep 700 
      ActiveCell.Copy 
      Sleep 700 
      AppActivate "Other Program" 
      Sleep 500 
      SendKeys "~", True 
      Sleep 700 
      SendKeys "~", True 
      Sleep 700 
      SendKeys "~", True 
      Sleep 700 
      SendKeys "~", True 
      Sleep 700 
      SendKeys "~", True 
      Sleep 700 
      SendKeys "~", True 
      Sleep 700 
      SendKeys "~", True 
      Sleep 700 
      SendKeys "1", True 
      Sleep 700 
      SendKeys "~", True 
      Sleep 700 
      SendKeys "2", True 
      Sleep 700 
      SendKeys "~", True 
      Sleep 700 
      SendKeys "1", True 
      Sleep 700 
      SendKeys "~", True 
      Sleep 700 
      SendKeys "c ", True 
      Sleep 700 
      SendKeys "^v", True 
      Sleep 7001 
      SendKeys "^x", True 
      Sleep 7000 
      SendKeys "^a", True 
      Sleep 7000 
      SendKeys "^c", True 
      Sleep 7000 
      AppActivate "Microsoft Excel" 
      Sleep 500 
      Worksheets("Data").Activate 
      Cells.Activate 
      Cells.Delete 
      Range("A1").Activate 
      ActiveCell.PasteSpecial 
      Sleep 500 
       If Range("A24").Value = "CONF# NOT FOUND, PRESS <ENTER>" Then 
        Sleep 700 
        AppActivate "Other Program" 
        Sleep 500 
        SendKeys "~", True 
        Sleep 700 
        AppActivate "Microsoft Excel" 
        Sleep 500 
        Worksheets("Email_List").Activate 
       ElseIf Range("A24").Value = "ENTER RESERVATION NUMBER:" Then 
        Range("D24").Activate 
        ActiveCell.Value = "=LEFT(A6,6)" 
        ActiveCell.Copy 
        AppActivate "Other Program" 
        Sleep 500 
        SendKeys "^v", True 
        Sleep 700 
        SendKeys "30", True 
        Sleep 700 
        SendKeys "~", True 
        Sleep 700 
        SendKeys "^x", True 
        Sleep 700 
        SendKeys "^a", True 
        Sleep 700 
        SendKeys "^c", True 
        Sleep 700 
        AppActivate "Microsoft Excel" 
        Sleep 500 
        Worksheets("Data").Activate 
        Cells.Activate 
        Cells.Delete 
        Range("A1").Activate 
        ActiveCell.PasteSpecial 
        Sleep 500 
         If Range("A8").Value = "3. E-FOLIO" Then 
          Sleep 700 
          AppActivate "Other Program" 
          Sleep 500 
          SendKeys ("3") 
          Sleep 700 
          SendKeys ("~") 
          Sleep 700 
          SendKeys "^x", True 
          Sleep 700 
          SendKeys "^a", True 
          Sleep 700 
          SendKeys "^c", True 
          Sleep 700 
          AppActivate "Microsoft Excel" 
          Sleep 500 
          Worksheets("Data").Activate 
          Cells.Activate 
          Cells.Delete 
          Range("A1").Activate 
          ActiveCell.PasteSpecial 
          Sleep 700 
          Range("A21").Copy 
          Worksheets("Email_List").Activate 
          ActiveCell.Offset(0, 3).Activate 
          ActiveCell.PasteSpecial 
          ActiveCell.Offset(0, -3).Activate 
         End If 
       ElseIf Range("A2").Value = "===============================================================================" Then 
        AppActivate "Other Program" 
        Sleep 500 
        SendKeys "30", True 
        Sleep 700 
        SendKeys "~", True 
        Sleep 700 
        SendKeys "^x", True 
        Sleep 700 
        SendKeys "^a", True 
        Sleep 700 
        SendKeys "^c", True 
        Sleep 700 
        AppActivate "Microsoft Excel" 
        Sleep 500 
        Worksheets("Data").Activate 
        Cells.Activate 
        Cells.Delete 
        Range("A1").Activate 
        ActiveCell.PasteSpecial 
        Sleep 500 
         If Range("A8").Value = "3. E-FOLIO" Then 
          Sleep 700 
          AppActivate "Other Program" 
          Sleep 500 
          SendKeys ("3") 
          Sleep 700 
          SendKeys ("~") 
          Sleep 700 
          SendKeys "^x", True 
          Sleep 700 
          SendKeys "^a", True 
          Sleep 700 
          SendKeys "^c", True 
          Sleep 700 
          AppActivate "Microsoft Excel" 
          Sleep 500 
          Worksheets("Data").Activate 
          Cells.Activate 
          Cells.Delete 
          Range("A1").Activate 
          ActiveCell.PasteSpecial 
          Sleep 500 
          Range("A21").Copy 
          Worksheets("Email_List").Activate 
          ActiveCell.Offset(0, 3).Activate 
          ActiveCell.PasteSpecial 
          ActiveCell.Offset(0, -3).Activate 
         End If 
       End If 
     Else 
      ActiveCell.Offset(0, -3).Activate 
     End If 
    End If 

Next e 
End Sub 

제공 할 수있는 도움이 있으면 대단히 감사하겠습니다. 여기

+1

이 질문을 [코드 검토] (http://codereview.stackexchange.com) –

+0

에 질문해야하므로이 질문을 주제 넘게 끝내기로했습니다.이 질문을 다시 게시 해 드리겠습니다. 나를 올바른 장소로 안내해 주셔서 감사합니다. – AutomateMyJob

+0

CR에서 검토를 기다릴 수 없습니다. 상대방에게 뵙겠습니다. :-) –

답변

2

시작 :

Worksheets("Email_List").Activate 
Range("A1").Activate 

당신은 표시 "EMAIL_LIST"의 ThisWorkbook에서 워크 시트를 가지고있다. 실제 (Name) 속성은 Sheet12 일 수 있습니다. 다음은 "Microsoft Excel 개체"폴더 아래에있는 "EMAIL_LIST"시트를 선택 프로젝트 탐색기를 불러옵니다 Ctrl 키 + R을 공격하고, 속성을 toolwindow를 불러옵니다 F4을했다. (Name) 속성을 찾고 (위에 맨 위에 있어야 함) Sheet12 (또는 무엇이든)을 EmailListSheet으로 변경하십시오.

지금 다시 코드, 당신은 더 이상 워크 시트를 찾을 수 할 필요가 없습니다 - 당신 이미에에 대한 참조를 가지고있다.

EmailListSheet.Range("A1").Activate 

이 정확히 같은 일을 할 것입니다 :

Worksheets("Email_List").Activate 
Range("A1").Activate 

하지만 당신은 .Activate 범위에 싶지 않아요. 오히려, 당신은 그것에 대한 참조를 유지하고 싶습니다.이 대신에 이제

Dim workingRange As Range 
Set workingRange = EmailListSheet.Range("A1") 

:하십시오 Range 변수를 선언

ActiveCell.Offset(1, 0).Activate 
    Sleep 700 
    ActiveCell.Offset(0, 3).Activate 
    Sleep 700 

당신은이 작업을 수행 할 수 있습니다

Set workingRange = workingRange.Offset(1, 3) 

을 (여기 잠을 할 필요)

다음 원하는 것은 t입니다. 해당 셀이 비어있는 경우 O를 참조하십시오

If IsEmpty(ActiveCell.Value) Then 

그래서 그냥이 작업을 수행 할 수 있습니다 : 다음

If IsEmpty(workingRange.Value) Then 

이 같은 다른 셀을 복사하는 :

ActiveCell.Offset(0, -3).Activate 
Sleep 700 
ActiveCell.Copy 

잘 모르겠습니까? i 번째 모두 자고하지만, 어쨌든 당신이 대신이 일을 할 수 있습니다 :

workingRange.Offset(0, -3).Copy 

SendKeys, 다른 응용 프로그램에 붙여 다른 응용 프로그램에서 복사, 우리는 불면 부분에 도착 :

Worksheets("Data").Activate 
Cells.Activate 
Cells.Delete 
Range("A1").Activate 
ActiveCell.PasteSpecial 

같은 거래 : 그 워크 시트 DataSheet의 이름을 지정하고 해당 개체에 대한 참조를 작동합니다.

DataSheet.UsedRange.Clear 
DataSheet.Range("A1").PasteSpecial 

나머지는 동일합니다.

요점 :

  • 이름 워크 시트와 대신 Worksheets 컬렉션 당신이 그것을 필요로 할 때마다 모든 시트를 가져 오는, 당신은 무료로 얻을 전역 참조를 사용합니다.
  • Range 및 을 Worksheet 개체 (예 :)로 정규화하지 않고 호출하지 않도록합니다. DataSheet.Range. 자격이 없으면이 멤버는 암시 적으로 여기 ActiveSheet을 참조하십시오.
  • 코드가 의도 한대로 작동하면 수정 된 코드를 your Code Review question으로 편집하여 해당 게시물을 다시 열고 새 작업 코드 동료를 검토하고 개선하십시오.
관련 문제