2013-06-25 65 views
5

Tôi đã đọc và áp dụng giải pháp mà tôi tìm thấy trên các chủ đề tương tự nhưng dường như không có gì hoạt động trong trường hợp của tôi.Excel - VBA: chuyển biến từ Sub sang Userform

Vì vậy, tôi muốn chuyển một biến từ một phần của Mô-đun1 sang biểu mẫu người dùng. Đó là một chuỗi gọi là "provinceSugg".

Dưới đây là phần có liên quan của mã của tôi:

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 

Và sau đó trong mã userform của tôi:

Private Sub userformBtn1_Click() 

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

End Sub 

Khi tôi chạy chương trình của tôi:

1/ Tôi có nội dung của tỉnhSugg hiển thị trong MsgBox được gọi từ phụ của tôi (vì vậy có một tỉnhSugg, nó không phải là một biến trống).
2/ MsgBox được gọi từ biểu mẫu người dùng trống (vì vậy không thể vượt qua giá trị) và chương trình của tôi bị lỗi khi chạy "sMain.Range (" J6 "). Value = provinceSugg" với thông báo "Lỗi 424 đối tượng bắt buộc" (do đó, biến không thành công để chuyển sang biểu mẫu người dùng).

Tôi đã thử tất cả nội dung tôi tìm thấy trên diễn đàn và tại đây (các cách khác nhau để chỉ ra rằng provinceSugg là biến công khai nhưng vẫn bị lỗi ...).

Cảm ơn trước sự giúp đỡ của bạn!

+1

Làm việc tốt cho tôi. Có bất kỳ mã nào khác đang chạy - chẳng hạn như khởi tạo UserForm - xen kẽ với 'provinceSugg' không? Bạn có thể đăng bài của bạn (đã được vệ sinh nếu cần) không? – brettdj

+0

@brettdj Tôi có một số cập nhật: với mã này trong button_click ("MsgBox provinceSugg sMain.Range (" J6 ").Value = provinceSugg), bây giờ tôi đã có contentSugg nội dung được hiển thị trong MsgBox nhưng vẫn không có gì cho dòng tiếp theo và lỗi tương tự (đối tượng yêu cầu/lỗi 424), vì vậy giá trị được thông qua nhưng không thể đọc được trong lệnh thứ hai .. – Phalanx

+4

Nếu bạn thử 'Sheets (x) .Range (" J6 "). Value = provinceSugg' trong đó' x' là vị trí 'sMain' thực hiện công việc này - tôi nghĩ đây là vấn đề của bạn – brettdj

Trả lời

5

Bạn có thể tạo các biến công khai trong Biểu mẫu người dùng có thể được đặt bởi Mô-đun.

Các biến này chỉ có thể truy cập trong Userform khi nó được tải.

Trong biểu mẫu người dùng, hãy khai báo biến công khai cho cả hai đối tượng.

Public sMain As Worksheet 
Public provinceSugg as string 

Private Sub userformBtn1_Click() 

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

End Sub 

Trong mô-đun, bạn có thể đánh giá cả hai biến đó.

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

Bạn có phải đặt lại hoặc xóa các biến công cộng để ngăn rò rỉ bộ nhớ hoặc các biến công khai sẽ biến mất khi hình thức đóng cửa? – michaelf

1
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 

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

Call UserFormStart(selectColumn) 
End Sub 

Bên trong chính Mô-đun

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

Bên trong UserForm

Private Sub UserForm_Initialize() 

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

End Sub 

Worksheet_SelectionChange gọi một tiểu trên module, nơi columnSelection được khai báo là public và visable từ UserForm. Tôi đã sử dụng ba biến khác nhau cho Tham chiếu Cột để cho biết rằng UserForm có quyền truy cập vào Mô-đun. Trên tất cả các công trình và mất lứa tuổi để tìm và làm việc ra do đó trình. Những người săn bắn vui vẻ

+0

Đây là giải pháp tốt hơn khi các biến cần được chuyển từ một dự án khác. (Nếu không, các dự án khác cần bao gồm tham chiếu đến dự án với biểu mẫu người dùng để có thể truy cập vào các biến công khai.) – Michael

Các vấn đề liên quan