select对象和用户窗体奇怪的错误

用这个代码获得一个奇怪的错误。 这段摘录是主要代码的开始。 首先它打开一个需要3个input的表单。 这些input现在没有被使用,所以这不是问题。

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作为宽度,这是正确的,根据我select的。

现在这里是你在用户表单上按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.我不知道这是从哪里来的。 我甚至检查了我的用户表单上的所有对象,就好像它正在解释我的select(这显然是错误的,因为这些对象没有行属性)。

理想情况下,如果这是一个真实的事情,我想将我的初始select保存为“公共variables”。

任何帮助表示赞赏。

编辑:进一步更新。 我现在已经手动设置了variables三angular形

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

这仍然给我同样奇怪的尺寸。 现在我真的很难过

2xEDIT:当我不使用variables高度和宽度,只是直接指向triangle.Rows.Count和triangle.Columns.Count它给了我正确的答案。 所以我现在可以正常运行我的程序。 我仍然很想知道为什么使用一个variables是错误的。


所以你说的是这条线

Public Height,Width,i As Integer

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


我redid它声明高度和宽度正确的整数,但它仍然buging同样的方式。 然而使用私有variablesW和H定义它的工作方式相同。

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

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

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

  • 所有模块中使用Option Explicit
  • 不要使用关键字variables名称
  • 范围你的variables,按照优先顺序, Procedure ,然后本地Module ,然后公共Module ,只有当有很好的理由
  • 使用模块名称前缀远程模块调用,例如Module1.Height

顺便说一句,使用Dim Height, Width, i as integer宣布声明HeightWidth作为默认types是Variant