【问题标题】:GRRR VBA Public array variable not working in userformGRRR VBA 公共数组变量在用户表单中不起作用
【发布时间】:2016-07-08 22:43:00
【问题描述】:

我正在创建一个宏来计算我在一个月内分配给工作的小时数。我有工作列表的代码和每个工作工作所花费的时间,它将每个工作名称和相关时间保存在数组JobHours(i,j) 中。一旦我尝试在用户表单中访问此数组,它就无法使用。

我在模块中的代码

Option Explicit
Public JobHours() As Variant

    Sub MonthlyHoursShow()
    Monthly_Hours.Show
End Sub

Sub MonthlyHours(SelMonth As Variant)
'Code which assigns values to JobHours() - 
    ReDim JobHours(1, 0)
    JobHours(0, 0) = "Job Number"
    JobHours(1, 0) = "Hours"
'There are a few loops to determine what values to collect, and they are then
'assigned to JobHours() as follows:
    cValue = UCase(ws.Cells(j, 2).Text)
    ReDim Preserve JobHours(1, JobNum)
        JobHours(0, JobNum) = cValue
        JobHours(1, JobNum) = ws.Cells(j, 27).Value
    Worksheets("25 Mar").Cells(8 + JobNum, 30).Value = JobHours(0, JobNum)
    Worksheets("25 Mar").Cells(8 + JobNum, 31).Value = JobHours(1, JobNum)
'where JobNum is a counter for the number of jobs, and is incremented as part of the loop.

    Debug.Print "Upper Bound of JobHours() = " & UBound(JobHours, 2) - 'Returns as 38
    Debug.Print "Total Number of jobs is " & Application.CountA(JobHours) - 'returns as 78

End Sub

在我的用户表单中:

Private Sub CalcButton_Click()
SelMonth = MonthBox.Value

Call MonthlyHours(SelMonth)

'Debug.Print "Upper Bound of JobHours() = " & UBound(JobHours, 2) - 'Returns error
Debug.Print "Total Number of jobs is " & Application.CountA(JobHours) - 'Returns as 1

End Sub

如果我没有在第一行 Debug.Print 中注释 UBound 命令,我会收到以下错误:

Compile Error: Expected Array

我的理解是,如果 Array 被声明为公共变量,它将传递给用户表单 - 事实上,我有这个工作!然后我保存了工作簿,将其关闭并重新打开,现在有问题吗??

我不知道为什么这不起作用 - 这是我第一次真正尝试使用数组。如果您有任何想法,我们将不胜感激。

谢谢,丹

【问题讨论】:

  • 什么代码将值分配给JobHoursubound 在哪里使用?
  • 你必须在加入之前定义你的“JobHours”数组(至少有一个ReDim 声明)(比如当你试图获得它的界限时)。此外,当您退出宏时,您会丢失所有变量值,无论它们是否为Public。如果要将变量值从一个宏会话保留到另一个宏会话,则必须将它们存储(可能在工作表中,或在 txt 文件中)然后检索它们
  • 我可以看到您收到该错误的唯一方法是您是否在其他地方使用了 JobHours 作为例程/模块名称。
  • 谢谢@shahkalpesh。我添加了一些代码来显示JobHours() 的尺寸和赋值方式。我还在模块代码和表单代码中添加了 uBound 行,以显示它们返回的不同值。
  • @Rory,我检查了所有代码,但找不到任何东西。事实证明,我在用户窗体中分配了一个名为 JobHours 的文本字段,这导致了问题。用户表单中的所有字段现在都标记为“Job_Hours”并且一切正常:) 谢谢!

标签: arrays vba excel userform


【解决方案1】:

感谢@Rory,我发现用户表单本身中的一个文本字段称为JobHours,这是导致错误的原因。此后它被标记为Job_Hours,并且一切正常:)

感谢大家的 cmets 和帮助。

【讨论】:

  • 您仍然可以保留相同的变量名称和文本框标签,如果您将其与如下引用一起使用:UserformName.JobHours(或表单内的Me.JobHours)和ModuleName.JobHours。但我不会推荐它(至于可能的混淆)
【解决方案2】:

由于我们没有看到您的所有代码以及您如何填充数组,因此我们只能进行猜测。

我猜你的问题是UBound(JobHours, 2)中的,2

Debug.Print "Upper Bound of JobHours() = " & UBound(JobHours, 2)

Ubound() 的第二个参数用于指定维度。这仅在您有一个多维数组时才有用。我相信这不是你的情况,你告诉 VBA 访问一个不存在的维度。

如果我错了,请编辑您的问题并向我们展示所有内容。

【讨论】:

  • 感谢 Thomas G,我确实有一个 2D 数组,并且我已经编辑了我的帖子以显示它是如何标注尺寸和分配值的。
猜你喜欢
  • 2013-12-15
  • 1970-01-01
  • 2015-10-27
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多