如何填写excel表中的数据,其中日期位于另一张表中给出的一系列日期范围之间?此外,特定列应匹配

时间:2016-09-25 13:17:14

标签: excel excel-vba excel-formula vlookup vba

我正在从事社会调查项目。由于数据的差异,我被困在某个地方。进行志愿者的调查得到了具有唯一ID的平板电脑。在不同的日期,平板电脑被用于不同的城市 表1包含大约数千个缺少城市名称的响应列表,表2包含不同日期在不同城市使用的平板电脑列表。

第1页

City      DeviceID   StartDate     EndDate
Delhi       25      21-08-2014  26-08-2014
Mumbai      39      14-05-2014  21-05-2014
Chennai     91      17-11-2014  21-11-2014
Bangalore   91      11-10-2014  21-10-2014
Delhi       91      26-05-2015  29-05-2015
Hyderabad   25      23-05-2015  28-05-2015

第2页

S.Id  DeviceId  SurveyDate  City
203     91      15-10-2014  ?
204     25      24-08-2014  ?

我需要以某种方式填写表2中的city列的值。 我尝试使用Vlookup,但作为一个优秀的初学者,却无法让事情发挥作用。我设法将日期列中的字符串格式化为日期。 但我不确定如何进一步追求这一点。

根据我的理解,Vlookup要求日期范围是连续的,中间没有缺失值。在这种情况下并非如此。这是现实世界的数据,因此不完美。

解决这个问题的正确方法是什么?这可以用excel宏完成吗? 我还读了一些关于嵌套if语句的内容,但我很困惑成为excel公式和数据操作的初学者。

3 个答案:

答案 0 :(得分:3)

有两种方法可以做你想要的。 第一个是使用vba并创建一个宏来完成工作但是你必须多次遍历所有数据(在最坏的情况下n1 * n2循环,其中n1和n2是其中的行数'如果您有大量数据,那么这个表格真的很慢。

另一种方式稍微复杂一点,包括数组公式,但实际上比vba更快,因为它使用了excel函数的构建(已经优化)。

所以我将使用一个更简单的示例,您可以根据需要使用它。

我有以下表格:

表1

city ID start end    
A    1    3    5
B    3    4    6
C    3    5    8

表2

ID point  city
3    5      ? 

所以我们想要一个完成第二个表的公式。其中ID完全匹配,点在起始端之间。我们将使用MATCH和INDEX来获取它。 这是:

=INDEX(A$2:A$4;MATCH(1;(B$2:B$4=G2)*(C$2:C$4<=H2)*(D$2:D$4>=H2);0))

首先要在你写完之后运行它,你不应该按输入而是 ctrl + shift + enter 告诉excel将其作为数组公式运行它根本不会运行。

现在我们解决了这个问题,让我解释一下这里发生了什么:

MATCH执行以下操作: 匹配我创建的范围中的值1(TRUE),这应该是完全匹配。但是如何创建范围?让我们以此为例:

This B$2:B$4=G2 -gives-> {1;3;3}=3 --> {FALSE;TRUE;TRUE}

同样,MATCH中的第二件事给出:{TRUE;TRUE;FALSE} 所以现在我们有(请记住*类似于逻辑AND):

{FALSE;TRUE;TRUE}*{TRUE;TRUE;FALSE} --> {FALSE;TRUE;FALSE}

这与第三个结合后给出了{FALSE;TRUE;FALSE}

所以现在我们有MATCH(1;{FALSE;TRUE;FALSE};0) --> 2因为在范围内只有第二行与1匹配(它匹配的第一行)。

所以现在我们只使用索引来获取第2行的其他范围。

您可以在自己的数据上使用上述内容来获得预期的结果。 祝你好运!

答案 1 :(得分:1)

如果deviceId值匹配且调查日期 开始日期和结束日期之间,则VLookup是不够的。但是,以下指针应该可以帮助您入门:

1)定义应进行日期比较的日期范围。

2)使用重叠日期检查功能确定相关日期是否与开始日期和结束日期重叠。

3)循环浏览日期范围,并在找到匹配项时插入Sheet2,即当deviceId值与匹配且日期重叠时。

以下函数将要检查的日期,开始日期和结束日期作为参数,如果True与开始日期和结束日期重叠,则返回dateVal

Function dateOverlap(dateVal As String, startDate As String, endDate As String) As Boolean

    If DateDiff("d", startDate, dateVal) >= 0 And DateDiff("d", endDate, dateVal) <= 0 Then _
        dateOverlap = True

End Function

使用示例

Debug.Print dateOverlap("05-10-2016", "01-10-2016", "10-10-2016")(返回true)。

答案 2 :(得分:1)

我们使用MEDIAN()作为测试&#34;中间&#34; 的简便方法。

Sub FillInTheBlanks()
    Dim s1 As Worksheet, s2 As Worksheet
    Dim N1 As Long, N2 As Long, i As Long, j As Long
    Dim rc As Long, DeId As Long, sDate As Date
    Dim wf As WorksheetFunction

    Set s1 = Sheets("Sheet1")
    Set s2 = Sheets("Sheet2")
    Set wf = Application.WorksheetFunction

    rc = Rows.Count
    N1 = s1.Cells(rc, "A").End(xlUp).Row
    N2 = s2.Cells(rc, "A").End(xlUp).Row

    For i = 2 To N2
        DeId = s2.Cells(i, "B").Value
        sDate = s2.Cells(i, "C").Value
        For j = 2 To N1
            If DeId = s1.Cells(j, 2).Value Then
                If sDate = wf.Median(sDate, s1.Cells(j, "C").Value, s1.Cells(j, "D").Value) Then
                    s2.Cells(i, "D").Value = s1.Cells(j, "A").Value
                End If
            End If
        Next j
    Next i
End Sub

<强> Sheet 2中

enter image description here

Sheet1 开始:

enter image description here