2011-12-27 76 views
1

我想尝试几天以来,但由于缺乏VBA技能,所以无法正常工作。更改单元格后,用VBA对应一个键的Excel复制值

场景:

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

实施例:
用户从下拉列表采摘值“团队一”在A1在片之一。该表在第二张表中定义。在表二的列表中的每个项目旁边都有一个用逗号分隔的名称列表。 用户从下拉列表中选择一个团队后,相应的名称列表将被复制到表1中的字段B1中。

此过程只能在A1更改时触发。

希望我能说清楚。如果我自己终于找到解决方案,我会在这里发布。

感谢您阅读本文。

+0

签名被删除,请参见常见问题解答。 – 2011-12-28 04:09:41

+0

我需要在VBA中这样做,因为要粘贴值的单元格不应该包含任何公式,因为单元格大部分时间都会被用户覆盖。 – Stowoda 2012-01-02 15:08:33

回答

0

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

在VBA编辑:

  1. Sheet 1中添加下列方法

    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. 在工作簿对象代码,输入以下方法:

    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 
    

我应该注意到您可以通过简单地使用Excel中数据验证选项中的列表控件来完成此操作。当你做出选择改变时,你会使用单元格B1中的标准VLookup来获取相应的值。

3

您可以在不使用VBA的情况下执行此操作。在现场你想粘贴到输入公式名称列表:

=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))) 

时,从下拉列表中选择任何内容,并且在选择的值将显示名称的相应列表这将是空白。

例如,如果在下拉是在Sheet 1上B1,下拉值在B1:B9 Sheet 2上,和名称的对应的列表是在A1:Sheet 2上A9,将使用以下公式:

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

编辑(每条评论): 要在VBA中使用它,您需要执行类似于@chris neilsen建议的操作。在工作表中,您将需要创建一个子一变事件:

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是将显示输出单元。

+0

明确而简单:) – JMax 2011-12-28 07:42:38

+0

谢谢你的回答。不幸的是,我没有解释,用户可以改变单元格,从而覆盖公式。 – Stowoda 2012-01-02 15:10:52

0

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

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

,如果球队的名称是在单元格B7,你可以用这个公式来获取名称的关联列表:下面 见道格Glancy的评论

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

编辑解释了为什么Excellll的解决方案比使用VLOOKUP更好。

+2

为什么你提倡VLookup超过索引/匹配? VLookup将您需要查看的数据的约束添加到右侧,而Index/Match没有。此外VLookup是不稳定的,因此可能会更慢。我主张使用索引/匹配。 – 2011-12-27 21:06:34

+0

@DougGlancy你说服了我。 – phoog 2011-12-27 21:58:16

0

要在VBA中执行此操作,请使用Change事件来监视数据输入单元。

假设你有一个名为您的验证数据范围内ListData,就把自己的模块中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 
相关问题