2016-03-22 20 views
0

Bir ay içinde bir işe kaç saat çalıştığımı gösteren bir makro oluşturuyorum. Her işin çalışmasında harcanan zaman ve işlerin listesi için kodum var, bu da her iş adını ve ilgili saatleri JobHours(i,j) dizisinde kaydeder. Bu diziye kullanıcı formunda erişmeye çalıştığımda mevcut değildir. modülGRRR VBA Kullanıcı dizisinde çalışmayan genel dizi değişkeni

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 

ve benim userform içinde

Kodum:

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 

ben aşağıdaki hatayı alıyorum ilk Debug.Print doğrultusunda UBound komutu açıklama yoksa:

Compile Error: Expected Array 

bir kamu değişkeni olarak bir kullanıcı formuna geçecek - Aslında bu işe yaramıştım! Daha sonra çalışma kitabını kurtardım, kapattım ve tekrar açıldı ve şimdi sorun var mı?

Bunun neden çalışmadığı hakkında hiçbir fikrim yok - bir dizi kullanma konusundaki ilk gerçek girişimim. Herhangi bir fikriniz varsa, büyük takdir edilecektir.

Teşekkürler Dan

+0

Hangi kod, değeri "JobHours" a atar? Ubound nerede kullanılıyor? – shahkalpesh

+1

"JobHours" dizininizi (en az bir "ReDim" ifadesiyle), kabul etmeden önce tanımlamanız gerekir (sınırlarını almaya çalıştığınızda olduğu gibi). Makrodan çıktığınızda, tüm değişken değerlerini kaybedersiniz, bunlar “Public” olsun ya da olmasınlar. Değişken değerlerini bir makro oturumdan diğerine saklamak isterseniz, bunları (muhtemelen bir sayfada veya bir txt dosyasında) saklamak ve daha sonra – user3598756

+1

almanız gerekir. Bu hatayı aldığınızı görebilmemin tek yolu şudur: "JobHours", rutin/modül adı olarak başka bir yerde kullanılır. – Rory

cevap

0

hepimiz kodunuzu göremiyorsanız ve dizi doldurmak nasıl biz tahmin yapmak sadece olabilir.

Benim tahminim Sorununuz olmasıdır Ubound() ikinci parametre var Optionnaly boyut belirtmektir ,2

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

UBound(JobHours, 2) içinde. Bu çok boyutlu bir diziniz varsa sadece yararlıdır. Bunun sizin durumunuz olmadığını ve VBA'ya var olmayan bir boyuta erişmesini söylediğine inanıyorum.

Yanılıyorsam sorunuzu değiştirin ve bize her şeyi gösterin.

+0

Teşekkürler Thomas G, Bir 2D dizilim var ve nasıl boyutlandırıldığını ve atanan değerlerin nasıl olduğunu göstermek için gönderimi düzenledim. –

1

@Rory sayesinde Kullanıcı formunun kendisinde bir metin alanının, hatalara neden olan JobHours olduğunu belirledim. O zamandan beri Job_Hours etiketli ve hepsi çalışıyor :)

Yorumlarınız ve yardımlarınız için herkese teşekkürler.

Dan

+0

aynı değişken adı ve metin kutusu etiketini, şu şekilde bir referansla kullanırsanız: "UserformName.JobHours" (veya formdaki "Me.JobHours" ve "ModuleName.JobHours"). Ama bunu tavsiye etmem (olası karışıklık için) –