Refrescante todas as tabelas dinâmicas na minha pasta de trabalho do excel com uma macro
Pergunta
Eu tenho um livro com 20 diferentes tabelas dinâmicas.Existe alguma forma fácil de encontrar todas as tabelas dinâmicas e atualizá-los em VBA?
Solução
Sim.
ThisWorkbook.RefreshAll
Ou, se sua versão do Excel é idade suficiente,
Dim Sheet as WorkSheet, Pivot as PivotTable
For Each Sheet in ThisWorkbook.WorkSheets
For Each Pivot in Sheet.PivotTables
Pivot.RefreshTable
Pivot.Update
Next
Next
Outras dicas
Este código VBA irá atualizar toda a dinâmica de tabelas/gráficos na pasta de trabalho.
Sub RefreshAllPivotTables()
Dim PT As PivotTable
Dim WS As Worksheet
For Each WS In ThisWorkbook.Worksheets
For Each PT In WS.PivotTables
PT.RefreshTable
Next PT
Next WS
End Sub
Outro não-programáticos opção é:
- Clique direito sobre cada tabela dinâmica
- Selecione opções da Tabela
- Assinale a 'Atualizar ao abrir' opção.
- Clique no botão OK
Isso irá atualizar a tabela dinâmica de cada vez que a pasta de trabalho é aberta.
ActiveWorkbook.RefreshAll
atualiza tudo, não apenas as tabelas de tabela dinâmica, mas também a consultas ODBC.Eu tenho um par de VBA consultas que consulte conexões de Dados e usando esta opção acidentes como o comando será executado as conexões de Dados sem o detalhe fornecido a partir do VBA
Eu recomendo a opção se você deseja que apenas os pivôs atualizada
Sub RefreshPivotTables()
Dim pivotTable As PivotTable
For Each pivotTable In ActiveSheet.PivotTables
pivotTable.RefreshTable
Next
End Sub
Em certas circunstâncias, você pode querer diferenciar uma tabela Dinâmica e sua PivotCache.A Cache tem o seu próprio método de atualização e de suas próprias coleções.Então, nós poderíamos ter atualizado todos os PivotCaches em vez de tabelas dinâmicas.
A diferença?Quando você criar uma nova Tabela Dinâmica-lhe-á perguntado se pretende é baseado em uma tabela anterior.Se disser que não, esta Tabela Dinâmica obtém o seu próprio cache e duplica o tamanho da fonte de dados.Se você disser sim, você manter o seu Livro pequeno, mas que você adicionar a uma coleção de Tabelas dinâmicas que compartilham um único cache.Toda a coleção fica atualizado quando você atualizar qualquer Tabela Dinâmica em que a coleta.Você pode imaginar, portanto, que a diferença pode ser entre refrescante cada cache na pasta de trabalho, em comparação com refrescante cada Tabela Dinâmica no Livro.
Há uma opção atualizar tudo na barra de ferramentas Tabela Dinâmica.Isso é o suficiente.Não é necessário fazer mais nada.
Pressione ctrl+alt+F5
Você tem um Tabelas dinâmicas coleção em um VB Folha de cálculo objecto.Assim, uma rápida loop como isso funcionará:
Sub RefreshPivotTables()
Dim pivotTable As PivotTable
For Each pivotTable In ActiveSheet.PivotTables
pivotTable.RefreshTable
Next
End Sub
Notas de trincheiras:
- Lembre-se para desproteger qualquer protegido folhas antes de actualizar a tabela Dinâmica.
- Salve muitas vezes.
- Eu vou pensar mais e atualização no devido curso...:)
Boa sorte!
O código
Private Sub Worksheet_Activate()
Dim PvtTbl As PivotTable
Cells.EntireColumn.AutoFit
For Each PvtTbl In Worksheets("Sales Details").PivotTables
PvtTbl.RefreshTable
Next
End Sub
funciona bem.
O código é usado na ativação da folha de módulo, assim, ele mostra uma cintilação/falha quando a folha está ativado.
Mesmo podemos atualizar ligação particular e, por sua vez, ele irá atualizar todos os pivôs ligado a ele.
Para que este código eu ter criado segmentação de dados da tabela presente no Excel:
Sub UpdateConnection()
Dim ServerName As String
Dim ServerNameRaw As String
Dim CubeName As String
Dim CubeNameRaw As String
Dim ConnectionString As String
ServerNameRaw = ActiveWorkbook.SlicerCaches("Slicer_ServerName").VisibleSlicerItemsList(1)
ServerName = Replace(Split(ServerNameRaw, "[")(3), "]", "")
CubeNameRaw = ActiveWorkbook.SlicerCaches("Slicer_CubeName").VisibleSlicerItemsList(1)
CubeName = Replace(Split(CubeNameRaw, "[")(3), "]", "")
If CubeName = "All" Or ServerName = "All" Then
MsgBox "Please Select One Cube and Server Name", vbOKOnly, "Slicer Info"
Else
ConnectionString = GetConnectionString(ServerName, CubeName)
UpdateAllQueryTableConnections ConnectionString, CubeName
End If
End Sub
Function GetConnectionString(ServerName As String, CubeName As String)
Dim result As String
result = "OLEDB;Provider=MSOLAP.5;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=" & CubeName & ";Data Source=" & ServerName & ";MDX Compatibility=1;Safety Options=2;MDX Missing Member Mode=Error;Update Isolation Level=2"
'"OLEDB;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=" & CubeName & ";Data Source=" & ServerName & ";Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False"
GetConnectionString = result
End Function
Function GetConnectionString(ServerName As String, CubeName As String)
Dim result As String
result = "OLEDB;Provider=MSOLAP.5;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=" & CubeName & ";Data Source=" & ServerName & ";MDX Compatibility=1;Safety Options=2;MDX Missing Member Mode=Error;Update Isolation Level=2"
GetConnectionString = result
End Function
Sub UpdateAllQueryTableConnections(ConnectionString As String, CubeName As String)
Dim cn As WorkbookConnection
Dim oledbCn As OLEDBConnection
Dim Count As Integer, i As Integer
Dim DBName As String
DBName = "Initial Catalog=" + CubeName
Count = 0
For Each cn In ThisWorkbook.Connections
If cn.Name = "ThisWorkbookDataModel" Then
Exit For
End If
oTmp = Split(cn.OLEDBConnection.Connection, ";")
For i = 0 To UBound(oTmp) - 1
If InStr(1, oTmp(i), DBName, vbTextCompare) = 1 Then
Set oledbCn = cn.OLEDBConnection
oledbCn.SavePassword = True
oledbCn.Connection = ConnectionString
oledbCn.Refresh
Count = Count + 1
End If
Next
Next
If Count = 0 Then
MsgBox "Nothing to update", vbOKOnly, "Update Connection"
ElseIf Count > 0 Then
MsgBox "Update & Refresh Connection Successfully", vbOKOnly, "Update Connection"
End If
End Sub
Eu uso o comando listado abaixo, no passado recente, e parece funcionar bem.
ActiveWorkbook.RefreshAll
Espero que ajude.
Se você estiver usando o MS Excel 2003, em seguida, vá em exibir->barra de ferramentas->Tabela Dinâmica a Partir desta barra de ferramentas de nós pode fazer a atualização clicando !este símbolo.