【问题标题】:Deselect range after autofilter自动过滤后取消选择范围
【发布时间】:2016-06-10 03:47:18
【问题描述】:

这看起来非常简单直接,但无论我进行多少测试和搜索,我都无法解决。我目前有脚本可以在不选择任何内容的情况下打开 AutoFilter,但我认为我可以在不选择数据的情况下复制数据并粘贴到新工作表中。但是,在它完成操作后,它确实将 A:K 列显示为选中状态。我一直无法弄清楚如何取消选择工作表上的这些列,也无法找出如何在不首先选择它们的情况下复制和粘贴。任何指导表示赞赏。谢谢。

Sub RunScript()

Application.ScreenUpdating = False
Application.DisplayAlerts = False

Dim ws1 As Worksheet
Set ws1 = ThisWorkbook.Sheets("Data")

Sheets.Add.Name = "copy"
Dim galreqws As Worksheet
Set galreqws = ThisWorkbook.Sheets("copy")

Sheets("Data").Select
Range("A:K").AutoFilter

ws1.Range("A1:K1000").Copy Destination:=Sheets("copy").Range("A1:K1000")

galreqws.Delete

'Sheets("Data").Select
Range("A:K").AutoFilter
Range("A:K").Select
Sheets("Buttons").Select

Application.ScreenUpdating = True
Application.DisplayAlerts = True

End Sub

【问题讨论】:

  • Application.CutCopyMode=False ?
  • 我应该把那个加法放在哪里?如果有帮助,我编辑了上面的内容以包含完整的脚本。
  • 在显示警报之后尝试,在结束之前将其设置回 true。
  • 还需要 Range("A:K").select 吗?

标签: excel vba deselect


【解决方案1】:

使用.Select 通常是不好的做法,除非您真的希望用户看到选定的范围。据我所知,没有需要.Select 的操作。

以下是一些您可以改进代码的建议:

Sub RunScript()

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    Dim wsCurrent As Worksheet
    Set wsCurrent = ActiveSheet

    Dim wsData As Worksheet
    Set wsData = ThisWorkbook.Worksheets("Data")

    Dim wsGalreq As Worksheet
    ' Note that .Add will activate the new sheet so we'll
    ' need to reactivate the worksheet that was previously active
    'Set wsGalreq = Worksheets.Add
    'wsGalreq.Name = "copy"
    Set wsGalreq = Worksheets("copy")

    wsData.Range("A:K").AutoFilter 1, "Supplier A"
    ' Find the used range in columns A to K and copy over starting
    ' at cell A1 of wsGalreq
    Intersect(wsData.UsedRange, wsData.Range("A:K")).Copy Destination:=wsGalreq.Range("A1")

    ' Doubt deleting the new sheet was intentional?
    ' wsGalreq.Delete

    ' Now change the view to the desired worksheet, uncomment one:
    'Worksheets("Buttons").Select
    'wsCurrent.Activate

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True

End Sub

【讨论】:

  • 感谢您的建议,非常感谢。我真的处于 VBA 的学习阶段,所以很高兴学习如何更好地编写代码。
  • 问题@snoopen,我尝试运行上面的脚本,但它几乎立即给了我一个错误,说“需要对象”。当我调试它时,它突出显示以下行: Set wsCurrent = ActiveWorksheet
  • 抱歉,应该是Set wsCurrent = ActiveSheet 我会相应地更新我的答案。
  • 希望最后一个问题@snoopen,使用此 Intersect 方法,我将如何搜索/选择特定记录,如“供应商 A”,而不是使用 Autofilter 方法。再次感谢,非常感谢所有帮助。
  • 我已更新问题以显示如何使用自动过滤器过滤第 1 列。要做到这一点没有自动过滤试试这个:gist.github.com/anonymous/f5969073d58dd4e84192
【解决方案2】:

从您的代码中删除下面的行。

Range("A:K").Select

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 2021-04-20
    • 1970-01-01
    相关资源
    最近更新 更多