2016-11-03 3 views
2

Так что я читал онлайн в разных местах, что я не должен использовать .activate или команды вроде этого. проблема в моей программе HEAVILY полагается на них.Написание программы без использования .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 

У вас есть лист в ThisWorkbook, что это маркированы "Email_List". Его фактическим (Name) может быть Sheet12; хит Ctrl +R, чтобы открыть Project Explorer,, затем выберите "Email_List" лист в папке "Объекты Microsoft Excel", и нажмите F4 , чтобы вызвать Свойства ToolWindow. Найдите свойство (Name) (должно быть самое первое сверху) и смените Sheet12 (или что-то еще) на EmailListSheet. не

Теперь вернемся к коду, вам больше не нужно найти лист - вы имеют ссылку на него уже.

EmailListSheet.Range("A1").Activate 

будет делать то же самое, как это:

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

Но вы не хотите, чтобы .Activate диапазона. Скорее, вы хотите сохранить ссылку на него.Объявите Range переменную:

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

Теперь вместо этого:

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

Вы можете сделать это:

Set workingRange = workingRange.Offset(1, 3) 

(нет необходимости спать здесь)

Далее вы хотите t о увидеть, что если ячейка пуста

If IsEmpty(ActiveCell.Value) Then 

Таким образом, вы будете просто сделать это:

If IsEmpty(workingRange.Value) Then 

Затем вы копируете другую ячейку, как это:

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

Не уверен, что случилось Ith все, что спит, но в любом случае вы будете делать это вместо:

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 и Cells без квалификации их с помощью объекта Worksheet, например. DataSheet.Range. Когда они не являются квалифицированными, эти члены неявно ссылаются на ActiveSheet, чего вы хотите избежать здесь.
  • После того, как вы получите код для работы в соответствии с назначением, отредактируйте переработанный код на your Code Review question, чтобы снова открыть этот пост, а ваш новый рабочий код просмотрен и усовершенствован.
Смежные вопросы