如何将多个列值范围匹配到一行,并使用VBA在另一个位置进行logging?

我正在和一个非政府组织进行志愿服务,帮助他们创build一个SQL数据库,用于每周的客户端考勤数据。 数据目前位于Excel电子表格中。

我想操纵电子表格,以避免让他们改变他们的过程。

关于这个电子表格:每一行表示一个不同的客户端,而3列的范围包含一周中5天的以下信息(时间,时间和单位)。 正好在 – 单位块的时间之上,是一组信息所属的服务date(date通常在该范围内合并,但是我不得不将其合并)。 以下截图供参考

电子表格截图

我需要做的是:我需要将每个客户的每个出席实例logging在一个单独的行上(在不同的位置 – 可以在同一张表上),将相应的服务date,时间,超时和单位等名字。

我曾尝试过:我试着做3个不同范围的信息,我需要查找,并将计数器作为范围宣布为3 For... Next计数器的For... Next循环。 我不确定如果While... Wend在这里更合适。

我也试过arrays方式,但这不是在我的VBA一起。

我也想知道是否有一个date时间的数据types,可以应用于Excel,以消除必须匹配其他范围的额外值。

注意:表格中灰色的单元格意味着客户没有安排在当天参加。 所以我需要包含一个If语句来跳过空白的单元格。

下面的代码将做你所需要的,足够让你开始我希望 – 请注意我有两张工作表,Sheet1(数据存储)和Sheet2(数据移动到)

我已经把循环放在r =当前行在sheet1上,c =当前列,然后x是sheet2的计数器

r循环从第3行开始,只能到第5行,但可以find最后一行并更改5,或者使用lastRowvariables,例如lastRow = .cells(.rows.count,1).end(xlup).row

这一切都假定数据总是正好在你的屏幕截图中显示的格式。 您可以在最里面的IF和END IF块内轻松地重新排列输出

 Sub shift_me() Dim r As Long Dim c As Long Dim x As Long Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets("Sheet2") x = 1 With ThisWorkbook.Worksheets("Sheet1") For r = 3 To 5 For c = 3 To 15 Step 3 If Not .Cells(r, c).Value2 = "" And Not .Cells(r, c).Value2 = 0 Then ws.Cells(x, 1).Value2 = .Cells(r, 1).Value2 ws.Cells(x, 2).Value2 = .Cells(r, 2).Value2 ws.Cells(x, 3).Value2 = .Cells(r, c).Value2 ws.Cells(x, 4).Value2 = .Cells(r, c + 1).Value2 ws.Cells(x, 5).Value2 = .Cells(r, c + 2).Value2 ws.Cells(x, 6).Value2 = .Cells(1, c).Value2 x = x + 1 End If Next c Next r End With End Sub