更改单元格后,使用对应于键的VBA复制Excel值

我正在尝试从几天以来,但由于我缺乏的VBA技能,不要得到它的工作。

场景:

  1. 用户:从下拉列表中select一个值(单元格只允许在另一个表单中定义的列表)。
  2. 代码:将剩余的值复制到适当的列表值。 (这是一个名字列表。)
  3. 代码:将值粘贴到表单中的特定字段。

例:
用户从表A1中的下拉列表中select“Team One”的值。 这个清单是在表二中定义的。 在表二的列表的每一项旁边是一个用逗号分隔的名字列表。 在用户从下拉列表中select一个团队之后,将相应的名称列表复制到表格1中的字段B1中。

这个过程只能在A1被改变时触发。

希望我能说清楚。 如果我自己终于find解决scheme,我会在这里发布。

谢谢您阅读此篇。

你可以做到这一点没有VBA。 在这个字段中你想要粘贴的名字列表中input这个公式:

 =IF(ISBLANK(<address of dropdown on Sheet1>),"",INDEX(<address of list to left of values on Sheet2>,MATCH(<address of dropdown on Sheet1>,<address of dropdown values on Sheet2>,0))) 

当从下拉列表中select任何内容时,这将是空白的,并且当select一个值时将显示适当的名称列表。

例如,如果下拉列表位于Sheet1的B1上,则下拉列表的值位于Sheet2上的B1:B9中,并且相应的名称列表位于Sheet2上的A1:A9中,则可以使用以下公式:

 =IF(ISBLANK(Sheet1!B1),"",INDEX(Sheet2!A1:A9,MATCH(Sheet1!B1,Sheet2!B1:B9,0))) 

编辑(每个评论):要在VBA中使用这个,你需要做一些类似于@chris neilsenbuild议的事情。 在“工作表”模块中,您需要为更改事件创build一个子对象:

 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("B1")) Is Nothing Then Range("A1").Formula = "=INDEX(Sheet2!A1:A9,MATCH(Sheet1!B1,Sheet2!B1:B9,0))" If IsError(Range("A1").Value) Then Range("A1") = "" Else Range("A1").Value = Range("A1") End If End If End Sub 

为了消除混淆,A1是将显示输出的单元格。

要做到这一点作为VBA,你会做下面的事情。 根据您的原始问题,Sheet2上有一个与下拉框中的select对应的列表,并填充到Sheet1上。

在VBA编辑器中:

  1. 在Sheet1中,添加以下方法

     Private Sub ComboBox1_Change() If ComboBox1.Text <> "Select" Then Dim selVal As String selVal = ComboBox1.Text Range("B1").Value = GetList(selVal) End If End Sub Public Function GetList(ByVal Value As String) As Variant Dim result As Variant result = Application.VLookup(Value, Worksheets("Sheet2").Range("A1:B100"), 2, False) GetList = result End Function 
  2. 在工作簿对象代码中,input以下方法:

      Private Sub Workbook_Open() With ThisWorkbook.Worksheets("Sheet1").ComboBox1 .AddItem "Team One" .AddItem "Team Two" .AddItem "Team Three" .AddItem "Team Four" .AddItem "Team Five" .Text = IIf(.Text = "", "Select", .Text) End With Worksheets("Sheet1").Activate End Sub 

我应该注意到,你可以做到这一点没有任何vba只需使用Excel中的数据validation选项中find一个列表控件。 当你做出select改变的时候,你可以在单元格B1中使用标准的VLookup来获取相应的值。

要在VBA中实现此function,请使用Change事件来监视数据input单元。

假设您已将validation数据范围命名为ListData ,请将其放在Sheet1的模块Sheet1

 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then [B1] = Application.WorksheetFunction.VLookup(Target.Value, [ListData].Resize(, 2), 2, 0) End If End Sub 

我会主张一种类似于Excell所描述的方法,但用VLOOKUP而不是MATCH 。 要做到这一点,你需要在每个团队的名字右边列出你的名字。 例如:

  | A | B 1 |Team 1 |Albert, Beth 2 |Team 2 |Carlo, Delia 3 |Team 3 |Egbert, Frederika 

现在,如果团队名称位于单元格B7,则可以使用此公式获取关联的名称列表:

 =VLOOKUP(B7, Sheet2!$A$1:$B$3, 2, FALSE) 

编辑请参阅下面的Doug Glancy的评论,解释为什么Excellll的解决scheme比使用VLOOKUP更好。