ActiveWorkbook.WritePassword chạy không chính xác trên MSE2010 / WIN7 (1 người xem)

  • Thread starter Thread starter USB1394
  • Ngày gửi Ngày gửi

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

USB1394

Thành viên hoạt động
Tham gia
20/12/08
Bài viết
173
Được thích
12
Nghề nghiệp
Lính triều đình
Mình có 1 thủ tục chạy tốt trên MSE 2003 (đuôi *.xls) nhưng khi chạy trên MSE 2010 (sửa thành đuôi *.xlsm) thì code chạy không chính xác nữa (Không lưu file ở chế độ Read-only) . Mong các Bạn giúp chỉnh lại code trên dùm . Xin cám ơn +-+-+-++-+-+-++-+-+-+
Mã:
Sub SaveReadOnlyWB()
    Ten = "SaveWB Mode Readonly " & Format(Now(), "hhmmss")
    With ActiveWorkbook
        .WritePassword = "chuot"
        .SaveCopyAs .Path & "\" & Ten & ".xlsm" 'for: MSE 2010
        '.SaveCopyAs .Path & "\" & Ten & ".xls" 'for: MSE 2003
        .WritePassword = ""
    End With
End Sub
 

File đính kèm

Mình có 1 thủ tục chạy tốt trên MSE 2003 (đuôi *.xls) nhưng khi chạy trên MSE 2010 (sửa thành đuôi *.xlsm) thì code chạy không chính xác nữa (Không lưu file ở chế độ Read-only) . Mong các Bạn giúp chỉnh lại code trên dùm . Xin cám ơn +-+-+-++-+-+-++-+-+-+
Mã:
Sub SaveReadOnlyWB()
    Ten = "SaveWB Mode Readonly " & Format(Now(), "hhmmss")
    With ActiveWorkbook
        .WritePassword = "chuot"
        .SaveCopyAs .Path & "\" & Ten & ".xlsm" 'for: MSE 2010
        '.SaveCopyAs .Path & "\" & Ten & ".xls" 'for: MSE 2003
        .WritePassword = ""
    End With
End Sub
Thử code này xem sao
Mã:
Sub SaveReadOnlyWB1()
Dim Ten As String
    Ten = "SaveWB Mode Readonly " & Format(Now(), "hhmmss")
    With ActiveWorkbook
        .SaveAs .Path & "\" & Ten, xlOpenXMLWorkbookMacroEnabled, "Chuot", , True
        '.WritePassword = "chuot"
        '.SaveCopyAs .Path & "\" & Ten & ".xlsm" 'for: MSE 2010
        '.SaveCopyAs .Path & "\" & Ten & ".xls" 'for: MSE 2003
        '.WritePassword = ""
    End With
End Sub
 
Thử code này xem sao
Mã:
Sub SaveReadOnlyWB1()
Dim Ten As String
    Ten = "SaveWB Mode Readonly " & Format(Now(), "hhmmss")
    With ActiveWorkbook
        .SaveAs .Path & "\" & Ten, xlOpenXMLWorkbookMacroEnabled, "Chuot", , True
        '.WritePassword = "chuot"
        '.SaveCopyAs .Path & "\" & Ten & ".xlsm" 'for: MSE 2010
        '.SaveCopyAs .Path & "\" & Ten & ".xls" 'for: MSE 2003
        '.WritePassword = ""
    End With
End Sub

Xin cám ơn bạn , trong trường hợp này mình không dùng SaveAs , vì giữa SaveAs và SaveCopyAs khác nhau , mà mình muốn ghi file này thành file khác (có Read-only) trong khi file gốc vẫn mở , không biết có cách khắc phục nào không bạn ?
 
Xin cám ơn bạn , trong trường hợp này mình không dùng SaveAs , vì giữa SaveAs và SaveCopyAs khác nhau , mà mình muốn ghi file này thành file khác (có Read-only) trong khi file gốc vẫn mở , không biết có cách khắc phục nào không bạn ?
Vậy thử code này lại xem sao
Mã:
Sub SaveReadOnlyWB()
    Dim Ten As String
    Ten = ActiveWorkbook.Path & "\" & "SaveWB Mode Readonly " & Format(Now(), "hhmmss") & ".xlsm"
    With ActiveWorkbook
        .WritePassword = "chuot"
        .SaveCopyAs Ten
        '.SaveCopyAs .Path & "\" & Ten & ".xlsm" 'for: MSE 2010
        '.SaveCopyAs .Path & "\" & Ten & ".xls" 'for: MSE 2003
        .WritePassword = ""
    End With
    Call SetAttr(Ten, vbReadOnly)
End Sub
 
Vậy thử code này lại xem sao
Mã:
Sub SaveReadOnlyWB()
    Dim Ten As String
    Ten = ActiveWorkbook.Path & "\" & "SaveWB Mode Readonly " & Format(Now(), "hhmmss") & ".xlsm"
    With ActiveWorkbook
        .WritePassword = "chuot"
        .SaveCopyAs Ten
        '.SaveCopyAs .Path & "\" & Ten & ".xlsm" 'for: MSE 2010
        '.SaveCopyAs .Path & "\" & Ten & ".xls" 'for: MSE 2003
        .WritePassword = ""
    End With
    Call SetAttr(Ten, vbReadOnly)
End Sub

Cách này gần giống yêu cầu,nhưng khác ở chỗ không có hiện hộp thoại nhập Pass Read-only (nếu ta cần chỉnh file thì ko đc) . Cái Read-only mà mình đề cập ở đây là của Excel , còn cái bạn dùng là của thuộc tính File (file properties) . Nên dòng WritePassword = "chuot" không có giá trị . Mong bạn xem lại
 
Lần chỉnh sửa cuối:
bạn nmhung49 ở miền tây mà ở tỉnh nào vậy ?
 
Cách này gần giống yêu cầu,nhưng khác ở chỗ không có hiện hộp thoại nhập Pass Read-only (nếu ta cần chỉnh file thì ko đc) . Cái Read-only mà mình đề cập ở đây là của Excel , còn cái bạn dùng là của thuộc tính File (file properties) . Nên dòng WritePassword = "chuot" không có giá trị . Mong bạn xem lại

Hình như office 2007,2010 không hỗ trợ trường hợp này thì phải?
 
Mình có 1 thủ tục chạy tốt trên MSE 2003 (đuôi *.xls) nhưng khi chạy trên MSE 2010 (sửa thành đuôi *.xlsm) thì code chạy không chính xác nữa (Không lưu file ở chế độ Read-only) . Mong các Bạn giúp chỉnh lại code trên dùm . Xin cám ơn +-+-+-++-+-+-++-+-+-+
Mã:
Sub SaveReadOnlyWB()
    Ten = "SaveWB Mode Readonly " & Format(Now(), "hhmmss")
    With ActiveWorkbook
        .WritePassword = "chuot"
        .SaveCopyAs .Path & "\" & Ten & ".xlsm" 'for: MSE 2010
        '.SaveCopyAs .Path & "\" & Ten & ".xls" 'for: MSE 2003
        .WritePassword = ""
    End With
End Sub

Bạn muốn tạo bản sao mà muốn mở thì chỉ mở được ở chế độ Read-Only? Nếu thế thì mật khẩu để mà làm gì? Chỉ có 1 cách duy nhất để mở tập tin thì hiển thị cửa sổ bất kỳ nào đó để làm gì? Để hỏi: "... Hay là ông nghĩ lại và ông muốn mở Read Write?. Nếu thế thì nhập mật khẩu nhé ông"???

Nếu cần lập bản sao chỉ để mở ReadOnly thì
1. code trong ThisWorkbook
Mã:
Private Sub Workbook_Open()
    If ThisWorkbook.Name Like prefix & "*" Then
        Application.DisplayAlerts = False
        .ChangeFileAccess xlReadOnly
        Application.DisplayAlerts = True
    End If
'   các code khác 
End Sub

2.
code trong Module
Mã:
Public Const [COLOR=#ff0000]prefix[/COLOR] As String = "SaveWB Mode Readonly"

Sub SaveReadOnlyWB()
Dim ten As String
    ten = prefix & " " & Format(Now(), "hhmmss")
    With ActiveWorkbook
        .SaveCopyAs .Path & "\" & ten & ".xlsm"
    End With
End Sub

prefix tư thay đổi cho thích hợp
 
Nếu cần lập bản sao chỉ để mở ReadOnly thì
1. code trong ThisWorkbook
Mã:
Private Sub Workbook_Open()
    If ThisWorkbook.Name Like prefix & "*" Then
        Application.DisplayAlerts = False
        .ChangeFileAccess xlReadOnly
        Application.DisplayAlerts = True
    End If
'   các code khác 
End Sub

2.
code trong Module
Mã:
Public Const [COLOR=#ff0000]prefix[/COLOR] As String = "SaveWB Mode Readonly"

Sub SaveReadOnlyWB()
Dim ten As String
    ten = prefix & " " & Format(Now(), "hhmmss")
    With ActiveWorkbook
        .SaveCopyAs .Path & "\" & ten & ".xlsm"
    End With
End Sub

prefix tư thay đổi cho thích hợp

Hình như không đúng yêu cầu của tác giả Chú Siwtom ah nếu code chỉnh thành như thế này
[GPECODE=vb]
Sub SaveReadOnlyWB()
Dim Ten As String

Ten = "SaveWB Mode Readonly " & Format(Now(), "hhmmss")
With ActiveWorkbook
.WritePassword = "chuot"
.SaveCopyAs .Path & "\" & Ten & ".xls" 'for: MSE 2003
.WritePassword = ""
End With

End Sub


[/GPECODE]
Làm trên office 2010 vẫn được mặc dù báo lỗi sai format khi đó sẽ hiện ra hộp thoại yêu cầu nhập pass để mở chế độ ReadOnly hay Readwrite. Nhưng trên office 2007 thì được ý kiến test trên máy cá nhân đính kèm file, không biết USB kiểm tra thế nào?
 
Lần chỉnh sửa cuối:
Hình như không đúng yêu cầu của tác giả Chú Siwtom ah nếu code chỉnh thành như thế này
[GPECODE=vb]
Sub SaveReadOnlyWB()
Dim Ten As String

Ten = "SaveWB Mode Readonly " & Format(Now(), "hhmmss")
With ActiveWorkbook
.WritePassword = "chuot"
.SaveCopyAs .Path & "\" & Ten & ".xls" 'for: MSE 2003
.WritePassword = ""
End With

End Sub


[/GPECODE]
Làm trên office 2010 vẫn được mặc dù báo lỗi sai format khi đó sẽ hiện ra hộp thoại yêu cầu nhập pass để mở chế độ ReadOnly hay Readwrite. Nhưng trên office 2007 thì được ý kiến test trên máy cá nhân đính kèm file, không biết USB kiểm tra thế nào?

Với code trích thì trên Excel 2007 khi mở tập tin có mật khẩu "chuot" thì user có 2 lựa chọn: hoặc chọn ReadOnly để mở ở chế độ ReadOnly, hoặc nhập mật khẩu "chuột" để mở ReadWrite.

Nếu chủ chủ đề cần có 2 khả năng thì code trên là đúng rồi còn gì? Trên Excel 2007 là thế còn trên Excel 2010 không có 2 khả năng? Thế thì lạ thật.

Code của tôi là cho trường hợp chỉ có 1 lựa chọn duy nhất là ReadOnly. Tôi cũng nói rõ trong bài viết.
 
vấn đề là : trong file gốc chứa code của bạn đang ở chế độ Read-only . Bây giờ mình đem đoạn code trên vào 1 file không có đặt chế độ Read-only và chạy code để tạo bản sao . Khi mở bản sao lên không thấy file sao chép ở chế độ bình thường không có read-only ,chắc phải chỉnh lại bạn ơi .

Còn về ý kiến của bạn siwtom
Bạn muốn tạo bản sao mà muốn mở thì chỉ mở được ở chế độ Read-Only? Nếu thế thì mật khẩu để mà làm gì? Chỉ có 1 cách duy nhất để mở tập tin thì hiển thị cửa sổ bất kỳ nào đó để làm gì? Để hỏi: "... Hay là ông nghĩ lại và ông muốn mở Read Write?. Nếu thế thì nhập mật khẩu nhé ông"???
Việc tạo bản sao ở chế độ Read-only để giúp mình bảo vệ dữ liệu , chỉ cho mọi người xem , còn sửa thì phải có Pass mới được . Điều này cũng rất thực tế mà bạn ! Mong sẽ nhận đc thêm nhiều sự giúp đỡ của bạn , xin cám ơn 2 bạn rất nhiều
 
Lần chỉnh sửa cuối:
Nếu cần lập bản sao chỉ để mở ReadOnly thì
1. code trong ThisWorkbook
Code:
Private Sub Workbook_Open()
If ThisWorkbook.Name Like prefix & "*" Then
Application.DisplayAlerts = False
.ChangeFileAccess xlReadOnly
Application.DisplayAlerts = True
End If
' các code khác
End Sub
2.
code trong Module
Code:
Public Const prefix As String = "SaveWB Mode Readonly"

Sub SaveReadOnlyWB()
Dim ten As String
ten = prefix & " " & Format(Now(), "hhmmss")
With ActiveWorkbook
.SaveCopyAs .Path & "\" & ten & ".xlsm"
End With
End Sub
prefix tư thay đổi cho thích hợp
Nếu ta đổi tên file thì sẽ vô hiệu hóa tính năng read-only trong file này . Cái này không đúng vấn đề của mình
 
Nếu ta đổi tên file thì sẽ vô hiệu hóa tính năng read-only trong file này . Cái này không đúng vấn đề của mình

Vấn đề là tôi không hiểu được ý bạn muốn gì mà thôi.

Cái code có pass = "chuot" mà chạy trên Excel 2007 thì rõ ràng là đạt yêu cầu của bạn rồi còn gì. Tức khi mở tập tin thì luôn có 2 lựa chọn: nếu nhấn nút ReadOnly thì tập tin được mở nhưng không thay đổi được. Còn nếu nhập pass = "chuot" thì mở ReadWrite.

Đọc kỹ thì tôi đoán là trên Excel 2010 không có 2 khả năng lựa chọn?

Nếu nói về Excel 2010 thì tôi không nghiên cứu vì tôi không cài.

Còn về code ReadOnly - 1 lựa chọn duy nhất thì đó chỉ là vd. Nếu bạn muốn thay đổi tên tập tin thì khó gì đâu. Thay

Mã:
If ThisWorkbook.Name Like prefix & "*" Then

bằng

Mã:
IF Sheets("híchíc").Cells(1000000,1000).Value = "tèn tèn" THEN

Tất nhiên trong Sub SaveReadOnlyWB phải ghi "tèn tèn" vào đúng chỗ. Sau khi gọi SaveCopyAs thì xóa đi.

Ngồi rảnh nghĩ ra cả đống cách. Người khác chỉ giúp ý tưởng thôi, còn chi tiết kỹ thuật thì tự có sáng kiến chứ nhỉ? Nói ngắn gọn thì nếu đi theo hướng này thì triết lý là: trong SaveReadOnlyWB phải gán cho tập tin một "đặc điểm gì đó", bất luận đó là gì vd. tô môi, độn ngực, hở rốn, mắt lé, chân vòng kiềng ... Còn trong Workbook_Open thì kiểm tra tập tin có "đặc điểm gì đó" không. Đó là tô môi, hay độn ngực, hay hở rốn, hay mắt lé, hay chân vòng kiềng, và thực hiện bằng cách nào thì là chi tiết kỹ thuật. Hãy có sáng kiến thêm.
 
vấn đề là : trong file gốc chứa code của bạn đang ở chế độ Read-only . Bây giờ mình đem đoạn code trên vào 1 file không có đặt chế độ Read-only và chạy code để tạo bản sao . Khi mở bản sao lên không thấy file sao chép ở chế độ bình thường không có read-only ,chắc phải chỉnh lại bạn ơi .

Còn về ý kiến của bạn siwtom
Việc tạo bản sao ở chế độ Read-only để giúp mình bảo vệ dữ liệu , chỉ cho mọi người xem , còn sửa thì phải có Pass mới được . Điều này cũng rất thực tế mà bạn ! Mong sẽ nhận đc thêm nhiều sự giúp đỡ của bạn , xin cám ơn 2 bạn rất nhiều

Bây giờ ta đổi thành code này thử xem sao

[GPECODE=vb]
Sub SaveReadOnlyWB1()
Dim Ten As String
Dim wb As Workbook
Ten = ActiveWorkbook.Path & "\" & "SaveWB Mode Readonly " & Format(Now(), "hhmmss") & ".xlsm"
Application.DisplayAlerts = False
With ActiveWorkbook
.SaveCopyAs Ten
End With
Set wb = Workbooks.Open(Ten)
With wb
.SaveAs Ten, xlOpenXMLWorkbookMacroEnabled, "Chuot", , True
.Close False
End With
Application.DisplayAlerts = True

End Sub


[/GPECODE]

Khi mở workbook được SaveCopyas nó hiện hỏi pass bạn nhập pass vào rồi Excel sẽ hiện thông báo tiếp nếu bạn nhấn Yes thì workbook sẽ ở chế đó ReadOnly, nếu bạn chọn No workbook sẽ ở chế độ ReadWrite. Đã test trên Office 2010 Neu không đúng mình cũng không còn cách nào nữa --=0. Có thể office 2010 không còn hỗ trợ giống 2003 nữa
 

File đính kèm

Lần chỉnh sửa cuối:
Cái code có pass = "chuot" mà chạy trên Excel 2007 thì rõ ràng là đạt yêu cầu của bạn rồi còn gì. Tức khi mở tập tin thì luôn có 2 lựa chọn: nếu nhấn nút ReadOnly thì tập tin được mở nhưng không thay đổi được. Còn nếu nhập pass = "chuot" thì mở ReadWrite.

Đọc kỹ thì tôi đoán là trên Excel 2010 không có 2 khả năng lựa chọn?
Chắc dự đoán của bạn đúng rùi , Mình đang dùng MSE 2010 . Không biết trên MSE 2010 có cách nào làm giống như trên MSE 2007 không bạn
 
Bây giờ ta đổi thành code này thử xem sao

[GPECODE=vb]
Sub SaveReadOnlyWB1()
Dim Ten As String
Dim wb As Workbook
Ten = ActiveWorkbook.Path & "\" & "SaveWB Mode Readonly " & Format(Now(), "hhmmss") & ".xlsm"
Application.DisplayAlerts = False
With ActiveWorkbook
.SaveCopyAs Ten
End With
Set wb = Workbooks.Open(Ten)
With wb
.SaveAs Ten, xlOpenXMLWorkbookMacroEnabled, "Chuot", , True
.Close False
End With
Application.DisplayAlerts = True

End Sub


[/GPECODE]

Khi mở workbook được SaveCopyas nó hiện hỏi pass bạn nhập pass vào rồi Excel sẽ hiện thông báo tiếp nếu bạn nhấn Yes thì workbook sẽ ở chế đó ReadOnly, nếu bạn chọn No workbook sẽ ở chế độ ReadWrite. Đã test trên Office 2010 Neu không đúng mình cũng không còn cách nào nữa --=0. Có thể office 2010 không còn hỗ trợ giống 2003 nữa
Đây cũng là 1 ý tưởng , mình sẽ kiểm tra thử , nếu có gì sẽ gởi phản hồi cho bạn nhé ! Xin cám ơn bạn
 

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

Back
Top Bottom