2013-04-10 16 views
8

Buduję dodatek VSTO Excel, który manipuluje wartościami wielu komórek. Chciałbym umożliwić użytkownikowi cofanie i ponawianie zmian wprowadzonych przez dodatek za pomocą standardowych funkcji programu Excel. Wolę unikać VBA.Jak przenieść operację na stos cofania Excel?

Czy to możliwe? Jeśli tak to jak?

Kolejne pytanie: czy możliwe jest sprawdzenie istniejącego stosu cofania/ponawiania?

Odpowiedz

-3

Rozwiązanie I rzeczywiście udał się był następujący:

  • Zapisz kopię stanu schowka
  • Wyczyść schowek
  • Generowanie danych chcę na karcie/nowa linia rozdzielany format, wciśnij go do schowka
  • Symuluj operację Ctrl + V do Excela
  • Wyczyść schowek
  • przywrócić pierwotny stan schowka

Oczywiście to jest zlokalizowane na manipulacji komórek, więc nie można naciskać dowolne operacji/wywołania zwrotne do stosu cofania. Ponadto, w oczywisty sposób naruszam zasady dotyczące używania schowka w Windows, ale jeśli Microsoft ujawnił lepszy interfejs API dla takich rzeczy (podpowiedź), nie musiałbym.

Dodatkowo, nie poszedłem z rozwiązaniem, które opisałem w pierwszym komentarzu do odpowiedzi Davida Zemensa, ponieważ uderzyłem w niektóre naruszenia bezpieczeństwa w naszym środowisku (tj. Wstrzyknięcie kodu VBA do skoroszytu jest nie-nie).

W każdym razie, dziękuję wszystkim!

+0

Porwanie schowka nie jest możliwe, ponieważ możesz potencjalnie nadpisać zawartość użytkownika, a oni będą naprawdę wściekli, jeśli to zrobisz. –

0

Możesz dodać operacje do komina za pomocą:

Application.OnUndo text, procedureName 

Gdzie Tekst jest tekst, który pojawia się z (menu Edycja) polecenia Cofnij i procedureName to nazwa jednego ze swoich subwooferów . Możesz także programowo cofać operacje, używając:

Application.Undo 

Nie sądzę, że można uzyskać dostęp do istniejących operacji cofania; przynajmniej nigdy o nich nie słyszałem. Może istnieć biblioteka, do której można uzyskać dostęp online, co na to pozwoli.

Mam nadzieję, że to pomoże.

+0

... co oznacza, że ​​muszę użyć VBA? –

+1

'Application.OnUndo' brakuje wymaganego argumentu ... –

4

można nie wspomnieć, która wersja programu Excel/.NET/VSTO wykonywania chcesz użyć, ale to naprawdę nie ma znaczenia:]
klienta Cofanie po prostu nie da się zrobić bez wstrzykiwania VBA, gdzie trzeba ustawić cofnij metodę cofania swoich działań, używając kompensacji (tj. operacji odwrotnych) lub przywracając zapisany stan.

3

Wiem, że chcesz uniknąć VBA, ale jak wspomnieli inni, nie jest możliwe uzyskanie Undo.

Oto przykład VBA, który zachowuje istniejący wybór jako niestandardowy typ danych, aby można go było później cofnąć.

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

Czy mogę wygenerować i wstrzyknąć VBA z C# z jakimś unikalnym identyfikatorem, przechowywać identyfikator w mojej aplikacji jako zmapowany do transformacji stanu i mieć sub wywołanie zwrotne do C#, które po wywołaniu odwraca transformację? –

+0

er, nie mogę edytować komentarza ... coś takiego jak połączenie tego http://stackoverflow.com/questions/15196534/is-there-a-way-to-add-vba-macro-code-to-excel z ten http://msdn.microsoft.com/en-us/library/vstudio/bb608614(v=vs.100).aspx może? –

+0

rodzaj z mojego elementu tutaj, ale przeglądając te wydaje się możliwe połączenie tych metod. Konieczne będzie albo odwrócenie procedur, albo zapisanie kopii danych, których dotyczy problem, w pamięci i powrót do tego stanu w wywołaniu "Cofnij". Wygląda na to, że można to zrobić w języku C# - ale powiązanie ich ze standardowym interfejsem programu Excel (np. 'Ctrl + Z'hotkey dla Cofania, itp.) Wymagałoby pewnego wstrzyknięcia kodu - nawet jeśli jest to po prostu suftoutyna VBA, aby wywołać Obiekt zewnętrzny (C#), aby wykonać "cofnąć". –