2013-07-24 10 views
7

Próbuję zaprojektować skoroszyt z pewnymi ograniczeniami bez użycia języka VBA w programie Excel, który jest zgodny w 2007 i 2010. Wybrałem "Niestandardowy edytor interfejsu dla pakietu Microsoft Office" z kodem XML, aby ograniczyć kilka opcje: - Zapisz-jak przy karcie informacyjnej, Wstaw, Usuń, Przenieś/Kopiuj arkusz, Ukryj arkusz, Odkryj arkusze. I udało się robi tak, ale zauważyłem, że kartę arkusza insert „ikona”Nazwa formantu dla zakładki Wstawka

enter image description here

nadal działa i jest dostępny. Czy ktoś może wskazać mi nazwę kontrolną, aby wyłączyć ją za pomocą pliku XML w pliku?

Mój kod to:

<?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> 

Próbowałem szukając Microsoft i rondebruin dla interfejsu użytkownika Office Fluent Kontroli Identyfikatory również.

+0

Możesz znaleźć wszystkie 2010 'idMso's [tutaj] (http://www.microsoft.com/en-us/download/details.aspx?id=6627) –

+0

Dziękuję Mehow za szybką reakcję, tak ja mieć kopię tego samego, próbowałem przy użyciu formantu o nazwie "SheetInsertPage" (jak wspomniano w powyższym kodzie) nadal nie mogę go wyłączyć. czy możesz zaproponować mi więcej –

+0

[Może być istotne] (http://stackoverflow.com/questions/16766034/hide-new-sheet-tab#comment24774096_16766034). – pnuts

Odpowiedz

1

Możesz wybrać kartę Recenzja, wybrać opcję Ochrona skoroszytu i sprawdzić strukturę. Nie musisz podawać hasła, a przycisk Wstaw arkusz zostanie wyłączony (ale nadal widoczny).

Albo można przejść do Opcji Excel z przycisk Office, zakładka Zaawansowane, przewiń do opcji wyświetlania dla tego skoroszytu i odznacz zaczepy Pokaż arkuszy.

Nie wierzę, że można to zrobić z XML. To znaczy, aby wyłączyć lub ukryć ten przycisk (bez ukrywania wszystkich zakładek arkusza). Być może ktoś może mi udowodnić, że się mylę;)

+0

Bardzo się starałem udowodnić, że się mylisz, ale nie mogłem tego zrobić ... – Floris

+0

Nie byłbym zły, gdyby ktoś mi udowodnił, że jestem zła;) ale czuję się pewnie, ponieważ jest to integralna część interfejsu. –

+0

Wciąż wierzę, że można to osiągnąć. Pozostaje ciemna strona, która pozostaje niezbadana. Poinformowałbym cię, gdybym się pojawił. –

4

Aby to zrobić za pomocą XML, musisz mieć dostęp do elementu - musi on mieć ID. Ręczne skanowanie różnych list opublikowanych przez Microsoft nie przyniosło żadnych rezultatów, ale ponieważ ich dokumentacja jest notorycznie niechlujna, postanowiłem napisać bardzo mały fragment kodu, który znajdzie identyfikator "każdy element sterujący z identyfikatorem" w aplikacji programu Excel oraz listy to:

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 

Po uruchomieniu tego i filtrować na niczym z eet w nazwie, Spodziewam się, aby zobaczyć wszystkie elementy sterujące „które mogą być kontrolowane” (ponieważ mają one msoID) i że odnoszą się do " Pościel". Poniżej znajduje się zrzut co to produkuje:

enter image description here

Kiedy unoszą moje myszy nad przyciskiem „” chcesz się ukryć, mam podpowiedzi „Wstaw arkusz” - który nie jest dowolne z te, które widzę na mojej liście. Wnioskuję z tego, że rzeczywiście nie można zrobić tego, o co prosisz - nie możesz wyłączyć tego przycisku za pomocą XML.

To nie znaczy, że nie możesz osiągnąć tego, co chcesz. Sugerowałbym następujące podejścia.

  1. Przechwytuje wydarzenie skoroszytu, które jest wyzwalane podczas tworzenia nowego arkusza i usuwa je na miejscu. Kiedy przycisk "przestaje działać" ludzie wkrótce się poddadzą. Przykładowy kod poniżej.
  2. Ukryj całkowicie zakładki arkuszy i podaj alternatywną metodę nawigacji między arkuszami. Ponieważ jest to oczywiście "kontrolowany arkusz kalkulacyjny", który i tak może być dobrym pomysłem. Możesz utworzyć niestandardową kartę na wstążce (używając XML-a, możesz to zrobić) lub utworzyć pływający pasek narzędzi, który znajduje się u dołu arkusza - blisko miejsca, w którym znajdowały się "stare" karty.W ten sposób symulujesz zachowanie - ale wymaga to dużo pracy i trochę hackowania. Dodaj ochronę do skoroszytu. Zastosowanie Ochrona -> Chroń skoroszyt -> „Chronić strukturę”: sheets can not be moved, deleted, hidden, unhidden, or renamed. New sheets cannot be inserted.

Kod trzeba by dodać do ThisWorkbook jest:

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 

Po to jest w skoroszycie, za każdym razem, gdy użytkownik kliknie przycisk "nowy arkusz" będzie bardzo krótki, ale nie zostanie utworzony nowy arkusz. Możesz dodać Application.ScreenUpdating = False, ale krótki błysk pozostaje ...

Niestety nie mam lepszych wiadomości dla ciebie.

+0

Dzięki Floris, ale przykro mi to mówić, że szukam rozwiązania tylko w XML . Głównym celem jest ograniczenie użytkownika bez makr; VBA. Myślałem o użyciu tylko przez XML, ponieważ to integruje się z plikiem, który udostępniam i tym samym pozostawiając użytkownikowi mniejszą i ograniczoną liczbę opcji. Jakkolwiek jestem bardzo wdzięczny za twoje wysiłki na rzecz pęknięcia. Jeszcze bardziej dziękuję bardzo Floris. –

+0

Zdaję sobie sprawę, że prosiłeś o rozwiązanie wyłącznie XML - podejrzewam (na podstawie powyższego), że może nie być to możliwe. Czy mogę zapytać, dlaczego nie chcesz używać VBA w tle lub ochrony struktury skoroszytu - czy któryś z nich wydaje się rozwiązać problem? Jestem ciekawy ... – Floris

+0

Większość moich użytkowników nie jest tego świadoma. (Zamiast tego chciałbym powiedzieć, że próbowałem używać ochrony, ale moi entuzjastyczni użytkownicy łamią ją i modyfikują przez cały czas). Próbowałem VBA, gdzie w wielu przypadkach znalazłem to, jeśli zabezpieczenia nie są wyłączone/dozwolone; wtedy cel jest tracony. Po przeszukaniu znalazłem xml, który jest bardziej bezpieczny (w oparciu o zasoby i warunki moich użytkowników). –

Powiązane problemy