Excel 宏:如果单击单元格 A,复制单元格 B 并粘贴为值,然后 return 位置到单元格 A
Excel Macro: If Cell A is clicked, copy Cell B and paste as value, then return position to Cell A
我正在 Excel 中创建一个表单模板,其中 Cell B = TODAY() 因此,当用户打开模板填写表单时,会显示今天的日期。
但是,一旦用户填写了表格,我希望单元格 B 等于 TODAY() 的值,因此单元格不会在每次打开工作簿时更新。
我的解决方案是创建一个执行以下操作的宏:
当用户单击单元格 A 时,需要用户填写文本的单元格单元格 B 包含公式 =TODAY(),将作为值复制并粘贴到同一位置。然后,再次选择单元格 A,以便用户填写所需信息。
下面是我的示例 VBA,它检查单元格 A 是否为空而不是被单击。不过,如果有人可以提供帮助,我想对此进行更改。
在此示例中,单元格 A 为 E11,单元格 B 为 E13。
Sub Date_Change(ByVal Target As Range)
Dim Rng As Range
Set Rng = Sheets("Form").Range("E13")
If Sheets("Form").Range("E11") = Empty Then
Sheets("Form").Range("E13") = TODAY()
Else
Rng.Copy
Rng.PasteSpecial xlPasteValues
Set Rng = Nothing
Application.CutCopyMode = False
Cells(11, 5).Select
End Sub
怎么样(这在你想要的工作表中 运行 它在模块上):
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim cellA As Range, cellB As Range
Set cellA = Sheets("Form").Range("E11")
Set cellB = Sheets("Form").Range("E13")
If Target.Row = cellA.Row And Target.Column = cellA.Column Then
Dim Rng As Range
Set Rng = cellA
If cellA = Empty Then
cellB.Value = WorksheetFunction.Text(Month(Now()) & "/" & Day(Now()) & "/" & Year(Now()), "MM/DD/YYYY")
Else
Rng.Copy
Rng.PasteSpecial xlPasteValues
Set Rng = Nothing
Application.CutCopyMode = False
Cells(11, 5).Select
End If
End If
End Sub
您可能需要检查我的声明,但这应该能让您继续。它将检查是否选择了单元格 E11,如果是,将 运行.
在工作簿对象中,您有一个内置事件 workbook_beforesave...
你可以把代码放在那里。
我录制了一个宏,将 B3 更新为硬值,删除了公式。
然后我将代码从宏中复制出来并点击保存。如果工作簿中有多个工作表,您可能需要更新 "range" 以说明特定工作表。
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Range("B3").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End Sub
我正在 Excel 中创建一个表单模板,其中 Cell B = TODAY() 因此,当用户打开模板填写表单时,会显示今天的日期。
但是,一旦用户填写了表格,我希望单元格 B 等于 TODAY() 的值,因此单元格不会在每次打开工作簿时更新。
我的解决方案是创建一个执行以下操作的宏:
当用户单击单元格 A 时,需要用户填写文本的单元格单元格 B 包含公式 =TODAY(),将作为值复制并粘贴到同一位置。然后,再次选择单元格 A,以便用户填写所需信息。
下面是我的示例 VBA,它检查单元格 A 是否为空而不是被单击。不过,如果有人可以提供帮助,我想对此进行更改。
在此示例中,单元格 A 为 E11,单元格 B 为 E13。
Sub Date_Change(ByVal Target As Range)
Dim Rng As Range
Set Rng = Sheets("Form").Range("E13")
If Sheets("Form").Range("E11") = Empty Then
Sheets("Form").Range("E13") = TODAY()
Else
Rng.Copy
Rng.PasteSpecial xlPasteValues
Set Rng = Nothing
Application.CutCopyMode = False
Cells(11, 5).Select
End Sub
怎么样(这在你想要的工作表中 运行 它在模块上):
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim cellA As Range, cellB As Range
Set cellA = Sheets("Form").Range("E11")
Set cellB = Sheets("Form").Range("E13")
If Target.Row = cellA.Row And Target.Column = cellA.Column Then
Dim Rng As Range
Set Rng = cellA
If cellA = Empty Then
cellB.Value = WorksheetFunction.Text(Month(Now()) & "/" & Day(Now()) & "/" & Year(Now()), "MM/DD/YYYY")
Else
Rng.Copy
Rng.PasteSpecial xlPasteValues
Set Rng = Nothing
Application.CutCopyMode = False
Cells(11, 5).Select
End If
End If
End Sub
您可能需要检查我的声明,但这应该能让您继续。它将检查是否选择了单元格 E11,如果是,将 运行.
在工作簿对象中,您有一个内置事件 workbook_beforesave... 你可以把代码放在那里。
我录制了一个宏,将 B3 更新为硬值,删除了公式。
然后我将代码从宏中复制出来并点击保存。如果工作簿中有多个工作表,您可能需要更新 "range" 以说明特定工作表。
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Range("B3").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End Sub