2015-03-03 4 views
0

Так вот что я пытаюсь сделать:Excel VBA - Форматирование сценарий для автоматизации

  1. Открыть файл: Pc_Profile
  2. Создать новый лист: Лист1
  3. Скопируйте нужные клетки Pc_Profile в Лист1 (см скрипт ниже)
  4. Скопируйте весь Лист1 в новый Excel файл: db.xls
  5. Переименовать лист содержание ячейки A5
  6. Создать новый лист для следующего сценария запуска

В основном я пытаюсь автоматизировать извлечение TON файлов excel в один организованный файл. Каждый вызов сценария должен извлекаться на свой собственный лист, чтобы не было перезаписи.

Вот что я до сих пор работаю. Он просто копирует нужные ячейки на новый лист в том же файле.

' Create Excel object 
Set objExcel = CreateObject("Excel.Application") 

' Open the workbook 
Set objWorkbook = objExcel.Workbooks.Open _ 
    ("\\[directory]\Pc_Profile.xls") 

' Set to True or False, whatever you like 
objExcel.Visible = True 


objWorkbook.Worksheets("Pc_Profile").Range("A5:D5").Copy 
objWorkbook.Worksheets("Sheet1").Range("A1").PasteSpecial 

objWorkbook.Worksheets("Pc_Profile").Range("A8:B8").Copy 
objWorkbook.Worksheets("Sheet1").Range("A2").PasteSpecial 

objWorkbook.Worksheets("Pc_Profile").Range("A13:B13").Copy 
objWorkbook.Worksheets("Sheet1").Range("A3").PasteSpecial 

objWorkbook.Worksheets("Pc_Profile").Range("A15:D17").Copy 
objWorkbook.Worksheets("Sheet1").Range("A4").PasteSpecial 

objWorkbook.Worksheets("Pc_Profile").Range("A24:E26").Copy 
objWorkbook.Worksheets("Sheet1").Range("A7").PasteSpecial 

objWorkbook.Worksheets("Pc_Profile").Range("A28:B30").Copy 
objWorkbook.Worksheets("Sheet1").Range("A10").PasteSpecial 

objWorkbook.Worksheets("Pc_Profile").Range("A43:B43").Copy 
objWorkbook.Worksheets("Sheet1").Range("A13").PasteSpecial 

objWorkbook.Worksheets("Pc_Profile").Range("A45:B45").Copy 
objWorkbook.Worksheets("Sheet1").Range("A14").PasteSpecial 

' Activate Sheet2 so you can see it actually pasted the data 
objWorkbook.Worksheets("Sheet2").Activate 

Я бы очень признателен за дополнительный толчок. Я автоматизирую это для рабочего проекта и не имею опыта работы с VB - я только что узнал об этом на ходу.

ответ

0

Пара вещей, которые хорошая практика, чтобы попасть в прежде чем я получаю на свой актуальный вопрос:

1) Любой макрос, который вы ожидаете работать длительное время должны иметь Application.ScreenUpdating = False прежде, чем любая фактическая работа выполняется в коде , это говорит о том, что Excel не беспокоится о том, чтобы изменить то, что отображается на экране (ускоритель большой производительности). Обязательно укажите Application.ScreenUpdating = True в конце вашего кода.

2) Как и в случае с # 1, вы обычно хотите включить Application.Calculation = xlManual для повышения производительности. Если у вас есть большие диапазоны ячеек, для которых ваш макрос нуждается в точных актуальных значениях, может быть проще оставить автоматическое вычисление, но это не похоже на случай в этом случае.

3) Вам не нужно создавать новый экземпляр Excel (это то, что делает ваша первая строка кода). Вы уже отлично разбираетесь в Excel. Это также экономит вам закрытие другого экземпляра в конце макроса (или, что еще хуже, от забывания сделать это и иметь память зависеть от процессов Excel, которые на самом деле не используются)

Что касается вашей конкретной проблемы, похоже, что у вас есть больше книг, которые Pc_profile копирует, и что вы хотите создать новый «db.xls» при каждом запуске макроса. Исходя из этих предположений, все, что вам нужно сделать, - это ввести код, начинающийся с 'Open the workbook и objWorkbook.Worksheets("Sheet1").Range("A14").PasteSpecial внутри цикла Do While. Дело в том, что я не уверен в том, как управлять циклом. Если список файлов всегда один и тот же, вы должны просто включить список на листе в книге, в которой содержится макрос, и просто перебирать его.

Другая вещь, которую вы должны сделать для упрощения кодирования, и сделать цикл более эффективным - объявить и использовать переменную Worksheet и установить, будет ли для каждой рабочей книги на соответствующем листе извлекаться данные. Ex.

Dim ws as Worksheet 

'The Dim is outside your loop, but this would be inside it 
Set ws = objWorkbook.Worksheets("whatever_the_sheet's_name_is") 

Таким образом, вы можете заменить каждое вхождение objWorkbook.Worksheets("Pc_Profile"). с ws., проще набрать, легче читать, легче обновлять, и меньше ошибок.

Далее у вас на самом деле нет кода для перемещения Sheet1 в новую книгу или его переименование. Для того, чтобы переместить его (так же, как и другие Лист1-х еще не создан), вы должны, прежде чем добраться до Do While цикл, имеют следующие

Dim target as Workbook 
Set target = Application.Workbooks.Add 

Тогда почти конец цикла, необходимо objWorkbook.Worksheets("Sheet1").Move Before:=Target.Sheets(1)

Наконец, вам нужно включить objWorkbook.Close SaveChanges:=False после того, как вы переместили Sheet1 из Pc_Profile и переименовали его.

Смежные вопросы