Tạo password bằng số seri của máy (1 người xem)

  • Thread starter Thread starter nad582
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

nad582

Thành viên thường trực
Tham gia
7/6/11
Bài viết
317
Được thích
48
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...^^
 
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...

Hoặc bạn hỏi mà không suy nghĩ hoặc tôi không hiểu được ý tưởng tuyệt vời của bạn. Rất có thể là cái thứ hai vì già rồi mà.
Tôi chỉ có vài câu hỏi:

1. Tôi là người dùng tập tin của bạn. Bạn bắt tôi phải nhập 3 thông tin trên?
UserName thì do tôi hồi xa xưa tự đặt nên chắc chắn tôi biết. 2 thông tin tiếp theo bạn dùng code gọi hàm của system để đọc ra. Còn tôi là người dùng bình thường thì tôi đọc từ đâu ra để thỏa mãn bạn?

2. Nếu tôi rất muốn chiều bạn nhưng sức có hạn nên không cung cấp được thông tin và bực mình tôi disable macro thì công lao bạn bỏ ra để rào chắn đổ xuống sông xuống biển à?

3. Nếu sức có hạn nên tôi google hoặc sực nhớ là có sư phụ ndu trên GPE đã từng tặng code để đọc các thông số trên thì sao? Thì tôi tạo tập tin đọc các thông số ra rồi điền vào cái UserForm của bạn thì công lao của bạn là công cốc à?

Hay vẫn còn có gì đó trong ý tưởng của bạn mà tôi không hiểu?
 
Upvote 0
Có thể bạn nad582 này mới làm quen và lẫn giữa 2 khái niệm "bảo mật" và "bảo vệ bản quyền".

Tôi cho ý tưởng của nad có thể là: Các thông tin số seri, số HDD của máy tính đã lưu trong Code.
Khi chạy, Code đọc lại các thông tin đó và so sánh với giá trị đã lưu trong Code. Nếu đúng thì chạy tiếp.

Như vậy, chép file sang máy khác thì không chạy (bản quyền: không cho sao chép) mà end.

 
Upvote 0
Có thể bạn nad582 này mới làm quen và lẫn giữa 2 khái niệm "bảo mật" và "bảo vệ bản quyền".

Tôi cho ý tưởng của nad có thể là: Các thông tin số seri, số HDD của máy tính đã lưu trong Code.
Khi chạy, Code đọc lại các thông tin đó và so sánh với giá trị đã lưu trong Code. Nếu đúng thì chạy tiếp.

Như vậy, chép file sang máy khác thì không chạy (bản quyền: không cho sao chép) mà end.

cảm ơn các bạn đã có ý!! Ý tưởng của mình là kết hợp giữa bảo mật và bản quyền!!
Có nghĩa là bạn muốn sử dụng file của mình thì phải nhập mật khẩu thì mới sử dụng được không thì thoát (mật khẩu thì chính là các thông số như tên máy, số seri và số HDD của máy bạn) mình đã mô tả từ đầu rồi.
Mong các bạn giúp đỡ!!!!cảm ơn....
 
Upvote 0
Hồi lúc mới học VBA, vài ba cái code mà mới đầu tôi học lỏm được, tôi tưởng tôi "vĩ đại" lắm nên bằng mọi cách tôi khóa code, protect tùm lum hết, giờ xem lại mấy cái file đó tôi thấy tức cười quá chừng! Vả lại chẳng bảo mật được gì nếu gặp cao thủ, còn gặp người kém cỏi thì nếu xem code cũng chẳng biết gì! Bây giờ tôi cũng khóa sheet, cũng bảo vệ VBA, nhưng chỉ hạn chế người không biết gì có tật táy máy tay chân, lỡ dại mà xóa vài đoạn code nào đó thì cái công viết, cũng như tiện ích do nó tạo ra coi như "tèo téo teo" luôn.

Quay lại với chủ topic và những người thích "làm khó" người dùng, nên đặt password do chính mình đặt ra, nó còn khó tìm hơn cả cái series số lưu trong máy, và cái series đó dài dằng dặt khó nhớ muốn chết luôn!
 
Upvote 0
Quay lại với chủ topic và những người thích "làm khó" người dùng, nên đặt password do chính mình đặt ra, nó còn khó tìm hơn cả cái series số lưu trong máy, và cái series đó dài dằng dặt khó nhớ muốn chết luôn!
Mình hiểu ý của b!! do tính chất mình vừa muốn cho người khác sử dụng và không cho copy qua máy khác nên mình mong các bạn giúp đỡ....
 
Upvote 0
Có nghĩa là bạn muốn sử dụng file của mình thì phải nhập mật khẩu thì mới sử dụng được không thì thoát (mật khẩu thì chính là các thông số như tên máy, số seri và số HDD của máy bạn) mình đã mô tả từ đầu rồi.

Mật khẩu là chính thông số của máy thì có cũng như không (siwton đã nói ở trên đó).
Nên nếu bạn ưa chọn ý tưởng của tôi trong bài 3 thì nên có các bước sau (để tiện tôi chỉ lấy 1 thông số là tên máy)
- Trên file cần bảo vệ bản quyền, bạn có 1 biến nhớ tên máy (tên là TM). Đại khái là
Dim TM as String
TM = "XXXX"
(XXXX là tên máy của bạn, biết nhờ những mã lệnh bạn đã có đó)

Có lệnh đọc tên máy vào biến TAM và lệnh
IF TAM <> TM then (lệnh đóng Excel)

Cũng có 1 Sub hiện Tên máy (Sub HienTenMay)

- Bảo vệ không cho đọc Code của bạn. Hãy nhớ mật khẩu.

- Khi sao chép cho ai file này xong, bạn mở file, chạy Sub HienTenMay, sửa XXXX ở Code TM = "XXXX" theo tên máy mới

- Đóng file và thử mở lại. Chắc là sẽ chạy bình thường. Nếu ai đó chép sang máy khác, vì họ không có mật khẩu đọc Code nên không sửa được XXXX theo máy mới nên có chép cũng không chạy. Vậy là bạn bảo vệ được "bản quyền" nếu ai đó không phá được mật khẩu đọc Code của file (họ vẫn mở được file nếu ấn phím Shift - tôi không nhớ rõ - khi mở file, disable macro - như siwton đã nói - rồi mở tiếp Code của bạn)

Tôi định gửi 1 file demo, trong đó dùng sự kiện khi đóng file sẽ ẩn mọi Sheet, trừ 1 Sheet vớ vẩn. Nếu disable macro thì chỉ hiện sheet vớ vẩn đó. Còn không thì Code chạy và tùy: nếu đúng máy thì hiện các sheet dữ liệu (dùng sự kiện Open), sai thì thoát Excel. Nhưng bận quá.

Gửi rồi đọc lại thấy anh Nghĩa nói đúng đó. Tất nhiên bạn cứ tự thử thách chính mình
 
Lần chỉnh sửa cuối:
Upvote 0
Mình hiểu ý của b!! do tính chất mình vừa muốn cho người khác sử dụng và không cho copy qua máy khác nên mình mong các bạn giúp đỡ....

Để xem, tôi hiểu ý bạn như thế nào nhé.

Khi người dùng gõ sơ-ri vào thì sơ-ri đó phải khớp với sơ-ri trong code, đồng thời phải trùng với sơ-ri của máy tính thì mới chạy được chương trình của bạn phải không?

Sao bài này giống với bài của bạn Bảy Dzõ vậy ta? Hiểu sơ bộ là như vậy, nhưng tôi thì không phải dân hacker nên không can thiệp vào cái sơ-ri đăng ký của máy tính.
 
Upvote 0
Mật khẩu là chính thông số của máy thì có cũng như không (siwton đã nói ở trên đó).
Nên nếu bạn ưa chọn ý tưởng của tôi trong bài 3 thì nên có các bước sau (để tiện tôi chỉ lấy 1 thông số là tên máy)
- Trên file cần bảo vệ bản quyền, bạn có 1 biến nhớ tên máy (tên là TM). Đại khái là
Dim TM as String
TM = "XXXX"
(XXXX là tên máy của bạn, biết nhờ những mã lệnh bạn đã có đó)

Có lệnh đọc tên máy vào biến TAM và lệnh
IF TAM <> TM then (lệnh đóng Excel)

Cũng có 1 Sub hiện Tên máy (Sub HienTenMay)

- Bảo vệ không cho đọc Code của bạn. Hãy nhớ mật khẩu.

- Khi sao chép cho ai file này xong, bạn mở file, chạy Sub HienTenMay, sửa XXXX ở Code TM = "XXXX" theo tên máy mới

- Đóng file và thử mở lại. Chắc là sẽ chạy bình thường. Nếu ai đó chép sang máy khác, vì họ không có mật khẩu đọc Code nên không sửa được XXXX theo máy mới nên có chép cũng không chạy. Vậy là bạn bảo vệ được "bản quyền" nếu ai đó không phá được mật khẩu đọc Code của file (họ vẫn mở được file nếu ấn phím Shift - tôi không nhớ rõ - khi mở file, disable macro - như siwton đã nói - rồi mở tiếp Code của bạn)

Tôi định gửi 1 file demo, trong đó dùng sự kiện khi đóng file sẽ ẩn mọi Sheet, trừ 1 Sheet vớ vẩn. Nếu disable macro thì chỉ hiện sheet vớ vẩn đó. Còn không thì Code chạy và tùy: nếu đúng máy thì hiện các sheet dữ liệu (dùng sự kiện Open), sai thì thoát Excel. Nhưng bận quá.
b gửi mình tập tin đình kèm luôn đi!!
 
Upvote 0
Để xem, tôi hiểu ý bạn như thế nào nhé.

Khi người dùng gõ sơ-ri vào thì sơ-ri đó phải khớp với sơ-ri trong code, đồng thời phải trùng với sơ-ri của máy tính thì mới chạy được chương trình của bạn phải không?
Nói chung là tên tài khoản hoặc số seri thì ko cần phải nhớ b ak, tại có file lấy số seri mình để ở file đính kèm đó, chỉ copy và dán thôi...
 
Upvote 0
Nói chung là tên tài khoản hoặc số seri thì ko cần phải nhớ b ak, tại có file lấy số seri mình để ở file đính kèm đó, chỉ copy và dán thôi...

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.
 
Lần chỉnh sửa cuối:
Upvote 0
Làm gì thì làm nhưng chẳng có tính bảo mật nào đâu.
 
Upvote 0
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...^^

Tôi thì chẳng quan tâm mấy cái vụ bảo vệ bản quyền gì đó...
Cứ cho là làm được đi... Vấn đề quan trong mà tôi đang thắc mắc là:
- Chương trình của bạn hoành tráng đến cở nào mà phải bảo vệ bản quyền?
- Nếu bạn có đủ khả năng tạo ra 1 chương trình hoành tráng thì sao lại không làm được cái vụ bản quyền này?
- Nếu chương trình của bạn chỉ thuộc loại "tầm thường" thì bản quyền để làm cóc khô gì?

Vân vân và vân vân... nhiều cái nghịch lý quá
(xem xong 2 file của bạn thì tôi chẳng thấy có cái gì gọi là "hoành tá tràng" trong đó cả)
 
Upvote 0
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
View attachment 101576 có thể đăng nhập như vầy được không bạn...(nếu dùng cách b thì người dùng phải vào Visual Basis nhưng mình ko muốn người dùng thấy code)...
username: chính là tên của máy tính
Password 1: chính là số seri của máy tính
Password 2: chính là số HDD của máy tính
^^
 
Upvote 0
có thể đăng nhập như vầy được không bạn...(nếu dùng cách b thì người dùng phải vào Visual Basis nhưng mình ko muốn người dùng thấy code)...

Thật ra dãy số không quan trọng, mà quan trọng là nó đối chiếu với số của mấy có đúng không thôi. Dù cho nó có những dãy số đó, nhưng trong máy của người đó không có thì cũng không xài được.

Tôi không hiểu người dùng thấy code là thấy thế nào? Bạn thử với nó chưa? Nếu không đúng thì nó tự thoát rồi chứ có đâu mà mở được file???
 
Lần chỉnh sửa cuối:
Upvote 0
Cứ cho là làm được đi... Vấn đề quan trong mà tôi đang thắc mắc là:
- Chương trình của bạn hoành tráng đến cở nào mà phải bảo vệ bản quyền?
- Nếu bạn có đủ khả năng tạo ra 1 chương trình hoành tráng thì sao lại không làm được cái vụ bản quyền này?
- Nếu chương trình của bạn chỉ thuộc loại "tầm thường" thì bản quyền để làm cóc khô gì?

Vân vân và vân vân... nhiều cái nghịch lý quá
(xem xong 2 file của bạn thì tôi chẳng thấy có cái gì gọi là "hoành tá tràng" trong đó cả)
Nói thật thì cũng chỉ là file tính bình thường thôi b ak...
chỉ qua mình muốn tìm hiểu về cách đặt pass mới cho mình, mình biết chắc những người giỏi (như các bạn trong GPE) sẽ mở được pass và bẻ khóa được bản quyền nên ko thể che giấu được. Vì vậy mình mới nhờ các bạn giúp dỡ...
Tóm lại mình chỉ muốn học hỏi thêm nhiều cách thôi....
cảm ơn tất cả các bạn...
 
Upvote 0
Thật ra dãy số không quan trọng, mà quan trọng là nó đối chiếu với số của mấy có đúng không thôi. Dù cho nó có những dãy số đó, nhưng trong máy của người đó không có thì cũng không xài được.

Tôi không hiểu người dùng thấy code là thấy thế nào? Bạn thử với nó chưa? Nếu không đúng thì nó tự thoát rồi chứ có đâu mà mở được file???
Cảm ơn các bạn nhiệt tình giúp đỡ, mình tìm hiểu ra rồi ^.^
 
Upvote 0
Cảm ơn các bạn nhiệt tình giúp đỡ, mình tìm hiểu ra rồi ^.^

Bạn thấy code ổn? Tôi và mọi người đã nói rồi: nếu người dùng disable macro thì công lao của bạn đổ xuống sông xuống biển. Mà chuyện disable macro là cái dễ. Nếu ai đã học 1 khóa về Excel thì chắc chắn sẽ biết. Những người chưa học khóa nào thì họ có thể hỏi đồng nghiệp, bạn bè. Đảm bảo sẽ có ít nhất 1 người trong số họ biết.
Vậy thì nhọc công làm gì?
 
Upvote 0
Cảm ơn các bạn nhiệt tình giúp đỡ, mình tìm hiểu ra rồi ^.^

Thà bạn làm như tôi đã hướng dẫn, tức là bạn chép sẳn 3 dữ liệu của máy bạn vào code, sau đó lưu lại. Nếu đúng là máy của bạn, khi mở file nó chạy thủ tục để lấy 3 dữ liệu đó, sau đó so sánh với 3 dữ liệu có sẳn trong code (số này là số chỉ có ở máy bạn), nếu trùng hết chỉ có thể là máy của bạn, còn không thì nó tự thoát.

Với cái form của bạn, bạn bắt người ta nhớ các thông số đó, nhưng nhớ rồi cũng bị thoát vì không đúng máy. Nếu ngồi đúng máy thì cũng quá nhức đầu cho việc phải nhập các số trên textbox.

Cũng nói thêm, ngoài việc ta không cho chạy macro thì còn thêm 1 cách nữa là bấm tổ hợp phím Ctrl+Break cũng làm cho thoát form mà không ảnh hưởng đến việc thoát file hay là không.
 
Upvote 0
Cảm ơn các bạn nhiệt tình giúp đỡ, mình tìm hiểu ra rồi ^.^

Nếu muốn bảo mật hay cái gì đó đại loại như vầy, thì mình khuyên bạn không nên dùng VBA, lý do:
Chỉ cần bạn nào biết tẹo về VBA, hay lên diễn đàn ---> clik vào xem những bài viết của anh Siwtom --> Đảm bảo sẽ tìm thấy một đoạn code có tên là " Đánh Tráo" hay " Trả lại " gì đó.......... ^^
Dù pass hay seri có là XXX gì đó thì cũng die hết, bạn ah:horse:
 
Lần chỉnh sửa cuối:
Upvote 0
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.

Tôi không hiểu được ý tưởng của bạn.
Nếu code là thế thì ngay cả bạn bạn cũng không thể xem được tập tin của mình vì chắc chắc là đk thỏa trên mọi máy, kể cả trên máy bạn.
Hay là ý bạn là thế này:
Nếu là người khác chạy file thì chắc chắn sẽ có Quit. Còn nếu bạn muốn dùng tập tin thì trước hết bạn bạn disable, sau đó vào và sửa lại code?

Nếu thế thì tôi có câu hỏi:

1. Bạn nghĩ ra cái disable macro và cho rằng người khác không biết disable macro?

2. Cứ cho là chỉ có bạn biết disable macro đi. Thay vì bỏ nhiều công ra để viết code "tuyệt chiêu" thì chỉ cần code đơn giản hơn:
Mã:
Private Sub Workbook_Open()
        If Application.Workbooks.Count = 1 Then
            Application.Quit
        Else
            ThisWorkbook.Close False
        End If
End Sub

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 ...

để làm gì cho tốn điện nước?
 
Upvote 0
Tôi không hiểu được ý tưởng của bạn.
Nếu code là thế thì ngay cả bạn bạn cũng không thể xem được tập tin của mình vì chắc chắc là đk thỏa trên mọi máy, kể cả trên máy bạn.
Hay là ý bạn là thế này:
Nếu là người khác chạy file thì chắc chắn sẽ có Quit. Còn nếu bạn muốn dùng tập tin thì trước hết bạn bạn disable, sau đó vào và sửa lại code?

Nếu thế thì tôi có câu hỏi:

1. Bạn nghĩ ra cái disable macro và cho rằng người khác không biết disable macro?

2. Cứ cho là chỉ có bạn biết disable macro đi. Thay vì bỏ nhiều công ra để viết code "tuyệt chiêu" thì chỉ cần code đơn giản hơn:
Mã:
Private Sub Workbook_Open()
        If Application.Workbooks.Count = 1 Then
            Application.Quit
        Else
            ThisWorkbook.Close False
        End If
End Sub

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 ...

để làm gì cho tốn điện nước?

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 ...

để làm gì cho tốn điện nước?

Làm sao mà thỏa được Thầy? Thử một điều kiện không trùng xem, nó có thỏa được hay không?
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn các bạn nhiệt tình giúp đỡ, mình tìm hiểu ra rồi ^.^

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.

Bạn xem file nhé!

Mọi Password đều là: HoangTrongNghia
 

File đính kèm

Upvote 0
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:

Ta không bàn tới Unviewable vì đây là vấn đề không phải ai cũng biết. Nhưng "disable macro" thì 50 người biết, còn 50 người kia đi hỏi bạn bè đồng nghiệp thì cũng biết nốt. Cần gì xem và sửa code khi mà "disable macro" thì code "tèo"?

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


Tôi lại tưởng là cái "202020202020202020202020563534484b463651" là lấy từ trên trời.

Làm sao mà thỏa được Thầy? Thử một điều kiện không trùng xem, nó có thỏa được hay không?

Một điều kiện không trùng hay một mã không trùng? Đk hoặc thỏa hoặc không thỏa chứ đk không trùng thì khái niệm thế nào? Còn nếu là một mã không trùng thì dĩ nhiên là đk thỏa chứ sao. Vì đk là "doc_ma_dia <> SeriesNumber OR Readserienumber <> HDD"

Do tôi tưởng số là bất di bất dịch
Mã:
SeriesNumber = "202020202020202020202020563534484b463651"
    HDD = "2073004635"

nên thậm chí tôi viết "chắc chắn 200% là đk của IF thỏa"
 
Upvote 0
Mã:
SeriesNumber = "202020202020202020202020563534484b463651"
    HDD = "2073004635"

nên thậm chí tôi viết "chắc chắn 200% là đk của IF thỏa"

Chắc Thầy nhầm gì đó, đây là 2 điều kiện dùng AND hoặc OR:

IF A = a AND B = b THEN

Hoặc:

IF A <> a OR B <> b THEN

Em dùng là trùng hay khớp hay thỏa gì đó mà.

Với OR được hiểu như sau, chỉ cần 1 điều kiện không thỏa là toàn bộ không thỏa điều kiện.

Ta không bàn tới Unviewable vì đây là vấn đề không phải ai cũng biết. Nhưng "disable macro" thì 50 người biết, còn 50 người kia đi hỏi bạn bè đồng nghiệp thì cũng biết nốt. Cần gì xem và sửa code khi mà "disable macro" thì code "tèo"?

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ả!
 
Lần chỉnh sửa cuối:
Upvote 0
Chắc Thầy nhầm gì đó,

Với OR được hiểu như sau, chỉ cần 1 điều kiện không thỏa là toàn bộ không thỏa điều kiện.

Bạn học ở đâu đấy?
đk = đk1 OR đk2

"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
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn học ở đâu đấy?
đk = đk1 OR đk2

"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)

HOẶC em sẽ đặt điều kiện là: Nếu tất cả các đều kiện đều BẰNG thì mới cho MỞ file. (AND)

như thế em đã làm đặt điều kiện đúng rồi chứ?

============================================

Do cách đặt tên hàm của bạn đó không sát với nội dung hoặc cách sử dụng không đúng ở file gốc, em chỉ theo đó mà làm thôi à.
 
Lần chỉnh sửa cuối:
Upvote 0
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)
ĐK bạn đặt đúng rồi. Có bài viết nào tôi nói bạn đặt đk sai đâu? Cái lỗi của bạn là dùng từ không chính xác. Đk hoặc thỏa hoặc không thỏa chứ làm gì có đk trùng, đk khác. Sao bạn không dùng câu "số trùng hoặc số không trùng"? Vd. số serial Vì "đk" và "số serial" "ngược nhau"
SeriesNumber KHÁC, KHÔNG TRÙNG => đk THỎA (doc_ma_dia <> SeriesNumber = TRUE)
SeriesNumber TRÙNG => đk KHÔNG THỎA (doc_ma_dia <> SeriesNumber = FALSE)
-------------
Tất nhiên cả khi bạn dùng từ không chính xác tôi vẫn hiểu ý bạn. Chính vì thế mà trong bài #21 tôi không "đeo bám" ngôn từ. Tôi chỉ viết là đk luôn thỏa (do hiểu là số SerialNumber và HDD là bất di bất dịch, y như là hiện nay có trong code) nên tôi viết là code có thể rút gọn. Chỉ tới khi bạn viết trong bài #22: "Thử một điều kiện không trùng xem, nó có thỏa được hay không" thì mới có một loạt bài tiếp theo.

Điều kiện không trùng là gì? Là đk không thỏa hay SerialNumber KHÔNG TRÙNG, hay SerialNumber TRÙNG? Và nó ở đây là gì? Là cái "toàn bộ" như bạn viết (cái toàn bộ này khó hiểu quá, sao không viết đk "toàn bộ" hay để khỏi hiểu lầm thì nên viết: đk kép?), tức ĐK KÉP?

1. Nếu hiểu "Điều kiện không trùng" là đk KHÔNG THỎA, vd. ĐK "doc_ma_dia <> SeriesNumber" KHÔNG THỎA, tức "doc_ma_dia <> SeriesNumber = FALSE", tức "doc_ma_dia BẰNG SeriesNumber", thì dĩ nhiên NÓ, tức ĐK KÉP, vẫn có thể THỎA nếu ĐK "Readserienumber <> HDD" THỎA, tức "Readserienumber <> HDD = TRUE", tức "Readserienumber KHÁC HDD"

2. Nếu hiểu "Điều kiện không trùng" là SerialNumber KHÔNG TRÙNG thì dĩ nhiên là NÓ, tức ĐK KÉP, chắc chắn là THỎA. Vì SerialNumber KHÔNG TRÙNG tức là "doc_ma_dia KHÁC SeriesNumber", tức ĐK "doc_ma_dia <> SeriesNumber = TRUE", vậy ĐK KÉP
Mã:
doc_ma_dia <> SeriesNumber Or Readserienumber <> HDD =[COLOR=#ff0000] TRUE[/COLOR]

tức NÓ THỎA

3. Nếu hiểu "Điều kiện không trùng" là SerialNumber TRÙNG thì như điểm 1 NÓ, tức ĐK KÉP, vẫn có thể THỎA nếu ĐK "Readserienumber <> HDD" THỎA, tức "Readserienumber <> HDD = TRUE", tức "Readserienumber KHÁC HDD"
--------------
OR được hiểu như sau, chỉ cần 1 điều kiện không thỏa là toàn bộ không thỏa điều kiện.

Để chính xác tôi dịch lại thành

OR được hiểu như sau, chỉ cần 1 điều kiện không thỏa là điều kiện kép không thỏa

Cái này rõ ràng là sai. Tôi đã đưa ra 2 phát biểu. Nhắc lại:
Nếu 2 đk được kết hợp bởi toán tử OR thì:

Mã:
ĐK KÉP không thỏa khi và chỉ khi cả 2 đk thành phần đều không thỏa. KHÔNG THỎA ở đây nghĩa là đk = FALSE


Mã:
ĐK KÉP thỏa nếu ÍT NHẤT 1 trong 2 đk thành phần thỏa. THỎA ở đây có nghĩa là đk = TRUE.
 
Lần chỉnh sửa cuối:
Upvote 0
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?
 
Lần chỉnh sửa cuối:
Upvote 0
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?

Thủ tục nó nằm trong form:

Mã:
Private Sub UserForm_Initialize()
    Application.EnableCancelKey = xlDisabled
    Application.Visible = False
[COLOR=#0000cd]    [B]ThisWorkbook.Unprotect "[/B][/COLOR][COLOR=#ff0000][B]HoangTrongNghia[/B][/COLOR][COLOR=#0000cd][B]"[/B][/COLOR]
    With Sheets("serifile")
        Serialnumber = .Range("D2").Value
        Computername = .Range("D3").Value
        HDD = .Range("D6").Value
        .Visible = xlSheetVeryHidden
    End With
[COLOR=#0000cd]    [B]ThisWorkbook.Protect "[/B][/COLOR][COLOR=#ff0000][B]HoangTrongNghia[/B][/COLOR][COLOR=#0000cd][B]", Structure:=True[/B][/COLOR]
End Sub

Và thủ tục nằm trong sheet MENU:

Mã:
Private Sub CommandButton1_Click()
[COLOR=#0000cd][B]    ThisWorkbook.Unprotect "[/B][/COLOR][COLOR=#ff0000][B]HoangTrongNghia[/B][/COLOR][COLOR=#0000cd][B]"[/B][/COLOR]
    Sheets("serifile").Visible = xlSheetVisible
    Sheets("serifile").Select
[COLOR=#0000cd][B]    ThisWorkbook.Protect "[/B][/COLOR][COLOR=#ff0000][B]HoangTrongNghia[/B][/COLOR][COLOR=#0000cd][B]", Structure:=True[/B][/COLOR]
End Sub

Lưu ý, trước khi thay đổi password, phải đảm bảo là Workbook đã được mở khóa, sau đó mới thay đổi pass mới trong code nhé!
 
Upvote 0
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.

Bạn xem file nhé!

Mọi Password đều là: HoangTrongNghia
Cho mình hỏi thêm: có thể viết code chỉ đăng nhập 1 lần được ko, những lần khác mở file lên thì ko cần đăng nhập...Còn nếu copy qua máy khác thì phải đăng nhập lại...
 
Upvote 0
Thủ tục nó nằm trong form:

Mã:
Private Sub UserForm_Initialize()
    Application.EnableCancelKey = xlDisabled
    Application.Visible = False
[COLOR=#0000cd]    [B]ThisWorkbook.Unprotect "[/B][/COLOR][COLOR=#ff0000][B]HoangTrongNghia[/B][/COLOR][COLOR=#0000cd][B]"[/B][/COLOR]
    With Sheets("serifile")
        Serialnumber = .Range("D2").Value
        Computername = .Range("D3").Value
        HDD = .Range("D6").Value
        .Visible = xlSheetVeryHidden
    End With
[COLOR=#0000cd]    [B]ThisWorkbook.Protect "[/B][/COLOR][COLOR=#ff0000][B]HoangTrongNghia[/B][/COLOR][COLOR=#0000cd][B]", Structure:=True[/B][/COLOR]
End Sub

Và thủ tục nằm trong sheet MENU:

Mã:
Private Sub CommandButton1_Click()
[COLOR=#0000cd][B]    ThisWorkbook.Unprotect "[/B][/COLOR][COLOR=#ff0000][B]HoangTrongNghia[/B][/COLOR][COLOR=#0000cd][B]"[/B][/COLOR]
    Sheets("serifile").Visible = xlSheetVisible
    Sheets("serifile").Select
[COLOR=#0000cd][B]    ThisWorkbook.Protect "[/B][/COLOR][COLOR=#ff0000][B]HoangTrongNghia[/B][/COLOR][COLOR=#0000cd][B]", Structure:=True[/B][/COLOR]
End Sub

Lưu ý, trước khi thay đổi password, phải đảm bảo là Workbook đã được mở khóa, sau đó mới thay đổi pass mới trong code nhé!
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.
 
Upvote 0
Cho mình hỏi thêm: có thể viết code chỉ đăng nhập 1 lần được ko, những lần khác mở file lên thì ko cần đăng nhập...Còn nếu copy qua máy khác thì phải đăng nhập lại...

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
 
Upvote 0
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
 
Upvote 0
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
 
Upvote 0
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

Thêm vào Form:

UserForm_Initialize:
Mã:
SetTopmostWindow Application.hwnd
UserForm_Terminate:
Mã:
SetTopmostWindow Application.hwnd, False
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
 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.
 
Lần chỉnh sửa cuối:
Upvote 0
file cuối cùng đâu up lên mình xem với.. hay quá đi!
 
Upvote 0
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 ạ
 
Upvote 0
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

1.png
 
Upvote 0
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

View attachment 163801


Bạn tìm hiểu lại cấu trúc lệnh "For each..." nhé. Mình đã viết lại code, bạn tham khảo bên dưới, lưu ý doc_ma_dia, doc_ma_may mình không biết bạn lấy từ đâu nhé :
[GPECODE=vb]Private Sub Workbook_Open()
Dim i As Long, arrDia, arrMay
arrDia = Array("S3PGE65Q", "S314J90H241608")
arrMay = Array("BFEBFBFF00040651", "BFEBFBFF000406E3")

For i = LBound(arrDia) To UBound(arrDia)
If arrDia(i) <> doc_ma_dia Or arrMay(i) <> doc_ma_may Then
If Application.Workbooks.Count = 1 Then
Application.Quit
Else
ThisWorkbook.Close False
End If
End If
Next
End Sub[/GPECODE]
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
Function doc_ma_dia()Dim ObjetoWMI As Object
Dim Disco As Object
Dim Discos As Object
Dim abc
Set ObjetoWMI = GetObject("WINMGMTS:")
Set Discos = ObjetoWMI.InstancesOf("Win32_PhysicalMedia")
abc = ""
For Each Disco In Discos
  abc = Disco.SerialNumber
  If Len(Trim(abc)) > 0 Then
    Exit For
  End If
Next
doc_ma_dia = Trim(abc)
End Function


Function doc_ma_may()
Dim i
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor")
For Each objItem In colItems
i = objItem.ProcessorId
Next
doc_ma_may = i
End Function
Đây là code doc_ma_may, doc_ma_dia. Em thử code của anh nhưng k chạy được.
 
Upvote 0
Bạn tìm hiểu lại cấu trúc lệnh "For each..." nhé. Mình đã viết lại code, bạn tham khảo bên dưới, lưu ý doc_ma_dia, doc_ma_may mình không biết bạn lấy từ đâu nhé :
[GPECODE=vb]Private Sub Workbook_Open()
Dim i As Long, arrDia, arrMay
arrDia = Array("S3PGE65Q", "S314J90H241608")
arrMay = Array("BFEBFBFF00040651", "BFEBFBFF000406E3")

For i = LBound(arrDia) To UBound(arrDia)
If arrDia(i) <> doc_ma_dia Or arrMay(i) <> doc_ma_may Then
If Application.Workbooks.Count = 1 Then
Application.Quit
Else
ThisWorkbook.Close False
End If
End If
Next
End Sub[/GPECODE]
Hình như code này chạy trên máy nào nó cũng Close hết hay sao ý .....
Mình mới test tren máy Mình thấy kiểu chi nó chết ... chỗ màu đỏ là máy Mình
Mã:
Private Sub Check_XYZ()
    Dim i As Long, arrDia, arrMay
    arrDia = Array("[COLOR=#ff0000][B]WD-WMAYUS6019431[/B][/COLOR]", "S314J90H241608")
    arrMay = Array("[COLOR=#ff0000][B]BFEBFBFF0001067A[/B][/COLOR]", "BFEBFBFF000406E3")
     
    For i = LBound(arrDia) To UBound(arrDia)
        If arrDia(i) <> doc_ma_dia Or arrMay(i) <> doc_ma_may Then
            If Application.Workbooks.Count = 1 Then
                'Application.Quit
                MsgBox "OK 1"
            Else
                'ThisWorkbook.Close False
                MsgBox "OK 2"
            End If
        End If
    Next
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
Function doc_ma_dia()
Dim ObjetoWMI As Object
Dim Disco As Object
Dim Discos As Object
Dim abc
Set ObjetoWMI = GetObject("WINMGMTS:")
Set Discos = ObjetoWMI.InstancesOf("Win32_PhysicalMedia")
abc = ""
For Each Disco In Discos
  abc = Disco.SerialNumber
  If Len(Trim(abc)) > 0 Then
    Exit For
  End If
Next
doc_ma_dia = Trim(abc)
End Function


Function doc_ma_may()
Dim i
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor")
For Each objItem In colItems
i = objItem.ProcessorId
Next
doc_ma_may = i
End Function
Đây là code doc_ma_may, doc_ma_dia. Em thử code của anh nhưng k chạy được.

Vì doc_ma_may, doc_ma_dia là hàm (Function) nên bạn cần có đóng, mở ngoặc '()' trong câu lệnh gọi, code ở bài #41 sửa lại như sau :
[GPECODE=vb]Private Sub Workbook_Open()
Dim i As Long, arrDia, arrMay
arrDia = Array("S3PGE65Q", "S314J90H241608") arrMay = Array("BFEBFBFF00040651", "BFEBFBFF000406E3")

For i = LBound(arrDia) To UBound(arrDia)
If arrDia(i) <> doc_ma_dia() Or arrMay(i) <> doc_ma_may() Then
If Application.Workbooks.Count = 1 Then
Application.Quit
Else
ThisWorkbook.Close False
End If
End If
Next
End Sub[/GPECODE]
 
Lần chỉnh sửa cuối:
Upvote 0
Hình như code này chạy trên máy nào nó cũng Close hết hay sao ý .....
Mình mới test tren máy Mình thấy kiểu chi nó chết ... chỗ màu đỏ là máy Mình
Mã:
Private Sub Check_XYZ()
    Dim i As Long, arrDia, arrMay
    arrDia = Array("[COLOR=#ff0000][B]WD-WMAYUS6019431[/B][/COLOR]", "S314J90H241608")
    arrMay = Array("[COLOR=#ff0000][B]BFEBFBFF0001067A[/B][/COLOR]", "BFEBFBFF000406E3")
     
    For i = LBound(arrDia) To UBound(arrDia)
        If arrDia(i) <> doc_ma_dia Or arrMay(i) <> doc_ma_may Then
            If Application.Workbooks.Count = 1 Then
                'Application.Quit
                MsgBox "OK 1"
            Else
                'ThisWorkbook.Close False
                MsgBox "OK 2"
            End If
        End If
    Next
End Sub

Có lẽ thiếu ngoặc như ở bài #44 mình đã trình bày.
 
Upvote 0
Hình như code này chạy trên máy nào nó cũng Close hết hay sao ý .....Mình mới test tren máy Mình thấy kiểu chi nó chết ... chỗ màu đỏ là máy Mình
Mã:
Private Sub Check_XYZ()    Dim i As Long, arrDia, arrMay    arrDia = Array("[COLOR=#ff0000][B]WD-WMAYUS6019431[/B][/COLOR]", "S314J90H241608")    arrMay = Array("[COLOR=#ff0000][B]BFEBFBFF0001067A[/B][/COLOR]", "BFEBFBFF000406E3")         For i = LBound(arrDia) To UBound(arrDia)        If arrDia(i)  doc_ma_dia Or arrMay(i)  doc_ma_may Then            If Application.Workbooks.Count = 1 Then                'Application.Quit                MsgBox "OK 1"            Else                'ThisWorkbook.Close False                MsgBox "OK 2"            End If        End If    NextEnd Sub
Hix, giải thuật sai các bác ạ (chưa thoát vòng lặp khi đúng). Xin sửa lại như sau :
[GPECODE=vb]Private Sub Workbook_Open()
Dim i As Long, arrDia, arrMay

arrDia = Array("S3PGE65Q", "S314J90H241608")
arrMay = Array("BFEBFBFF00040651", "BFEBFBFF000406E3")

For i = LBound(arrDia) To UBound(arrDia)
If arrDia(i) = doc_ma_dia() Then
If arrMay(i) = doc_ma_may() Then
'// Làm gì đó
Else
If Application.Workbooks.Count = 1 Then
Application.Quit
Else
ThisWorkbook.Close False
End If
End If
Exit For
End If
Next
End Sub[/GPECODE]
 
Lần chỉnh sửa cuối:
Upvote 0
Hix, giải thuật sai các bác ạ (chưa thoát vòng lặp khi đúng). Xin sửa lại như sau :
[GPECODE=vb]Private Sub Workbook_Open()
Dim i As Long, arrDia, arrMay
arrDia = Array("S3PGE65Q", "S314J90H241608")
arrMay = Array("BFEBFBFF00040651", "BFEBFBFF000406E3")

For i = LBound(arrDia) To UBound(arrDia)
If arrDia(i) = doc_ma_dia() Then
If arrMay(i) = doc_ma_may() Then
Exit For
Else
If Application.Workbooks.Count = 1 Then
Application.Quit
Else
ThisWorkbook.Close False
End If
End If
End If
Next
End Sub[/GPECODE]
Bài này nếu là mình khỏi For ... Next làm chi khi Mở File nó quay tròn quay Tròn ...

Ma Mình chơi If ...and ... Then đơn giản gọn nhẹ xong Phim
 
Upvote 0
Em thử test code trên cả máy chưa được nhập mã đĩa và mã máy mà vẫn mở được .**~**
 
Upvote 0
Em thử test code trên cả máy chưa được nhập mã đĩa và mã máy mà vẫn mở được .**~**
Thì đơn giản vây đi
1/ Nếu Mình thì sẻ viết vây
Mã:
Public Sub CheckSerial()
    Dim May1$, May2$, May3$, Serial$
    May1 = "WD-WMAYUS601943"
    May2 = "WD-WMAYUS6019431"
    May3 = "K12PAK5G"
    Serial = doc_ma_dia()
    If Serial <> May1 And Serial <> May2 And Serial <> May3 Then
        MsgBox "OK"
        'ThisWorkbook.Close False
    End If
End Sub

2/ Còn viết vầy cho Bạn nào mới Tập làm quen vơi VBA hiểu thêm một chút Về If

Mã:
Public Sub CheckSerial2()
    Dim May1$, May2$, May3$, Serial$
    May1 = "WD-WMAYUS601943"
    May2 = "WD-WMAYUS6019431"
    May3 = "K12PAK5G"
    Serial = doc_ma_dia()
    If Serial <> May1 Then
        If Serial <> May2 Then
            If Serial <> May3 Then
                MsgBox "OK"
                'ThisWorkbook.Close False
            End If
        End If
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0

Bài viết mới nhất

Back
Top Bottom