Macro Vba per copiare la riga dalla tabella se il valore nella tabella soddisfa la condizione

sto cercando di creare una macro che:

  1. passa attraverso un tavolo
  2. guarda se il valore nella colonna B di quella tabella ha un determinato valore
  3. se ce l’ha, copia quella riga in un intervallo in un altro foglio di lavoro

Il risultato è simile al filtraggio della tabella ma voglio evitare di hide le righe

Sono un pò nuovo in vba e non so davvero da dove iniziare con questo, qualsiasi aiuto sia molto apprezzato.

Questo è esattamente ciò che fai con un filtro avanzato. Se è uno scatto, non hai nemmeno bisogno di una macro, è disponibile nel menu Dati.

Sheets("Sheet1").Range("A1:D17").AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Sheets("Sheet1").Range("G1:G2"), CopyToRange:=Range("A1:D1") _ , Unique:=False 

Le selezioni sono lente e non appariscenti. Il seguente codice sarà molto più veloce:

 Sub CopyRowsAcross() Dim i As Integer Dim ws1 As Worksheet: Set ws1 = ThisWorkbook.Sheets("Sheet1") Dim ws2 As Worksheet: Set ws2 = ThisWorkbook.Sheets("Sheet2") For i = 2 To ws1.Range("B65536").End(xlUp).Row If ws1.Cells(i, 2) = "Your Critera" Then ws1.Rows(i).Copy ws2.Rows(ws2.Cells(ws2.Rows.Count, 2).End(xlUp).Row + 1) Next i End Sub 

Provalo in questo modo:

 Sub testIt() Dim r As Long, endRow as Long, pasteRowIndex As Long endRow = 10 ' of course it's best to retrieve the last used row number via a function pasteRowIndex = 1 For r = 1 To endRow 'Loop through sheet1 and search for your criteria If Cells(r, Columns("B").Column).Value = "YourCriteria" Then 'Found 'Copy the current row Rows(r).Select Selection.Copy 'Switch to the sheet where you want to paste it & paste Sheets("Sheet2").Select Rows(pasteRowIndex).Select ActiveSheet.Paste 'Next time you find a match, it will be pasted in a new row pasteRowIndex = pasteRowIndex + 1 'Switch back to your table & continue to search for your criteria Sheets("Sheet1").Select End If Next r End Sub 

stai descrivendo un problema, che proverei a risolvere con la funzione CERCA.VERT invece di utilizzare VBA.

Si dovrebbe sempre considerare prima una soluzione non VBA.

Ecco alcuni esempi di applicazione di VLOOKUP (o SVERWEIS in tedesco, come lo conosco):

http://www.youtube.com/watch?v=RCLUM0UMLXo

http://office.microsoft.com/en-us/excel-help/vlookup-HP005209335.aspx


Se devi renderlo come una macro, potresti usare VLOOKUP come funzione di applicazione – una soluzione rapida con prestazioni lente – o dovrai fare tu stesso una funzione simillar.

Se deve essere quest’ultimo, allora c’è bisogno di maggiori dettagli sulle specifiche, per quanto riguarda le domande sulle prestazioni.

È ansible copiare qualsiasi intervallo su un array, eseguire il ciclo attraverso questa matrice e verificare il valore, quindi copiare questo valore su qualsiasi altro intervallo. Questo è come risolverei questo come una funzione vba.

Questo sembrerebbe qualcosa del genere:

 Public Sub CopyFilter() Dim wks As Worksheet Dim avarTemp() As Variant 'go through each worksheet For Each wks In ThisWorkbook.Worksheets avarTemp = wks.UsedRange For i = LBound(avarTemp, 1) To UBound(avarTemp, 1) 'check in the first column in each row If avarTemp(i, LBound(avarTemp, 2)) = "XYZ" Then 'copy cell targetWks.Cells(1, 1) = avarTemp(i, LBound(avarTemp, 2)) End If Next i Next wks End Sub 

Ok, ora ho qualcosa di carino che potrebbe tornare utile per me stesso:

 Public Function FILTER(ByRef rng As Range, ByRef lngIndex As Long) As Variant Dim avarTemp() As Variant Dim avarResult() As Variant Dim i As Long avarTemp = rng ReDim avarResult(0) For i = LBound(avarTemp, 1) To UBound(avarTemp, 1) If avarTemp(i, 1) = "active" Then avarResult(UBound(avarResult)) = avarTemp(i, lngIndex) 'expand our result array ReDim Preserve avarResult(UBound(avarResult) + 1) End If Next i FILTER = avarResult End Function 

Puoi usarlo nel tuo foglio di lavoro come questo = FILTER (Tabelle1! A: C; 2) o con = INDICE (FILTER (Tabelle1! A: C; 2); 3) per specificare la riga del risultato. Sono sicuro che qualcuno potrebbe estendere questo per includere la funzionalità di indice in FILTER o sapere come restituire un intervallo come object – forse potrei farlo anch’io, ma non oggi;)