chào các bạn!! Mình có vần đề như sau:
Khi mở file lên thì hiện lên 1 bảng (userForm) có 3 phần:
1 là username: chính là tên của máy tính
2 là Password 1: chính là số seri của máy tính
3 là Password 2: chính là số HDD của máy tính
khi điền đúng đủ 3 phần trên thì mở file, nếu 1 trong 3 phần trên sai thì close file.....
mình có file lấy số seri ở file đính kèm...
Nhờ các bạn giúp mình. Thanks nhiều...^^
Nói chung là bạn chỉ cần cái này (đặt trong module của Thisworkbook):
Mã:
Option Explicit
Private Sub Workbook_Open()
Dim SeriesNumber As String, HDD As String
SeriesNumber = "202020202020202020202020563534484b463651"
HDD = "2073004635"
If doc_ma_dia <> SeriesNumber Or Readserienumber <> HDD Then
If Application.Workbooks.Count = 1 Then
Application.Quit
Else
ThisWorkbook.Close False
End If
End If
End Sub
Khi chạy cái này, nhằm hạn chế tối đa các vấn đề không cho chạy macro, bạn nên ẩn sheet (veryhidden), chỉ chừa 1 sheet Menu hay giới thiệu gì đó thôi. Đồng thời phải protect structure của workbook thì sẽ hạn chế bị xem file.
Giả sử rằng VBA đã được khóa và không xem gì được trong code (thực ra thì những cao thủ ai cũng thể xem được cho dù nó có Unviewable), thì code của em được hiểu như sau:
1) Dùng code lấy Series và HDD chạy trên máy của chính em sử dụng
2) Copy 2 cái series đó vào trong code
3) Chạy thủ tục kiểm tra trên máy, tức là chạy cái code để lấy Series và HDD, nếu số đó trùng với số trong code thì cho mở máy, không thì thoát.
Đương nhiên máy của em thì mở vô tư vì điều kiện đúng. Qua máy khác không sử dụng được vì khó có thể có số trùng đến 2 hoặc 3 series. Thế thôi.
Bởi nếu viết như bạn thì chắc chắn 200% là đk của IF thỏa. Vậy thì bầy trò
Mã:
Dim SeriesNumber As String, HDD As String
SeriesNumber = "202020202020202020202020563534484b463651"
HDD = "2073004635"
IF ...
Cái file của bạn nên là như vầy mới gọi là tương đối chính xác:
Tại sheet của bạn có các số serri trên máy của bạn, đương nhiên vì do bạn tạo.
Tôi sẽ ẩn sheet này và thêm vào một sheet Menu nào đó. Nếu bạn đã mở được file thì bấm vô nút Hiện sheet đó lên.
Trong form, tôi sẽ lấy điều kiện đúng khi tham khảo các dữ liệu trong bảng series trong sheet của bạn.
Trên form đó thôi thể hiện 2 nút, 1 nút lấy dữ liệu từ máy tính của người đang sử dụng, sau khi lấy dữ liệu thì bấm nút Xác nhận, nếu đúng 3 số trong bảng thì hiện sheet, không thì thôi.
Nếu ai đó cố tình Ctrl+Break, thì tôi đã có câu lệnh chặn nó lại. Nếu ai đó Disable Macro thì vào file cũng không thể xem được sheet vì tôi đã khóa workbook. Còn nếu họ mở được khóa WorkBook thì có khả năng họ mở được VBA, nên cũng không làm khó được người này.
Giả sử rằng VBA đã được khóa và không xem gì được trong code (thực ra thì những cao thủ ai cũng thể xem được cho dù nó có Unviewable), thì code của em được hiểu như sau:
Em lấy một ví dụ, Nếu file em cho ẩn các sheet tác vụ, nếu các sheet tác vụ đó được chạy bởi một Menu tự tạo và nếu ai đó không cho chạy macro thì làm sao biết được trong trái ổi có bao nhiêu hạt được ạ?
Khi thỏa điều kiện, thì các thủ tục chạy Menu mới tạo ra, các nút lệnh mới hoạt động được. Còn không chỉ thấy cái sheet LINH TINH nằm chình ình ở ngoài chẳng làm gì được cái file cả và cũng chẳng mở được sheet nào cả!
"toàn bộ không thỏa điều kiện", tức đk = FALSE khi và chỉ khi CẢ HAI điều kiện đều không thỏa, tức khi và chỉ khi đk1 = FALSE VÀ đk2 = FALSE
---------------
Nhưng nếu ÍT NHẤT 1 điều kiện THỎA thì "toàn bộ THỎA điều kiện" (tôi dùng ngôn từ của bạn)
Do vậy nếu 1 đk thỏa vd. doc_ma_dia <> SeriesNumber = TRUE thì rõ ràng đk của IF = TRUE
Do tôi tưởng các số được nhập bất di bất dịch nên tôi nói là chắc chắn đk sẽ thỏa (thậm chí cả 2 sẽ thỏa chứ không chỉ một) và do vậy code
Mã:
Private Sub Workbook_Open()
Dim SeriesNumber As String, HDD As String
SeriesNumber = "202020202020202020202020563534484b463651"
HDD = "2073004635"
If doc_ma_dia <> SeriesNumber Or Readserienumber <> HDD Then
If Application.Workbooks.Count = 1 Then
Application.Quit
Else
ThisWorkbook.Close False
End If
End If
End Sub
LUÔN được thực hiện, và do vậy có thể rút gọn thành code của tôi cho khỏi tốn điện nước
"toàn bộ không thỏa điều kiện", tức đk = FALSE khi và chỉ khi CẢ HAI điều kiện đều không thỏa, tức khi và chỉ khi đk1 = FALSE VÀ đk2 = FALSE
---------------
Nhưng nếu ÍT NHẤT 1 điều kiện THỎA thì "toàn bộ THỎA điều kiện" (tôi dùng ngôn từ của bạn)
Do vậy nếu 1 đk thỏa vd. doc_ma_dia <> SeriesNumber = TRUE thì rõ ràng đk của IF = TRUE
Do tôi tưởng các số được nhập bất di bất dịch nên tôi nói là chắc chắn đk sẽ thỏa (thậm chí cả 2 sẽ thỏa chứ không chỉ một) và do vậy code
Mã:
Private Sub Workbook_Open()
Dim SeriesNumber As String, HDD As String
SeriesNumber = "202020202020202020202020563534484b463651"
HDD = "2073004635"
If [COLOR=#0000cd][B]doc_ma_dia[/B][/COLOR] [COLOR=#ff0000][B]<>[/B][/COLOR] SeriesNumber [COLOR=#ff0000][B]Or [/B][/COLOR][B][COLOR=#0000cd]Readserienumber [/COLOR][COLOR=#ff0000]<>[/COLOR][/B] HDD Then
If Application.Workbooks.Count = 1 Then
Application.Quit
Else
ThisWorkbook.Close False
End If
End If
End Sub
LUÔN được thực hiện, và do vậy có thể rút gọn thành code của tôi cho khỏi tốn điện nước
Em vẫn không hiểu ý của Thầy, có phải Thầy đang thắc mắc dùng OR và dùng AND? Điều kiện mà em đặt ra là: Nếu chỉ cần 1 điều kiện KHÁC thôi (trong tổng số điều kiện) thì file đó bị THOÁT.(OR)
Em đã mở được file của Anh Nghĩa, Cũng chỉ để tìm cách ngăn một số người hay táy máy nghịch file thôi. Em đang áp dụng để bảo vệ cho bảng tính Lương của Công ty thôi. Em xin hỏi ngoài lề một chút là. Pass Unprotect Workbook của anh là HoangTrongNghia. Sau khi Unprotect sau lưu lại file, đóng File lại, mở file lại vẫn còn pass Protect Workbook. Thủ tục Mặc định đặt lại Pass protect Workbook anh đặt ở dòng Code nào vậy hay thuộc tính gì vậy?
Em đã mở được file của Anh Nghĩa, Cũng chỉ để tìm cách ngăn một số người hay táy máy nghịch file thôi. Em đang áp dụng để bảo vệ cho bảng tính Lương của Công ty thôi. Em xin hỏi ngoài lề một chút là. Pass Unprotect Workbook của anh là HoangTrongNghia. Sau khi Unprotect sau lưu lại file, đóng File lại, mở file lại vẫn còn pass Protect Workbook. Thủ tục Mặc định đặt lại Pass protect Workbook anh đặt ở chỗ nào vậy?
Cái file của bạn nên là như vầy mới gọi là tương đối chính xác:
Tại sheet của bạn có các số serri trên máy của bạn, đương nhiên vì do bạn tạo.
Tôi sẽ ẩn sheet này và thêm vào một sheet Menu nào đó. Nếu bạn đã mở được file thì bấm vô nút Hiện sheet đó lên.
Trong form, tôi sẽ lấy điều kiện đúng khi tham khảo các dữ liệu trong bảng series trong sheet của bạn.
Trên form đó thôi thể hiện 2 nút, 1 nút lấy dữ liệu từ máy tính của người đang sử dụng, sau khi lấy dữ liệu thì bấm nút Xác nhận, nếu đúng 3 số trong bảng thì hiện sheet, không thì thôi.
Nếu ai đó cố tình Ctrl+Break, thì tôi đã có câu lệnh chặn nó lại. Nếu ai đó Disable Macro thì vào file cũng không thể xem được sheet vì tôi đã khóa workbook. Còn nếu họ mở được khóa WorkBook thì có khả năng họ mở được VBA, nên cũng không làm khó được người này.
Góp ý tý xíu: Bạn nên cho cái Form đăng nhập luôn nổi trên mà hình cho đến khi Unload, vì khi file được mở bạn cho Excel "biến" rồi, nếu ta đang mở nhiều cửa sổ chương trình và vô tình bấm ra ngoài Form thì "lạc" mất Form.
Tôi không hiểu ý bạn là gì. Nếu máy bạn đăng nhập thì không cần phải kiểm tra hoặc kiểm tra chỉ lần đầu, còn máy khác thì kiểm tra? Chi cho mất công vậy? Nếu vậy thì làm luôn cái mà tôi đề nghị đầu tiên cho rồi (Workbook_Open), khỏi phải "fơm fiếc" gì cho mệt.
Góp ý tý xíu: Bạn nên cho cái Form đăng nhập luôn nổi trên mà hình cho đến khi Unload, vì khi file được mở bạn cho Excel "biến" rồi, nếu ta đang mở nhiều cửa sổ chương trình và vô tình bấm ra ngoài Form thì "lạc" mất Form.
Anh an tâm đi, khi form này load lên, tất cả các cửa sổ của excel biến mất hết, chẳng có cái nào còn đâu mà lo. Ta đang làm gì đó thì ta tự biết, nếu lạc thì kiếm thôi kakaka
Anh an tâm đi, khi form này load lên, tất cả các cửa sổ của excel biến mất hết, chẳng có cái nào còn đâu mà lo. Ta đang làm gì đó thì ta tự biết, nếu lạc thì kiếm thôi kakaka
Ai nói cửa sổ Excel, giả sử mình đang mở nhiều cửa sổ khác như Internet, word, pdf ... Đã có Pass thì phải chuyên nghiệp một tí để xứng tầm với sự bảo mật đó chớ. he he
Ai nói cửa sổ Excel, giả sử mình đang mở nhiều cửa sổ khác như Internet, word, pdf ... Đã có Pass thì phải chuyên nghiệp một tí để xứng tầm với sự bảo mật đó chớ. he he
Muốn bao nhiêu cửa sổ thì bao! Thêm vào 2 dòng đỏ trong ThisWorkbook cái sự kiện này là được!
Mã:
Private Sub Workbook_Open()
[COLOR=#ff0000] CreateObject("Shell.Application").MinimizeAll
Application.Wait Now + TimeValue("00:00:01")[/COLOR]
frmPass.Show
End Sub
Muốn bao nhiêu cửa sổ thì bao! Thêm vào 2 dòng đỏ trong ThisWorkbook cái sự kiện này là được!
Mã:
Private Sub Workbook_Open()
[COLOR=#ff0000] CreateObject("Shell.Application").MinimizeAll
Application.Wait Now + TimeValue("00:00:01")[/COLOR]
frmPass.Show
End Sub
Không ăn thua bạn ơi! vẫn bị chìm Form khi bấm qua cửa sổ khác.
Thử dùng em này nhé:
Thêm code vào đầu Module:
Mã:
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, _
ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Public Sub SetTopmostWindow(ByVal hwnd As Long, Optional topmost As Boolean = True)
SetWindowPos hwnd, IIf(topmost, -1, -2), 0, 0, 0, 0, 3
End Sub
Public Function TimeVn(t As String) As String Dim i As Integer
Dim l As String
Dim r As String
i = InStr(1, t, ":")
l = Left(t, i - 1)
r = Mid(t, i)
i = CInt(l)
j = (i + 7) Mod 24
If i < j Then
TimeVn = CStr(j) & r
Else
TimeVn = CStr(j) & r & "+"
End If
End Function
Public Function TimeVn1(d As Date) As String
Dim t As String
Dim i As Integer
Dim l As String
Dim r As String
t = Format(d, "hh:mm:ss")
i = InStr(1, t, ":")
l = Left(t, i - 1)
r = Mid(t, i)
i = CInt(l)
j = (i + 7) Mod 24
If i < j Then
TimeVn1 = CStr(j) & r
Else
TimeVn1 = CStr(j) & r & "+"
End If
End Function
Sub GetBoardSerial()
Set WMI = GetObject("winmgmts:\\.\root\cimv2")
Set objs = WMI.ExecQuery("Select * from Win32_BaseBoard")
For Each obj In objs
Sheet1.[B1].Value = obj.SerialNumber
Next
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor")
For Each objItem In colItems
Sheet1.[B2].Value = objItem.ProcessorId
Next
Dim fso As Object, Drv As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set Drv = fso.GetDrive(Environ("SystemDrive"))
With Drv
If .IsReady Then
DriveSerial = Abs(.SerialNumber)
Else
DriveSerial = -1
End If
End With
Set Drv = Nothing
Set fso = Nothing
Sheet1.[B3].Value = DriveSerial
End Sub
Có thể chèn đoạn code nào để thêm một ô B4 chưa thời gian tại thời điểm bấm để lấy số seri của máy không vậy các bạn?
Mình muốn sau 1 ngày, thì giá trị trong ô B1-2-3 không còn giá trị nữa, mà phải bấm nút lấy lại seri lần nữa (mục đích là lấy lại thời gian ở ô B4).
Tks.
Nói chung là bạn chỉ cần cái này (đặt trong module của Thisworkbook):
Mã:
Option Explicit
Private Sub Workbook_Open()
Dim SeriesNumber As String, HDD As String
SeriesNumber = "202020202020202020202020563534484b463651"
HDD = "2073004635"
If doc_ma_dia <> SeriesNumber Or Readserienumber <> HDD Then
If Application.Workbooks.Count = 1 Then
Application.Quit
Else
ThisWorkbook.Close False
End If
End If
End Sub
Các anh cho em hỏi. Nếu muốn bổ sung để cho 2 máy chạy được - thêm SeriesNumber = " mã đĩa 2" và HDD = "mã ổ cứng 2". Thì sửa thế nào ạ
Em sửa code như sau thì chạy được nhưng có thông báo lỗi:
Anh chị chỉ giúp em với ạ.
Mã:
Private Sub Workbook_Open()
Dim madia As String, mamay As String
Dim Arrdia
Dim Arrmay
Arrdia = Array("S3PGE65Q","S314J90H241608")
Arrmay = Array("BFEBFBFF00040651","BFEBFBFF000406E3")
For Each madia in Arrdia
For Each mamay in Arrmay
If doc_ma_dia <> madia Or doc_ma_may <> mamay Then
If Application.Workbooks.Count = 1 Then
Application.Quit
Else
ThisWorkbook.Close False
End If
End If
Next
Next
End Sub