Vấn đề File mẫu chỉ được Save As không cho Save trên chính File mẫu (4 người xem)

Liên hệ QC

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

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,662
Được thích
16,722
Giới tính
Nam
Chào các Anh Chị và các bạn, tôi có một File mẫu, nếu đặt thuộc tính Read Only trong Properties thì đương nhiên Save đều cho ra dạng Save As. Tuy nhiên, nếu người khác cũng click chuột phải lên File mẫu và bỏ chọn thuộc tính Read Only thì File mẫu sẽ bị chỉnh sửa và save bình thường.

Tôi muốn được giúp đỡ về Code mà có thuộc tính như Properties Read Only mà cho dù người khác can thiệp vô Properties cũng không thể save trên chính file mẫu đó, chỉ sau khi save thành File khác thì muốn làm gì thì làm.

Việc dùng tên file để gán vô sự kiện BeforeSave thì cũng phiêu quá, người ta cũng có thể đổi tên File mẫu được!

Xin cám ơn.
 
Anh trai cố gắng tìm cách nào đi chăng nữa thì chỉ cần Disable all Marco là công cốc thôi.
Nhưng em xin đưa ra 1 ý tưởng thế này,còn về VBA thì chắc anh thừa làm được!
Anh tạo một VBA khi mở file nên sẽ hiện Input hỏi password!
Nếu Pass đúng thì tại một ô nào đó trong file sẽ là giá trị "True" lúc này file sẽ cho save bình thường!
Nếu pass sai thì cũng tại ô đó giá trị sẽ là False.File không cho phép Save thông thường mà sẽ Save theo kiểu phím tắt F12 hoặc SaveAs.
Ý tưởng của em là như vậy? Chẳng biết như vậy có thực hiện được không nữa! hì
 
Upvote 0
Vậy thì khi save, so sánh 2 tên, nếu khác cho save trùng mở save as. Nghĩ như vậy thôi, mình chưa làm nên chưa thấy khó
 
Upvote 0
Chào các Anh Chị và các bạn, tôi có một File mẫu, nếu đặt thuộc tính Read Only trong Properties thì đương nhiên Save đều cho ra dạng Save As. Tuy nhiên, nếu người khác cũng click chuột phải lên File mẫu và bỏ chọn thuộc tính Read Only thì File mẫu sẽ bị chỉnh sửa và save bình thường.

Tôi muốn được giúp đỡ về Code mà có thuộc tính như Properties Read Only mà cho dù người khác can thiệp vô Properties cũng không thể save trên chính file mẫu đó, chỉ sau khi save thành File khác thì muốn làm gì thì làm.

Việc dùng tên file để gán vô sự kiện BeforeSave thì cũng phiêu quá, người ta cũng có thể đổi tên File mẫu được!

Xin cám ơn.
Có code làm được việc này (mặc dù không phải Properties Read Only) nhưng khi họ Disable Macro thì bị vô hiệu hóa code thì sao?
PHP:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  If SaveAsUI = False Then
     MsgBox "Khong duoc Save ma chi SaveAs"
     Cancel = True
  Else
    With ThisWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule 
       .DeleteLines 1, .CountOfLines
    End With
  End If
End Sub
Khi save code không cho save mà chỉ SaveAs, khi SaveAs rồi thì với file mới dùng trở lại bình thường vì xóa luôn code không cho save. Nhược điểm cách này là phải đặt Security:
Tools>Macro>Security - Trusted Publishers và tích chọn Trust access to Visual Basic Editor trước khi chạy code mới xóa được code khi đã được save as
 
Lần chỉnh sửa cuối:
Upvote 0
Chào các Anh Chị và các bạn, tôi có một File mẫu, nếu đặt thuộc tính Read Only trong Properties thì đương nhiên Save đều cho ra dạng Save As. Tuy nhiên, nếu người khác cũng click chuột phải lên File mẫu và bỏ chọn thuộc tính Read Only thì File mẫu sẽ bị chỉnh sửa và save bình thường.

Tôi muốn được giúp đỡ về Code mà có thuộc tính như Properties Read Only mà cho dù người khác can thiệp vô Properties cũng không thể save trên chính file mẫu đó, chỉ sau khi save thành File khác thì muốn làm gì thì làm.

Việc dùng tên file để gán vô sự kiện BeforeSave thì cũng phiêu quá, người ta cũng có thể đổi tên File mẫu được!

Xin cám ơn.

Nếu anh minhthien321 chỉ muốn phòng người ngay thì có thể tạo file mẫu đuôi .xlt, người dùng click đôi vào thì sẽ làm việc trên file mới mà không liên quan gì đến file mẫu. Còn nếu buộc người dùng không chỉnh sửa file thì có lẽ phải dùng phần mềm hỗ trợ như LockXLS chẳng hạn. Anh cũng biết VBA thì đâu có bảo mật gì được mà.
 
Upvote 0
Hì hì, vấn đề không phải là bảo mật, vấn đề là cái tật táy máy của mấy bạn đồng nghiệp khi vọc file mẫu linh tinh ấy mà, mình nói là sau khi Save As xong thì muốn làm gì thì làm, sửa gì thì sửa, chứ trên File mẫu lại chỉnh sửa lung tung thì coi không được ấy mà! Hihihi

Nếu anh minhthien321 chỉ muốn phòng người ngay thì có thể tạo file mẫu đuôi .xlt, người dùng click đôi vào thì sẽ làm việc trên file mới mà không liên quan gì đến file mẫu. Còn nếu buộc người dùng không chỉnh sửa file thì có lẽ phải dùng phần mềm hỗ trợ như LockXLS chẳng hạn. Anh cũng biết VBA thì đâu có bảo mật gì được mà.


Uh, mình nghĩ tạo File thành File Template như ptlong04x1 nói có lẽ tốt nhất đó, không sợ bị Save trên chính File đó. Đơn giản vậy mà không chịu nghĩ ra! Cũng không sợ Disable Macro thì bị vô hiệu hóa.

Cám ơn nhé!
 
Lần chỉnh sửa cuối:
Upvote 0
Hì hì, vấn đề không phải là bảo mật, vấn đề là cái tật táy máy của mấy bạn đồng nghiệp khi vọc file mẫu linh tinh ấy mà, mình nói là sau khi Save As xong thì muốn làm gì thì làm, sửa gì thì sửa, chứ trên File mẫu lại chỉnh sửa lung tung thì coi không được ấy mà! Hihihi
Đằng nào họ cũng chỉnh sửa lung tung, thì kệ họ, vọc chán hoặc hư thì phải quay về xin lại file mẫu. Lúc đó tha hồ điều kiện hoặc yêu sách rồi mới cho. Lần sau, không muốn xin để phải tốn 1 chầu, họ sẽ tự động save as rồi cất.
Không những thế xin được file mẫu về họ phải cập nhật lại dữ liệu đã làm bấy nay (chắc sẽ không ít), cập nhật không được, lại kiếm thêm 1 chầu.
Còn sướng là khác.
 
Upvote 0
Đằng nào họ cũng chỉnh sửa lung tung, thì kệ họ, vọc chán hoặc hư thì phải quay về xin lại file mẫu. Lúc đó tha hồ điều kiện hoặc yêu sách rồi mới cho. Lần sau, không muốn xin để phải tốn 1 chầu, họ sẽ tự động save as rồi cất.
Không những thế xin được file mẫu về họ phải cập nhật lại dữ liệu đã làm bấy nay (chắc sẽ không ít), cập nhật không được, lại kiếm thêm 1 chầu.
Còn sướng là khác.

Nhiều lúc cái người nghịch ngợm chỉnh sửa lung tung lại là sếp của mình mới gay anh ptm0412 ạ, thế này thì hết cửa --=0
 
Upvote 0
Có code làm được việc này (mặc dù không phải Properties Read Only) nhưng khi họ Disable Macro thì bị vô hiệu hóa code thì sao?
PHP:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  If SaveAsUI = False Then
     MsgBox "Khong duoc Save ma chi SaveAs"
     Cancel = True
  Else
    With ThisWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule 
       .DeleteLines 1, .CountOfLines
    End With
  End If
End Sub
Khi save code không cho save mà chỉ SaveAs, khi SaveAs rồi thì với file mới dùng trở lại bình thường vì xóa luôn code không cho save. Nhược điểm cách này là phải đặt Security:
Tools>Macro>Security - Trusted Publishers và tích chọn Trust access to Visual Basic Editor trước khi chạy code mới xóa được code khi đã được save as

Mã:
    With ThisWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule 
       .DeleteLines 1, .CountOfLines
    End With

Cho hỏi, cái này sử dụng như thế nào, nếu chỉ xóa 1 thủ tục Macro cần thiết chứ không xóa hết tất cả macro trong module đó? Cám ơn rất nhiều.
 
Upvote 0
Mã:
    With ThisWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule 
       .DeleteLines 1, .CountOfLines
    End With

Cho hỏi, cái này sử dụng như thế nào, nếu chỉ xóa 1 thủ tục Macro cần thiết chứ không xóa hết tất cả macro trong module đó? Cám ơn rất nhiều.

Anh sửa lại 2 thông số StartLine (dòng bắt đầu xoá) và Count (số dòng cần xoá kể từ Start line).
 
Lần chỉnh sửa cuối:
Upvote 0
Vui lòng cho hỏi, với excel 2003, tôi thực hiện thủ tục như các bạn hướng dẫn, không những không xóa macro mà còn báo lỗi:

PHP:
Sub XoaCode()
    With ActiveWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule
      .DeleteLines 1, .CountOfLines
    End With
End Sub

Báo lỗi: Programatic access to Visual Basic Project is not trusted.

Và tô vàng dòng: With ActiveWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule

Vậy khắc phục như thế nào?
 

File đính kèm

  • Picture1.jpg
    Picture1.jpg
    11.4 KB · Đọc: 93
Upvote 0
Vui lòng cho hỏi, với excel 2003, tôi thực hiện thủ tục như các bạn hướng dẫn, không những không xóa macro mà còn báo lỗi:

PHP:
Sub XoaCode()
    With ActiveWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule
      .DeleteLines 1, .CountOfLines
    End With
End Sub

Báo lỗi: Programatic access to Visual Basic Project is not trusted.

Và tô vàng dòng: With ActiveWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule

Vậy khắc phục như thế nào?
Lỗi này nói hoài rồi còn gì: Đó là vì chưa check mục "Trusted access to... " trong security
Tóm lại: Bất cứ code nào can thiệp vào cửa sổ Visual Basic đều phải check mục này
 
Upvote 0
Lỗi này nói hoài rồi còn gì: Đó là vì chưa check mục "Trusted access to... " trong security
Tóm lại: Bất cứ code nào can thiệp vào cửa sổ Visual Basic đều phải check mục này

Có phải mặc định là nó không Check và khi mình Check thì nó Check cái file này hay toàn bộ excel trên máy này?

Nếu nó check toàn bộ excel, thì có thể dùng code để check đối với file mình chạy code và uncheck khi chạy hết thủ tục hay không?
 
Upvote 0
Đúng là mặc định nó không check, mình chỉ có thể tạo thông báo để mỗi lần khởi động file đó lên người dùng check thủ công.
Mã:
Sub Test_Check '
    On Error Resume Next
    Dim vbp As Object  
    If Val(Application.Version) >= 10 Then
        Set vbp = ActiveWorkbook.VBProject
        If Err.Number <> 0 Then
            MsgBox "Your security settings do not allow this procedure to run." _
                   & vbCrLf & vbCrLf & "To change your security setting:" _
                   & vbCrLf & vbCrLf & " 1. Select Tools - Macro - Security." & vbCrLf _
                   & " 2. Click the 'Trusted Sources' tab" & vbCrLf _
                   & " 3. Place a checkmark next to 'Trust access to Visual Basic Project.'", _
                   vbCritical
            Exit Sub
        End If
    End If
End Sub
Khi đóng file làm ngược lại
 
Upvote 0
Có phải mặc định là nó không Check và khi mình Check thì nó Check cái file này hay toàn bộ excel trên máy này?

Nếu nó check toàn bộ excel, thì có thể dùng code để check đối với file mình chạy code và uncheck khi chạy hết thủ tục hay không?
Bạn cứ check 1 lần, nó có tác dụng trên toàn Excel... và cứ để nguyên thế, đâu cần phải Uncheck gì chứ
Còn để check mục này bằng VBA code cũng có cách luôn:

Mã:
Sub ChangeVBOM()
  Dim regKey As String
  regKey = "HKEY_LOCAL_MACHINE\Software\Microsoft\Office\" & Application.Version & "\Excel\Security\AccessVBOM"
  CreateObject("WScript.Shell").RegWrite regKey, 1, "REG_DWORD"
End Sub
Xem bài này:
http://www.giaiphapexcel.com/forum/showthread.php?57628-Set-Security-chế-độ-Trus-access-to-Visual-Basic-project&p=359990#post359990
 
Upvote 0
Bạn cứ check 1 lần, nó có tác dụng trên toàn Excel... và cứ để nguyên thế, đâu cần phải Uncheck gì chứ
Còn để check mục này bằng VBA code cũng có cách luôn:

Mã:
Sub ChangeVBOM()
  Dim regKey As String
  regKey = "HKEY_LOCAL_MACHINE\Software\Microsoft\Office\" & Application.Version & "\Excel\Security\AccessVBOM"
  CreateObject("WScript.Shell").RegWrite regKey, 1, "REG_DWORD"
End Sub
Xem bài này:
http://www.giaiphapexcel.com/forum/showthread.php?57628-Set-Security-chế-độ-Trus-access-to-Visual-Basic-project&p=359990#post359990


Cám ơn Thầy về thủ tục này, em hiểu nếu thay số 1 là số 0 thì nó UnCheck, nhưng chưa hiểu tại sao khi chạy code nó chuyển thành UnEnable cái checkbox này? Và muốn nó vẫn check tư động nhưng không cho nó trở thành UnEnable được không?
 
Upvote 0
Cám ơn Thầy về thủ tục này, em hiểu nếu thay số 1 là số 0 thì nó UnCheck, nhưng chưa hiểu tại sao khi chạy code nó chuyển thành UnEnable cái checkbox này? Và muốn nó vẫn check tư động nhưng không cho nó trở thành UnEnable được không?
Tôi cố tình như vậy đấy (để người dùng khỏi chỉnh bậy)...
Trong Registry, nhánh LOCAL_MACHINE sẽ chỉnh giá trị và khóa luôn không cho người dùng sửa đổi... Còn nhánh CURRENT_USER thì sẽ tùy chỉnh theo ý người dùng
Vậy, nếu muốn chỉnh được bình thường, thay LOCAL_MACHINE thành CURRENT_USER là được rồi
---------------
Thật ra, nếu bạn đọc kỹ đường link tôi cho ở trên cũng có thể hiểu được vấn đề rồi
 
Upvote 0
Tôi cố tình như vậy đấy (để người dùng khỏi chỉnh bậy)...
Trong Registry, nhánh LOCAL_MACHINE sẽ chỉnh giá trị và khóa luôn không cho người dùng sửa đổi... Còn nhánh CURRENT_USER thì sẽ tùy chỉnh theo ý người dùng
Vậy, nếu muốn chỉnh được bình thường, thay LOCAL_MACHINE thành CURRENT_USER là được rồi
---------------
Thật ra, nếu bạn đọc kỹ đường link tôi cho ở trên cũng có thể hiểu được vấn đề rồi

Lúc đầu chạy hoài không được, nhưng sau khi đọc từng bài trong đường link thầy cho thì nhận ra rằng, khi đã chạy HKEY_LOCAL_MACHINE thì phải chay thủ tục xóa nó dưới đây,

Mã:
Sub ResetVBOM()
  Dim regKey As String
  [COLOR=#006400]'Thu tuc de xoa HKEY_LOCAL_MACHINE (Enable=False)[/COLOR]
  regKey = "HKEY_LOCAL_MACHINE\Software\Microsoft\Office\" & Application.Version & "\Excel\Security\AccessVBOM"
  CreateObject("WScript.Shell").RegDelete regKey
End Sub

sau đó mới cho chạy HKEY_CURRENT_USER nó mới thực hiện được.

(Sau khi chạy tới chạy lui, đổi tới đổi lui, kể cả làm thủ công, giờ mới biết tại sao Thầy dùng HKEY_LOCAL_MACHINE mà không dùng cái kia, ẹc ... ẹc ...)
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy có cách nào chỉ cho save với một định dạng đã chỉ định, ví dụ xlsb thì có được không mọi người? Mấy bà nhà em làm được mấy buổi xong tự nhiên mất hết code thì em nghĩ chỉ có thể save sang định dạng khác, mà hướng dẫn rồi vẫn cứ ngựa quen đường cũ, khổ.
 
Upvote 0
Vậy có cách nào chỉ cho save với một định dạng đã chỉ định, ví dụ xlsb thì có được không mọi người? Mấy bà nhà em làm được mấy buổi xong tự nhiên mất hết code thì em nghĩ chỉ có thể save sang định dạng khác, mà hướng dẫn rồi vẫn cứ ngựa quen đường cũ, khổ.
khởi động excel và làm theo hình sau đó khởi động lại là ok
 

File đính kèm

  • Untitled.jpg
    Untitled.jpg
    27.2 KB · Đọc: 25
Upvote 0
Web KT

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

Back
Top Bottom