备份数据供以后恢复(保存以前的值)

Backup data for later restore (save previous values)

我正在尝试找出一种备份数据的方法,以便在需要时恢复数据。在用户窗体初始化期间我正在做

'Save Backup
Worksheets("Machine Format").Cells(ActiveCell.Column).EntireColumn.copy

如果不是整列而是只有包含数据的行,那将是首选,但我不知道如何将这段代码与

结合起来
Dim LastRow As Long

LastRow = Range("B" & Rows.Count).End(xlUp).Row

我能想到的一切都不起作用,但是当我尝试使用

粘贴以前复制的数据时
'Paste Backup
ActiveSheet.Paste Destination:=Worksheets("Machine Format").Cells(ActiveCell.Column)

它没有粘贴,也没有显示错误。我什至不确定像这样备份数据的概念是最佳还是好主意。

有人可以帮我解决这个问题吗?我什至需要这个的原因是因为我有一个实时修改数据的用户窗体,并且在通过 X 按钮关闭用户窗体时我需要它来取消所有更改,我认为我可以在用户窗体初始化时复制数据然后将其粘贴回去如果用户窗体通过 x 按钮关闭。

您可以将值保存在数组中

Dim BackupArray() As Variant
BackupArray = Worksheets("Machine Format").UsedRange.Value

如果你必须return他们你可以使用

Worksheets("Machine Format").Cells(row, column).Value = BackupArray(row, column)

到return备份中的特定值,或一次还原整个值:

Worksheets("Machine Format").UsedRange.Value = BackupArray

请注意,这仅适用于更改的值。如果添加了新值并且您也想删除它们,则需要先清除所有单元格的内容并恢复到原始范围:

Dim OriginalDataRange As Range
Set OriginalDataRange = Worksheets("Machine Format").UsedRange

Dim BackupArray() As Variant
BackupArray = OriginalDataRange.Value

' do your changes here

' revert entire backup
Worksheets("Machine Format").UsedRange.ClearContents  'remove changed data including new added data
OriginalDataRange.Value = BackupArray  ' revert old tata

如果创建备份和恢复不在同一过程中发生,则将 BackupArray 设置为 public 变量。

请注意,如果您不小心停止了整个 VBA 运行 例如。通过使用 End 语句(不要与 End Sub 混淆!)然后备份数据丢失。它仅在 VBA 的 运行 时间内持续存在(或更好的变量生命周期 BackupArray)。

备份列数据

Option Explicit

Private bData As Variant ' Array
Private brg As Range ' Column Range (object)

Sub UsageExample()

    ' Some code...
    backupData
    ' some more code...
    
    If Something Then
        ' Whatever...
    Else
        retrieveData
    End If
    
End Sub

Sub backupData()
        
    Const wsName As String = "Machine Format"
    Const First As Long = 2
    Const lrCol As String = "B"
    
    Dim wb As Workbook: Set wb = ThisWorkbook
    
    With wb.Worksheets(wsName)
        .Activate
        If TypeName(Selection) = "Range" Then
            ' Create a reference to the column range.
            Dim Last As Long: Last = .Range("B" & .Rows.Count).End(xlUp).Row
            Dim cCol As Long: cCol = Selection.Cells(1).Column
            Set brg = .Columns(cCol).Rows(First & ":" & Last)
            ' Write the values from the column range to an array.
            If brg.Cells.Count = 1 Then
                ReDim bData(1 To 1, 1 To 1): bData(1, 1) = brg.Value
            Else
                bData = brg.Value
            End If
        'Else
            ' No range selected.
        End If
    End With

End Sub

Sub retrieveData()

    If Not brg Is Nothing Then
        Debug.Print brg.Address
        Debug.Print UBound(bData, 1), UBound(bData, 2)
        ' Write data back to range.
        brg.Value = bData
    Else
        Debug.Print "No range."
    End If

End Sub