Excel 使用数组的重排序表 试图用代码来查询数据,考虑数据形状如下: Empid| 1/01/2019|2/01/2019 | 3/01/2019 ------------------------------------------- 1 | A | B | A 2 | B | A | B 3 | B | C | C 4 | A | A | A Empid | Date | Shift --------------------- 1 |1/01/2019 | A 1 |2/01/2019 | B 1 |3/01/2019 | A 2 |1/01/2019 | B 2 |2/01/2019 | A 2 |3/01/2019 | B 3 |1/01/2019 | B 3 |2/01/2019 | C 3 |3/01/2019 | C 4 |1/01/2019 | A 4 |2/01/2019 | A 4 |3/01/2019 | A
球门形状如下:Excel 使用数组的重排序表 试图用代码来查询数据,考虑数据形状如下: Empid| 1/01/2019|2/01/2019 | 3/01/2019 ------------------------------------------- 1 | A | B | A 2 | B | A | B 3 | B | C | C 4 | A | A | A Empid | Date | Shift --------------------- 1 |1/01/2019 | A 1 |2/01/2019 | B 1 |3/01/2019 | A 2 |1/01/2019 | B 2 |2/01/2019 | A 2 |3/01/2019 | B 3 |1/01/2019 | B 3 |2/01/2019 | C 3 |3/01/2019 | C 4 |1/01/2019 | A 4 |2/01/2019 | A 4 |3/01/2019 | A,excel,vba,excel-formula,phpexcel,Excel,Vba,Excel Formula,Phpexcel,球门形状如下: Empid| 1/01/2019|2/01/2019 | 3/01/2019 ------------------------------------------- 1 | A | B | A 2 | B | A | B 3 | B | C | C 4 | A | A | A Empid | Date | Shi
Empid| 1/01/2019|2/01/2019 | 3/01/2019
-------------------------------------------
1 | A | B | A
2 | B | A | B
3 | B | C | C
4 | A | A | A
Empid | Date | Shift
---------------------
1 |1/01/2019 | A
1 |2/01/2019 | B
1 |3/01/2019 | A
2 |1/01/2019 | B
2 |2/01/2019 | A
2 |3/01/2019 | B
3 |1/01/2019 | B
3 |2/01/2019 | C
3 |3/01/2019 | C
4 |1/01/2019 | A
4 |2/01/2019 | A
4 |3/01/2019 | A
我使用此代码,并使用以下代码达到此形状:
Empid | Shift
---------------------
1 |A
1 |B
1 |A
2 |B
2 |A
2 |B
3 |B
3 |C
3 |C
4 |A
4 |A
4 |A
这是vba代码:
Sub TransposeData()
Const FirstDataRow As Long = 2 ' presuming row 1 has headers
Const YearColumn As String = "A" ' change as applicable
Dim Rng As Range
Dim Arr As Variant, Pos As Variant
Dim Rl As Long, Cl As Long
Dim R As Long, C As Long
Dim i As Long
With ActiveSheet
Cl = .UsedRange.Columns.Count - .UsedRange.Column + 1
Rl = .Cells(.Rows.Count, Columns(YearColumn).Column).End(xlUp).Row
Set Rng = Range(.Cells(FirstDataRow, YearColumn), .Cells(Rl, Cl))
End With
Arr = Rng.Value
ReDim Pos(1 To (UBound(Arr) * UBound(Arr, 2)), 1 To 2)
For R = 1 To UBound(Arr)
For C = 2 To UBound(Arr, 2)
i = i + 1
Pos(i, 1) = Arr(R, 1)
Pos(i, 2) = Arr(R, C)
Next C
Next R
R = Rl + 5 ' write 5 rows below existing data
Set Rng = ActiveSheet.Cells(R, YearColumn).Resize(i, 2)
Rng.Value = Pos
End Sub
在Excel 2016+中使用Power Query(也称为获取和转换)
选择第一列并取消选择其他列。
重命名将由GUI命名为Attributes的结果日期列和将由GUI命名为Value的Shift列
如果要在VBA中执行此操作,请在运行PQ时录制宏
在表格中选择单个单元格后,选择“从表格/范围获取并转换”
电源查询将打开。确保已选择第一列。然后,从Transform中,选择Unpivot按钮旁边的下拉列表。从该下拉列表中,选择取消打印其他列。
选择该选项后,您将看到需要重命名第2列和第3列
然后,从“文件”菜单中选择一个“关闭”选项,并将结果加载到同一工作表或另一工作表中。
现在,如果数据发生更改,您可以重新运行查询
正如我在上面所写的,如果需要使用VBA执行此操作,只需在执行步骤时录制一个宏即可
我还建议您搜索unpivot,您将获得大量信息。使用Power Query,即Excel 2016+中的get&Transform
选择第一列并取消选择其他列。
重命名将由GUI命名为Attributes的结果日期列和将由GUI命名为Value的Shift列
如果要在VBA中执行此操作,请在运行PQ时录制宏
在表格中选择单个单元格后,选择“从表格/范围获取并转换”
电源查询将打开。确保已选择第一列。然后,从Transform中,选择Unpivot按钮旁边的下拉列表。从该下拉列表中,选择取消打印其他列。
选择该选项后,您将看到需要重命名第2列和第3列
然后,从“文件”菜单中选择一个“关闭”选项,并将结果加载到同一工作表或另一工作表中。
现在,如果数据发生更改,您可以重新运行查询
正如我在上面所写的,如果需要使用VBA执行此操作,只需在执行步骤时录制一个宏即可
我还建议你搜索unpivot,你会得到很多信息。数组方法
注
您应该使用首选的日期格式设置目标范围的格式,例如dd/mm/yyyy;@ 数组方法
注
您应该使用首选的日期格式设置目标范围的格式,例如dd/mm/yyyy;@ 我不在这里,你可以编辑这个代码或帮助我,或向我解释它将如何在excel上做更多解释的步骤's@hadyalzpen你有什么版本的Excel?office16我只想在每次轮班时添加日期。@hadyalzpen我将在回答中添加一些屏幕截图。我不在下面。你能编辑此代码还是帮助我使用它或向我解释如何在excel上完成更多解释步骤's@hadyalzpen您有什么版本的Excel?office16我只想在每次轮班时添加日期。@hadyalzpen我将在回答中添加一些屏幕截图您的代码正在显式创建输出数组Pos并将其填充为两列。您需要将其更改为三列,将其更改为将Shift写入第3列,并添加代码将日期写入第2列添加一个接近您的方法的数组解决方案。因为这是您第一次使用此站点,如果有帮助,请随时将答案标记为正确。答案旁边的绿色复选标记表示接受-cf。然后去旅行。标记答案将帮助其他开发人员避免进入这个问题,因为它已经解决,我们可以关注其他问题。谢谢您的代码将显式创建输出数组并将其填充为两列。您需要将其更改为三列,将其更改为将Shift写入第3列,并添加代码将日期写入第2列添加一个接近您的方法的数组解决方案。因为这是您第一次使用此站点,如果有帮助,请随时将答案标记为正确。答案旁边的绿色复选标记表示接受-cf。然后去旅行。标记答案将帮助其他开发人员避免进入这个问题,因为它已经解决,我们可以关注其他问题。谢谢