考虑以下示例:
考虑到我在“表1”中的表格中包含Country and Food及其值的列。
在表2中,我有两列名为Country#1和Food#1。我已经拥有的(@sktneer学分),需要通过下拉列表自动填充与国家#1单元格中的正确文本相关联的Food#1单元格。
示例:当我在国家#1中选择“马德里”时,它需要使用“小吃和玉米饼”文本自动填充食物#1。
这个代码是:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.CountLarge > 1 Then Exit Sub
Dim wsSource As Worksheet
Dim r As Long
Set wsSource = Sheets("Sheet1") 'Source sheet which contains a table of countries and their food
If Target.Column = 1 And Target.Row > 1 Then
If Application.CountIf(wsSource.Columns(1), Target.Value) > 0 Then
Application.EnableEvents = False
r = Application.Match(Target.Value, wsSource.Columns(1), 0)
Target.Offset(0, 1) = wsSource.Cells(r, 2)
Application.EnableEvents = True
End If
End If
End Sub
我的问题是:对于完全相同的问题,此代码是否可以缩放到更多列?
以下是示例的预览:
很抱歉,如果这个问题很广泛,但我的最终目标是比较两个代码(我拥有的代码和本例),以了解如何扩展到N个行数和N个列数。
祝你好运, 路易斯
答案 0 :(得分:1)
试试这个......
将以下代码放在Sheet2模块上。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.CountLarge > 1 Then Exit Sub
Dim wsSource As Worksheet
Dim r As Long
Set wsSource = Sheets("Sheet1") 'Source sheet which contains a table of countries and their food
If Target.Column = 1 And Target.Row > 1 Then
Application.EnableEvents = False
If Target <> "" Then
If Application.CountIf(wsSource.Columns(1), Target.Value) > 0 Then
r = Application.Match(Target.Value, wsSource.Columns(1), 0)
wsSource.Range("B" & r & ":E" & r).Copy Target.Offset(0, 1)
Target.Offset(0, 1) = wsSource.Cells(r, 2)
End If
Else
Target.Resize(1, 5).ClearContents
End If
Application.EnableEvents = True
End If
End Sub
答案 1 :(得分:0)
当你想要做的事情本质上是一个vlookup时,这似乎过于复杂。这是一个基本公式,如果您的数据位于左上方列,并假设列顺序匹配,则可以应用此公式。 =INDEX(Sheet2!$1:$1048576,MATCH($A2,Sheet2!$A:$A,TRUE),MATCH(B$1,Sheet2!$1:$1,FALSE))
或者,在将值设置为更加动态时使用VBA ......
Range(Target.Offset(0, 1), Target.Offset(0, Application.WorksheetFunction.CountA(wsSource.Rows(1)) + 1)).Value = _
Range(wsSource.Cells(r, 2), wsSource.Cells(r, Application.WorksheetFunction.CountA(wsSource.Rows(1)))).Value