【问题标题】:How to restrict VBA code to a specific worksheet?如何将 VBA 代码限制为特定的工作表?
【发布时间】:2018-11-02 19:10:32
【问题描述】:

我正在尝试将宏限制为特定的测试!工作表当我激活下面粘贴的宏并且我在测试中!工作表,宏工作。但是,当我尝试在不同的工作表上激活宏时,我收到一个错误。关于我需要做什么来修改 VBA 代码以使其在工作簿中的任何其他工作表上工作的任何想法?谢谢

Sub Test ()
' Test Macro
'
' Keyboard Shortcut: Ctrl+Shift+B
'
  Range ("Test!B1").Select 
  Selection.ClearContents
  Range ("Test!B2").Select
  Selection.ClearContents
  Range ("Test!B3").Select
  Selection.ClearContents
End Sub

【问题讨论】:

  • 上面的代码不会编译,所以我怀疑它是否有效。请为您运行的确切代码是什么。

标签: excel vba


【解决方案1】:

您必须直接引用工作表:

Dim ws as worksheet
set ws = Thisworkbook.Worksheets("Test")

with ws
  .Range("B1:B3").ClearContents  
end with

其他说明: 不要使用.SelectSelection。只需直接对对象进行操作。 您的原始代码中有字符串问题会导致编译时错误(已在我的代码中修复) 您可以在一行代码中清除整个范围,而不是逐个单元格

【讨论】:

  • 您应该使用Worksheets 集合来检索Worksheet 实例。 Sheets 包含所有工作表类型,包括非工作表工作表(例如Chart) - 如果用户重命名“测试”工作表,并添加他们命名为“测试”的Chart 工作表,此代码将抛出一个类型不匹配错误。如果将“测试”表重命名为其他任何内容,则此代码将引发 下标超出范围 错误。使用工作表的代号标识符以获得更强大的解决方案,除非工作表被彻底删除,否则不会中断。
  • @MathieuGuindon 公平点我将更新答案以使用工作簿的更具体的 Worksheets 集合
【解决方案2】:

如果工作表在编译时存在于 ThisWorkbook(即托管 VBA 代码的同一文件)中,那么您根本不需要检索工作表 - 不是按名称,也不是按索引。

VBA 已经为该工作表(以及ThisWorkbook 中的每个工作表)声明了一个全局Worksheet 对象变量。验证工作表的(Name) 属性;将其更改为TestSheet,然后您可以在代码中的任何位置使用TestSheet 作为标识符来引用该表。

TestSheet.Range("B1:B3").ClearContents

无论用户是否将工作表移动到工作簿中的另一个索引/位置,或者用户是否将工作表的“选项卡”重命名为其他内容,此代码都将起作用。

ThisWorkbook.Worksheets(1).Range("B1:B3").ClearContents ' breaks if sheet is moved
ThisWorkbook.Worksheets("Test").Range("B1:B3").ClearContents ' breaks if sheet/tab is renamed

【讨论】:

  • 您看不到工作表的代号已被大量使用。很好的解释。
【解决方案3】:

基础知识

如果你想学习一些东西,你应该学习版本 1 和 2,它们分别是版本 3 和 4 的精细版本。

使用 Option Explicit 快速发现错误。
使用常量可以快速更改值。
使用对象引用不必反复键入名称。

假设您将在工作表“测试”所在的工作簿的任何模块中复制这些代码。

Option Explicit

Sub Test1()

  Const cStrWs As String = "Test" 'Worksheet Name
  Const cStrRng As String = "B1:B3" 'Range to 'DEL'

  Dim oWs As Worksheet 'Worksheet Object
  Dim oRng As Range 'Range Object

  Set oWs = ThisWorkbook.Worksheets(cStrWs) 'Create a reference to the worksheet
  Set oRng = oWs.Range(cStrRng) 'Create a reference to the range

  oRng.ClearContents

End Sub

Sub Test2()

  Const cStrWs As String = "Test" 'Worksheet Name
  Const cStrCell As String = "B1" 'Cell to 'DEL'
  Const cLngCells As Long = 3 'Number of cells

  Dim oWs As Worksheet 'Worksheet Object
  Dim oRng As Range 'Range Object

  Set oWs = ThisWorkbook.Worksheets(cStrWs) 'Create a reference to the worksheet
  Set oRng = oWs.Range(cStrCell) 'Create a reference to the cell range

  oRng.Resize(3, 1).ClearContents

End Sub

Sub Test3()
  ThisWorkbook.Worksheets("Test").Range("B1:B3").ClearContents
End Sub

Sub Test4()
  ThisWorkbook.Worksheets("Test").Range("B1").Resize(3, 1).ClearContents
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2017-12-01
    相关资源
    最近更新 更多