2009-01-15 28 views
10

Đoạn mã dưới đây thay đổi trạng thái xác thực dữ liệu của ô và chạy khi trang tính Excel-2003 không được bảo vệ. Tuy nhiên, khi tôi bảo vệ sheet công việc vĩ mô không chạy và đặt ra một lỗi thời gian chạyLàm cách nào để tránh lỗi thời gian chạy khi trang tính được bảo vệ trong MS-Excel?

Run-time error '-2147417848 (80010108)':

Method 'Add' of object 'Validation' failed

Tôi đã thử gói mã với

Me.unprotect 
... 
Me.protect 

Nhưng điều này không làm việc đúng cách. Vì vậy, làm thế nào tôi có thể sửa đổi mã dưới đây để làm việc (tức là có mã sửa đổi xác nhận của ô mở khóa) khi trang tính được bảo vệ mà không có lỗi thời gian chạy ở trên?

Cập nhật

cuốn sách tác phẩm gốc của tôi là một Excel 2003. Tôi đã thử nghiệm @ giải pháp eJames trong Excel 2007 với định nghĩa sau đây cho Workbook_Open

Sub WorkBook_Open() 
    Me.Worksheets("MainTable").Protect contents:=True, userinterfaceonly:=True 
End Sub 

Mã này vẫn không thành công với những điều sau run- lỗi thời gian khi trang tính được bảo vệ

Run-time error '1004': Application-defined or object-defined error

Xin cảm ơn, Azim


Code Snippet

'cell to add drop down validation list' 
dim myNamedRange as String 
dim modifyCell as Range 
modifyCell = ActiveCell.Offset(0,1) 


' set list values based on some conditions not defined for brevitity' 
If myCondition then 
    myNamedRange = "range1" 
Else 
    myNamedRange = "range2" 
End If 

With modifyCell.Validation 
    .Delete 

    'Run time error occurs on the next line' 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAltertStop, _ 
     Operator:=xlBetween, Formula1:="=" & myNamedRange 

    ... 
    ' skipping more property setting code ' 
    ... 
End With 
+0

bản sao có thể có của [Cách bảo vệ các ô trong Excel nhưng cho phép chúng được sửa đổi bởi tập lệnh VBA] (http://stackoverflow.com/questions/125449/how-to-protect-cells-in-excel-but- cho phép-những-được-được-sửa-by-vba-script) –

Trả lời

11

Nếu tôi hiểu câu hỏi một cách chính xác, bạn sẽ là người bảo vệ tấm. Nếu đúng như vậy, bạn có thể sử dụng VBA sau:

myWorksheet.Protect contents:=True, userinterfaceonly:=True 

Phần quan trọng ở đây là "userinterfaceonly: = true". Khi một trang tính được bảo vệ bằng bộ cờ này, các macro VBA vẫn được phép thực hiện thay đổi.

Đặt mã này vào sự kiện WorkBook_Activate để tự động bảo vệ sổ làm việc và đặt cờ bất cứ khi nào được kích hoạt.

Chỉnh sửa: Cảm ơn Lance Roberts để được đề xuất sử dụng Workbook_Activate thay vì Workbook_Open.

Chỉnh sửa: Vì ở trên dường như không hoạt động, bạn có thể phải bọc phần không thành công của mã VBA của bạn với các lệnh không được bảo vệ/bảo vệ. Nếu bạn làm điều đó, tôi cũng sẽ quấn Toàn bộ macro với một xử lý lỗi, do đó tờ không bị bỏ không được bảo vệ sau khi một lỗi:

Sub MyMacro 
    On Error Goto HandleError 

    ... 

    myWorksheet.unprotect 
    With ModifyCell.Validation 
     ... 
    End With 
    myWorksheet.protect contents:=True, userinterfaceonly:=True 

    ... 

Goto SkipErrorHandler 
HandleError: 
    myWorksheet.protect contents:=True, userinterfaceonly:=True 
    ... some code to present the error message to the user 
SkipErrorHandler: 
End Sub 

Edit: Hãy nhìn vào this thread tại PCreview. Họ đã trải qua nhiều bước tương tự, và đi đến cùng một kết luận. Ít nhất bạn không phải một mình!

+0

http://support.microsoft.com/kb/810788 để biết thông tin về mật khẩu. – Fionnuala

+0

Cảm ơn bạn đã liên kết, Remou. Tôi chưa gặp phải vấn đề đó, nhưng ít nhất giờ tôi sẽ biết chuyện gì đang xảy ra khi nó xảy ra! –

+0

có bạn hiểu câu hỏi của tôi một cách chính xác; Tôi là người bảo vệ tờ giấy. Tôi đã thử giải pháp của bạn (trong Excel 2007) và nhận được lỗi Thời gian chạy '1004' khi trang tính được bảo vệ. – Azim

2

Tôi không chắc đây có phải là giải pháp toàn cầu hay không, nhưng khi tôi gặp lỗi này gần đây, tôi chỉ cần thực hiện MywkSheet.Activate ngay trước khi tôi thực hiện Validation.Add.Vì vậy:

' set list values based on some conditions not defined for brevitity' 
If myCondition then 
    myNamedRange = "range1" 
Else 
    myNamedRange = "range2" 
End If 

''-------------------------------------------------- 
Sheets("mysheet").Activate 
''-------------------------------------------------- 

With modifyCell.Validation 
    .Delete 

    'Run time error occurs on the next line' 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAltertStop, _ 
     Operator:=xlBetween, Formula1:="=" & myNamedRange 

    ... 
    ' skipping more property setting code ' 
    ... 
End With 

trong trường hợp của tôi, ScreenUpdating đã tắt, vì vậy người dùng không bao giờ thấy các trang tính chuyển đổi qua lại. HTH.

Các vấn đề liên quan