将过滤后的单元格复制到另一张

时间:2013-10-24 16:14:35

标签: excel vba excel-vba

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

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

1 个答案:

答案 0 :(得分: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 ... < / p>

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

你的文件范围是一个表/列表对象还是只有一个带有自动筛选功能的普通旧范围?如果它是一个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从中获取不同的列。