2016-03-22 3 views
0

1か月間にジョブに割り当てられた時間数をカウントするマクロを作成しています。私は各ジョブの作業に費やされたジョブと時間のリストのコードを持っており、各ジョブ名とその時間をアレイJobHours(i,j)に保存しています。ユーザーフォームでこの配列にアクセスしようとすると、利用できません。モジュールGRRR VBAパブリック配列変数がユーザーフォームで機能していない

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 

私の理解は、配列が宣言されていた公開された変数としてedを渡して、ユーザーフォームに渡します - 実際には私はこの作業をしていました!私はその後、ブックを保存し、それを閉じて再オープンし、今問題がありますか?

なぜこれが機能していないのかわかりません。アレイを使用したのは初めての試みです。アイデアがあれば、大変感謝しています。

おかげで、ダン

+0

「JobHours」にどのような値を割り当てるコードですか? 'ubound'はどこで使われていますか? – shahkalpesh

+1

あなたの "JobHours"配列(少なくとも 'ReDim'文)を定義する必要があります(その境界を取得しようとするときのように)。マクロを終了すると、 'Public'であろうとなかろうと、すべての変数値が失われます。 1つのマクロセッションの変数値を別のマクロセッションに保持したい場合は、それらを(シートやtxtファイルに)格納してから取得する必要があります。 – user3598756

+1

エラーが表示されるのは、ルーチン/モジュール名として 'JobHours'を使用していました。 – Rory

答えて

0

我々はすべてのコードとどのように配列を移入が表示されていないので、我々は推測のみを行うことができます。

私の推測では、あなたの問題は,2UBound(JobHours, 2)

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

Ubound()の2番目のパラメータがoptionnalyの寸法を指定することがあることです。これは、多次元配列を持つ場合にのみ便利です。私はこれがあなたの事件ではないと信じています、あなたは存在しない次元にアクセスするようにVBAに指示します。

私が間違っている場合は、質問を編集してください。

+0

ありがとうThomas G、私は2D配列を持っています、そして私はそれがどのように次元化され、値が割り当てられているかを示すために投稿を編集しました。 –

1

@Roryのおかげで、ユーザーフォーム自体のテキストフィールドがJobHoursと呼ばれ、エラーの原因となっていました。以後、Job_Hoursというラベルが付けられており、すべて動作しています。

おかげさまで、皆様のご意見、ご協力をお待ちしております。

Dan

+0

'UserformName.JobHours'(またはフォーム内の' Me.JobHours')や 'ModuleName.JobHours'のように、同じ変数名とテキストボックスのラベルをそのまま使用することができます。しかし、私はそれをお勧めしません(混乱の可能性について) –

関連する問題