使用VBA将过滤后的数据复制到另一个工作表

时间:2016-08-24 11:21:31

标签: excel vba excel-vba filter copy

我有两张纸。一个具有完整数据,另一个基于第一个工作表上应用的过滤器。

数据表的名称:Data
已过滤工作表的名称:Hoky

为了简单起见,我只是拿一小部分数据。我的目标是根据过滤器从数据表中复制数据。我有一个宏,它以某种方式工作,但它的硬编码,是一个录制的宏。

我的问题是:

  1. 每次行数不同。 (手动)
  2. 列不按顺序排列。
  3. enter image description here enter image description here

    Sub TESTTHIS()
    '
    ' TESTTHIS Macro
    '
    'FILTER
    Range("F2").Select
    Selection.AutoFilter
    ActiveSheet.Range("$B$2:$F$12").AutoFilter Field:=5, Criteria1:="hockey"
    
    'Data Selection and Copy
    Range("C3").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Sheets("Hockey").Select
    Range("E3").Select
    ActiveSheet.Paste
    
    Sheets("Data").Select
    Range("D3").Select
    Range(Selection, Selection.End(xlDown)).Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Hockey").Select
    Range("D3").Select
    ActiveSheet.Paste
    
    Sheets("Data").Select
    Range("E3").Select
    Range(Selection, Selection.End(xlDown)).Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Hockey").Select
    Range("C3").Select
    ActiveSheet.Paste
    
    End Sub
    

4 个答案:

答案 0 :(得分:4)

最佳方式

下面的代码是复制DBExtract工作表中的可见数据,并将其粘贴到duplicateRecords工作表中,只有过滤后的值。我选择的范围是我的数据可以占用的最大范围。您可以根据需要进行更改。

  Sub selectVisibleRange()

    Dim DbExtract, DuplicateRecords As Worksheet
    Set DbExtract = ThisWorkbook.Sheets("Export Worksheet")
    Set DuplicateRecords = ThisWorkbook.Sheets("DuplicateRecords")

    DbExtract.Range("A1:BF9999").SpecialCells(xlCellTypeVisible).Copy
    DuplicateRecords.Cells(1, 1).PasteSpecial


    End Sub

答案 1 :(得分:0)

当我需要从过滤表中复制数据时,我使用range.SpecialCells(xlCellTypeVisible).copy。范围是所有数据的范围(没有过滤器)。

示例:

Sub copy()
     'source worksheet
     dim ws as Worksheet
     set ws = Application.Worksheets("Data")' set you source worksheet here
     dim data_end_row_number as Integer
     data_end_row_number = ws.Range("B3").End(XlDown).Row.Number
    'enable filter
    ws.Range("B2:F2").AutoFilter Field:=2, Criteria1:="hockey", VisibleDropDown:=True
    ws.Range("B3:F" & data_end_row_number).SpecialCells(xlCellTypeVisible).Copy
    Application.Worksheets("Hoky").Range("B3").Paste
    'You have to add headers to Hoky worksheet
end sub

答案 2 :(得分:0)

我建议你以不同的方式做。

在下面的代码中,我将Sub TestThat() 'Declare the variables Dim DataSh As Worksheet Dim HokySh As Worksheet Dim SportsRange As Range Dim rCell As Range Dim i As Long 'Set the variables Set DataSh = ThisWorkbook.Sheets("Data") Set HokySh = ThisWorkbook.Sheets("Hoky") Set SportsRange = DataSh.Range(DataSh.Cells(3, 6), DataSh.Cells(Rows.Count, 6).End(xlUp)) 'I went from the cell row3/column6 (or F3) and go down until the last non empty cell i = 2 For Each rCell In SportsRange 'loop through each cell in the range If rCell = "hockey" Then 'check if the cell is equal to "hockey" i = i + 1 'Row number (+1 everytime I found another "hockey") HokySh.Cells(i, 2) = i - 2 'S No. HokySh.Cells(i, 3) = rCell.Offset(0, -1) 'School HokySh.Cells(i, 4) = rCell.Offset(0, -2) 'Background HokySh.Cells(i, 5) = rCell.Offset(0, -3) 'Age End If Next rCell End Sub 列设置为体育名称为F和loop through each cell的列,检查它是否是"曲棍球"如果是,我使用Offset逐个插入另一张表中的值。

我认为这不是很复杂,即使您只是在学习VBA,您也应该能够理解每一步。如果您需要澄清,请告诉我

    public class WczytajUzytkownikow {
    public void wczytajPracownikow(final ZarzadzajPracownikami zarzadzajPracownikami, Integer uprawnienie) {
        APIInterface apiInterface = ServiceGenerator.createService(APIInterface.class);
        Call<List<Uzytkownik>> call = apiInterface.wczytajpracownikow(uprawnienie);
        call.enqueue(new Callback<List<Uzytkownik>>() {
            @Override
            public void onResponse(Call<List<Uzytkownik>> call, Response<List<Uzytkownik>> response) {
                List<Uzytkownik> user;
                user = response.body();
                zarzadzajPracownikami.setUzytko(user);
            }

            @Override
            public void onFailure(Call<List<Uzytkownik>> call, Throwable t) {
                new ShowToast().showToast(zarzadzajPracownikami.getActivity(), "Brak pracowników. Dodaj pracownika");
            }
        });
    }
    public void wczytajPracownikow(final ZarzadzajKlientami zarzadzajKlientami, Integer uprawnienie) {
        APIInterface apiInterface = ServiceGenerator.createService(APIInterface.class);
        Call<List<Uzytkownik>> call = apiInterface.wczytajpracownikow(uprawnienie);
        call.enqueue(new Callback<List<Uzytkownik>>() {
            @Override
            public void onResponse(Call<List<Uzytkownik>> call, Response<List<Uzytkownik>> response) {
                List<Uzytkownik> user;
                user = response.body();
                zarzadzajKlientami.setUser(user);
            }

            @Override
            public void onFailure(Call<List<Uzytkownik>> call, Throwable t) {
                new ShowToast().showToast(zarzadzajKlientami.getActivity(), "Brak pracowników. Dodaj pracownika");
            }
        });
    }
    public void wczytajPracownikow(final KreatorZlecenia kreatorZlecenia, Integer uprawnienie) {
        APIInterface apiInterface = ServiceGenerator.createService(APIInterface.class);
        Call<List<Uzytkownik>> call = apiInterface.wczytajpracownikow(uprawnienie);
        call.enqueue(new Callback<List<Uzytkownik>>() {
            @Override
            public void onResponse(Call<List<Uzytkownik>> call, Response<List<Uzytkownik>> response) {
                List<Uzytkownik> user;
                user = response.body();

                Log.e("yyyy", "yyyy" + user.size());
                Log.e("yyyy", "yyyy" + user);

                ArrayList<Uzytkownik> uzytkownicy = new ArrayList<Uzytkownik>(user);
                kreatorZlecenia.setPracownicy(uzytkownicy);
            }

            @Override
            public void onFailure(Call<List<Uzytkownik>> call, Throwable t) {
                new ShowToast().showToast(kreatorZlecenia.getActivity(), "Brak pracowników. Dodaj pracownika");
            }
        });
    }
    public void wczytajKlientow(final KreatorZlecenia kreatorZlecenia, Integer uprawnienie){
        APIInterface apiInterface = ServiceGenerator.createService(APIInterface.class);
        Call<List<Uzytkownik>> call = apiInterface.wczytajpracownikow(uprawnienie);
        call.enqueue(new Callback<List<Uzytkownik>>() {
            @Override
            public void onResponse(Call<List<Uzytkownik>> call, Response<List<Uzytkownik>> response) {
                List<Uzytkownik> list;
                list = response.body();
                ArrayList<Uzytkownik> array = new ArrayList<Uzytkownik>(list);
                kreatorZlecenia.setUzytkownicy(array);
            }

            @Override
            public void onFailure(Call<List<Uzytkownik>> call, Throwable t) {
                kreatorZlecenia.wywolajToast("Brak klientów");
                kreatorZlecenia.setUzytkownicy(true);
            }
        });
    }

    public void wczytajKlientowAddDevice(final AddDevice addDevice, Integer uprawnienie){
        APIInterface apiInterface = ServiceGenerator.createService(APIInterface.class);
        Call<List<Uzytkownik>> call = apiInterface.wczytajpracownikow(uprawnienie);
        call.enqueue(new Callback<List<Uzytkownik>>() {
            @Override
            public void onResponse(Call<List<Uzytkownik>> call, Response<List<Uzytkownik>> response) {
                List<Uzytkownik> list;
                list = response.body();
                ArrayList<Uzytkownik> array = new ArrayList<Uzytkownik>(list);
                addDevice.setUzytkownicy(array);
            }

            @Override
            public void onFailure(Call<List<Uzytkownik>> call, Throwable t) {
                new ShowToast().showToast(addDevice.getActivity(), "Brak klientów");
            }
        });
    }

    public void wczytajPracownika(final Szczegoly szczegoly, Zlecenia zlecenia){

        APIInterface apiInterface = ServiceGenerator.createService(APIInterface.class);
        Call<Uzytkownik> call = apiInterface.wczytajuzytkownika(zlecenia.getIdPracownik());
        call.enqueue(new Callback<Uzytkownik>() {
            @Override
            public void onResponse(Call<Uzytkownik> call, Response<Uzytkownik> response) {

                Uzytkownik uzytkownik = response.body();
                szczegoly.dodajWidok(szczegoly.getView(), uzytkownik);

            }

            @Override
            public void onFailure(Call<Uzytkownik> call, Throwable t) {
                new ShowToast().showToast(szczegoly.getActivity(), "Brak klientów");
            }
        });
    }

    public void wczytajPracownika(final SzczegolyUzytkownik szczegolyUzytkownik, Sprzety sprzety){

        APIInterface apiInterface = ServiceGenerator.createService(APIInterface.class);
        Call<Uzytkownik> call = apiInterface.wczytajuzytkownika(sprzety.getIdUzytkownik());
        call.enqueue(new Callback<Uzytkownik>() {
            @Override
            public void onResponse(Call<Uzytkownik> call, Response<Uzytkownik> response) {

                Uzytkownik uzytkownik = response.body();
                szczegolyUzytkownik.setUzytkownik(uzytkownik);

            }

            @Override
            public void onFailure(Call<Uzytkownik> call, Throwable t) {
                new ShowToast().showToast(szczegolyUzytkownik.getActivity(), "Brak klientów");
            }
        });
    }
}

答案 3 :(得分:0)

它必须是.Row.count而不是Row.Number吗?

这就是我所使用的并且效果很好 子TransfersToCleared() 昏暗的工作表 暗淡的LastRow只要长 设置ws = Application.Worksheets(“导出(2)”)'数据源 LastRow = Range(“ A”&Rows.Count).End(xlUp).Row ws.Range(“ A2:AB”&LastRow).SpecialCells(xlCellTypeVisible).Copy