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。然后去旅行。标记答案将帮助其他开发人员避免进入这个问题,因为它已经解决,我们可以关注其他问题。谢谢