Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在excel中将垂直数据转换为水平数据_Excel - Fatal编程技术网

在excel中将垂直数据转换为水平数据

在excel中将垂直数据转换为水平数据,excel,Excel,在excel表格中,我有如下数据: Name Age ------- ------- XYZ 24 ABC 25 CDE 26 GHI 27 我希望此数据在excel工作表中转换如下 Name1 Age1 Name2 Age2 Name3 Age3 Name4 Age4 XYZ 24 ABC 25 CDE 26

在excel表格中,我有如下数据:

Name        Age
-------    -------
XYZ        24
ABC        25
CDE        26
GHI        27
我希望此数据在excel工作表中转换如下

Name1     Age1    Name2     Age2    Name3     Age3    Name4     Age4
XYZ       24      ABC       25      CDE       26      GHI       27

这可能吗?请帮忙。谢谢

将其粘贴到vba编辑器(标准模块)中,并将代码添加到按钮。
代码假定表格从范围“A1”开始。
第一行包含标题,其他行包含示例中的值。
我粘贴了第8行的输出。
如果有帮助,请告诉我

Option Explicit

Sub Name_Age()

Dim oRange                  As Excel.Range
Dim iRange_Cols             As Integer
Dim lRange_Rows             As Long
Dim lCnt                    As Long

Dim vArray                  As Variant
Dim vArray_Dest             As Variant

Dim lUbound_Rows            As Long
Dim lUBound_Cols            As Long


Set oRange = ThisWorkbook.Sheets(1).UsedRange
iRange_Cols = oRange.Columns.Count
lRange_Rows = oRange.Rows.Count - 1
ReDim vArray(1 To lRange_Rows, 0 To iRange_Cols)
ReDim vArray_Dest(1 To iRange_Cols, 1 To (lRange_Rows * iRange_Cols))
vArray = oRange

lCnt = 0
For lCnt = 1 To lRange_Rows
    vArray_Dest(1, (lCnt * 2) - 1) = CStr("Name" & lCnt)
    vArray_Dest(1, (lCnt * 2)) = CStr("Age" & lCnt)
    vArray_Dest(2, (lCnt * 2) - 1) = vArray(1 + lCnt, 1)
    vArray_Dest(2, (lCnt * 2)) = vArray(1 + lCnt, 2)
Next lCnt

lUbound_Rows = UBound(vArray_Dest, 1)
lUBound_Cols = UBound(vArray_Dest, 2)

Set oRange = Nothing
Set oRange = ThisWorkbook.Sheets(1).Range(Cells(8, 1), Cells(8 + lUbound_Rows - 1, lUBound_Cols))
oRange = vArray_Dest

End Sub

将其粘贴到vba编辑器(标准模块)中,并将代码添加到按钮。
代码假定表格从范围“A1”开始。
第一行包含标题,其他行包含示例中的值。
我粘贴了第8行的输出。
如果有帮助,请告诉我

Option Explicit

Sub Name_Age()

Dim oRange                  As Excel.Range
Dim iRange_Cols             As Integer
Dim lRange_Rows             As Long
Dim lCnt                    As Long

Dim vArray                  As Variant
Dim vArray_Dest             As Variant

Dim lUbound_Rows            As Long
Dim lUBound_Cols            As Long


Set oRange = ThisWorkbook.Sheets(1).UsedRange
iRange_Cols = oRange.Columns.Count
lRange_Rows = oRange.Rows.Count - 1
ReDim vArray(1 To lRange_Rows, 0 To iRange_Cols)
ReDim vArray_Dest(1 To iRange_Cols, 1 To (lRange_Rows * iRange_Cols))
vArray = oRange

lCnt = 0
For lCnt = 1 To lRange_Rows
    vArray_Dest(1, (lCnt * 2) - 1) = CStr("Name" & lCnt)
    vArray_Dest(1, (lCnt * 2)) = CStr("Age" & lCnt)
    vArray_Dest(2, (lCnt * 2) - 1) = vArray(1 + lCnt, 1)
    vArray_Dest(2, (lCnt * 2)) = vArray(1 + lCnt, 2)
Next lCnt

lUbound_Rows = UBound(vArray_Dest, 1)
lUBound_Cols = UBound(vArray_Dest, 2)

Set oRange = Nothing
Set oRange = ThisWorkbook.Sheets(1).Range(Cells(8, 1), Cells(8 + lUbound_Rows - 1, lUBound_Cols))
oRange = vArray_Dest

End Sub

对于非VBA解决方案,您可以通过创造性地使用自动填充和排序来实现这一点:

进行一些创造性的自动填充和排序:

复制和粘贴转置:

你的工作完成了:

对于非VBA解决方案,您可以创造性地使用自动填充和排序来实现这一点:

进行一些创造性的自动填充和排序:

复制和粘贴转置:

你的工作完成了:

如果它能奏效,我能吗?但我不知道如何使用它。它是一次性的还是你需要定期这样做?可能是以前问题的重复。可能属于超级用户。但这怎么会偏离主题呢?如果它真的奏效了,我能做到吗?但我不知道如何使用它。它是一次性的还是你需要定期这样做?可能是以前问题的重复。可能属于超级用户。但这怎么会偏离主题呢?