2012-06-18 16 views
5

Quando si utilizza un file XML dell'interfaccia utente personalizzato per aggiungere diverse schede personalizzate della barra multifunzione in Access, la scheda della barra multifunzione selezionata torna alla prima scheda personalizzata ogni volta che viene chiuso un modulo.È possibile impedire a MS Access di cambiare automaticamente la linguetta selezionata quando si utilizza un nastro personalizzato?

Carichiamo un nastro personalizzato da VBA. Ho creato an accdb that reproduces the problem. La cartella include anche un file XML che contiene la definizione del nastro. Deve essere nella stessa directory del file .accdb.

Il problema può facilmente essere dimostrata:

  1. aprire il database RibbonTest.accdb,
  2. interruttore Tab2 e aprire Form2 utilizzando il pulsante sul nastro e
  3. chiudere Form2.

Si noti che Tab1 è ora attivo.

Ovviamente, in questo piccolo esempio db questo problema sembra molto minore. Tuttavia, abbiamo un progetto molto grande con molte schede personalizzate, ciascuna contenente numerosi gruppi e pulsanti. I nostri utenti stanno trovando molto frustrante che continuino a perdere il loro posto sul nastro ogni volta che chiudono un modulo.

Abbiamo esaminato una soluzione alternativa in cui archiviamo la scheda selezionata in modo programmatico e la ripristiniamo quando pensiamo di aver bisogno. Tuttavia, si sta dimostrando difficile farlo in modo affidabile. (Non esiste un'API di Office per l'automazione del nastro in questo modo, ma this article helped.)

Qualcun altro ha riscontrato questo problema? Hai trovato un modo per impedire la modifica automatica della scheda?

Edit: Sembra che questo problema è stato introdotto con una correzione implementato in Office 2010 SP1 . (Scusa, nessun collegamento: non credo di poterne avere più di due.) Il problema non è presente nella versione RTM. L'elenco di correzioni per SP1 include questo: "L'accesso non si attiva o non restituisce l'utente alla scheda Nastro corretta per un oggetto di database precedentemente aperto quando l'utente torna a quell'oggetto." Sembra che abbiano provato a correggere l'uso della proprietà Form.RibbonName (che supporta i nastri contestuali), ma hanno interrotto il nastro predefinito nel processo.

risposta

3

potenziale soluzione

Qualcosa mi sono imbattuto che ha lavorato per me è quello di nascondere la prima scheda in XML utilizzando il tag visibile. Non l'ho testato molto, ma ho una copia della scheda Home standard che è nascosta (non ho idea se debba essere una scheda popolata o meno). Mi sembra che poiché Access non può effettivamente attivare la scheda nascosta quando chiudi un modulo, rimane su quello attualmente selezionato.

Non so se questo problema è stato risolto in Access 2013 o no, ma si spera che le informazioni non siano troppo tardi per essere utili a qualcuno.

+0

Eccellente: contrassegnato come risposta anziché come soluzione alternativa. – Olly

1

Sembra che ci sia un modo per ottenere la scheda selezionata (come lei ha ricordato, e probabilmente già il codice per, e come si può trovare here)

Nel modulo RibbonCode: Salvare il ribbonObject ad un modulo -variable: nel xml cambiare la prima linea:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onload="OnRibbonLoad" > 

e aggiungere questo:

Private MyRibbon as IRibbonUI 
Private ActiveRibbonTab as string 

Sub OnRibbonLoad(ribbon As IRibbonUI) 
    Set MyRibbon = ribbon 
End Sub 

Sub RememberRibbonTab 
    ActiveRibbonTab=<Do the IAccessibleMagic here> 
End 

Sub RecallActiveTab 
    If ActiveRibbonTab<>"" then MyRibbon.ActivateTab(ActiveRibbonTab) 
    ActiveRibbonTab="" 
End 

Ora, in ogni sua forma aggiungere

Private Sub Form_Close() 
    Remember_RibbonTab 
End Sub 

Private Sub Form_GotFocus() 
    RecallActiveTab 
End Sub 
+0

Grazie! Al momento stiamo usando qualcosa del genere, ma (come spesso accade con soluzioni alternative) non è perfetto. Ad esempio, quando la barra multifunzione è ridotta a icona, la nostra soluzione alternativa provoca alcuni comportamenti strani. Mi piacerebbe sapere se c'è un modo per fare in modo che Access lasci il nastro da solo! – Olly

0

realtà un approccio che funziona bene è quello di ridurre o eliminare le schede nelle forme si apre. Se si specifica la barra multifunzione (altra scheda nel foglio delle proprietà), quando si passa da una maschera all'altra, la barra multifunzione visualizzata cambia automaticamente e senza codice.

Ora, anche se questa non è davvero una soluzione al tuo problema, l'idea e il concetto qui è che se devi iniziare a scrivere un po 'di codice per impegnarti e passare a quale scheda, diventa davvero difficile come fai notare.

Come indicato per Access/office 2010 è possibile utilizzare il codice per impostare la scheda attiva (questa funzione non è disponibile in Access/Office 2007).

Quindi, l'unico suggerimento che ho qui è provare e limitare la maggior parte dei moduli a una scheda quando possibile. L'altro suggerimento è che mentre nei menu potrebbe essere raggruppato per "tipo di attività" e quindi si potrebbe avere un menu che ricade a cascata su un intero gruppo di rapporti. Ora con il nastro quando si lavora su una fattura, allora si ha:

Create invoice 
Balance invoice 
Post invoice 
Print invoice (a report). 

Quindi, tutte le opzioni di cui sopra sono cose diverse, ma sono gruppo in una nastro per consentire di ottenere un lavoro fatto.

Quindi l'idea qui è di raggruppare le opzioni di barra multifunzione non per tipo di opzione come tutti i report, ma di gruppo + creare un nastro in base all'attività UNO che include le opzioni che l'utente richiede per un determinato compito nel momento indicato.

Come indicato, quanto sopra potrebbe non essere una soluzione ai vostri problemi, ma evitare ulteriori schede spesso risolverà molti di questi problemi.

+0

Grazie per il suggerimento. Non abbiamo esaminato la proprietà Form.RibbonName che descrivi, ma purtroppo non è una soluzione per noi. Non usiamo la funzione del nastro contestuale; abbiamo semplicemente un grande nastro con molte schede che utilizziamo per fornire l'accesso ai moduli nel nostro progetto. È interessante notare che il problema che abbiamo riscontrato è stato introdotto con SP1, apparentemente a causa di una "correzione" aggiunta per far funzionare correttamente la proprietà Form.RibbonName. – Olly

1

È un bug!

supporto MS ha accettato una sottomissione bug per questo, e commentato per quanto riguarda Office 2010 SP1, "Il cambiamento che è stata implementata permette di tenere traccia della scheda attiva per ogni oggetto di database (forme, rapporti, ecc) utilizzando TCID della scheda in modo che quando si sposta tra oggetti la scheda attiva viene ripristinata. Tuttavia schede personalizzate utilizzano tutti lo stesso valore TCID, quindi con questo cambiamento la scheda attiva per schede personalizzate sarà sempre passare alla scheda prima personalizzato. "

Speriamo che rilasceranno un hotfix per risolvere questo problema in futuro.

Soluzioni alternative

Le seguenti informazioni si è rivelata utile per noi nella creazione di una soluzione.

  1. Vedere la risposta di Johanness sopra relativa al metodo IRibbonUI.ActivateTab. Questo è stato introdotto in Office 2010.
  2. Non esiste alcuna API di Office (AFAIK) per ottenere la scheda attualmente selezionata. Pertanto utilizziamo il codice da this article utile. Abbiamo
    • creare una matrice quando generiamo nostro nastro contenente il valore id di ciascuna linguetta nastro,
    • maniglia Form_Deactivate e utilizzarlo per avviare un timer in un'altra forma nascosta e anche memorizzare l'indice della scheda selezionata,
    • nel Timer_Tick gestore in forma nascosta disabilitiamo il timer e cercare il valore id della scheda il cui indice abbiamo memorizzato in Form_Deactivate, e
    • attivare la scheda utilizzando IRibbonUI.ActivateTab.
  3. This article mostra un uso interessante IRibbonUI.Invalidate e getVisible callback per selezionare una scheda particolare.
+0

Grazie per aver dedicato del tempo ad aggiungere informazioni utili per possibili soluzioni alternative. –

4

Questa una linea risolve il problema:

<tab id="tabBogus" label="Bogus" visible="false"></tab>

Basta fare 'la prima scheda in <tabs>. Grazie mille alla risposta di Potential Workaround di Scott !! (Ho cercato di votare e/o commentare, ma mi sono appena iscritto, quindi non ho abbastanza reputazione.) Questo ha risparmiato ore (o giorni) di lavoro rispetto all'altra soluzione complicata! Grazie!

1

creare una variabile enumeratore in un modulo di codice generale che corrisponde ai numeri scheda della barra multifunzione (ALT + Y)

' Used By Send Keys to Select Correct Ribbon Tab. 
Enum eRibTabs 
    DataEntry = 1 
    Reporting = 2 
    StockAndParts = 3 
    AdminFinance = 4 
    DataImport = 5 
    OtherAdmin = 6 
    Admin = 7 
    LocalSystem = 8 
End Enum 

Creare un modulo in MS Access chiamato "zFrmRibbonSelect" e mettere una casella di testo non associata denominata txtTabValue e quindi inserisci il codice seguente nel tuo nuovo modulo. . (Suggerisci modalità modulo impostato su nascosto

Private Sub Form_Current() 
' Select Correct Tab Menu Item 
Me.txtTabValue = Me.OpenArgs 

End Sub 

Private Sub Form_Close() 
'Select Correct Tab Menu Item 
Dim varTab As Variant 

varTab = Me.txtTabValue 

SendKeys "%Y" & varTab 
SendKeys "{ESC}" 
SendKeys "{ESC}" 

End Sub 

Private Sub Form_Timer() 
DoCmd.Close acForm, Me.Name, acSaveNo 
End Sub 

Set intervallo del timer modulo per 500 e verificare il caso per spettacoli timer in scatola proprietà ecc

Sul vostro rapporto di inserire il codice seguente: (utilizzare il valore enumeratore si desidera.)

Private Sub Report_Close() 
'Select Correct Tab Menu Item 
DoCmd.OpenForm "zFrmRibbonSelect", , , , , acHidden, eRibTabs.StockAndParts 
End Sub 

Per le forme che si chiudono utilizzare il seguente codice int forma

Private Sub Form_Close() 
'Select Correct Tab Menu Item 
    SendKeys "%Y" & eRibTabs.StockAndParts 
    SendKeys "{ESC}" 
    SendKeys "{ESC}" 
End Sub