2013-09-23 76 views
6

Tôi có mã vba tự động mở. Nó thực hiện một số kiểm tra sau đó sẽ nhắc một userform yêu cầu tên người dùng và mật khẩu. Tôi đã gọi cho biểu mẫu này bằng userform_name.show.Gọi một biểu mẫu người dùng và trả về một giá trị

Vấn đề của tôi là làm cách nào tôi có thể trả lại số Boolean cho số Auto_Open phụ của mình từ mã người dùng.

Tôi đã liên kết mã xác minh xem thông tin xác thực có chính xác với nút "Đăng nhập" trên biểu mẫu hay không. đây là mã tạo ra Boolean. Tôi cần trả lại nó cho Auto_Open.

Private Sub loginbutton() 
    Dim bool As Boolean 
    Dim lrup 
    Dim r As Long 
    Dim pass As String 

    loginbox.Hide 

    'are fields empty 
    Do While True 
     If unBox.Text = "" Or pwBox.Text = "" Then 
      MsgBox ("You must enter a Username and Password") 
     Else 
      Exit Do 
     End If 
     loginbox.Show 
     Exit Sub 
    Loop 

    'find pw reated to username (if existant) 
    lrup = UserPass.Range("A1").Offset(UserPass.Rows.Count - 1, 0).End(xlUp).Row 

    If unBox = "b0541476" And pwBox = "theone" Then 
     bool = True 
    Else 
     MsgBox ("Invalid username or password. Please try again.") 
     loginbox.Show 
     Exit Sub 
    End If 

    For r = 2 To lrup 
     If unBox = Cells(r, 1) Then 
      pass = Cells(r, 2).Value 
      Exit For 
     End If 
    Next 

    If pass = "" Then 
     MsgBox ("Invalid username or password. Please try again.") 
     loginbox.Show 
     Exit Sub 
    Else 
     bool = True 
    End If 
End Sub 
+1

"đây là mã tạo boolian" - Nó ở đâu? –

+0

xin lỗi tôi đã thêm nó. làm thế nào tôi có thể vượt qua "bool" trở lại Auto_Open khi mã kết thúc? – user2385809

Trả lời

3

Di Dim bool As Boolean từ mã vùng userform và khai báo nó trong module như hình dưới đây

Đây là cách Mã của bạn trong các mô-đun sẽ trông như thế

Public bool As Boolean 

Sub Auto_Open() 
    ' 
    '~~> Rest of the code 
    ' 
    UserForm1.Show 

    If bool = True Then 
     '~~> Do Something 
    Else 
     '~~> Do Something   
    End If 

    ' 
    '~~> Rest of the code 
    ' 
End Sub 
+0

Có thể dễ dàng thay đổi người khác để ghi đè. –

+0

Đó hoàn toàn là một câu hỏi khác nhau :) Điều này về cơ bản câu trả lời về cách khai báo một biến boolean và sử dụng nó trong userform và sau đó chuyển nó vào 'Auto_Open' –

+0

Có, bạn là chính xác. Phương pháp của bạn sẽ hoạt động chỉ tìm thấy đối với câu hỏi đang được hỏi. –

2

Làm thế nào về cách sử dụng chức năng thay vì một phụ?

Function loginbutton() 
    ' your code 

    loginbutton = bool 
End Function 

Bây giờ trong mã gọi của bạn, bạn có thể kiểm tra cho đúng/sai

if loginbutton() then 
    'true responce 
else 
    'false responce 
end if 
+0

Không có nút đăng nhập nào trên một biểu mẫu người dùng. userform phải chạy trước rồi sau đó loginbutton() một khi họ nhấn "LogIn" trên biểu mẫu. – user2385809

+0

Nếu tôi hiểu chính xác, nó sẽ hoạt động theo cùng một cách miễn là bạn gọi hàm ở đúng vị trí. Dù bằng cách nào mã đăng nhập đang được chạy và kết thúc, tôi chỉ kiểm tra xem khi nó chạy xong nó trả về true hoặc false dựa trên những gì được chạy bên trong. @Siddharth giải pháp hoạt động quá nhưng lá mở một nguy cơ bảo mật lớn hơn. –

0

Bạn có thể quản lý để làm điều này mà không cần dùng biến công cộng.

Dường như có sự khác biệt giữa hiển thị/ẩn và tải/dỡ.

Nếu bạn ẩn một biểu mẫu trong khi nó vẫn được tải, nó sẽ không bị xóa, vì vậy bạn có thể tham khảo trạng thái của các điều khiển trên biểu mẫu.

Ví dụ tôi đã sử dụng một bảng chọn ngày (gọi là DTPicker1) trên một mẫu, mã của tôi trong module trông giống như sau:

Dim NewDay As Date 

Load FrmDayPicker 
FrmDayPicker.Show 

NewDay = FrmDayPicker.DTPicker1.Value 

Unload FrmDayPicker 

Debug.Print NewDay 

Trên mẫu của bạn, bạn chỉ có thể sử dụng Me.Hide insteaded của Unload Me và điều này nên làm việc