Macro hiện ra tên thư mục và nhập pass để mở

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

duongnc

Thành viên mới
Tham gia
9/5/08
Bài viết
36
Được thích
4
Chào các bác,

Tôi đang viết một marco để thực hiện công việc sau. Tôi có một file excel, khi mở file này ra sẽ hiện ra một Form, Form này sẽ có các nội dung sau:

1) Có một Label hiện dòng thông báo là: "Bạn đang thực hiện Dự án: XYZ" với XYZ chính là tên Thư mục chứa file này. Mục đích của việc này là khi thực hiện một Dự án mới chỉ cần copy thư mục đang dùng sang chỗ khác và đổi tên thư mục là xong.

2) Hiện ra thông báo là: "Đặt/Đổi mật khẩu". Mục đích của việc này là nếu lần đầu tiên sử dụng file thì có thể người dùng sẽ đặt mật khẩu cho file và lần sau mở file này thì phải vào đúng mật khẩu. Nếu là thay đổi mật khẩu thì phải gõ vào đúng mật khẩu cũ. Đặt mật khẩu hoặc thay đổi mật khẩu thì có thêm một ô để "xác nhận mật khẩu" tránh trường hợp gõ nhầm mật khẩu.

3) Nếu gõ vào đúng mật khẩu rồi click vào Nút "Mở File" hoặc nhấn ENTER thì cho phép mở file ra để làm việc, nếu gõ vào sai mật khẩu thì thông báo: "Mật khẩu nhập vào không đúng", sau 3 lần nhập không đúng thì tự động đóng file.

4) Nếu click vào Nút Cancel hoặc nhấn phím "ESC" thì đóng file.

5) Có thêm một ý tưởng, nhưng làm được thì tốt, không làm được cũng không sao. Đó là khi nhập password thì hiện ra dưới dạng các dấu chấm (......) hoặc các dấu sao (*******) trông sẽ chuyên nghiệp hơn rất nhiều.

Hiện nay tôi thấy khả năng của mình khó thực hiện được công việc trên, vì vậy mong các bác trên forum có cách nào để thực hiện thì chỉ giáo giúp, được phần nào tốt phần đó. Các bác xem giúp cái form trong file gửi kèm.

Cảm ơn các bác,
 

File đính kèm

1: Application.ActiveWorkbook.path
2,3,4,5: Bạn chịu khó tìm kiếm trên diễn đàn nhé, đã có rất nhiều, đây là một ví dụ
 
Upvote 0
1: Application.ActiveWorkbook.path
2,3,4,5: Bạn chịu khó tìm kiếm trên diễn đàn nhé, đã có rất nhiều, đây là một ví dụ

Cảm ơn bạn đã đọc bài viết của tôi,

Tuy nhiên, áp dụng câu lệnh như gợi ý của bạn thì sẽ chỉ đưa về đường dẫn của thư mục hoặc file thôi, ý tôi muốn hỏi là có cách nào để chỉ lấy mỗi tên thư mục thôi bạn ạ.

Các phần tôi nêu ra để hỏi, tôi cũng đã tìm hiểu trên diễn đàn, nhưng chưa có bài nào cụ thể vào trường hợp của tôi, có một số bài cùng chủ đề như nhập password vào trước khi mở file thì lại không đáp ứng được yêu cầu về việc người sử dụng có thể thay đổi pass.

Có gì mong bạn chỉ giúp. Xin trân trọng cảm ơn.
 
Lần chỉnh sửa cuối:
Upvote 0
Xin lỗi nha! Giờ mới rãnh tay! Bạn xem có vừa ý không nha!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Xin lỗi nha! Giờ mới rãnh tay!
Bạn xem có vừa ý không nha!

Cảm ơn bác Boong,

File của bác giúp cho em tuyệt vời lắm, tuy nhiên em còn vài chỗ thắc mắc mong được bác chỉ giáo thêm cho:

1) Làm thế nào để sau 3 lần nhập pass sai thì file excel tự động đóng lại (hiện tại em thấy khi chỉ khi nhấn Cancel thì file mới đóng lại);

2) Chữ XYZ có thể tự động thay bằng tên thư mục chứa file excel được không? Em thử dùng một đoạn code để xác định tên thư mục sau đó đặt công thức dùng Caption của label gán cho giá trị kiểu String vào nhưng không thành công.

3) Theo cách thức hiện tại thì phài dùng một cell trong một sheet nào đó để lưu password, bác có cách nào dùng VBA thuần túy không để tránh người sử dụng trong quá trình thao tác lại vô tình hoặc cố ý tác động vào. Em cũng hiểu là khi đó phải tạo một sheet riêng, đặt protect và hide cái sheet đó đi, nhưng nếu có thể sử dụng VBA thuần túy vẫn thú vị hơn.

Cảm ơn Bác rất nhiều.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình làm đã gần như hoàn tất rồi! Chỉ mỗi việc thay đổi pass bằng code không thì vẫn chưa có cách khắc phục! Tạm thời thì mình giấu nó đi thôi! Bạn muốn biết thì có thể xem code (Alt + F11). Bạn xem coi được chưa nhé!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mình làm đã gần như hoàn tất rồi! Chỉ mỗi việc thay đổi pass bằng code không thì vẫn chưa có cách khắc phục! Tạm thời thì mình giấu nó đi thôi! Bạn muốn biết thì có thể xem code (Alt + F11). Bạn xem coi được chưa nhé!

Cảm ơn Bác Boong,

File của bác tuyệt lắm. Em định viết đoạn code để cắt tên thư mục thôi chứ không lấy toàn bộ cả đường dẫn, em dự định dùng hàm Right lấy từng ký tự một cho đến khi gặp ký tự "\". Bác thấy em làm thế có được không, nếu có cách nào hay hơn thì bác tư vấn cho em với nhé.

Cảm ơn Bác rất nhiều
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn Bác Boong,

File của bác tuyệt lắm. Em định viết đoạn code để cắt tên thư mục thôi chứ không lấy toàn bộ cả đường dẫn, em dự định dùng hàm Right lấy từng ký tự một cho đến khi gặp ký tự "\". Bác thấy em làm thế có được không, nếu có cách nào hay hơn thì bác tư vấn cho em với nhé.

Cảm ơn Bác rất nhiều


đúng rùi bạn dùng hàm right thui, nhưng không cắt từng ký tự mà tìm ra số ký tự sau dấu \ cuối cùng -> bàng hàm InStrRev(), cụ thể

Function InStrRev(StringCheck As String, StringMatch As String, [Start As Long = -1], [Compare As VbCompareMethod = vbBinaryCompare]) As Long
Member of VBA.Strings
Returns the position of the last occurrence of one string within another
 
Upvote 0
2 Bác cho hỏi: Pass của File này là gì vậy?

Pass là Boong123, nó nằm ở cell A1 sheet 1 nhưng đã bị veryhiden đi rồi bạn ạ, nếu muốn xem code hoặc hiện cái sheet đó thì bạn vào VBA mới hiện ra được chứ không cho hiện sheet này như cách thông thường được đâu.
 
Lần chỉnh sửa cuối:
Upvote 0
đúng rùi bạn dùng hàm right thui, nhưng không cắt từng ký tự mà tìm ra số ký tự sau dấu \ cuối cùng -> bàng hàm InStrRev(), cụ thể
Bác có thể giải thích cụ thể hơn được không? Em không biết áp dụng thế nào cả?
 
Lần chỉnh sửa cuối:
Upvote 0
đúng rùi bạn dùng hàm right thui, nhưng không cắt từng ký tự mà tìm ra số ký tự sau dấu \ cuối cùng -> bàng hàm InStrRev(), cụ thể

Cảm ơn bác Tiger,

Em chưa biết hàm này, đây sẽ làm lần đầu tiên em sử dụng, bác có cái gì hướng dẫn cách sử dụng nó không cho em xin với.
 
Upvote 0
Bác có thể giải thích cụ thể hơn được không? Em không biết áp dụng thế nào cả?

Ví dụ đây

làm thây mới thấy dùng hàm MID hay hơn đỡ pahir dùng len nữa

còn InStrRev() là hàm tìm vị trí cuối cùng xuất hiện của chuỗi ký tự "\" trong chuỗi pathF ;; cụ thể bạn chịu khó dịch tiếng anh trên nhé hay tìm kiêm trên GPE,

PHP:
Function tenFile(pathF As String)
   tenFile = Mid(pathF, InStrRev(pathF, "\", , vbTextCompare) + 1)
End Function
PHP:
Function tenFile2(pathF As String)
   tenFile2 = Right(pathF, Len(pathF) - InStrRev(pathF, "\", , vbTextCompare))
End Function
 
Upvote 0
Mình làm đã gần như hoàn tất rồi! Chỉ mỗi việc thay đổi pass bằng code không thì vẫn chưa có cách khắc phục! Tạm thời thì mình giấu nó đi thôi! Bạn muốn biết thì có thể xem code (Alt + F11). Bạn xem coi được chưa nhé!

Chào bác Boong,

Em lại hỏi nhờ bác thêm một chút xíu, tại sao em đã đặt chữ M trong chữ Mở File (button) thuộc tính Accelerater rồi mà nó không chịu gạch chân để có thể dùng phím tắt được nhỉ.

Nhân tiện có bác nào biết nguyên nhân tại sao thì chỉ luôn cho em với nhé.

Xin trân trọng cảm ơn với cả tấm lòng.
 
Upvote 0
Ví dụ đây

làm thây mới thấy dùng hàm MID hay hơn đỡ pahir dùng len nữa

còn InStrRev() là hàm tìm vị trí cuối cùng xuất hiện của chuỗi ký tự "\" trong chuỗi pathF ;; cụ thể bạn chịu khó dịch tiếng anh trên nhé hay tìm kiêm trên GPE,

PHP:
Function tenFile(pathF As String)
   tenFile = Mid(pathF, InStrRev(pathF, "\", , vbTextCompare) + 1)
End Function
PHP:
Function tenFile2(pathF As String)
   tenFile2 = Right(pathF, Len(pathF) - InStrRev(pathF, "\", , vbTextCompare))
End Function

Cảm ơn bác Tiger,

Ý định của em là lấy được tên Thư mục chứa file chứ không phải lấy tên File, Em phải làm 2 lệnh như dưới đây :

Sub MyFormOpen()
MyFolderPath = Left(ActiveWorkbook.FullName, InStrRev(ActiveWorkbook.FullName, "\", , vbTextCompare) - 1)
MyFolderName = Mid(MyFolderPath, InStrRev(MyFolderPath, "\", , vbTextCompare) + 1)
MyForm.Caption = MyForm.Caption & MyFolderName
MyForm.Show
End Sub

Ngoài cách trên, em định sử dụng hàm CurDir nhưng không được, nó toàn trả về ổ C trong khi file em đang làm việc nằm trên ổ D, thể là thế nào nhỉ. Có bác nào biết thì chỉ bảo cho em với.

Cảm ơn các bác
 
Upvote 0
Cảm ơn bác Tiger,

Ý định của em là lấy được tên Thư mục chứa file chứ không phải lấy tên File, Em phải làm 2 lệnh như dưới đây :

Ngoài cách trên, em định sử dụng hàm CurDir nhưng không được, nó toàn trả về ổ C trong khi file em đang làm việc nằm trên ổ D, thể là thế nào nhỉ. Có bác nào biết thì chỉ bảo cho em với.

Cảm ơn các bác

oh, bạn trích có 1 phần rất khó hỉu

bạn xem bài sau, xem giúp ích:
http://www.giaiphapexcel.com/forum/showthread.php?t=9831
.
 
Upvote 0
Cảm ơn bác Tiger, Ý định của em là lấy được tên Thư mục chứa file chứ không phải lấy tên File, Em phải làm 2 lệnh như dưới đây : Sub MyFormOpen() MyFolderPath = Left(ActiveWorkbook.FullName, InStrRev(ActiveWorkbook.FullName, "\", , vbTextCompare) - 1) MyFolderName = Mid(MyFolderPath, InStrRev(MyFolderPath, "\", , vbTextCompare) + 1) MyForm.Caption = MyForm.Caption & MyFolderName MyForm.Show End Sub Ngoài cách trên, em định sử dụng hàm CurDir nhưng không được, nó toàn trả về ổ C trong khi file em đang làm việc nằm trên ổ D, thể là thế nào nhỉ. Có bác nào biết thì chỉ bảo cho em với. Cảm ơn các bác
Nếu bạn muốn lấy Folder đầy đủ của File này thôi thì sữa lại thành:
Mã:
Private Sub UserForm_Activate() MyFolderPath = Left(ActiveWorkbook.FullName, InStrRev(ActiveWorkbook.FullName, "\", , vbTextCompare) - 1) Ten_DA.Caption = Ten_DA.Caption & MyFolderPath Nhap_Pass_Box = "" Nhap_Pass_Box.SetFocus End Sub
Nếu bạn chỉ muốn lấy Folder của File này thôi thì sữa lại thành:
Mã:
Private Sub UserForm_Activate() MyFolderPath = Left(ActiveWorkbook.FullName, InStrRev(ActiveWorkbook.FullName, "\", , vbTextCompare) - 1) MyFolderName = Mid(MyFolderPath, InStrRev(MyFolderPath, "\", , vbTextCompare) + 1) Ten_DA.Caption = Ten_DA.Caption & MyFolderName Nhap_Pass_Box = "" Nhap_Pass_Box.SetFocus End Sub
Nếu muốn kết hợp tên file chỉ tên Folder thôi thì đổi là vầy:
Mã:
Private Sub UserForm_Activate() MyFolderPath = Left(ActiveWorkbook.FullName, InStrRev(ActiveWorkbook.FullName, "\", , vbTextCompare) - 1) MyFolderName = Mid(MyFolderPath, InStrRev(MyFolderPath, "\", , vbTextCompare) + 1) MyFileName = Right(ActiveWorkbook.FullName, Len(ActiveWorkbook.FullName) - InStrRev(ActiveWorkbook.FullName, "\", , vbTextCompare)) Ten_DA.Caption = Ten_DA.Caption & MyFolderName & "\" & MyFileName Nhap_Pass_Box = "" Nhap_Pass_Box.SetFocus End Sub
Nếu muốn đầy đủ cả tên file Folder đầy đủ luôn:
Mã:
Private Sub UserForm_Activate() Ten_DA.Caption = Ten_DA.Caption & ActiveWorkbook.FullName Nhap_Pass_Box = "" Nhap_Pass_Box.SetFocus End Sub
Tùy bạn chọn vậy!
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu bạn muốn lấy Folder đầy đủ của File này thôi thì sữa lại thành:
Mã:
Private Sub UserForm_Activate()
MyFolderPath = Left(ActiveWorkbook.FullName, InStrRev(ActiveWorkbook.FullName, "\", , vbTextCompare) - 1)
Ten_DA.Caption = Ten_DA.Caption & MyFolderPath
Nhap_Pass_Box = ""
Nhap_Pass_Box.SetFocus
End Sub
Nếu bạn chỉ muốn lấy Folder của File này thôi thì sữa lại thành:
Mã:
Private Sub UserForm_Activate()
MyFolderPath = Left(ActiveWorkbook.FullName, InStrRev(ActiveWorkbook.FullName, "\", , vbTextCompare) - 1)
MyFolderName = Mid(MyFolderPath, InStrRev(MyFolderPath, "\", , vbTextCompare) + 1)
Ten_DA.Caption = Ten_DA.Caption & MyFolderName
Nhap_Pass_Box = ""
Nhap_Pass_Box.SetFocus
End Sub
Nếu muốn kết hợp tên file chỉ tên Folder thôi thì đổi là vầy:
Mã:
Private Sub UserForm_Activate()
MyFolderPath = Left(ActiveWorkbook.FullName, InStrRev(ActiveWorkbook.FullName, "\", , vbTextCompare) - 1)
MyFolderName = Mid(MyFolderPath, InStrRev(MyFolderPath, "\", , vbTextCompare) + 1)
MyFileName = Right(ActiveWorkbook.FullName, Len(ActiveWorkbook.FullName) - InStrRev(ActiveWorkbook.FullName, "\", , vbTextCompare))
Ten_DA.Caption = Ten_DA.Caption & MyFolderName & "\" & MyFileName
Nhap_Pass_Box = ""
Nhap_Pass_Box.SetFocus
End Sub
Nếu muốn đầy đủ cả tên file Folder đầy đủ luôn:
Mã:
Private Sub UserForm_Activate()
Ten_DA.Caption = Ten_DA.Caption & ActiveWorkbook.FullName
Nhap_Pass_Box = ""
Nhap_Pass_Box.SetFocus
End Sub
Tùy bạn chọn vậy!

Cảm ơn bác Boong,

Bác chu đáo quá, trong trường hợp này thì em chỉ cần lấy tên Folder thôi, nhưng em sẽ ghi lại tất cả các trường hợp bác nêu ra, thế nào cũng có lúc dùng tới.
Cảm ơn bác nhiều
 
Upvote 0
Web KT

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

Back
Top Bottom