2013-07-08 21 views
7

Sto utilizzando AutoFilter per ordinare una tabella in VBA, che si traduce in una tabella di dati più piccola. Voglio solo copiare/incollare le celle visibili di una colonna dopo l'applicazione del filtro. Inoltre, vorrei fare una media dei valori filtrati di una colonna e mettere il risultato in una cella diversa.Copia/Incolla/Calcola celle visibili da una colonna di una tabella filtrata

Ho trovato questo frammento su Stack che mi consente di copiare/incollare l'intero risultato visibile del filtro, ma non so come modificarlo o un altro modo per ottenere solo una colonna di dati (senza l'intestazione) da esso.

Range("A1",Cells(65536,Cells(1,256).End(xlToLeft).Column).End(xlUp)).SpecialCells(xlCellTypeVisible).Copy 
Sheets("Sheet2").Range("A1").PasteSpecial xlPasteValuesAndNumberFormats 
Application.CutCopyMode = False 

aggiunta a rispondere (per calcolare i valori filtrati):

tgt.Range("B2").Value =WorksheetFunction.Average(copyRange.SpecialCells(xlCellTypeVisible)) 

risposta

11

ho creato una gamma semplice a 3 colonne di Sheet1 con Paese, Città, e la lingua nelle colonne A, B e C. Il seguente codice consente di compilare automaticamente l'intervallo e quindi incolla solo una delle colonne di dati auto filtrati su un altro foglio. Si dovrebbe essere in grado di modificare il presente per i vostri scopi:

Sub CopyPartOfFilteredRange() 
    Dim src As Worksheet 
    Dim tgt As Worksheet 
    Dim filterRange As Range 
    Dim copyRange As Range 
    Dim lastRow As Long 

    Set src = ThisWorkbook.Sheets("Sheet1") 
    Set tgt = ThisWorkbook.Sheets("Sheet2") 

    ' turn off any autofilters that are already set 
    src.AutoFilterMode = False 

    ' find the last row with data in column A 
    lastRow = src.Range("A" & src.Rows.Count).End(xlUp).Row 

    ' the range that we are auto-filtering (all columns) 
    Set filterRange = src.Range("A1:C" & lastRow) 

    ' the range we want to copy (only columns we want to copy) 
    ' in this case we are copying country from column A 
    ' we set the range to start in row 2 to prevent copying the header 
    Set copyRange = src.Range("A2:A" & lastRow) 

    ' filter range based on column B 
    filterRange.AutoFilter field:=2, Criteria1:="Rio de Janeiro" 

    ' copy the visible cells to our target range 
    ' note that you can easily find the last populated row on this sheet 
    ' if you don't want to over-write your previous results 
    copyRange.SpecialCells(xlCellTypeVisible).Copy tgt.Range("A1") 

End Sub 

Si noti che utilizzando la sintassi sopra per copiare e incollare, nulla è selezionato o attivato (che si dovrebbe sempre evitare in Excel VBA) e la clipboard non è Usato. Di conseguenza, Application.CutCopyMode = False non è necessario.

+0

Se si vuole fare la media di una parte di una gamma filtrato, utilizzare questo: 'applicazione. WorksheetFunction.Average (copyRange.SpecialCells (xlCellTypeVisible)) '. (In risposta a un commento ora cancellato) –

4

Giusto per aggiungere alla codifica di Jon se si ha bisogno di prendere un ulteriore passo avanti, e fare di più che una colonna è possibile aggiungere qualcosa di simile

Dim copyRange2 As Range 
Dim copyRange3 As Range 

Set copyRange2 =src.Range("B2:B" & lastRow) 
Set copyRange3 =src.Range("C2:C" & lastRow) 

copyRange2.SpecialCells(xlCellTypeVisible).Copy tgt.Range("B12") 
copyRange3.SpecialCells(xlCellTypeVisible).Copy tgt.Range("C12") 

mettere questi nei pressi delle altre codifiche che sono gli stessi che si può facilmente cambiare gli intervalli di cui hai bisogno.

Aggiungo solo questo perché è stato utile per me. Immagino che Jon lo sappia già, ma per quelli meno esperti a volte è utile vedere come modificare/aggiungere/modificare questi codici. Ho capito perché Ruya non sapeva come manipolare il codice originale potrebbe essere utile se si dovesse mai copiare solo 2 colonne visibili, o solo 3, ecc. Puoi usare questa stessa codifica, aggiungere linee aggiuntive che sono quasi lo stesso e poi il codice sta copiando su qualunque cosa tu abbia bisogno.

Non ho abbastanza reputazione per rispondere direttamente al commento di Jon, quindi devo postare un nuovo commento, mi dispiace.

0

Ho trovato che funziona molto bene. Esso utilizza la proprietà .Range dell'oggetto .autofilter, che sembra essere un piuttosto oscuro, ma molto maneggevole, caratteristica:

Sub copyfiltered() 
    ' Copies the visible columns 
    ' and the selected rows in an autofilter 
    ' 
    ' Assumes that the filter was previously applied 
    ' 
    Dim wsIn As Worksheet 
    Dim wsOut As Worksheet 

    Set wsIn = Worksheets("Sheet1") 
    Set wsOut = Worksheets("Sheet2") 

    ' Hide the columns you don't want to copy 
    wsIn.Range("B:B,D:D").EntireColumn.Hidden = True 

    'Copy the filtered rows from wsIn and and paste in wsOut 
    wsIn.AutoFilter.Range.Copy Destination:=wsOut.Range("A1") 
End Sub 
Problemi correlati