备份数据供以后恢复(保存以前的值)
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
我正在尝试找出一种备份数据的方法,以便在需要时恢复数据。在用户窗体初始化期间我正在做
'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