2013-06-25 4 views
5

Benzer konularda bulduğum bir çözüm okudum ve uygulamam ancak durumumda hiçbir işe yaramadı.Excel - VBA: Sub'dan Userform'a geçişi değiştir

Modülümün bir alt biriminden bir kullanıcı formuna bir değişkeni geçmek istiyorum. "ProvinceSugg" adlı bir dizedir. Benim userform kodunda sonra

Public provinceSugg As String 

Sub probaCity() 
[...] 
If province = "" And city <> "" Then 
provinceSugg = sCurrent.Cells(p, db_column).Offset(0, 1).Value 
UserForm2.Label1 = "Do you mean " & city & " in " & provinceSugg & " ?" 
UserForm2.Label1.TextAlign = fmTextAlignCenter 
UserForm2.Show 
Else 
End If 

End Sub 

Ve: İşte

ilgili benim kod parçasıdır

Private Sub userformBtn1_Click() 

MsgBox provinceSugg 
sMain.Range("J6").Value = provinceSugg 

End Sub 

benim programı çalıştırdığınızda:

1/ MsgBox'ta altımdan arandığımda gösterilen ildeSugg içeriğine sahibim (bu yüzden bir ilSugg var, boş bir değişken değil).
2/ Kullanıcı formundan çağrılan MsgBox boş (bu nedenle değeri başarısız oldu) ve "sMain.Range (" J6 ") çalışırken programım çöküyor. Value = provinceSugg" gibi bir şeyle "Error 424 Object Required" (böylece değişken kullanıcı formuna geçemedi).

Forumda bulduğum tüm öğeleri denedim (burada, bir başka değişkeni belirtmek için farklı bir yol var.

Yardımlarınız için şimdiden teşekkür ederiz!

+1

Benim için iyi çalıştı. UserForm Initialisation - "provinceSugg" ile etkileşimde çalışan başka bir kod var mı? Çalışma kitabınızı gönderebilir misiniz (gerekirse, sanitize edilmiş)? – brettdj

+0

@brettdj Bazı güncellemelerim var: button_click ("MsgBox provinceSugg sMain.Range (" J6 ").Value = provinceSugg), şimdi MsgBox'ta görüntülenen ilSugg içeriğim var ama yine de bir sonraki satır ve aynı hata için hiçbir şey (nesne gerekli/hata 424), bu yüzden değer geçilir ancak ikinci komutta okunamaz .. – Phalanx

+4

Eğer "Sheets (x) .Range (" J6 ") 'yı deneyin. Value = provinceSugg'' '' '' '' '' ın pozisyonu '' 'pozisyonu bu işi yapar - Bence bu senin meselenizdir – brettdj

cevap

5

Modül tarafından ayarlanabilecek Userform içinde genel değişkenler oluşturabilirsiniz.

Bu değişkenlere yalnızca Userform yüklenirken erişilebilir.

Userform içinde, her iki nesne için genel değişkenleri bildirin.

Public sMain As Worksheet 
Public provinceSugg as string 

Private Sub userformBtn1_Click() 

MsgBox provinceSugg 
sMain.Range("J6").Value = provinceSugg 

End Sub 

Modül içinde, her iki değişkeni de değerlendirebilirsiniz.

Sub probaCity() 
[...] 
If province = "" And city <> "" Then 

    provinceSugg = sCurrent.Cells(p, db_column).Offset(0, 1).Value 

    With UserForm2 
     .provinceSugg = provinceSugg 
     Set .sMain = sMain 
     .Label1 = "Do you mean " & city & " in " & provinceSugg & " ?" 
     .Label1.TextAlign = fmTextAlignCenter 
     .Show 
    End With 

End If 

End Sub 
+0

Bellek sızıntılarını önlemek için bu genel değişkenleri sıfırlamanız veya temizlemeniz gerekiyorsa veya bu genel değişkenler formu kapalı mı? – michaelf

1
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 

Dim selectColumn 
selectColumn= Split(Target.Address(1, 0), "$")(0) 

Call UserFormStart(selectColumn) 
End Sub 

İçinde Ana Modül

Public columnSelection As String 
... 
Public Sub UserFormStart(ByVal columnRef As String) 
    'MsgBox "Debug columnRef=" & columnRef 
    columnSelection = columnRef 
    UserForm1.Show 
End Sub 

İçinde UserForm

Private Sub UserForm_Initialize() 

'MsgBox "Debug UserForm_Initialize =" & columnSelection 
... 

End Sub 

Worksheet_SelectionChange columnSelection UserForm kamu ve vize nerede olarak bildirilmiş modülünde bir alt çağırır. UserForm'un Modüle eriştiği yer olduğunu göstermek için Sütun Referansı için üç farklı değişken kullandım. Yukarıdaki tüm çalışmalar ve bu nedenle teslim ve bulmak için yaş aldı. Mutlu avcı milleti

+0

Bu, değişkenlerin farklı bir projeden geçirilmesi gerektiğinde daha iyi bir çözümdür. (Aksi takdirde, diğer projelerin, kullanıcı değişkenlerinin genel değişkenlere erişebilmesi için projeye bir referans eklemesi gerekir.) – Michael