Selection对象和Userform的奇怪错误

时间:2012-12-02 21:06:47

标签: excel vba excel-vba

使用此代码获取奇怪错误。这段摘录是主要代码的开头。首先,它打开一个需要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作为宽度,这是根据我选择的正确。

现在,这是在用户表单上按“确定”时运行的子程序:

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

这给了我28.5的高度和99的宽度。我不知道它来自何处。我甚至检查了我的用户表单上的所有对象,好像它可能正在解释那个作为我的选择(这显然是错误的,因为那些对象没有行属性)。

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

感谢任何帮助。

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

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

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

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


所以你说的是

Public Height,Width,i As Integer

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


我重新整理它将高度和宽度正确地表示为整数,但它仍然以相同的方式进行了删除。但是,使用私有变量W和H定义的方式与它的工作方式相同。 耸肩

1 个答案:

答案 0 :(得分:1)

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

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

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

  • 所有模块
  • 中使用Option Explicit
  • 不要使用关键字作为变量名称
  • 按优先顺序将变量范围限定为Procedure,然后是本地Module,然后是公开Module,并且仅在有充分理由时
  • 使用模块名称(例如Module1.Height
  • )作为远程模块调用的前缀

BTW,使用Dim Height, Width, i as integer声明声明HeightWidth作为默认类型Variant