2013-04-10 8 views
8

私は、複数のセルの値を操作するVSTO Excelアドインを構築しています。標準のExcel機能を使用して、アドインによって作成された変更を元に戻したりやり直すことができます。私はVBAの使用を避けることを好む。Excelの元に戻すスタックに操作をプッシュする方法はありますか?

これは可能ですか?もしそうなら、どうですか?

もう1つ質問:既存の元に戻す/やり直しスタックを調べることは可能ですか?

答えて

-3

私は実際には次られたといった解決策:

  • 保存クリップボード状態のコピー
  • クリアクリップボード
  • は、私はタブ区切り/改行に必要なデータを生成しますフォーマット、クリップボードにプッシュ
  • ExcelへのCtrl + V操作をシミュレート
  • クリップボードをクリア
  • 元クリップボードの状態

を復元明らかにこれは、細胞の操作に局在しているので、あなたは、アンドゥスタックに任意の操作/コールバックをプッシュすることはできません。また、私は明らかにWindowsでのクリップボード使用に関する原則に違反していますが、もしMicrosoftがそのようなもののためにより良いAPIを公開すれば(ヒント)、私はする必要はありません。

また、David Zemensの回答に関する最初のコメントには答えられませんでした。私の環境でセキュリティ違反が発生したためです(つまり、VBAコードをワークブックに挿入するのはいいえ)。

とにかく、ありがとうございます!

+0

クリップボードをハイジャックすることは可能ではありません。なぜなら、ユーザーのコンテンツを上書きする可能性があり、そうすることで本当に狂ってしまうからです。 –

0

あなたが使用してスタックに操作を追加することができます

テキストは、[元に戻す]コマンド([編集]メニュー)で表示され、 PROCEDURENAMEは、あなたの潜水艦の1つの名前であるテキストです
Application.OnUndo text, procedureName 

を。

Application.Undo 

既存の元に戻す操作にアクセスすることはできません。少なくとも私は何も聞いたことがない。これを可能にするオンラインでアクセスできる図書館があるかもしれません。

これが役に立ちます。

+0

...私はVBAを使用する必要がありますか? –

+1

'Application.OnUndo'に必要な引数がありません... –

4

使用したいExcel/.NET/VSTOランタイムのバージョンは言及していませんでしたが、実際には関係ありません:]
VBAを注入することなくカスタムの元に戻すことはできません。補償を使用して(逆動作)、または保存された状態を復元することによって、アクションをロールバックする方法を取り消すことができます。

3

私はあなたがVBAを避けたいと思っていますが、他の人が触れたように、これは実際にUndoを得ることはできません。

ここでは、既存の選択をカスタムデータ型として保存して、後で元に戻すことができるようにするVBAの例を示します。

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

C#からVBAを生成して、ある種の一意のIDでインジェクトし、アプリケーションにIDを格納して状態変換にマップすることができますか? C#へのコールバックは、呼び出されると変換を元に戻しますか? –

+0

私のコメントを編集できません...これを組み合わせるようなものhttp://stackoverflow.com/questions/15196534/is-there-a-way-to-add-vba-macro-code-to-excel withこれはhttp://msdn.microsoft.com/en-us/library/vstudio/bb608614(v=vs.100).aspxかもしれませんか? –

+0

ここでは私の要素から外れていますが、これらの方法を組み合わせることは可能です。最終的には、手順を逆にするか、影響を受けたデータのコピーをメモリに保存し、 'Undo'呼び出しでその状態に戻す必要があります。 C#で行うことができるようですが、Excelの標準インターフェース(例えば、Ctrl + Zキー、Undoなど)にバインドするには、単純にVBAのsoubroutineでコードを呼び出す必要があります外部オブジェクト(C#)を使用して "取り消し"を実行します。 –

関連する問題