如何在excel表格中填写数据,date在另一个表格中给出的一系列date范围之间? 另外,一个特定的列应该匹配

我正在从事社会调查项目。由于数据的差异,我被困在某个地方。 进行志愿者调查的药片有独特的ID。 在不同的date,这些平板电脑在不同的城市使用。第一页包含了大约几千个城市名称缺失的响应列表,第二页列出了在不同date的不同城市使用的平板电脑列表。

表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中的城市列的值。我尝试使用Vlookup,但作为一个初学者擅长,无法让事情工作。 我设法将date列中的string格式化为date。 但我不确定如何进一步追求。

根据我的理解,Vlookup要求date范围是连续的,两者之间没有缺失值。 这种情况并非如此。 这是现实世界的数据,因此不完善。

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

有两种方法可以做你想做的事情。 第一个是使用vba并创build一个macros来完成这个工作,但是你必须多次迭代你的所有数据(在最坏的情况下,n1和n2分别是表中的行数)如果你有很多数据,这真的很慢。

另一种方式是更复杂一点,包括数组公式,但是比vba更快,因为它使用了excel的function(已经优化过)。

所以我将使用一个更简单的例子,你可以使用它,因为你希望你的数据。

我有以下表格:

表格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执行以下操作:在我创build的范围内匹配值1(TRUE),这应该完全匹配。 但是如何创build范围? 让我们拿这个部分为例:

 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(它匹配的第一行)。

所以现在我们只是使用索引来从另一个范围得到第二行。

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

如果deviceId值应该匹配,并且调查date应该开始date和结束date之间, VLookup将不足够。 下面的指针,但是,应该让你开始:

1)定义date比较的date范围。

2)使用重叠date检查function来确定所述date是否与开始date和结束date重叠。

3)遍历date范围并在find匹配时插入到Sheet2 ,即当deviceId值匹配date重叠时。

如果dateVal与开始date和结束date重叠,以下函数将作为参数来检查date,开始date和结束date,并返回True

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

这里我们使用MEDIAN()作为一个简单的方法来testing“中间”

 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 

Sheet2

在这里输入图像说明

Sheet1开始:

在这里输入图像说明