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