【问题标题】:vba Userform macro edits wrong sheetvba Userform宏编辑错误的工作表
【发布时间】:2017-12-09 02:03:56
【问题描述】:

我有一个用户窗体,它应该在 Sheet3 上插入一行并用一些值填充该行中的一些单元格。只要我显示了 sheet3,它就可以很好地工作。 (表格显示为无模式,以便我访问工作表)。

无论如何,我碰巧有另一个工作表处于活动状态并再次运行它,并惊讶地发现它插入的行不是在 sheet3 中,而是在我显示的那个中......(感谢上帝,我先保存了!)

在代码中,我指定了一个范围对象,如下所示:(为了简单起见,我将代码截断一点)

Dim RecordRange As Range
Set RecordRange = Sheet3.Cells(RowVariable,ColumnVariable)
RecordRange.Offset(1,0).EntireRow.Insert

哈哈哈哈哈哈。 一种解决方法是先激活工作表:

Sheet3.Activate

至少插入到正确的工作表中,但我宁愿在添加记录时不显示 sheet3,所以我什至用:

Application.ScreenUpdating = False
Sheet3.Activate
Application.ScreenUpdating = True

不幸的是,ScreenUpdating 不能在用户表单代码模块中工作,所以会咬人......

当我已经在代码中指定了 sheet3 时,我仍然不明白为什么它选择将行插入到任何活动的工作表中。我有另一个非常相似的宏没有这个问题。

有什么想法吗?

【问题讨论】:

  • 我怀疑这可能与“细胞”与“范围”有关。另一个可以正常工作的宏通过以下方式引用该行:Sheet3.Range("C" & variable).EntireRow.Insert。我也没有像在原始帖子中那样将它传递给范围对象变量。
  • 如果在Sheet3 前面添加工作簿会发生什么?例如Workbooks("Name of workbook").Sheet3. ...
  • Workbooks("Name of workbook").Sheet3.rows(rowvariable+1).Insert ...
  • 这可能与代码位置有关。基本上,您有一个用于用户窗体的类模块和另一个用于 ActiveSheet 的类模块。然后您尝试从另一个类模块调用一个类模块的代码,这将不起作用。将您的代码放在一个标准模块中,并从您的工作表的类模块中调用它,这样它就是一个打开表单的标准模块,而不是一个类模块。您可以调用 sub 从工作表类模块打开表单。我建议您也这样做,以避免直接从另一个工作表的类模块中操作工作表。
  • 您提供的代码不会造成问题,您可能需要提供完整的代码。

标签: excel range userform vba


【解决方案1】:

...所以您认为您的解决方法需要解决方法? 嗯... 我认为这符合双重否定的条件,因为根据定义,解决方法应该修复问题而不是导致问题...

解决方法是绕过系统中已识别的问题。一个 解决方法通常是临时修复,这意味着真正的 需要解决问题。但是解决方法通常是 创造性作为真正的解决方案,涉及跳出框框思考 他们的创作。

通常它们被认为是脆弱的,因为它们不会响应 以及从原始设计之外的系统进一步施加压力。在 实施变通方法很重要的是标记更改,以便 稍后实施适当的解决方案。

对解决方法施加压力可能会导致以后的系统故障。 例如,在计算机编程中,变通方法通常用于 解决库中的问题或反模式,例如不正确的 返回值。更改库时,解决方法可能会中断 整体程序功能,有效地成为 反模式,因为它可能期望来自 图书馆。 (Wikipedia)

只是说... :-)

因此,您的原始问题不是修复解决方法,而是(谢天谢地)直截了当。

您正在使用 Sheet3 作为对象,我怀疑您没有分配任何东西(例如将 Worksheets("Sheet3") 分配给名为 Sheet3 的对象。

试试这个:

Dim RecordRange As Range
Set RecordRange = Worksheets("Sheet3").Cells(RowVariable,ColumnVariable)
RecordRange.Offset(1,0).EntireRow.Insert

如果您确实打算将 Sheet3 用作对象,请确保将其声明为 set,例如,您可以改用:

Dim RecordRange As Range
Dim Sheet3 As Worksheet
Set Sheet3 = Worksheets("Sheet3")
Set RecordRange = Sheet3.Cells(RowVariable,ColumnVariable)
RecordRange.Offset(1, 0).EntireRow.Insert

另外,只是要指出:如果其中任何一个解决了您的问题,那么问题将通过在每个模块的顶部包含一行(至少在开发和故障排除期间)“让自己知道”:

Option Explicit

This link 有一个简短的解释,但基本上它会强制您正确声明所有变量(从而有助于防止将来出现变通方法!)

【讨论】:

  • 好吧,其实我是来贴一个符合variatus建议的解决方案,就是把它自己的Public Sub中的代码分离到一个单独的模块中。它只有一行:Sheet3.Rows(variable).Insert。当 sub 在 sheet3 模块中时,我无法让它工作。它一直说这是一个无法识别的例程,但我通过将它放入一个单独的模块中,从我的主例程传递变量并从我的主例程调用它来解决它。有点乱,但它有效。
  • 然后我看到了 Ashleedawg 的评论。我是一个菜鸟,从来不理解 Option Explicit,所以谢谢你。令人惊讶的是,即使在同一个代码模块中,我的其他例程都没有以这种方式引用工作表(Sheet1.Range、Sheet3.Cells 等)。我仍然不明白,但是通过将选项显式放在窗口顶部并将 Sheet3 声明为工作表对象,然后我将 sheet3 = 设置在给我带来问题的 sub 中,它通过消除需要解决了这个问题调用单独的例程或必须激活工作表。我认为它现在有效。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多