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

4

1 回答 1

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). 过度的字符串操作可能会伤害你。单元格属性可以将一行和一列作为参数。

您的归档范围是表格/列表对象还是只是带有自动过滤器的普通旧范围?如果它是一个列表对象,则获取列表对象,获取它的 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

于 2013-10-24T17:09:26.323 回答