两个 excel 表有一个相同的列,一个可以从另一个自动更新吗?
Two excel tables that have one identical column, can one auto update from the other?
我有一个 table 用于输入数据和 运行 计算。这个 table 有很多列,所以我为 printable 输出创建了第二个 table。两个 tables 中的第一列是两个 tables 共有的唯一值,因此输出 table 基本上是一个 table,它使用查找函数来提取每行的输入 table 中所需的数据或结果。
当最终用户从输入 table 添加和删除行时,使两个 table 中的第一列始终相同的最佳方法是什么?我一直在尝试制定一个宏,以便每次将一个值添加到输入的第一列时,该值都会被复制到输出第一列的最后一行 table,但后来我没有' 知道如果删除一行或添加重复值将如何工作。或者我可以使用一个宏,它会在每次更改输入列时复制并粘贴整个列。是否有任何我还应该考虑的明显的解决方案?我是 VBA 的新手,但一旦我弄清楚哪个方向对最终用户来说最简单,我想我就能弄清楚。
更新:对于有类似问题的其他人,这是我最终编写的代码,到目前为止效果很好。
在工作表中:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Range("A:A")
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
Call Module1.UpdateOutput
End If
End Sub
在模块 1 中:
Sub UpdateOutput()
' UpdateOutput Macro
'Set active cell for return at end of macro
Dim ActCell As Range
Set ActCell = Selection
' Check Input table has data
If Sheet6.ListObjects("Input").DataBodyRange Is Nothing Then
Exit Sub
End If
'Count Selected Rows of Input and Output Table
Dim RowsIn As Long
RowsIn = Sheet6.ListObjects("Input").ListColumns("UWI").DataBodyRange.Rows.Count
Dim RowsOut As Long
RowsOut = Sheet3.ListObjects("Results").DataBodyRange.Rows.Count
Dim RowsCalc As Long
RowsCalc = Sheet1.ListObjects("IWCP").DataBodyRange.Rows.Count
Application.ScreenUpdating = False
'Delete extra rows from Output Table
Dim lRow As Long
lRow = RowsOut + 1
Do While lRow >= RowsIn + 2
Sheet3.Rows(lRow).Delete
Sheet1.Rows(lRow + 1).Delete
lRow = lRow - 1
Loop
'Select UWI column from input table
Application.Goto Sheet6.ListObjects("Input").ListColumns("UWI").DataBodyRange
Selection.Copy
'Paste UWI column from input table
Sheet3.ListObjects("Results").ListColumns("UWI").DataBodyRange(1).PasteSpecial xlPasteValues
Sheet1.ListObjects("IWCP").ListColumns("UWI").DataBodyRange(1).PasteSpecial xlPasteValues
Application.CutCopyMode = False
'Return to previous cell
Application.Goto ActCell
Application.ScreenUpdating = True
End Sub
我假设您的两个表都在 Sheet1 中。您必须在Sheet1对应的模块中插入以下代码
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngsrc As Range, rngtrg As Range
Dim losrc As ListObject, lotrg As ListObject
Set losrc = Me.ListObjects(1)
Set lotrg = Me.ListObjects(2)
'Set rngsrc = your_source_range_to_monitor
Set rngsrc = losrc.ListColumns(1).Range
Set rngtrg = lotrg.ListColumns(1).Range
Dim ints As Range
Set ints = Application.Intersect(rngsrc, Target)
If (Not (ints Is Nothing)) Then
' Do your job to copy from rngsrc to rngtrg
Application.CutCopyMode = xlCopy
rngsrc.Copy
rngtrg.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlPasteSpecialOperationNone
End If
End Sub
并根据需要进行修改。
我有一个 table 用于输入数据和 运行 计算。这个 table 有很多列,所以我为 printable 输出创建了第二个 table。两个 tables 中的第一列是两个 tables 共有的唯一值,因此输出 table 基本上是一个 table,它使用查找函数来提取每行的输入 table 中所需的数据或结果。
当最终用户从输入 table 添加和删除行时,使两个 table 中的第一列始终相同的最佳方法是什么?我一直在尝试制定一个宏,以便每次将一个值添加到输入的第一列时,该值都会被复制到输出第一列的最后一行 table,但后来我没有' 知道如果删除一行或添加重复值将如何工作。或者我可以使用一个宏,它会在每次更改输入列时复制并粘贴整个列。是否有任何我还应该考虑的明显的解决方案?我是 VBA 的新手,但一旦我弄清楚哪个方向对最终用户来说最简单,我想我就能弄清楚。
更新:对于有类似问题的其他人,这是我最终编写的代码,到目前为止效果很好。 在工作表中:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Range("A:A")
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
Call Module1.UpdateOutput
End If
End Sub
在模块 1 中:
Sub UpdateOutput()
' UpdateOutput Macro
'Set active cell for return at end of macro
Dim ActCell As Range
Set ActCell = Selection
' Check Input table has data
If Sheet6.ListObjects("Input").DataBodyRange Is Nothing Then
Exit Sub
End If
'Count Selected Rows of Input and Output Table
Dim RowsIn As Long
RowsIn = Sheet6.ListObjects("Input").ListColumns("UWI").DataBodyRange.Rows.Count
Dim RowsOut As Long
RowsOut = Sheet3.ListObjects("Results").DataBodyRange.Rows.Count
Dim RowsCalc As Long
RowsCalc = Sheet1.ListObjects("IWCP").DataBodyRange.Rows.Count
Application.ScreenUpdating = False
'Delete extra rows from Output Table
Dim lRow As Long
lRow = RowsOut + 1
Do While lRow >= RowsIn + 2
Sheet3.Rows(lRow).Delete
Sheet1.Rows(lRow + 1).Delete
lRow = lRow - 1
Loop
'Select UWI column from input table
Application.Goto Sheet6.ListObjects("Input").ListColumns("UWI").DataBodyRange
Selection.Copy
'Paste UWI column from input table
Sheet3.ListObjects("Results").ListColumns("UWI").DataBodyRange(1).PasteSpecial xlPasteValues
Sheet1.ListObjects("IWCP").ListColumns("UWI").DataBodyRange(1).PasteSpecial xlPasteValues
Application.CutCopyMode = False
'Return to previous cell
Application.Goto ActCell
Application.ScreenUpdating = True
End Sub
我假设您的两个表都在 Sheet1 中。您必须在Sheet1对应的模块中插入以下代码
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngsrc As Range, rngtrg As Range
Dim losrc As ListObject, lotrg As ListObject
Set losrc = Me.ListObjects(1)
Set lotrg = Me.ListObjects(2)
'Set rngsrc = your_source_range_to_monitor
Set rngsrc = losrc.ListColumns(1).Range
Set rngtrg = lotrg.ListColumns(1).Range
Dim ints As Range
Set ints = Application.Intersect(rngsrc, Target)
If (Not (ints Is Nothing)) Then
' Do your job to copy from rngsrc to rngtrg
Application.CutCopyMode = xlCopy
rngsrc.Copy
rngtrg.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlPasteSpecialOperationNone
End If
End Sub
并根据需要进行修改。