Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Обновление сводных таблиц в разных файлах макросом - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Обновление сводных таблиц в разных файлах макросом (Макросы/Sub)
Обновление сводных таблиц в разных файлах макросом
akyakovlev Дата: Пятница, 20.02.2015, 15:06 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 12
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Добрый день!

Имеется такая задачка: есть 4 файла, в которых имеется по одной сводной таблице, данные в которую подгружаются из внешней БД. Есть мысль создать отдельный файл, который поочередно открывал эти 4 файла, обновлял их и закрывал с сохранением.

Бьюсь второй день, все никак.
Решил сделать так: в каждый из 4 файлов зашит макрос:
[vba]
Код
Sub RefreshAll()
ActiveWorkbook.RefreshAll
End Sub
[/vba]

В главном файле следующий макрос:
[vba]
Код
Sub UpdateCollection()
BookName = ActiveWorkbook.Name
File1Path = Worksheets("Update").Range("B5").Value
File1Name = Worksheets("Update").Range("B6").Value
File2Path = Worksheets("Update").Range("B9").Value
File2Name = Worksheets("Update").Range("B10").Value
File3Path = Worksheets("Update").Range("B13").Value
File3Name = Worksheets("Update").Range("B14").Value
File4Path = Worksheets("Update").Range("B17").Value
File4Name = Worksheets("Update").Range("B18").Value
Pass = Worksheets("Update").Range("B2").Value
File1 = File1Path & "\" & File1Name
File2 = File2Path & "\" & File2Name
File3 = File3Path & "\" & File3Name
File4 = File4Path & "\" & File4Name
Workbooks.Open Filename:=File1, WriteResPassword:=Pass
Application.DisplayAlerts = False
Application.Run "'" & File1Name & "'!RefreshAll"
ActiveWorkbook.Save
ActiveWindow.Close False
Application.DisplayAlerts = True
Windows(BookName).Activate
MsgBox ("Finish")
End Sub
[/vba]

При этом файлы открываются, но обновления не происходит :( А если открывать файлы отдельно - с помощью ActiveWorkbook.RefreshAll все прекрасно обновляется.

Подскажите, пожалуйста, может я что-то делаю не так?
 
Ответить
СообщениеДобрый день!

Имеется такая задачка: есть 4 файла, в которых имеется по одной сводной таблице, данные в которую подгружаются из внешней БД. Есть мысль создать отдельный файл, который поочередно открывал эти 4 файла, обновлял их и закрывал с сохранением.

Бьюсь второй день, все никак.
Решил сделать так: в каждый из 4 файлов зашит макрос:
[vba]
Код
Sub RefreshAll()
ActiveWorkbook.RefreshAll
End Sub
[/vba]

В главном файле следующий макрос:
[vba]
Код
Sub UpdateCollection()
BookName = ActiveWorkbook.Name
File1Path = Worksheets("Update").Range("B5").Value
File1Name = Worksheets("Update").Range("B6").Value
File2Path = Worksheets("Update").Range("B9").Value
File2Name = Worksheets("Update").Range("B10").Value
File3Path = Worksheets("Update").Range("B13").Value
File3Name = Worksheets("Update").Range("B14").Value
File4Path = Worksheets("Update").Range("B17").Value
File4Name = Worksheets("Update").Range("B18").Value
Pass = Worksheets("Update").Range("B2").Value
File1 = File1Path & "\" & File1Name
File2 = File2Path & "\" & File2Name
File3 = File3Path & "\" & File3Name
File4 = File4Path & "\" & File4Name
Workbooks.Open Filename:=File1, WriteResPassword:=Pass
Application.DisplayAlerts = False
Application.Run "'" & File1Name & "'!RefreshAll"
ActiveWorkbook.Save
ActiveWindow.Close False
Application.DisplayAlerts = True
Windows(BookName).Activate
MsgBox ("Finish")
End Sub
[/vba]

При этом файлы открываются, но обновления не происходит :( А если открывать файлы отдельно - с помощью ActiveWorkbook.RefreshAll все прекрасно обновляется.

Подскажите, пожалуйста, может я что-то делаю не так?

Автор - akyakovlev
Дата добавления - 20.02.2015 в 15:06
Rioran Дата: Пятница, 20.02.2015, 15:19 | Сообщение № 2
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
akyakovlev, здравствуйте.

Если вы открываете книгу - она у Вас сразу становится активной. Не будет ли лишним делать ActiveWorkbook.RefreshAll через Application.Run?

По логике Вашей текущей программы Вы пытаетесь обновить только 1 книгу. Было бы логичнее скормить все четыре файла одному циклу, который бы брал нужные имена и пути перебором строк Вашего главного файла.

На уровне рекоммендаций: Option Explicit и всегда инициализация переменных Dim'ами.

Вопрос - что должно измениться в сводных таблицах при обновлении? Дата по привязке к сегодняшнему дню?


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
Сообщениеakyakovlev, здравствуйте.

Если вы открываете книгу - она у Вас сразу становится активной. Не будет ли лишним делать ActiveWorkbook.RefreshAll через Application.Run?

По логике Вашей текущей программы Вы пытаетесь обновить только 1 книгу. Было бы логичнее скормить все четыре файла одному циклу, который бы брал нужные имена и пути перебором строк Вашего главного файла.

На уровне рекоммендаций: Option Explicit и всегда инициализация переменных Dim'ами.

Вопрос - что должно измениться в сводных таблицах при обновлении? Дата по привязке к сегодняшнему дню?

Автор - Rioran
Дата добавления - 20.02.2015 в 15:19
akyakovlev Дата: Пятница, 20.02.2015, 15:39 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 12
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Rioran,
Не будет ли лишним делать ActiveWorkbook.RefreshAll через Application.Run?

Пока ничего умнее я не придумал))

По логике Вашей текущей программы Вы пытаетесь обновить только 1 книгу.

Так и будет, только не цикл, а просто продублируется аналогичный код для остальных трех файлов, обрезал для удобства

что должно измениться в сводных таблицах при обновлении? Дата по привязке к сегодняшнему дню?

Данные сводной таблицы должны обновиться из внешнего источника (обновление данных ежедневное)
 
Ответить
СообщениеRioran,
Не будет ли лишним делать ActiveWorkbook.RefreshAll через Application.Run?

Пока ничего умнее я не придумал))

По логике Вашей текущей программы Вы пытаетесь обновить только 1 книгу.

Так и будет, только не цикл, а просто продублируется аналогичный код для остальных трех файлов, обрезал для удобства

что должно измениться в сводных таблицах при обновлении? Дата по привязке к сегодняшнему дню?

Данные сводной таблицы должны обновиться из внешнего источника (обновление данных ежедневное)

Автор - akyakovlev
Дата добавления - 20.02.2015 в 15:39
akyakovlev Дата: Пятница, 20.02.2015, 15:55 | Сообщение № 4
Группа: Пользователи
Ранг: Новичок
Сообщений: 12
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Если это как-то поможет: при включенных алертах в процессе "обновления" возникает ошибка "Это действие приведет к отмене команды обновелния данных. Продолжить?" и Варианты ОК, ОТМЕНА
 
Ответить
СообщениеЕсли это как-то поможет: при включенных алертах в процессе "обновления" возникает ошибка "Это действие приведет к отмене команды обновелния данных. Продолжить?" и Варианты ОК, ОТМЕНА

Автор - akyakovlev
Дата добавления - 20.02.2015 в 15:55
Rioran Дата: Пятница, 20.02.2015, 16:04 | Сообщение № 5
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
akyakovlev, посмотрите, рефакторинг Вашего кода, общая логика сохранена, но обращение к активной книге без посредников:

[vba]
Код
Option Explicit

Sub UpdateCollection()

Dim FilePath As String
Dim FileName As String
Dim File As String
Dim Pass As String
Dim i As Long

With ThisWorkbook.Worksheets("Update")
Pass = .Range("B2").Value

For i = 5 To 17 Step 4
     FilePath = .Range("B" & i).Value
     FileName = .Range("B" & i + 1).Value
     File = FilePath & "\" & FileName
     Workbooks.Open FileName:=File, WriteResPassword:=Pass
     Application.DisplayAlerts = False
     ActiveWorkbook.RefreshAll
     ActiveWorkbook.Save
     ActiveWindow.Close
     Application.DisplayAlerts = True
Next i

Windows(ThisWorkbook.Name).Activate
MsgBox ("Finish")

End With

End Sub
[/vba]


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
Сообщениеakyakovlev, посмотрите, рефакторинг Вашего кода, общая логика сохранена, но обращение к активной книге без посредников:

[vba]
Код
Option Explicit

Sub UpdateCollection()

Dim FilePath As String
Dim FileName As String
Dim File As String
Dim Pass As String
Dim i As Long

With ThisWorkbook.Worksheets("Update")
Pass = .Range("B2").Value

For i = 5 To 17 Step 4
     FilePath = .Range("B" & i).Value
     FileName = .Range("B" & i + 1).Value
     File = FilePath & "\" & FileName
     Workbooks.Open FileName:=File, WriteResPassword:=Pass
     Application.DisplayAlerts = False
     ActiveWorkbook.RefreshAll
     ActiveWorkbook.Save
     ActiveWindow.Close
     Application.DisplayAlerts = True
Next i

Windows(ThisWorkbook.Name).Activate
MsgBox ("Finish")

End With

End Sub
[/vba]

Автор - Rioran
Дата добавления - 20.02.2015 в 16:04
akyakovlev Дата: Пятница, 20.02.2015, 16:19 | Сообщение № 6
Группа: Пользователи
Ранг: Новичок
Сообщений: 12
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Rioran, согласен, Ваш код более правильный, но тем не менее так тоже не обновляется :(

    Workbooks.Open FileName:=File, WriteResPassword:=Pass
    Application.DisplayAlerts = False
    ActiveWorkbook.RefreshAll
    ActiveWorkbook.Save

Подобную конструкцию я уже пробовал
 
Ответить
СообщениеRioran, согласен, Ваш код более правильный, но тем не менее так тоже не обновляется :(

    Workbooks.Open FileName:=File, WriteResPassword:=Pass
    Application.DisplayAlerts = False
    ActiveWorkbook.RefreshAll
    ActiveWorkbook.Save

Подобную конструкцию я уже пробовал

Автор - akyakovlev
Дата добавления - 20.02.2015 в 16:19
Rioran Дата: Пятница, 20.02.2015, 16:52 | Сообщение № 7
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
akyakovlev, предположу, что мы закрываем книгу до того, как отработает обновление. Давайте уберём алерты и вставим DoEvents после рефреша:

[vba]
Код
Option Explicit

Sub UpdateCollection()

Dim FilePath As String
Dim FileName As String
Dim File As String
Dim Pass As String
Dim i As Long

With ThisWorkbook.Worksheets("Update")
Pass = .Range("B2").Value

For i = 5 To 17 Step 4
      FilePath = .Range("B" & i).Value
      FileName = .Range("B" & i + 1).Value
      File = FilePath & "\" & FileName
      Workbooks.Open FileName:=File, WriteResPassword:=Pass
      ActiveWorkbook.RefreshAll
      DoEvents
      ActiveWorkbook.Save
      ActiveWindow.Close
Next i

Windows(ThisWorkbook.Name).Activate
MsgBox "Finish"

End With

End Sub
[/vba]


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279


Сообщение отредактировал Rioran - Пятница, 20.02.2015, 16:52
 
Ответить
Сообщениеakyakovlev, предположу, что мы закрываем книгу до того, как отработает обновление. Давайте уберём алерты и вставим DoEvents после рефреша:

[vba]
Код
Option Explicit

Sub UpdateCollection()

Dim FilePath As String
Dim FileName As String
Dim File As String
Dim Pass As String
Dim i As Long

With ThisWorkbook.Worksheets("Update")
Pass = .Range("B2").Value

For i = 5 To 17 Step 4
      FilePath = .Range("B" & i).Value
      FileName = .Range("B" & i + 1).Value
      File = FilePath & "\" & FileName
      Workbooks.Open FileName:=File, WriteResPassword:=Pass
      ActiveWorkbook.RefreshAll
      DoEvents
      ActiveWorkbook.Save
      ActiveWindow.Close
Next i

Windows(ThisWorkbook.Name).Activate
MsgBox "Finish"

End With

End Sub
[/vba]

Автор - Rioran
Дата добавления - 20.02.2015 в 16:52
akyakovlev Дата: Пятница, 20.02.2015, 16:56 | Сообщение № 8
Группа: Пользователи
Ранг: Новичок
Сообщений: 12
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Rioran,
уберём алерты и вставим DoEvents после рефреша:

Идет процесс подключения к источнику данных (как, впрочем, и раньше), затем возникает ошибка "Это действие приведет к отмене команды обновелния данных. Продолжить?" и Варианты ОК, ОТМЕНА
После нажатия ОК файл закрывается без обновления
 
Ответить
СообщениеRioran,
уберём алерты и вставим DoEvents после рефреша:

Идет процесс подключения к источнику данных (как, впрочем, и раньше), затем возникает ошибка "Это действие приведет к отмене команды обновелния данных. Продолжить?" и Варианты ОК, ОТМЕНА
После нажатия ОК файл закрывается без обновления

Автор - akyakovlev
Дата добавления - 20.02.2015 в 16:56
Rioran Дата: Пятница, 20.02.2015, 17:09 | Сообщение № 9
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
Не имея на руках файлы - продолжаю играть в Настрадамуса =)

Нашёл идею The_Prist'а по обновлению таблиц:

[vba]
Код
Sub Refresh_PVTables()

Dim wsSh As Worksheet
Dim PVTable As PivotTable

For Each wsSh In Worksheets
      For Each PVTable In wsSh.PivotTables
          PVTable.RefreshTable
      Next PVTable
Next wsSh

End Sub
[/vba]
Давайте попробуем совместить эту идею с нашей программой:

[vba]
Код
Option Explicit

Sub UpdateCollection()

Dim FilePath As String
Dim FileName As String
Dim File As String
Dim Pass As String
Dim i As Long

Dim wsSh As Worksheet
Dim PVTable As PivotTable

With ThisWorkbook.Worksheets("Update")
Pass = .Range("B2").Value

For i = 5 To 17 Step 4
      FilePath = .Range("B" & i).Value
      FileName = .Range("B" & i + 1).Value
      File = FilePath & "\" & FileName
      Workbooks.Open FileName:=File, WriteResPassword:=Pass
        
      For Each wsSh In ActiveWorkbook.Worksheets
          For Each PVTable In wsSh.PivotTables
              PVTable.RefreshTable
          Next PVTable
      Next wsSh
        
      ActiveWorkbook.Save
      ActiveWindow.Close
Next i

Windows(ThisWorkbook.Name).Activate
MsgBox ("Finish")

End With

End Sub
[/vba]


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279


Сообщение отредактировал Rioran - Пятница, 20.02.2015, 17:10
 
Ответить
СообщениеНе имея на руках файлы - продолжаю играть в Настрадамуса =)

Нашёл идею The_Prist'а по обновлению таблиц:

[vba]
Код
Sub Refresh_PVTables()

Dim wsSh As Worksheet
Dim PVTable As PivotTable

For Each wsSh In Worksheets
      For Each PVTable In wsSh.PivotTables
          PVTable.RefreshTable
      Next PVTable
Next wsSh

End Sub
[/vba]
Давайте попробуем совместить эту идею с нашей программой:

[vba]
Код
Option Explicit

Sub UpdateCollection()

Dim FilePath As String
Dim FileName As String
Dim File As String
Dim Pass As String
Dim i As Long

Dim wsSh As Worksheet
Dim PVTable As PivotTable

With ThisWorkbook.Worksheets("Update")
Pass = .Range("B2").Value

For i = 5 To 17 Step 4
      FilePath = .Range("B" & i).Value
      FileName = .Range("B" & i + 1).Value
      File = FilePath & "\" & FileName
      Workbooks.Open FileName:=File, WriteResPassword:=Pass
        
      For Each wsSh In ActiveWorkbook.Worksheets
          For Each PVTable In wsSh.PivotTables
              PVTable.RefreshTable
          Next PVTable
      Next wsSh
        
      ActiveWorkbook.Save
      ActiveWindow.Close
Next i

Windows(ThisWorkbook.Name).Activate
MsgBox ("Finish")

End With

End Sub
[/vba]

Автор - Rioran
Дата добавления - 20.02.2015 в 17:09
akyakovlev Дата: Пятница, 20.02.2015, 17:13 | Сообщение № 10
Группа: Пользователи
Ранг: Новичок
Сообщений: 12
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Rioran,
Ура, заработало!
Последнее решение от Вас не пробовал, просто отключил в настройках подключений (в каждом из файлов) Фоновое обновление и все заработало))

Файлы выложить не мог - коммерческая тайна...

Спасибо за помощь!!!))
 
Ответить
СообщениеRioran,
Ура, заработало!
Последнее решение от Вас не пробовал, просто отключил в настройках подключений (в каждом из файлов) Фоновое обновление и все заработало))

Файлы выложить не мог - коммерческая тайна...

Спасибо за помощь!!!))

Автор - akyakovlev
Дата добавления - 20.02.2015 в 17:13
Rioran Дата: Пятница, 20.02.2015, 17:16 | Сообщение № 11
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
отключил в настройках подключений (в каждом из файлов) Фоновое обновление

akyakovlev, все, пора снимать про меня фильм "Унесённые пятницей" =) Должен был догадаться об этом ещё при размышлениях о DoEvents.


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
Сообщение
отключил в настройках подключений (в каждом из файлов) Фоновое обновление

akyakovlev, все, пора снимать про меня фильм "Унесённые пятницей" =) Должен был догадаться об этом ещё при размышлениях о DoEvents.

Автор - Rioran
Дата добавления - 20.02.2015 в 17:16
MrSaito Дата: Четверг, 26.04.2018, 11:06 | Сообщение № 12
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

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

Будьте любезны, поясните несведущему, почему в строке "For i = 5 To 17 Step 4" именно такие значения 5, 17 и 4 соответственно?
Использовал ваш код, но есть подозрение что процедуры повторяются неоднократно, соответственно времени до окончания проходит сильно больше.

Спасибо,
С уважением ...
 
Ответить
СообщениеRioran, akyakovlev, доброго времени суток!
Возникла подобная задачка, а поскольку вынужден разбираться самостоятельно, на глобальных просторах наткнулся на данный ресурс и тему.

Будьте любезны, поясните несведущему, почему в строке "For i = 5 To 17 Step 4" именно такие значения 5, 17 и 4 соответственно?
Использовал ваш код, но есть подозрение что процедуры повторяются неоднократно, соответственно времени до окончания проходит сильно больше.

Спасибо,
С уважением ...

Автор - MrSaito
Дата добавления - 26.04.2018 в 11:06
Pelena Дата: Четверг, 26.04.2018, 11:12 | Сообщение № 13
Группа: Админы
Ранг: Местный житель
Сообщений: 19176
Репутация: 4413 ±
Замечаний: ±

Excel 365 & Mac Excel
Посмотрите код из первого поста.
Там данные начинают считываться с пятой строки: B5, B9, B13, B17 - путь для каждого четырёх файлов


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеПосмотрите код из первого поста.
Там данные начинают считываться с пятой строки: B5, B9, B13, B17 - путь для каждого четырёх файлов

Автор - Pelena
Дата добавления - 26.04.2018 в 11:12
MrSaito Дата: Четверг, 26.04.2018, 12:40 | Сообщение № 14
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Нет слов, одни восклицания! Большое спасибо!
Мир Вашему Дому и берегите себя!

Искренне ваш ...
 
Ответить
СообщениеНет слов, одни восклицания! Большое спасибо!
Мир Вашему Дому и берегите себя!

Искренне ваш ...

Автор - MrSaito
Дата добавления - 26.04.2018 в 12:40
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Обновление сводных таблиц в разных файлах макросом (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!