2012-04-03 83 views
0

我可以使用一些帮助,因为我是Excel VBA的新手。我有一个两页的工作簿,我想帮助一些VBA代码,它将电话#直接放置在下面的单元格中,一旦从上面单元格的下拉列表中选择了一个名称。 此下拉列表中的姓名将来自第一张表格“联系人”上的列A,而电话号码将来自同一联系人表格中的列B。 我的第二张工作表“Schedule”是一个很大的工作表,所以我希望在这个下拉列表中选择一个名字的时候运行这段代码,而不管这个工作表上的单元格位置如何。 任何和所有这方面的帮助将不胜感激,因为我有点卡住了这一点。 再次感谢, 兰迪Excel VBA:使用查找来定位和放置电话#根据名称选择

回答

0

假设:您的工作表的代码名称为wshContacts。在该表格中,您有一个名称列表,并且您已将该名称命名为“ContactNames”。在该范围旁边的单元格中是电话号码。在您的时间表中,您将数据验证下拉到指向ContactName命名范围的某些单元格中。

基于此,将此代码放置在日程表的代码模块中(右键单击工作表选项卡并选择查看代码)。

Private Sub Worksheet_Change(ByVal Target As Range) 

    Dim oValid As Validation 
    Dim rFind As Range 
    Dim sRefersTo As String 

    'The named range with your contact names 
    Const sCNAMES As String = "ContactNames" 

    Set oValid = Target.Validation 

    'Trap error where there's no validation in cell 
    On Error Resume Next 
     sRefersTo = oValid.Formula1 
    On Error GoTo 0 

    'If it's a DV pointing to contact names 
    If sRefersTo = "=" & sCNAMES Then 
     'Find the name in the list 
     Set rFind = wshContacts.Range(sCNAMES).Find(Target.Value, , xlValues, xlWhole) 
     'if the name was found 
     If Not rFind Is Nothing Then 
      'put the next cell (phone number) in the cell below the changed cell 
      Application.EnableEvents = False 
       Target.Offset(1, 0).Value = rFind.Offset(0, 1).Value 
      Application.EnableEvents = True 
     End If 
    End If 

End Sub 

这会针对您在计划表中所做的每一项更改运行。但是,如果已更改的单元格的数据验证指向联系表单上的命名范围,它只会实际执行某些操作。

有几件事值得注意。这段代码并没有考虑改变多个单元格,它并不在乎下面单元格中是否有东西(它会覆盖它)。所以你可能需要适应这些情况。

+0

非常感谢@Dick 。我认为这会很好。我非常感谢帮助。 – ExcelForFreelancers 2012-04-03 14:51:53

+0

嗨,我能够找出问题,因为我有书面工作表名称“联系人”,而不是指定的工作表名称“Sheet11” 再次感谢, – ExcelForFreelancers 2012-04-06 02:56:33

0

简单的VLOOKUP公式将做到这一点,不需要VBA。

如果与下降的细胞向下是A1,然后在A2这个公式可能做的伎俩:

= IF(A1 = “”, “”,VLOOKUP(A1,Sheet2的$ A:$ B,2,0))

+0

谢谢你的公式,但是我需要保留所有单元格的'可用'名称以上和以下,因为它是一个调度程序,我们将无法预测他们将使用哪个时间(行)。 VBA代码允许我们使用任何行,然后自动将手机放置在下方。你会碰巧能够用任何VBA代码来帮助我吗?再次感谢,Randy – ExcelForFreelancers 2012-04-03 08:53:28

+0

你为什么要用电话号码替换当前单元格下面的名字? – Aprillion 2012-04-03 09:01:13

+0

嗯....我们有一列可用的景点,以便用户可以输入约会,比如1:00,1:30,2:00和2:30。每个约会是一个小时。如果我们在1:30输入姓名,则为1小时。约会,我们不再需要2点时间段。然后,我们可以将有用的信息,如电话号码#插入该插槽中。我们不能在那里使用一个公式,因为我们不知道最初将使用哪个时隙。 (注意:每个单元格允许用户输入任何文本,而不仅仅是联系人下拉列表中的可用内容)另外,如果名称已经存在于时间段中,用户不一定会安排预约。 – ExcelForFreelancers 2012-04-03 09:19:10