-4

Мне нужен макрос Excel, который извлекает данные определенных ячеек из нескольких рабочих книг, обновляет определенные ячейки другой рабочей книги и заполняет ячейки в том порядке, в котором файлы находятся в папке.

Я создал очень простой макрос, который выполняет большую часть того, что мне нужно, но у меня новое имя файла при каждом обновлении, и я должен сохранить все предыдущие копии файла.

Кто-нибудь может мне помочь?

Sub Test_Macro()
'
' Test_Macro Macro
'
' Keyboard Shortcut: Ctrl+Shift+P
    Selection.End(xlDown).Select
    Selection.End(xlDown).Select
    Selection.End(xlDown).Select
    Selection.End(xlToRight).Select
    ActiveCell.Range("A1:A33").Select
    Selection.AutoFill Destination:=ActiveCell.Range("A1:B33"), Type:= _
        xlFillDefault
    ActiveCell.Range("A1:B33").Select
    ActiveCell.Offset(1, 1).Range("A1:A32").Select
    Selection.Replace What:="[36 DRD BP-04_Apr 14.xlsx]", Replacement:= _
        "[37 DRD BP-04_May 14.xlsx]", LookAt:=xlPart, SearchOrder:=xlByRows, _
        MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    Selection.End(xlUp).Select
    Selection.End(xlUp).Select
    Selection.End(xlToLeft).Select    
  End Sub

1 ответ1

3

Мы не пишем ваш код для вас и не думаем о вас здесь, в SuperUser, поэтому вам нужно научиться программировать на VBA, а не просто записывать макрос и надеяться, что он сделает всю вашу работу за вас. , То, что вы пытаетесь сделать, включает использование нескольких простых API. Поскольку вы, похоже, не знаете, что это за API, позвольте мне указать их для вас.

  • Вы захотите использовать объект FileSystemObject чтобы составить список содержимого каталога, содержащего файлы, которые вы хотите открыть.
  • Начните с получения дескриптора объекта Folder содержащего файлы, которые необходимо обработать; это можно получить с помощью метода GetFolder объекта FileSystemObject .
  • Ваша Folder позволяет вам получить коллекцию (итеративную, используя For Each) Files в папке.
  • Вы хотите использовать Excel.Application чтобы получить экземпляр объекта Workbook для каждого имени файла, который вы хотите открыть, используя коллекцию Workbooks (в частности, Application.Workbooks.Open).
  • Затем, используя ссылку на каждый конкретный объект Workbook , вы можете при необходимости выполнять обработку данных на уровне ячейки и Close каждую книгу, когда закончите с ней.
  • Для обработки на уровне ячеек вам необходимо перейти к Worksheets имеющейся у вас книги, используя, например, wb.Worksheets(1) если у вас есть только один рабочий лист в рабочей книге, и это тот, который вы хотите прочитать (при условии, что ваш объект рабочей Workbook назначен переменной wb).
  • Имейте в виду, что Selection является полиморфным с Range ; вместо того, чтобы выбирать каждую отдельную ячейку, которую вы хотите обработать, гораздо быстрее и проще работать с кодом, как, например, ws.Cells(1,2).Value чтобы получить значение ячейки A2 на листе, на которое указывает ws . Ценность в запоминании этого полиморфизма заключается в том, что вы можете заменить существующие записанные вызовы Selection на вызовы ws.Cells или аналогичные. Просто следите за "курсором" (например, ячейка, которая, как вы знаете, является началом ваших данных) и используйте метод Offset чтобы получить ячейки относительно нее.

Удачи!


Научить человека ловить рыбу

Всякий раз, когда вы не уверены в семантике API какого-либо конкретного объекта, даже если вы не получаете меню автозавершения кода в редакторе VBA, вы все равно можете нажать F2, чтобы вызвать обозреватель объектов, который отобразит API всех объектов, которые вы используете. ссылались (который будет включать в себя весь Excel COM API).

Вы также можете написать в Google "msdn what excel", где whatever вы ни искали, какой бы тип объекта или имени метода вы ни искали, и вы попадете прямо в список API на MSDN.

Убедитесь, что используете Set для назначения типов объектов переменным! :)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .