Riepilare le tabelle strutturate con il ciclo VBA

Ho due tabelle, una è solo una list di posizioni e l'altra è una tabella di dati strutturata collegata a un database tramite una query MS Query. Nella mia tabella dati strutturata, ho un parametro impostato che tira dall'elenco delle posizioni, each volta che viene inserita una nuova posizione nel parametro e la tabella dati viene aggiornata, dovrei ricevere un nuovo set di dati in base alla nuova posizione.

Quello che sto cercando di build è un ciclo VBA che passa attraverso each posizione, alimenta la posizione alla tabella dati tramite il parametro e quindi aggiorna la tabella dati per riflettere le modifiche. Infine, dopo each aggiornamento, voglio salvare la nuova tabella dei dati nella propria cartella di lavoro, ma devo eseguire la scansione prima di poter camminare, per cui risolverò per risolvere il problema di aggiornamento.

Ecco cosa ho provato:

Sub Macro1() Dim WS As Worksheet Dim CT As Variant Dim MSG As String Set WS = Sheets("Sheet1") CT = Range("A1").CurrentRegion For i = 2 To UBound(CT, 1) MSG = "" For J = 1 To UBound(CT, 2) Range("$D$2").Value = CT(i, J) ActiveWorkbook.Connections("Query from Database").Refresh Sheets("Sheet2").Select Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False Next J Next i End Sub 

Questo sta causando alcuni dei miei dati nella tabella dati a sfarfallio, ma non cambiano.

Ho provato anche solo a rinfrescare la connessione anziché a tutto il tavolo, e questo sembra aggiornare la connessione solo bene, ma ovviamente non aggiorna la tabella dati. Come posso get la tabella stessa per aggiornare con each loop?

EDIT:

Sulla base di un po 'di complicazioni, ho ripreso alcuni dei codici dall'alto, ma ho ancora problemi. Il codice passa attraverso gli elenchi di posizioni e pone la posizione corrente nella cella $ D $ 2 del primo foglio di lavoro (proprio accanto all'elenco di posizioni). Da qui la query del database e la tabella dovrebbero essere aggiornati, ma la tabella visualizza solo i risultati di aggiornamento quando esco dal codice VBA colpendo la fuga. Ad esempio passerà attraverso l'elenco, each iterazione del ciclo metterà una nuova posizione nella cella $ D $ 2, con each iterazione che la tabella dati dovrebbe aggiornare in base a quel valore in $ D $ 2. Quello che sta succedendo è $ D $ 2 che viene riempito con un nuovo valore con each loop, ma la tabella di dati rimane vuota, se colpisco la fuga per fermare la macro, la tabella dei dati popolerà con qualunque valore sia stato ultimo in $ D $ 2. Come potrei aggiornare la tabella dati dopo each ciclo?

 Sub Macro1() Dim WS As Worksheet Dim WS2 As Worksheet Dim CT As Variant Dim MSG As String Set WS = Sheets("Sheet1") Set WS2 = Sheets("Sheet2") CT = Range("A1").CurrentRegion For i = 2 To UBound(CT, 1) MSG = "" For J = 1 To UBound(CT, 2) WS.Range("$D$2").Value = CT(i, J) Exit For Next J ActiveWorkbook.Connections("Query from Database").Refresh WS2.ListObjects(1).Refresh Next i End Sub Sub Macro1 () Sub Macro1() Dim WS As Worksheet Dim WS2 As Worksheet Dim CT As Variant Dim MSG As String Set WS = Sheets("Sheet1") Set WS2 = Sheets("Sheet2") CT = Range("A1").CurrentRegion For i = 2 To UBound(CT, 1) MSG = "" For J = 1 To UBound(CT, 2) WS.Range("$D$2").Value = CT(i, J) Exit For Next J ActiveWorkbook.Connections("Query from Database").Refresh WS2.ListObjects(1).Refresh Next i End Sub Dim WS come foglio di lavoro Sub Macro1() Dim WS As Worksheet Dim WS2 As Worksheet Dim CT As Variant Dim MSG As String Set WS = Sheets("Sheet1") Set WS2 = Sheets("Sheet2") CT = Range("A1").CurrentRegion For i = 2 To UBound(CT, 1) MSG = "" For J = 1 To UBound(CT, 2) WS.Range("$D$2").Value = CT(i, J) Exit For Next J ActiveWorkbook.Connections("Query from Database").Refresh WS2.ListObjects(1).Refresh Next i End Sub Imposta WS = fogli ("foglio 1") Sub Macro1() Dim WS As Worksheet Dim WS2 As Worksheet Dim CT As Variant Dim MSG As String Set WS = Sheets("Sheet1") Set WS2 = Sheets("Sheet2") CT = Range("A1").CurrentRegion For i = 2 To UBound(CT, 1) MSG = "" For J = 1 To UBound(CT, 2) WS.Range("$D$2").Value = CT(i, J) Exit For Next J ActiveWorkbook.Connections("Query from Database").Refresh WS2.ListObjects(1).Refresh Next i End Sub Uscire per Sub Macro1() Dim WS As Worksheet Dim WS2 As Worksheet Dim CT As Variant Dim MSG As String Set WS = Sheets("Sheet1") Set WS2 = Sheets("Sheet2") CT = Range("A1").CurrentRegion For i = 2 To UBound(CT, 1) MSG = "" For J = 1 To UBound(CT, 2) WS.Range("$D$2").Value = CT(i, J) Exit For Next J ActiveWorkbook.Connections("Query from Database").Refresh WS2.ListObjects(1).Refresh Next i End Sub Avanti J Sub Macro1() Dim WS As Worksheet Dim WS2 As Worksheet Dim CT As Variant Dim MSG As String Set WS = Sheets("Sheet1") Set WS2 = Sheets("Sheet2") CT = Range("A1").CurrentRegion For i = 2 To UBound(CT, 1) MSG = "" For J = 1 To UBound(CT, 2) WS.Range("$D$2").Value = CT(i, J) Exit For Next J ActiveWorkbook.Connections("Query from Database").Refresh WS2.ListObjects(1).Refresh Next i End Sub Avanti i Sub Macro1() Dim WS As Worksheet Dim WS2 As Worksheet Dim CT As Variant Dim MSG As String Set WS = Sheets("Sheet1") Set WS2 = Sheets("Sheet2") CT = Range("A1").CurrentRegion For i = 2 To UBound(CT, 1) MSG = "" For J = 1 To UBound(CT, 2) WS.Range("$D$2").Value = CT(i, J) Exit For Next J ActiveWorkbook.Connections("Query from Database").Refresh WS2.ListObjects(1).Refresh Next i End Sub 

Il problema con il codice è che non si specifica alcun riferimento specifico al genitore object quando si lavora con loro.

In particolare si può pensare che questa dichiarazione Range("$D$2").Value = CT(i, J) agisce sulla cella accanto alla tabella, ma agisce su qualsiasi foglio è attivo al momento.

Prova questo codice. Potrei avere le assegnazioni specifiche un po 'per la tua situazione esatta, ma il concetto generale dovrebbe arrivare lì se fai gli adeguamenti necessari.

 Sub Macro1() Dim WS As Worksheet Dim WS2 as Worksheet Dim CT As Variant Set WS = Sheets("Sheet1") Set WS2 = Sheets("Sheet2") CT = WS.Range("A1").CurrentRegion For i = 2 To UBound(CT, 1) For J = 1 To UBound(CT, 2) With WS2 .Range("$D$2").Value = CT(i, J) .ListObjects(1).Refresh End With Next J Next I End Sub Sub Macro1 () Sub Macro1() Dim WS As Worksheet Dim WS2 as Worksheet Dim CT As Variant Set WS = Sheets("Sheet1") Set WS2 = Sheets("Sheet2") CT = WS.Range("A1").CurrentRegion For i = 2 To UBound(CT, 1) For J = 1 To UBound(CT, 2) With WS2 .Range("$D$2").Value = CT(i, J) .ListObjects(1).Refresh End With Next J Next I End Sub Dim WS come foglio di lavoro Sub Macro1() Dim WS As Worksheet Dim WS2 as Worksheet Dim CT As Variant Set WS = Sheets("Sheet1") Set WS2 = Sheets("Sheet2") CT = WS.Range("A1").CurrentRegion For i = 2 To UBound(CT, 1) For J = 1 To UBound(CT, 2) With WS2 .Range("$D$2").Value = CT(i, J) .ListObjects(1).Refresh End With Next J Next I End Sub Imposta WS = fogli ("foglio 1") Sub Macro1() Dim WS As Worksheet Dim WS2 as Worksheet Dim CT As Variant Set WS = Sheets("Sheet1") Set WS2 = Sheets("Sheet2") CT = WS.Range("A1").CurrentRegion For i = 2 To UBound(CT, 1) For J = 1 To UBound(CT, 2) With WS2 .Range("$D$2").Value = CT(i, J) .ListObjects(1).Refresh End With Next J Next I End Sub Con WS2 Sub Macro1() Dim WS As Worksheet Dim WS2 as Worksheet Dim CT As Variant Set WS = Sheets("Sheet1") Set WS2 = Sheets("Sheet2") CT = WS.Range("A1").CurrentRegion For i = 2 To UBound(CT, 1) For J = 1 To UBound(CT, 2) With WS2 .Range("$D$2").Value = CT(i, J) .ListObjects(1).Refresh End With Next J Next I End Sub Fine con Sub Macro1() Dim WS As Worksheet Dim WS2 as Worksheet Dim CT As Variant Set WS = Sheets("Sheet1") Set WS2 = Sheets("Sheet2") CT = WS.Range("A1").CurrentRegion For i = 2 To UBound(CT, 1) For J = 1 To UBound(CT, 2) With WS2 .Range("$D$2").Value = CT(i, J) .ListObjects(1).Refresh End With Next J Next I End Sub Avanti J Sub Macro1() Dim WS As Worksheet Dim WS2 as Worksheet Dim CT As Variant Set WS = Sheets("Sheet1") Set WS2 = Sheets("Sheet2") CT = WS.Range("A1").CurrentRegion For i = 2 To UBound(CT, 1) For J = 1 To UBound(CT, 2) With WS2 .Range("$D$2").Value = CT(i, J) .ListObjects(1).Refresh End With Next J Next I End Sub Avanti Sub Macro1() Dim WS As Worksheet Dim WS2 as Worksheet Dim CT As Variant Set WS = Sheets("Sheet1") Set WS2 = Sheets("Sheet2") CT = WS.Range("A1").CurrentRegion For i = 2 To UBound(CT, 1) For J = 1 To UBound(CT, 2) With WS2 .Range("$D$2").Value = CT(i, J) .ListObjects(1).Refresh End With Next J Next I End Sub