Sono sicuro che probabilmente è là fuori ma non riesco a trovarlo.
Aggiornamenti
Ho testato un codice diverso e ho ridotto il mio tempo a completare l'attività da 50/60 secondi a 10 secondi. Questo è quello che ho cambiato:
For k = 0 To 28
For v = 1 To countryLastRow(k)
If Sheet3.Cells(v + 3, countryRanges(k) + 3) = Sheet1.Range("C6") Then
Sheet3.Range(Sheet3.Cells(v + 3, countryRanges(k)), Sheet3.Cells(v + 3, countryRanges(k) + 6)).Copy Destination:=tbl.DataBodyRange(p, countryRanges(k) - 1).End(xlUp).Offset(1, 0)
End If
Next v
Next k
L'utilizzo dell'intervallo per copiare e incollare intere righe contemporaneamente anziché 1 cella alla volta ha migliorato drasticamente la mia macro.
Continuando a guardare fuori per le loro prestazioni, le persone aumentano le conoscenze con il codice che ho ma ora sembra essere buono.
Rundown di base
In Excel ho più righe e più colonne che devono essere ricercate, a seconda dei criteri, copiandole e incollandole in un'altra scheda utilizzando VBA.
Voglio trovare il modo più veloce / più efficace per codificare questa funzione di ricerca / copia / incolla.
Quello che ho provato
Quindi ho optato per un semplice codice forza bruta dove cerco tutte le celle nelle colonne della tabella Sheet2, uso se la formula soddisfa i criteri e .copy destination:=
per copiare la riga nella successiva riga vuota di tabella in Sheet1, quindi spostarsi sulla successiva tabella di Sheet2 e ripetere fino a quando tutte le 29 tabelle sono state cercate.
Molto rapidamente ho scoperto che avevo bisogno di migliorare la velocità di questo e ho aggiunto quanto segue:
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
che ha migliorato la velocità quando utilizzavo solo una tabella. Da quando ha aggiunto la seconda tabella, ha iniziato a rallentare con l'aggiunta di 2148 righe.
Ora sto usando solo 2 tabelle di dati (prima tabella con 680 righe, seconda tabella con 2148 righe) e quando si esegue un criterio di ricerca più ampio piuttosto che una ricerca molto specifica ci vogliono circa 30 secondi per essere completato. Considerando che questo è solo 2 tavoli, credo che quando verranno aggiunti tutti i 29 tavoli potrebbero essere necessari più di 10 minuti perché questi due tavoli sono piuttosto piccoli rispetto ad altri (la tabella più grande avrà circa 8000 righe).
Di seguito è riportato un esempio delle tabelle. Vedi l'esempio di seguito per una migliore visualizzazione di più righe.
SKU,CounteSizenonsonocompilatiinquantononsonoimportantiperlaricerca,masolocopiaeincollaincuiilproduttore,ilmarchio,ilmarchiosecondarioel'aromacorrispondono.
Questoèunosnippetdellafunzionediricerca:
For k = 0 To 28
For v = 1 To countryLastRow(k)
If Sheet3.Cells(v + 3, countryRanges(k) + 3) = Sheet1.Range("C6") Then
Sheet3.Cells(v + 3, countryRanges(k)).Copy Destination:=tbl.DataBodyRange(v, countryRanges(k) - 1) 'Manufacturer
Sheet3.Cells(v + 3, countryRanges(k) + 1).Copy Destination:=tbl.DataBodyRange(v, countryRanges(k)) 'Brand
Sheet3.Cells(v + 3, countryRanges(k) + 2).Copy Destination:=tbl.DataBodyRange(v, countryRanges(k) + 1) 'SubBrand
Sheet3.Cells(v + 3, countryRanges(k) + 3).Copy Destination:=tbl.DataBodyRange(v, countryRanges(k) + 2) 'Flavour
Sheet3.Cells(v + 3, countryRanges(k) + 4).Copy Destination:=tbl.DataBodyRange(v, countryRanges(k) + 3) 'SKU
Sheet3.Cells(v + 3, countryRanges(k) + 5).Copy Destination:=tbl.DataBodyRange(v, countryRanges(k) + 4) 'Count
Sheet3.Cells(v + 3, countryRanges(k) + 6).Copy Destination:=tbl.DataBodyRange(v, countryRanges(k) + 5) 'Size
End If
Next v
Next k
dove
-
K = 0 to 28
scorre le colonne della tabella dei paesi -
v = 1 to countryLastRow(k)
scorre le righe per la tabella dei paesi -
countryLastRow(k)
è il numero di righe nella tabella su sheet3, quindi non cercherà solo tra i carichi di spazi vuoti se il numero massimo è maggiore della tabella corrente. -
countryRanges(k)
è una matrice che contiene il numero di colonna iniziale per ogni tabella
Questo frammento di codice è di 1 su 16 versioni in quanto esistono diversi modi per definire i criteri (utilizzati in una funzione di selezione dei casi) in cui trova tutte le celle nella colonna 1 di una tabella paese che corrisponde ai criteri di una casella ComboBox su Sheet1 e il resto lo copiano / incollano.
Se il ComboBox su Sheet1 diceva WEETABIX LTD, Tutti i marchi, Tutti i marchi secondari, Tutti i sapori, allora copiava entrambe le righe di WEETABIX dalla tabella AE e entrambe le righe di WEETABIX dalla tabella BE omettevano le righe di Kelloggs.
Ho provato a cambiare il modo in cui la mia ricerca ha funzionato, ho cercato di guardare solo in 1 colonna alla volta piuttosto che tutte le righe in 1 colonna (per table1), la riga successiva quando terminò il passaggio al tavolo successivo tuttavia questo in realtà era più lento alcuni secondi quando l'ho programmato.
Ho un'idea di manipolare i dati inserendo i dati nelle tabelle (che utilizza un codice per estrarre i dati da cartelle di lavoro esterne di Excel. Quindi è tutto in ordine alfabetico e trova la prima cella e l'ultima cella con i criteri e fai un .range.copy
.pastespecial
ma ci vorrà un po 'per scrivere il codice per fare ciò poiché richiederà più livelli di ordinamento.
Un'altra idea, dove la condizione è vera, ottiene il valore column1 e .copy .pastespecial
dell'intervallo utilizzando .offset
per ottenere l'intera riga anziché .copy
destinazione ogni cella nella riga
Esempio di codice completo ed esempi di tabelle excel sotto
Tabella di esempio nel link excel qui: link
Codice completo in pastebin qui: link
Se vuoi accedere al documento completo fammelo sapere e io lo invierò in privato.