实际上,我认为您的“Jan”工作表是您的“主”工作表,其标题行中将包含所有月份名称,并且这些也将是您所在的同一工作簿中的工作表名称想要导入余额。
因此,我想到了您可以双击“主”表上的月份名称(名称无关紧要)并从您单击的名称的表中导入余额(名称必须完全匹配) 到您单击的列中。下面的代码正是这样做的。就像在 VLOOKUP 中一样,该表列出客户名称的顺序无关紧要。但新名称将添加到底部。在下一次运行之前,您可以对它们进行不同的排序。与使用 VLOOKUP 时不同,工作表之间没有永久链接。这是代码。
Option Explicit
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _
Cancel As Boolean)
' 084
Const TriggerRow As Long = 1 ' change to suit
Dim TabName As String ' worksheet name to update from
Dim WsS As Worksheet ' data source: Tabname
With Target
If .Row = TriggerRow Then ' skip if row is different
TabName = .Value
If Len(TabName) Then ' if the clicked cell isn't blank
On Error Resume Next
Set WsS = Worksheets(TabName)
If Err Then
MsgBox "The worksheet """ & TabName & """ hasn't been set up yet.", _
vbInformation, "Invalid tab name"
Else
Application.ScreenUpdating = False ' this is faster
TransferBalances Target, WsS
Application.ScreenUpdating = True
End If
End If
Err.Clear
Cancel = True
End If
End With
End Sub
Private Sub TransferBalances(Target As Range, _
WsS As Worksheet)
' 084
' the same columns are used in both the Master and all Source sheets
' columns need not be positioned in numeric sequence (1 = "A", 2="B" etc)
Const NameClm As Long = 1 ' specify the column where the Client names are
Const IdClm As Long = 2 ' specify the column where the Client IDs are
Const BalClm As Long = 3 ' specify the column where the balance are
Dim IdRng As Range ' existing IDs in "Master" sheet
Dim SrcRng As Range ' cell range containing source data
Dim Src As Variant ' value of SrcRng (for faster access)
Dim R As Long ' loop counter: Rows
Dim Rt As Long ' target row
With Target.Worksheet
Set IdRng = .Range(.Cells(1, IdClm), .Cells(.Rows.Count, IdClm).End(xlUp))
' the range will not be extended to include added items
End With
With WsS
R = .Cells(.Rows.Count, IdClm).End(xlUp).Row ' last used row (IdClm)
' row 2 is the first row with data to be transferred
' copy all columns from A to the last one used in row 1
Set SrcRng = .Range(.Cells(2, 1), _
.Cells(1, .Columns.Count).End(xlToLeft).Offset(R - 1))
End With
Src = SrcRng.Value
For R = 1 To UBound(Src)
On Error Resume Next
Rt = WorksheetFunction.Match(Src(R, IdClm), IdRng, 0)
With Target.Worksheet
If Err Or (Rt = 1) Then ' disallow match in header row
Rt = .Cells(.Rows.Count, IdClm).End(xlUp).Row + 1
.Rows(Rt - 1).Copy
.Rows(Rt).Insert Shift:=xlDown ' copy formats from above
Application.CutCopyMode = False
.Cells(Rt, NameClm).Value = Src(R, NameClm)
.Cells(Rt, IdClm).Value = Src(R, IdClm)
End If
.Cells(Rt, Target.Column).Value = Src(R, BalClm)
End With
Next R
Err.Clear
End Sub
由于代码响应双击事件,它必须安装在主工作表的代码模块中。这个位置是必不可少的,因为在您的工作簿中的其他任何地方都不会注意到双击。只有将代码粘贴到该模块中,您才能享受承诺的自动化。