将数值复制到单独的Excel工作表VBA

3
我有一段代码,可以自动将主表中特定单元格复制到另一个表中。当在“B列”输入特定的值时,即可实现此功能。
例如,在下面的示例中,我想要复制所有“B列”的值等于“Faults Raised”的单元格。但问题是,主表有一个独立的脚本,根据在“B列”中输入的其他各种“值”,隐藏/显示“列”。
当输入“Faults Raised”时,“B:C,AC:AE,BP”列会显示出来。但是当我尝试自动复制时,只有“B列”被显示出来。我无法复制“C,AC:AE”和“BP”?我做错了什么?
Option Explicit

Sub FilterAndCopy()
  Dim sht1 As Worksheet, sht2 As Worksheet

  Set sht1 = Sheets("SHIFT LOG")
  Set sht2 = Sheets("FAULTS RAISED")

  sht2.UsedRange.ClearContents
  Dim rng As Range

  With sht1.Cells(2, "B").CurrentRegion
      .Range("B:BP").EntireColumn.Hidden = False ' unhide columns
      .AutoFilter
      .AutoFilter 2, "Faults Raised"
      .SpecialCells(xlCellTypeVisible).Copy sht2.Cells(6, 2)
      .AutoFilter

      .Range("C:AA").EntireColumn.Hidden = True ' hide columns
      sht2.Range("C:AA").EntireColumn.Delete ' delete 'sht2' columns
      .Range("AE:BN").EntireColumn.Hidden = True ' hide columns
      sht2.Range("AE:BN").EntireColumn.Delete ' delete 'sht2' columns
  End With

结束子程序


在 sht1.Columns("B:BP").CurrentRegion 中,无论是 .Range("B:BP").EntireColumn 错误地寻址还是 .AutoFilter field:=1 引用了列 A。为什么不使用 sht1.Cells(1, "A").CurrentRegion? - user4039065
我需要将其输入到第二张表的第2列第6行。自动筛选器是错误的。因此,我的参考列是错误的。它应该是B。我已经更改了这个,但还是一样吗? - Chopin
1个回答

2

您的 .CurrentRegion 正在干扰您想要操作的区域。在 sht1.Columns("B:BP").CurrentRegion 中,.Range("B:BP").EntireColumn 可能是错误的地址,或者 .AutoFilter field:=1 是指向列 A。使用 Intersect 可以帮助克服这些问题。

Option Explicit

Sub FilterAndCopy()
    Dim rng As Range, sht1 As Worksheet, sht2 As Worksheet

    Set sht1 = Worksheets("SHIFT LOG")
    Set sht2 = Worksheets("FAULTS RAISED")

    sht2.UsedRange.ClearContents

    With Intersect(sht1.Columns("B:BP"), sht1.UsedRange)
        .Cells.EntireColumn.Hidden = False ' unhide columns
        If .Parent.AutoFilterMode Then .Parent.AutoFilterMode = False
        'within B:BP, column B is the first column
        .AutoFilter field:=1, Criteria1:="Faults Raised"
        'within B:BP, Columns B:C, AC:AE, BP are referenced as .Columns A:B, AB:AD, BO
        .Range("A:B, AB:AD, BO:BO").Copy Destination:=sht2.Cells(6, "B")
        .Parent.AutoFilterMode = False

        'no need to delete what was never there
        'within B:BP, Columns C:AA, AE:BN, BP are referenced as .Columns B:Z, AD:BM
        .Range("B:Z").EntireColumn.Hidden = True ' hide columns
        .Range("AD:BM").EntireColumn.Hidden = True ' hide columns
    End With
End Sub

谢谢。不过在交集行出现了错误。它说范围失败了。 - Chopin
有两条相交的直线。 - user4039065
很抱歉让您感到不便。使用自动筛选行时出现了另一个错误。对象范围的AtuoFilter方法失败。 - Chopin
我只是将你的代码复制到编辑器中,然后返回错误? - Chopin
我在 .Range("A:B, AB:AD, BO:BO") 中发现了一个小的语法错误,请参见上面的编辑。 - user4039065
@Jeeped,我有一个快速问题。如果主表是一个表而不是范围,那么怎么办?这是否可能?需要完全不同的代码吗? - Chopin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接