Page 1 of 1

password (VBA)

Posted: Thu Nov 02, 2017 11:30 am
by Benmore
ขอบสอบถามค่ะ ถ้าเมื่อกดปุ่มในหน้า Uniform_EGAS แล้วขึ้น Userform ให้กรอกรหัสต้องใส่โค้ดตรงไหนค่ะ
แล้วเมื่อเปิดไฟล์มาให้แสดงที่ชีท Uniform_EGAS แบบเต็มจอต้องเขียนโค้ดแบบไหนค่ะ
โค้ดด้านล่างถูกต้องไหมค่ะ Userform12 :ard:

Code: Select all

'Login
Private Sub CommandButton1_Click()
' On Error Resume Next
 If TextBox1 = "" Or TextBox2 = "" Then
        MsgBox "กรุณากรอกข้อมูลให้ครบถ้วน"
        Exit Sub
    End If
            If TextBox1.Text = Worksheets("Username").Range("A2").Value Then
            If TextBox2.Text = Worksheets("Username").Range("B2").Value Then
                passOK = True
                UserForm12.Hide
                TextBox1.Text = ""
                TextBox2.Text = ""
           Else
              MsgBox "รหัสผ่านไม่ถูกต้อง กรุณาพิมพ์ใหม่อีกครั้ง"
            End If
        End If
    If passOK = False Then
        MsgBox "รหัสผ่านไม่ถูกต้อง กรุณาพิมพ์ใหม่อีกครั้ง"
    End If
End Sub

Re: password (VBA)

Posted: Thu Nov 02, 2017 8:45 pm
by snasui
:D กรุณาลำดับสิ่งที่ต้องการทำมาใหม่ว่าต้องการจะทำอะไรครับ

การอ้างถึง UserForm ให้อ้างชื่อในภาพ ไม่ใช่ชื่อที่เขียนไว้ตรง Caption ครับ

Re: password (VBA)

Posted: Thu Nov 02, 2017 9:48 pm
by Benmore
ถ้าเมื่อกดปุ่มในหน้า Uniform_EGAS
11.png
11.png (112.26 KiB) Viewed 434 times
แล้วขึ้น Userform ให้กรอกรหัส
22.png
22.png (104.05 KiB) Viewed 434 times
แล้วถึงขึ้นหน้าฟอร์มปกติค่ะ
33.png
33.png (111 KiB) Viewed 434 times
แล้วต้องเขียนโค้ดแบบไหนให้เวลาเปิดไฟล์มาแล้วแสดงหน้า Uniform_EGAS แบบเต็มจอ ค่ะ

Re: password (VBA)

Posted: Thu Nov 02, 2017 10:13 pm
by snasui
:D UserForm ใน Excel ไม่เหมือนใน .Net ที่จะกำหนดหน้าต่างย่อขยายได้แบบง่าย ๆ ครับ

ตัวอย่างด้านล่างนี้เป็นการใช้ Windows API เข้ามาช่วย

ทำตามลำดับดังนี้

A. แทรก Module เข้ามาใหม่ เพื่อวาง Code Windows API ด้านล่าง

Code: Select all

Public Const SW_MAXIMIZED = 3
#If VBA7 Or Win64 Then
    Public Declare PtrSafe Function FindWindow Lib "user32" Alias _
    "FindWindowA" (ByVal lpClassName As String, ByVal _
    lpWindowName As String) As Long
    
    Public Declare PtrSafe Function ShowWindow Lib "user32" (ByVal _
    hwnd As Long, ByVal nCmdShow As Long) As Long
    
#Else
    public Declare  Function FindWindow Lib "user32" Alias _
    "FindWindowA" (ByVal lpClassName As String, ByVal _
    lpWindowName As String) As Long
    
    public Declare  Function ShowWindow Lib "user32" (ByVal _
    hwnd As Long, ByVal nCmdShow As Long) As Long
#End If
ฺB. ในขั้นตอนการเรียก UserForm ให้เขียน on error resume next เพื่อปิดการฟ้อง เช่นด้านล่าง

Code: Select all

Sub Button1_Click()
    'Sheet1.Activate
    On Error Resume Next
    UserForm1.Show
End Sub
C. ในตอน Initial ให้เพิ่ม Code ด้านล่าง

Code: Select all

Private Sub UserForm_Initialize()
    Call ClearData
    Sheet6.Activate
    'day
    comday.RowSource = "DATA!D2:D32"
    'month
    commonth.RowSource = "DATA!E2:E13"
    'year
    comyear.RowSource = "DATA!F2:F31"
    'description
    Combobox1.RowSource = "DATA!C2:C8"
    Call ShowMaximized
End Sub

Private Sub ShowMaximized()
    Call ShowWindow(FindWindow("ThunderDFrame", Me.Caption), SW_MAXIMIZED)
End Sub

Re: password (VBA)

Posted: Thu Nov 02, 2017 10:48 pm
by Benmore
แล้วโค้ดตรงส่วน password ต้องทำยังไงค่ะ
ตามหัวข้อตัวอย่างที่แนบไปก่อนหน้านี้ค่ะ

Re: password (VBA)

Posted: Thu Nov 02, 2017 10:50 pm
by snasui
:D อธิบายมาใหม่ ทบทวนสิ่งที่ผมถามไปในโพสต์ #2 แล้วตอบมาตามนั้นในเรื่องที่เกี่ยวกับ Password ครับ

Re: password (VBA)

Posted: Thu Nov 02, 2017 10:58 pm
by Benmore
ลองแก้โค้ดตามที่บอกแล้วค่ะ แต่คือ ที่อยากให้เต็มจอไม่ใช่ Userform แต่เป็น ชีท Uniform_EGAS ตอนเปิดไฟล์มาค่ะ

Re: password (VBA)

Posted: Thu Nov 02, 2017 11:05 pm
by Benmore
เช่น เมื่อกดปุ่มในหน้าการเบิกชุดยูนิฟอร์มในหน้า Uniform_EGAS
11.png
11.png (112.26 KiB) Viewed 416 times
ก็จะแสดง Userform12 เพื่อให้กรอกข้อมูล
22.png
22.png (104.05 KiB) Viewed 416 times
แล้วเมื่อกรอกข้อมูลถูกต้องเรียบร้อยก็จะแสดงที่หน้า Userform1
33.png
33.png (111 KiB) Viewed 416 times

โค้ด Userform12

Code: Select all

Private Sub CommandButton1_Click()
' On Error Resume Next
 If TextBox1 = "" Or TextBox2 = "" Then
        MsgBox "กรุณากรอกข้อมูลให้ครบ"
        Exit Sub
    End If
            If TextBox1.Text = Worksheets("Username").Range("A2").Value Then
            If TextBox2.Text = Worksheets("Username").Range("B2").Value Then
                passOK = True
                UserForm12.Hide
                TextBox1.Text = ""
                TextBox2.Text = ""
           Else
              MsgBox "รหัสผ่านไม่ถูกต้อง กรุณาพิมพ์ใหม่อักครั้ง", vbInformation, "แจ้งเตือน"
            End If
        End If
    If passOK = False Then
        MsgBox "รหัสผ่านไม่ถูกต้อง กรุณาพิมพ์ใหม่อักครั้ง", vbInformation, "แจ้งเตือน"
    End If
End Sub
Private Sub UserForm_Terminate()
    ThisWorkbook.Close
End Sub

Re: password (VBA)

Posted: Thu Nov 02, 2017 11:17 pm
by snasui
:D จะต้องเขียน Code ให้เรียก Userform12 เมื่อมีการคลิกแต่ละปุ่ม และเมื่อกรอกข้อมูล Username และ Password ถูกต้องก็จะเรียก UserForm ที่เกี่ยวข้องมาแสดง

สามารถกำหนดตัวแปรเพิ่มว่าปัจจุบันคลิกปุ่มใด และเมื่อคลิกปุ่มนั้นแล้วต้องการจะให้เรียก UserForm ใดหลังจากที่มีการกรอก Username และ Password ถูกต้องแล้ว

กำหนดตัวแปรเป็น Public CallForm as String ไว้ใน Module ใด ๆ และเมื่อคลิกปุ่มใด ๆ เช่นคลิกปุ่มแรกจะกำหนดตัวแปร CallForm เป็น CallForm = "UserForm1" เช่นนี้เป็นต้น

ในขั้นตอนของการกรอก Username และ Password ใน Userform12 จะเพิ่ม Code สำหรับการเรียก UserForm ที่จะใช้งานโดยพิจารณาตัวแปร CallForm ตัวอย่างเช่น

Code: Select all

select case callform
   case "UserForm1"
     Userform1.Show
  case "Userform2"
     UserForm2.Show
  '...   
end select

Re: password (VBA)

Posted: Thu Nov 02, 2017 11:20 pm
by Benmore
พอจะมีตัวอย่างโค้ดไหมค่ะ อ่านแล้วงงๆไม่ค่อยเข้าใจ :)

Re: password (VBA)

Posted: Thu Nov 02, 2017 11:22 pm
by snasui
:D ตัวอยา่งคือที่เขียนไปตามด้านบน หากยังไม่เข้าใจก็ให้ศึกษาเพิ่มเติมก่อนครับ

Re: password (VBA)

Posted: Fri Nov 03, 2017 1:05 pm
by Benmore
พอทำได้แล้วค่ะ ติดตรงที่ถ้ากดปิดแล้วให้ไฟล์นั้นปิดไปด้วยต้องแก้โค้ดตรงไหนค่ะ
แล้วเขียนโค้ดแบบไหนให้ไม่แสดงชีท จะแสดงก็ต่อเมื่อล็อคอินรหัสผ่านแล้วค่ะ

Code: Select all

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = 0 Then
        Cancel = True
       If MsgBox("ต้องการปิดไฟล์นี้ ใช่หรือไม่", vbYesNo) = vbYes Then
  End If
  End If
End Sub
:arrow: username admin
:arrow: pass 123
Uniform_EGAS(Ex).xlsm
(426.36 KiB) Downloaded 16 times

Re: password (VBA)

Posted: Fri Nov 03, 2017 7:50 pm
by snasui
:D กรณีต้องการซ่อน Sheet ทั้งหมดให้กำหนดตอนเปิดไฟล์ โดยเขียน Code ไว้ที่ ThisWorkbook เป็นด้านล่างครับ

Code: Select all

Private Sub Workbook_Open()
    ActiveWindow.DisplayWorkbookTabs = False
End Sub
กรณีต้องการปิด Form แล้วให้ปิดไฟล์ไปด้วยสามารถกำหนด Code ตามด้านล่างครับ

Code: Select all

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = 0 Then
        Cancel = True
        If MsgBox("คุณต้องการปิดไฟลนี้ ใช่หรือไม่", vbYesNo) = vbYes Then
            ActiveWindow.DisplayWorkbookTabs = True
            ThisWorkbook.Close True
        End If
    End If
End Sub

Re: password (VBA)

Posted: Mon Nov 06, 2017 1:23 pm
by Benmore
ถ้ากำนดให้เมื่อเปิดไฟล์มาแล้วให้แสดงหน้า EGAS_Uniform เลยแล้วเมื่อต้องการให้แสดงชีทที่ถูกซ่อนไปต้องใสโค้ดตรงไหนเพิ่มค่ะ

Re: password (VBA)

Posted: Mon Nov 06, 2017 9:33 pm
by snasui
:D ตัวอย่าง Code ครับ

Code: Select all

Private Sub Workbook_Open()
    ThisWorkbook.Worksheets("Uniform_EGAS").Activate
    ActiveWindow.DisplayWorkbookTabs = False
End Sub

Re: password (VBA)

Posted: Thu Nov 09, 2017 8:19 pm
by Benmore
snasui wrote::D ตัวอย่าง Code ครับ

Code: Select all

Private Sub Workbook_Open()
    ThisWorkbook.Worksheets("Uniform_EGAS").Activate
    ActiveWindow.DisplayWorkbookTabs = False
End Sub
ถ้าต้องการปิดแบบถามด้วยว่าบันทึกหรือไม่ต้องเพิ่มตรงไหนค่ะ

Re: password (VBA)

Posted: Thu Nov 09, 2017 8:22 pm
by snasui
:D เขียนคำถามมาใหม่ครับ อธิบายสิ่งที่เป็นปัญหา สิ่งที่ต้องการให้เป็น ระบุ Code ที่เขียนมาเองแล้วจะได้ตอบต่อมาจากนั้น

Re: password (VBA)

Posted: Thu Nov 09, 2017 8:31 pm
by Benmore
snasui wrote::D เขียนคำถามมาใหม่ครับ อธิบายสิ่งที่เป็นปัญหา สิ่งที่ต้องการให้เป็น ระบุ Code ที่เขียนมาเองแล้วจะได้ตอบต่อมาจากนั้น
ปัญหาตอนนี้คือ ถ้ากดปุ่มปิดที่ฟอร์ม 12 แล้วไฟล์ก็จะถูกปิดไปเลย โดยไม่ถามว่าต้องการบันทึก หรือไม่
แล้วถ้าต้องการให้ใส่ข้อมูลในฟอร์ม 12 ครั้งเดียว แล้วก็กดปุ่มอื่นๆได้โดยไม่ต้องกรอกข้อมูลต้องแก้ตรงไหนค่ะ

Code: Select all

Private Sub CommandButton1_Click()
On Error Resume Next
 If TextBox1 = "" Or TextBox2 = "" Then
        MsgBox "กรุณากรอกข้อมูลให้ครบถ้วน"
        Exit Sub
    End If
            If TextBox1.Text = Worksheets("Username").Range("A2").Value Then
            If TextBox2.Text = Worksheets("Username").Range("B2").Value Then
                passOK = True
                UserForm12.Hide
                TextBox1.Text = ""
                TextBox2.Text = ""
           Else
              MsgBox "รหัสผ่านไม่ถูกต้อง กรุณาพิมพ์ใหม่อีกครั้ง", vbInformation, "แจ้งเตือน"
            End If
        End If
    If passOK = False Then
        MsgBox "รหัสผ่านไม่ถูกต้อง กรุณาพิมพ์ใหม่อีกครั้ง", vbInformation, "แจ้งเตือน"
    End If
    Select Case CallForm
   Case "UserForm1"
     UserForm1.Show
  Case "Userform2"
     UserForm2.Show
     Case "UserForm3"
     UserForm3.Show
     Case "UserForm5"
     UserForm5.Show
     Case "UserForm6"
     UserForm6.Show
     Case "UserForm7"
     UserForm7.Show
     Case "UserForm8"
     UserForm8.Show
     Case "UserForm9"
     UserForm9.Show
     Case "UserForm11"
     UserForm11.Show
     Case "UserForm12"
     UserForm12.Show
     End Select
End Sub
Private Sub UserForm_Terminate()
    ThisWorkbook.Close
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = 0 Then
        Cancel = True
        If MsgBox("คุณต้องการปิดไฟล์นี้ ใช่หรือไม่", vbYesNo) = vbYes Then
            ActiveWindow.DisplayWorkbookTabs = True
            ThisWorkbook.Close True
        End If
    End If
End Sub


Re: password (VBA)

Posted: Thu Nov 09, 2017 8:47 pm
by snasui
Benmore wrote:แล้วถ้าต้องการให้ใส่ข้อมูลในฟอร์ม 12 ครั้งเดียว แล้วก็กดปุ่มอื่นๆได้โดยไม่ต้องกรอกข้อมูลต้องแก้ตรงไหนค่ะ
:D ให้สร้างตัวแปรมารับว่าได้กรอกข้อมูลถูกต้องแล้ว อาจจะเช่น

public pwdCorrect as boolean

และเมื่อกรอกข้อมูลถูกต้องแล้วให้กำหนดpwdCorrect = True ในการกดปุ่มอื่นก็ให้มาเช็คว่า pwdCorrect เป็น True แล้วใช่หรือไม่ หากใช่ก็ไม่ต้องเปิด Form ให้กรอก Username และ Password อีก เช่นนี้เป็นต้นครับ
Benmore wrote:ปัญหาตอนนี้คือ ถ้ากดปุ่มปิดที่ฟอร์ม 12 แล้วไฟล์ก็จะถูกปิดไปเลย โดยไม่ถามว่าต้องการบันทึก หรือไม่
Code ที่เขียนไว้มี Save ไฟล์อยู่แล้ว ช่วยอธิบายคำว่าบันทึกว่าทำงานอย่างไร จะได้เข้าใจตรงกันครับ

Re: password (VBA)

Posted: Sun Nov 12, 2017 9:54 am
by Benmore
ตรงนี้ได้แล้ว ขอบตุณค่ะ