2013-07-24 46 views
7

Tôi đang cố thiết kế sổ làm việc với một số hạn chế mà không sử dụng VBA trong Excel, tương thích trong năm 2007 và 2010. Tôi đã chọn "Trình chỉnh sửa giao diện người dùng tùy chỉnh cho Microsoft Office" với mã XML để hạn chế một số tùy chọn: - Lưu như với tab thông tin, Chèn, Xóa, Di chuyển/Sao chép Trang tính, Ẩn trang tính, Bỏ ẩn trang tính. Tôi đã thành công khi làm như vậy nhưng tôi đã nhận thấy rằng tab chèn tấm "ICON"Tên điều khiển cho tab chèn

enter image description here

vẫn làm việc và có thể truy cập. Bất cứ ai có thể chỉ cho tôi để kiểm soát tên để vô hiệu hóa nó thông qua XML trong tập tin xin vui lòng?

Mã của tôi là:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"> 
    <commands> 
       <command idMso="FileSaveAsWebPage" enabled="false" /> 
       <command idMso="FileSaveAs" enabled="false" /> 
       <command idMso="FileSaveAsMenu" enabled="false" /> 
       <command idMso="FileSaveAsExcelXlsx" enabled="false" /> 
       <command idMso="FileSaveAsExcelXlsxMacro" enabled="false" /> 
       <command idMso="FileSaveAsExcel97_2003" enabled="false" /> 
       <command idMso="FileSaveAsExcelOpenDocumentSpreadsheet" enabled="false" /> 
       <command idMso="FileSaveAsPdfOrXps" enabled="false" /> 
       <command idMso="FileSaveAsOtherFormats" enabled="false" /> 

       <command idMso="SheetInsert" enabled="false" /> 
       <command idMso="SheetInsertPage" enabled="false" /> 
       <command idMso="SheetDelete" enabled="false" /> 
       <command idMso="SheetRename" enabled="false" /> 
       <command idMso="SheetMoveOrCopy" enabled="false" /> 
       <command idMso="SheetUnhide" enabled="false" /> 
       <command idMso="SheetProtect" enabled="false" /> 
       <command idMso="SheetTabColorGallery" enabled="false" /> 
       <command idMso="SheetTabColorMoreColorsDialog" enabled="false" /> 
      <command idMso="SelectAllSheets" enabled="false" /> 
    </commands> 
    <backstage> 
      <tab idMso="TabInfo" visible="false"/> 
    </backstage> 
</customUI> 

Tôi đã cố gắng tìm kiếm Microsoft và rondebruin cho giao diện Office Fluent User Control định danh cũng có.

+0

Bạn có thể tìm thấy tất cả 2010 'idMso's [ở đây] (http://www.microsoft.com/en-us/download/details.aspx?id=6627) –

+0

Cảm ơn bạn Mehow đã phản hồi nhanh, Có tôi có một bản sao của cùng một, tôi đã cố gắng sử dụng điều khiển có tên "SheetInsertPage" (như đã đề cập trong mã trên) vẫn còn tôi không thể làm cho nó vô hiệu hóa. bạn có thể đề xuất thêm cho tôi –

+0

[Có thể có liên quan] (http://stackoverflow.com/questions/16766034/hide-new-sheet-tab#comment24774096_16766034). – pnuts

Trả lời

1

Bạn có thể chọn tab Đánh giá, chọn Bảo vệ sổ làm việc và kiểm tra Cấu trúc. Bạn không cần phải chỉ định mật khẩu và nút Chèn Bảng tính sẽ bị vô hiệu hóa (nhưng vẫn hiển thị).

Hoặc bạn có thể vào Options Excel từ Office Button, tab Advanced, cuộn xuống tùy chọn hiển thị cho bảng tính này và bỏ chọn Hiển thị tab sheet.

Tôi không tin rằng điều này có thể được thực hiện từ XML. Đó là, để vô hiệu hóa hoặc ẩn nút này (không ẩn tất cả các tab trang tính). Có lẽ ai đó có thể chứng minh cho tôi sai;)

+0

Tôi đã cố gắng để chứng minh bạn sai, nhưng tôi không thể làm điều đó ... – Floris

+0

Tôi sẽ không buồn nếu ai đó chứng minh tôi sai;) nhưng tôi cảm thấy khá tự tin, vì nó là một phần không thể thiếu của giao diện người dùng. –

+0

Tôi vẫn tin rằng nó có thể đạt được. Một mặt tối còn lại là trái chưa được khám phá. tôi sẽ cho bạn biết khi tôi đi qua. –

4

Để thực hiện điều này thông qua XML, bạn cần có khả năng truy cập vào phần tử - nó cần có ID. Quét theo cách thủ công thông qua các danh sách khác nhau mà Microsoft xuất bản không có gì hữu ích, nhưng vì tài liệu của họ nổi tiếng cẩu thả, tôi quyết định viết một đoạn mã rất nhỏ tìm ID của "mọi điều khiển với ID" trong ứng dụng Excel và danh sách nó:

Sub listID() 
Dim r As Range 
Dim ctls 
Dim ii As Long 

Cells(1, 1).Value = "ID" 
Cells(1, 2).Value = "caption" 
Cells(1, 3) = "Type" 
Set r = Range("a1") 

For ii = 1 To 100000 
    Set ctls = CommandBars.FindControl(Id:=ii) 
    If Not (ctls Is Nothing) Then 
    'Debug.Print "controls ID " & ii & " exists; the caption is " & ctls.Caption & "; the type is " & ctls.Type 
    Set r = r.Offset(1, 0) 
    r.Value = ii 
    r.Offset(0, 1) = ctls.Caption 
    r.Offset(0, 2) = ctls.Type 
    r.Offset(0, 3) = ctls.TooltipText 
    End If 
Next ii 

End Sub 

Sau khi tôi chạy này, và lọc trên bất cứ điều gì với eet trong tên, tôi sẽ mong đợi để xem tất cả các điều khiển "có thể được kiểm soát" (vì họ có một msoID) và có liên quan đến " Trang tính ". Sau đây là bản chụp của điều này tạo ra:

enter image description here

Khi tôi di chuột của tôi trong "nút" bạn muốn ẩn, tôi nhận được tooltip "Insert Sheet" - mà không phải là bất kỳ những cái tôi có thể thấy trong danh sách của tôi. Tôi kết luận từ điều này rằng nó thực sự là không thể làm những gì bạn đang yêu cầu - bạn không thể vô hiệu hóa nút đó bằng XML.

Điều đó không có nghĩa là bạn không thể đạt được những gì bạn muốn. Tôi sẽ đề nghị các phương pháp sau đây.

  1. Bẫy sự kiện sổ làm việc được kích hoạt khi tạo trang tính mới và xóa ngay tại chỗ. Khi nút "ngừng hoạt động" mọi người sẽ sớm từ bỏ. Mã ví dụ bên dưới.
  2. Ẩn hoàn toàn các trang tính và cung cấp phương pháp điều hướng thay thế giữa các trang tính. Vì đây rõ ràng là "bảng tính được kiểm soát" có thể là một ý tưởng hay. Bạn có thể tạo một tab tùy chỉnh trên ruy-băng (bằng cách sử dụng XML, bạn dường như quen thuộc với điều đó) hoặc tạo một thanh công cụ nổi nằm ở cuối trang tính - gần với các tab "cũ".Theo cách đó, bạn mô phỏng hành vi - nhưng đó là rất nhiều công việc và một chút hack
  3. Thêm bảo vệ vào sổ làm việc. Sử dụng Protection -> Protect Workbook -> "Bảo vệ cấu trúc": sheets can not be moved, deleted, hidden, unhidden, or renamed. New sheets cannot be inserted.

Mã này bạn sẽ phải thêm vào ThisWorkbook là:

Private Sub Workbook_NewSheet(ByVal Sh As Object) 
    Dim temp As Boolean 
    temp = Application.DisplayAlerts 
    Application.DisplayAlerts = False 
    Sh.Delete 
    Application.DisplayAlerts = temp 
End Sub 

Một khi điều này là trong bảng tính của bạn, bất cứ lúc nào người dùng nhấp nút "trang tính mới" sẽ có flash rất ngắn nhưng không có trang tính mới nào được tạo. Bạn có thể thêm Application.ScreenUpdating = False nhưng đèn flash ngắn gọn vẫn còn ...

Xin lỗi tôi không có tin tốt hơn cho bạn.

+0

Cảm ơn Floris, Nhưng tôi xin lỗi để nói rằng tôi đang tìm một giải pháp trong XML chỉ . Mục đích chính là hạn chế người dùng không có Macro; VBA. tôi đã nghĩ đến việc chỉ sử dụng thông qua XML vì điều này tích hợp vào tập tin tôi chia sẻ và do đó để người dùng với các tùy chọn ít hơn và hạn chế. Làm thế nào bao giờ tôi rất cảm ơn đầy đủ cho những nỗ lực của bạn để crack.Once cảm ơn bạn rất nhiều Floris. –

+0

Tôi nhận ra bạn đã yêu cầu giải pháp XML duy nhất - tôi nghi ngờ (dựa trên điều trên) có thể không thực hiện được. Tôi có thể hỏi _why_ bạn không muốn bất kỳ VBA nào ở chế độ nền hoặc bảo vệ cấu trúc bảng tính - một trong số đó có xuất hiện để giải quyết vấn đề không? Tôi tò mò ... – Floris

+0

Hầu hết người dùng của tôi không biết về nó. (Thay vào đó tôi muốn nói rằng tôi đã cố gắng sử dụng bảo vệ; nhưng người dùng nhiệt tình của tôi phá vỡ nó và sửa đổi tất cả các thời gian). Tôi đã thử VBA trong nhiều trường hợp tôi thấy rằng, nếu bảo mật không bị vô hiệu hóa/cho phép; sau đó mục tiêu bị mất.Sau khi tìm kiếm thông qua tôi đã đưa ra xml đó là an toàn hơn (dựa trên các nguồn lực và điều kiện của người dùng của tôi). –