2013-04-10 37 views
8

Tôi đang xây dựng một bổ trợ VSTO Excel điều khiển các giá trị của nhiều ô. Tôi muốn cho phép người dùng hoàn tác và làm lại các thay đổi được tạo bởi bổ trợ thông qua các tính năng Excel chuẩn. Tôi thích tránh sử dụng VBA.Làm cách nào để đẩy thao tác lên ngăn xếp hoàn tác Excel?

Điều này có khả thi không? Nếu vậy, làm thế nào?

Một câu hỏi khác: có thể kiểm tra ngăn xếp hoàn tác/làm lại hiện tại không?

Trả lời

-3

Các giải pháp tôi thực sự đã đi với ta như sau:

  • Lưu một bản sao của nhà nước vào clipboard
  • Rõ ràng clipboard
  • Tạo dữ liệu tôi muốn trong một tab/newline phân định dạng, đẩy nó vào clipboard
  • Mô phỏng thao tác Ctrl + V thành Excel
  • Xóa khay nhớ tạm
  • Khôi phục trạng thái ban đầu vào clipboard

Rõ ràng đây là cục bộ để thao tác tế bào, vì vậy bạn không thể đẩy độc đoán hoạt động/callbacks undo stack. Ngoài ra, tôi rõ ràng vi phạm nguyên tắc xung quanh việc sử dụng clipboard trong Windows, nhưng nếu Microsoft tiếp xúc với API tốt hơn cho những thứ như vậy (gợi ý), tôi sẽ không phải làm như vậy. Ngoài ra, tôi đã không đi với giải pháp mà tôi đã mô tả trong bình luận đầu tiên về câu trả lời của David Zemens vì tôi nhấn một số vi phạm an ninh trong môi trường của chúng tôi (ví dụ, tiêm mã VBA vào sổ làm việc là không).

Dù sao, cảm ơn mọi người!

+0

Việc chiếm đoạt clipboard không khả thi vì bạn có khả năng ghi đè lên nội dung của người dùng và họ sẽ thực sự phát điên nếu bạn làm điều đó. –

0

Bạn có thể thêm các hoạt động để ngăn xếp bằng cách sử dụng:

Application.OnUndo text, procedureName 

đâu chữ là văn bản xuất hiện với lệnh Undo (menu Edit) và procedureName là một cái tên của một trong những tàu ngầm của bạn . Bạn cũng có thể lập trình hoàn tác các hoạt động bằng cách sử dụng:

Application.Undo 

Tôi không nghĩ rằng có thể truy cập các hoạt động hoàn tác hiện tại; ít nhất tôi chưa bao giờ nghe nói về bất kỳ điều gì. Có thể có một thư viện mà bạn có thể truy cập trực tuyến để cho phép điều này.

Hy vọng điều này sẽ hữu ích.

+0

... có nghĩa là tôi cần sử dụng VBA? –

+1

'Application.OnUndo' thiếu đối số bắt buộc ... –

4

Bạn không đề cập đến phiên bản thời gian chạy Excel/.NET/VSTO nào bạn muốn sử dụng, nhưng không thực sự quan trọng:]
Hoàn tác tùy chỉnh không thể thực hiện mà không cần tiêm VBA, nơi bạn cần đặt undo phương pháp để quay trở lại hành động của bạn, bằng cách sử dụng bồi thường (tức là hoạt động ngược lại) hoặc bằng cách khôi phục lại một trạng thái đã lưu.

3

Tôi biết bạn muốn tránh VBA nhưng như những người khác đã đề cập, điều này là không thực sự có thể để có được Undo.

Dưới đây là ví dụ VBA duy trì lựa chọn hiện tại làm loại dữ liệu tùy chỉnh để có thể hoàn tác sau này.

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

Tôi có thể tạo và tiêm VBA từ C# với một số loại ID duy nhất không, lưu ID trong ứng dụng của tôi dưới dạng ánh xạ tới biến đổi trạng thái và có chính nó một cuộc gọi lại đến C# khi được gọi, đảo ngược biến đổi? –

+0

er, không thể chỉnh sửa nhận xét của tôi ... điều gì đó giống như kết hợp http://stackoverflow.com/questions/15196534/is-there-a-way-to-add-vba-macro-code-to-excel với http://msdn.microsoft.com/en-us/library/vstudio/bb608614(v=vs.100).aspx có thể? –

+0

loại ra khỏi yếu tố của tôi ở đây, nhưng skimming những người có vẻ như có thể kết hợp những phương pháp. Cuối cùng, bạn sẽ cần phải đảo ngược các thủ tục, hoặc lưu trữ một bản sao của dữ liệu bị ảnh hưởng trong bộ nhớ, và trở lại trạng thái đó trong cuộc gọi 'Hoàn tác '. Có vẻ như có thể được thực hiện trong C# - nhưng buộc chúng vào giao diện chuẩn của Excel (ví dụ, 'Ctrl + Z'hotkey cho Undo, vv) sẽ yêu cầu một số mã tiêm - ngay cả khi nó chỉ đơn giản là một VBA soubroutine để gọi một đối tượng bên ngoài (C#) để thực hiện "hoàn tác". –