2013-04-10 9 views
8

Sto costruendo un componente aggiuntivo di Excel VSTO che manipola i valori di più celle. Vorrei consentire all'utente di annullare e ripetere le modifiche create dal componente aggiuntivo tramite le funzionalità standard di Excel. Preferisco evitare l'uso di VBA.Come spingere un'operazione sulla pila di annullamento di Excel?

È possibile? Se é cosi, come?

Un'altra domanda: è possibile esaminare lo stack di annullamento/ripetizione esistente?

risposta

-3

La soluzione Io sono andato con era la seguente:

  • Salva una copia dello stato appunti
  • cancellare gli Appunti
  • generare i dati che voglio in una scheda/nuova riga delimitato formato, spingerlo negli Appunti
  • Simulare un'operazione Ctrl + V in Excel
  • Cancellare gli appunti
  • ripristinare lo stato originale appunti

Ovviamente questo è localizzato a manipolazioni cellulari, quindi non si può spingere operazioni arbitrarie/callback alla stack di annullamento. Inoltre, sto chiaramente violando i principi relativi all'uso di appunti in Windows, ma se Microsoft ha esposto una migliore API per tali cose (suggerimento), non avrei dovuto.

Inoltre, non ho seguito la soluzione che ho descritto nel primo commento sulla risposta di David Zemens perché ho riscontrato alcune violazioni della sicurezza nel nostro ambiente (ad esempio, l'inserimento del codice VBA in una cartella di lavoro è un no-no).

Comunque, grazie a tutti!

+0

Il dirottamento degli appunti non è fattibile perché potresti potenzialmente sovrascrivere i contenuti degli utenti e saranno davvero pazzi se lo fai. –

0

È possibile aggiungere operazioni allo stack utilizzando:

Application.OnUndo text, procedureName 

Dove Testo è il testo che appare con il (menu Modifica) comando Annulla e ProcedureName è un nome di uno dei tuoi subs . È inoltre possibile annullare le operazioni in modo programmatico utilizzando:

Application.Undo 

Non penso sia possibile accedere alle operazioni di annullamento esistenti; almeno non ne ho mai sentito parlare. Potrebbe esserci una libreria alla quale è possibile accedere online per consentire ciò.

Spero che questo aiuti.

+0

... che significa che avrei bisogno di utilizzare VBA? –

+1

'Application.OnUndo' manca un argomento obbligatorio ... –

4

non siete riusciti a parlare di quale versione di Excel/NET/VSTO runtime che si desidera utilizzare, ma in realtà non importa:]
personalizzato Undo solo non può essere fatto senza l'iniezione di VBA, in cui si avrebbe bisogno di impostare un annullare il metodo per il rollback delle azioni, utilizzando la compensazione (ossia le operazioni inverse) o ripristinando uno stato salvato.

3

So che vuoi evitare VBA ma, come altri hanno già detto, non è possibile ottenere lo Undo.

Ecco un esempio VBA che conserva la selezione esistente come tipo di dati personalizzato in modo che possa essere annullata in un secondo momento.

Option Explicit 
'Stores info about current selection' 
Public OldWorkbook As Workbook 
Public OldSheet As Worksheet 
Public OldSelection() As SaveRange 

'Custom data type for undoing' 
Type SaveRange 
    Value As Variant 
    Address As String 
End Type 

Public Sub YourSubRoutine() 
    'A simple subroutine that acts on a Range selection' 
    Dim UserRange As Range 

    Set UserRange = Selection 


    If UserRange Is Nothing Then 
     Exit Sub 
    End If 

'## The next block of statements ' 
'## Save the current values for undoing ' 
    Set OldWorkbook = ActiveWorkbook 
    Set OldSheet = ActiveSheet 

    Application.ScreenUpdating = False 

    '## Code to manipulate the Selection range ' 
    '## Code to manipulate the Selection range ' 
    '## Code to manipulate the Selection range ' 

    '## Specify the Undo Sub ' 
    Application.OnUndo "Undo the YourSubRoutine macro", "UndoYourSubRoutine" 

End Sub 
Public Sub UndoYourSubRoutine() 

Dim i As Integer 

' Undoes the effect of the YourSubRoutine ' 

' Tell user if a problem occurs ' 
    On Error GoTo Problem 

    Application.ScreenUpdating = False 

'## Make sure the correct workbook and sheet are active ' 
    OldWorkbook.Activate 
    OldSheet.Activate 

'## Restore the saved information ' 
    For i = 1 To UBound(OldSelection) 
     Range(OldSelection(i).Address).Value = OldSelection(i).Value 
    Next i 
    Exit Sub 

' Error handler' 
Problem: 
    MsgBox "Can't undo" 

End Sub 
+0

Posso generare e iniettare VBA da C# con una sorta di ID univoco, archiviare l'ID nella mia app come mappato a una trasformazione di stato e avere il sotto stesso appena essere una richiamata a C# che quando invocato, inverte la trasformazione? –

+0

, non posso modificare il mio commento ... qualcosa come combinare questo http://stackoverflow.com/questions/15196534/is-there-a-way-to-add-vba-macro-code-to-excel con questo http://msdn.microsoft.com/en-us/library/vstudio/bb608614(v=vs.100).aspx forse? –

+0

qui fuori dal mio elemento, ma sfiorando quelli sembra possibile combinare questi metodi. In definitiva, sarà necessario invertire le procedure o archiviare una copia dei dati interessati in memoria e ripristinare lo stato nella chiamata 'Annulla '. Sembra che sia possibile farlo in C#, ma collegarli all'interfaccia standard di Excel (ad esempio, 'Ctrl + Z'hotkey per Annulla, ecc.) Richiederebbe qualche iniezione di codice - anche se è semplicemente una soubroutine VBA per chiamare un oggetto esterno (C#) per eseguire "annulla". –

Problemi correlati