私は、複数のセルの値を操作するVSTO Excelアドインを構築しています。標準のExcel機能を使用して、アドインによって作成された変更を元に戻したりやり直すことができます。私はVBAの使用を避けることを好む。Excelの元に戻すスタックに操作をプッシュする方法はありますか?
これは可能ですか?もしそうなら、どうですか?
もう1つ質問:既存の元に戻す/やり直しスタックを調べることは可能ですか?
私は、複数のセルの値を操作するVSTO Excelアドインを構築しています。標準のExcel機能を使用して、アドインによって作成された変更を元に戻したりやり直すことができます。私はVBAの使用を避けることを好む。Excelの元に戻すスタックに操作をプッシュする方法はありますか?
これは可能ですか?もしそうなら、どうですか?
もう1つ質問:既存の元に戻す/やり直しスタックを調べることは可能ですか?
私は実際には次られたといった解決策:
を復元明らかにこれは、細胞の操作に局在しているので、あなたは、アンドゥスタックに任意の操作/コールバックをプッシュすることはできません。また、私は明らかにWindowsでのクリップボード使用に関する原則に違反していますが、もしMicrosoftがそのようなもののためにより良いAPIを公開すれば(ヒント)、私はする必要はありません。
また、David Zemensの回答に関する最初のコメントには答えられませんでした。私の環境でセキュリティ違反が発生したためです(つまり、VBAコードをワークブックに挿入するのはいいえ)。
とにかく、ありがとうございます!
あなたが使用してスタックに操作を追加することができます
テキストは、[元に戻す]コマンド([編集]メニュー)で表示され、 PROCEDURENAMEは、あなたの潜水艦の1つの名前であるテキストですApplication.OnUndo text, procedureName
を。
Application.Undo
既存の元に戻す操作にアクセスすることはできません。少なくとも私は何も聞いたことがない。これを可能にするオンラインでアクセスできる図書館があるかもしれません。
これが役に立ちます。
...私はVBAを使用する必要がありますか? –
'Application.OnUndo'に必要な引数がありません... –
使用したいExcel/.NET/VSTOランタイムのバージョンは言及していませんでしたが、実際には関係ありません:]
VBAを注入することなくカスタムの元に戻すことはできません。補償を使用して(逆動作)、または保存された状態を復元することによって、アクションをロールバックする方法を取り消すことができます。
私はあなたが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
C#からVBAを生成して、ある種の一意のIDでインジェクトし、アプリケーションにIDを格納して状態変換にマップすることができますか? C#へのコールバックは、呼び出されると変換を元に戻しますか? –
私のコメントを編集できません...これを組み合わせるようなもの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かもしれませんか? –
ここでは私の要素から外れていますが、これらの方法を組み合わせることは可能です。最終的には、手順を逆にするか、影響を受けたデータのコピーをメモリに保存し、 'Undo'呼び出しでその状態に戻す必要があります。 C#で行うことができるようですが、Excelの標準インターフェース(例えば、Ctrl + Zキー、Undoなど)にバインドするには、単純にVBAのsoubroutineでコードを呼び出す必要があります外部オブジェクト(C#)を使用して "取り消し"を実行します。 –
クリップボードをハイジャックすることは可能ではありません。なぜなら、ユーザーのコンテンツを上書きする可能性があり、そうすることで本当に狂ってしまうからです。 –