【问题标题】:Strange error with Selection object and Userform选择对象和用户窗体的奇怪错误
【发布时间】:2012-12-03 13:48:16
【问题描述】:

此代码出现一个奇怪的错误。这段摘录是主要代码的开始。首先,它打开一个接受 3 个输入的表单。输入现在没有被使用,所以这不是问题。

Public triangle As Range
Public Height, Width, i As Integer


Sub asdf()
Set triangle = Selection
WeightsUserForm.Show
Height = triangle.Rows.Count
Width = triangle.Columns.Count
Debug.Print Height
Debug.Print Width

这给了我 12 作为高度和 12 作为宽度,根据我的选择,这是正确的。

现在这是当您在用户表单上按 OK 时运行的子程序:

Private Sub OKButton_Click()
Set triangle = Selection
Height = triangle.Rows.Count
Width = triangle.Columns.Count
Debug.Print Height
Debug.Print Width

这给了我 28.5 的高度和 99 的宽度。我不知道这是从哪里来的。我什至检查了我的用户窗体上的所有对象,好像它可能将其解释为我的选择(这显然是错误的,因为这些对象没有 rows 属性)。

理想情况下,如果这是真实的,我想将我的初始选择保存为“公共变量”。

感谢任何帮助。

编辑:进一步更新。我现在手动设置了变量三角形,即

triangle = Range("B3","M14")

这仍然给了我同样奇怪的维度。现在我真的很难过。

2xEDIT:当我不使用变量 Height 和 Width 并且直接引用 triangle.Rows.Count 和 triangle.Columns.Count 时,它给了我正确的答案。所以我现在可以正常运行我的程序了。不过,我仍然很想知道为什么使用变量是错误的。


所以你是说那行

Public Height,Width,i As Integer

只是将 i 声明为整数而不指定高度和宽度的类型?如果是这样,那将是我的问题。


我重做了它,将高度和宽度都正确地声明为整数,但它仍然以同样的方式出错。但是,使用私有变量 W 和 H 定义的工作方式相同。 耸耸肩

【问题讨论】:

  • 声明所有变量可能会有所帮助。在用户表单代码中,至少正如您所展示的那样,没有声明任何变量。在第一个例程中,您实际上已将HeightWidth 声明为Variants。请参阅cpearson.com/excel/DeclaringVariables.aspx 和名为“注意使用 One Dim 声明声明的变量”的部分,了解它们为何是变体。尝试将Option Explicit 放在模块顶部,这将强制在编译时声明变量。
  • 那么,您是否尝试过将所有变量声明为variant 以外的类型?我相信这会回答您的 2xEdit 问题。
  • 再想一想:一般建议不要使用 Excel 保留字作为变量名。 HeightWidth 都是 Excel 属性名称。我会尝试将变量名称更改为其他名称,例如“TriangleHeight”。
  • 所以您是说 Public Height,Width,i As Integer 行只是将 i 声明为整数而不指定高度和宽度的类型?如果是这样,那将是我的问题。
  • 这就是我所说的,是的。

标签: vba excel


【解决方案1】:

从字里行间看,我认为您的问题是 Debug.Print HeightDebug.Print Width 正在打印您的表单的大小。

如果您的声明位于 Module 而不是 Form 类中,则会发生这种情况,因为 HeightWidth 是适用于表单的关键字,因此优先使用本地版本。

要解决,你应该做所有这些事情(并非所有这些都是绝对必要的,但都是好的做法):

  • 在您的所有模块中使用Option Explicit
  • 变量名不要使用关键字
  • 将变量范围按优先顺序排列为Procedure,然后是本地Module,然后是公共Module,并且只有在有充分理由的情况下才能使用
  • 在远程模块调用前加上模块名称,例如Module1.Height

顺便说一句,使用Dim Height, Width, i as integer 声明将HeightWidth 声明为默认类型Variant

【讨论】:

    猜你喜欢
    • 2017-08-20
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多