我正在从事社会调查项目。由于数据的差异,我被困在某个地方。进行志愿者的调查得到了具有唯一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公式和数据操作的初学者。
答案 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中强>:
从 Sheet1 开始: