2013-10-24 49 views
0

我有四行信息可以过滤。 (月份,名称,服务,单位)我按名称和月份过滤信息。 (取决于所需信息)我已经将以下内容放在一起,尝试抓取最上面一行过滤的数据并将其放在另一张纸上。将过滤的单元格复制到另一个表格

Sub Mine() 
    Dim sht1 As Worksheet 
    Dim sht2 As Worksheet 
    Dim lRow As Long 

     Set sht1 = ThisWorkbook.Sheets("Export") 
     Set sht2 = ThisWorkbook.Sheets("DB1") 

     lRow = sht1.Cells(Rows.Count, "A").End(xlUp).Row + 1 

     sht1.Range("b" & lRow) = sht2.Range("A2" & Cells.SpecialCells(xlCellTypeLastCell).Row).SpecialCells(xlCellTypeVisible) 'Month 
     sht1.Range("a" & lRow) = sht2.Range("E2" & Cells.SpecialCells(xlCellTypeLastCell).Row).SpecialCells(xlCellTypeVisible) 'Client Name 
     sht1.Range("c" & lRow) = sht2.Range("C2" & Cells.SpecialCells(xlCellTypeLastCell).Row).SpecialCells(xlCellTypeVisible) 'Service 
     sht1.Range("d" & lRow) = sht2.Range("H1" & Cells.SpecialCells(xlCellTypeLastCell).Row).SpecialCells(xlCellTypeVisible) 'Units 

    End Sub 

这不会错误,它只是不会复制任何内容到“导出”工作表。我能得到任何东西从一张纸复制到另一张纸的唯一方法是取出特殊的单元。如下...

Sub Mine() 
Dim sht1 As Worksheet 
Dim sht2 As Worksheet 
Dim lRow As Long 

    Set sht1 = ThisWorkbook.Sheets("Export") 
    Set sht2 = ThisWorkbook.Sheets("DB1") 

    lRow = sht1.Cells(Rows.Count, "A").End(xlUp).Row + 1 

    sht1.Range("b" & lRow) = sht2.Range("A2") 'Month 
    sht1.Range("a" & lRow) = sht2.Range("E2") 'Client Name 
    sht1.Range("c" & lRow) = sht2.Range("C2") 'Service 
    sht1.Range("d" & lRow) = sht2.Range("H1") 'Units 

End Sub 

但如前所述,它只复制第一行,过滤或不复制。我的目标是获取“DB1”的过滤顶行,并将其复制到“导出”中的已排序单元格。任何援助将不胜感激。

-JGr3g

+0

您可能需要将这些行更改为类似:sht2.Range( “A2:A” &sht2.Cells.SpecialCells(xlCellTypeLastCell).Row).SpecialCells(xlCellTypeVisible)“月 – Sam

回答

1

好了,所以我不认为你的代码是做什么你认为它是。 让我们有些除了

sht2.Range("A2" & Cells.SpecialCells(xlCellTypeLastCell).Row).SpecialCells(xlCellTypeVisible) 

你打电话sht2.Range(),并传递一个字符串。该字符串是"A2"Cells.SpecialCells(xlCellTypeLastCell).Row).SpecialCells(xlCellTypeVisible)的并置。

什么是Cells.SpecialCells(xlCellTypeLastCell).Row).SpecialCells(xlCellTypeVisible)?隐含地,Cells是表示活动电子表格中的每个单元格的范围,ThisWorkbook.ActiveSheet.Cells。然后你要求SpecialCells(xlCellTypeLastCell),并采取行? sht1和sht2发生了什么?你没有使用它们,你正在使用活动工作表?

所以,如果活动工作表的最后一个单元格是在第50,你所要求的"A2" & 50这将得到"A250",这将是空白,因为上次使用的行50 ...第一

第一件事,我建议你避免使用字符串连接来查找单元格。没有这"A" & numericVariable的东西。使用更直接的东西,如Cells(numericVariable, 1)。过度的字符串操作可能会伤害你。 cells属性可以将行和列作为参数。

你的filered范围是table/listobject还是只是一个普通的旧范围,上面有一个AutoFilter?如果它是一个listobject,那么得到listobject,得到它的DataBodyRange,然后使用.SpecialCells(xlCellTypeVisible),然后得到结果范围的第一行。

同样,如果它是一个自动过滤范围,获取目标数据范围,整个数据范围。一旦你有了,抓住可见的单元格,然后得到第一行。

编辑:未经测试的例子

set targetRow = ws.Range(ws.Cells(2, 1), ws.Cells(lRow, 5)).SpecialCells(xlCellTypeVisible).Row(1) 
targetSheet.Range("A2") = targetRow.Cells(1,2) 

好了,这是什么做的?我正在工作表变量ws并获取范围。 .Range(ws.Cells(2, 1), ws.Cells(lRow, 5))。该范围是从第二行,第一列,又名"A2"。它转到第5列lRow中包含的行号,即"E" & lRow

从那里它只有可见单元格.SpecialCells(xlCellTypeVisible)然后获取第一区域的第一行中的选择.Row(1)

一旦我们有第一排,我们可以从它那里得到不同的列有两种.Cells.Column

+0

为什么什么试过好解释有一个问题。可以从这个答案中学到一些东西,而不仅仅是提供一个答案+1 – datatoo

+0

伟大的建议顺便说一句,我仍然有点困惑。无论如何,我们可以有一些代码去解释吗?眼见为实。 –

相关问题