Обновление данных в книге сводной таблицы из другой книги - PullRequest
1 голос
/ 01 марта 2020

Я столкнулся со странной вещью: я присоединился к трем рабочим книгам: Personal Data Tracker, Global Tracker и рабочая тетрадь с графиками и диаграммами. Логика c выглядит следующим образом: пользователь нажимает кнопку после завершения работы, чтобы данные копировались в GL Tracker. Как только событие изменения инициируется в Таблице отслеживания GL, открывается последняя рабочая книга, обновляется сводная таблица при открытии вентиляционного отверстия и закрывается wb.

Кажется, что все работает нормально, однако при запуске макроса в прямом эфире, в самом конце я получаю сообщение об ошибке

«Ошибка приложения или объекта».

Отображаются только кнопка «ОК» и «Справка». не делаю VBE Open, чтобы я мог его отладить. Кто-нибудь знает, что это может происходить, даже если вся цепочка работает нормально? Спасибо.

Код от персонального трекера:

Sub test()

Dim path As String
Dim wb As Workbook

path = ThisWorkbook.path & "\Dest.xlsm"

Application.ScreenUpdating = False

ThisWorkbook.Sheets("Total").Range("R1").Value = Date
Range("R1").Font.Color = VBA.ColorConstants.vbWhite
Worksheets("TOTAL").Range("B2:B13").Copy

On Error GoTo Handler
Workbooks.Open (path)
On Error GoTo 0

Set wb = Workbooks("Dest")
Worksheets("Sheet1").Range("B2").PasteSpecial Paste:=xlPasteValues
Exit Sub

Handler:
 MsgBox "Someone else is saving their data at the moment." & vbNewLine & _
    "Please try in a few seconds"
End Sub

Код от GL трекера:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

Dim MRange As Range
Dim wbPivot As Workbook
Dim pt As PivotTable
Dim ws As Worksheet
Dim Name As String
Dim answer As VbMsgBoxResult

Set MRange = ThisWorkbook.Sheets(1).Range("Table1")
Name = Application.UserName

Application.ScreenUpdating = False

If Not Intersect(Target, MRange) Is Nothing Then
    Application.EnableEvents = True
Set wbPivot = Workbooks.Open("C:\Users\jakub\Desktop\Excel - various\Pivot.xlsm")
End If

'refresh

For Each ws In wbPivot.Worksheets
    For Each pt In ws.PivotTables
        pt.PivotCache.Refresh
        pt.Update
        pt.RefreshTable
    Next
Next

'saving

Application.ScreenUpdating = True

If Application.UserName <> "Jakub Tracz" Then
    MsgBox "User not authorised. Workbook will be closed."
            wbPivot.Close True
            ThisWorkbook.Close True
    Else
        answer = MsgBox(Prompt:="Do you want to save and close the workbook?", _
            Buttons:=vbYesNo + vbQuestion)

    Select Case answer
        Case vbYes
            wbPivot.Close True
            ThisWorkbook.Close True
        Case vbNo
            MsgBox "Welcome, " & Application.UserName
    End Select
End If
End Sub

1 Ответ

0 голосов
/ 01 марта 2020

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

Это просто демонстрирует, как использовать переменную объекта рабочей книги в одной подпрограмме, которая может ссылаться на другую рабочую книгу, и как внести изменения в эту вторую рабочую книгу и сохранить / закрыть ее.

Sub Tracker_Update()
  Dim wbPivot as Workbook

  ' open the workbook
  Set wbPivot = Workbooks.Open("C:\Users\jakub\Desktop\Excel - various\Test.xlsx")

  ' optionally make it hidden
  wbPivot.Visible = False

  With wbPivot

    ' pretend this code updates the pivot table
    .Worksheets(1).Range("A1") = "hello world"

    ' Close and save it
    .Close True

  End With

  ' optionally clear the variable 
  ' this is not really needed in VBA, but if you eventually
  ' start using VB.NET with Excel as a COM object,
  ' you will want to know how to do this part when you are done
  Set wbPivot = Nothing

End Sub

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...