宏根据不同工作表

时间:2017-07-22 14:08:01

标签: excel vba excel-vba

考虑以下示例:

enter image description here

考虑到我在“表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

我的问题是:对于完全相同的问题,此代码是否可以缩放到更多列?

以下是示例的预览:

enter image description here

很抱歉,如果这个问题很广泛,但我的最终目标是比较两个代码(我拥有的代码和本例),以了解如何扩展到N个行数和N个列数。

祝你好运, 路易斯

2 个答案:

答案 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