Microsoft Excel 将一列中的行拆分为单独的列

Microsoft Excel 将一列中的行拆分为单独的列

我在 Excel 中有几千行数据,每个逻辑记录使用两行,其中职位/设备编号和职位名称在 C 列中交替排列。我想将职位名称数据移到 D 列并删除不必要的行,留下每行一个记录的更合乎逻辑的布局。数据现在如下所示:

        Column A     Column B    Column C
Row 1   Date:        Employee:   Job/Eqp:
Row 2   07/10/2014   Jeremy      2014042
Row 3                            LABCORP GAITHERSBURG
Row 4   07/10/2014               2013002
Row 5                            DULLES LANDING
Row 6   07/11/2014               2013002
Row 7                            ONE LOUDOUN BUILDING P
Row 8   07/11/2014               2014049
Row 9                            ELITE SHOOTING SPORTS

这就是我想要的:

        Column A     Column B    Column C    Column D
Row 1   Date:        Employee:   Job/Eqp:   Job Name:
Row 2   07/10/2014   Jeremy      2014042    LABCORP GAITHERSBURG
Row 3   07/10/2014               2013002    DULLES LANDING
Row 4   07/11/2014               2013002    ONE LOUDOUN BUILDING P
Row 5   07/11/2014               2014049    ELITE SHOOTING SPORTS

我尝试过的宏或公式均不起作用。

答案1

如果您只需要执行一次此操作,并且假设每个逻辑记录恰好有两行,则不需要宏。我将 C 列复制到 D 列,然后删除单个单元格 D2,确保选择“上移单元格”。这会将每个职位名称上移一行。接下来,我将插入一个索引列,并用 1 到 2000 或您拥有的任何行数填充它。假设您在 E 列中插入索引列,接下来您将按 A 列对所有数据进行排序。日期列中所有有空白的交替行将一起排序并可以删除。最后,按索引列重新排序所有数据,您将得到您指示的格式。

答案2

我会使用 Power Query 插件来解决这个问题。这需要几个步骤,但不需要宏代码或更改输入数据结构。

我已经构建了一个原型,您可以查看或下载它 - 我的 One Drive 中的“Power Query 演示 - 将一列中的行拆分为单独的列”:

https://onedrive.live.com/redir?resid=4FA287BBC10EC562%21398

基本上,我的技术是首先构建一个中间查询,该查询过滤到每个奇数行(不包括标题),并添加一个“索引行对”列来跟踪行对。然后我创建了该查询的副本,该查询过滤到偶数行。然后我使用合并(在“索引行对”列上)连接到第一个查询并获取 Eqp 列。

答案3

假设 A 列(每组两行中的第一行)中始终有一个日期,则此宏应该执行此操作:

Sub CreateNewColumn()
Const dataSheetName As String = "Sheet1"

Dim dataSheet As Worksheet
Dim lastCellInColumnA As Range
Dim totalNoOfRows As Long
Dim autoFillSource As Range
Dim autoFillTarget As Range
Dim rowIndex As Long

Set dataSheet = ThisWorkbook.Worksheets(dataSheetName)
dataSheet.Range("D1").Value = "Job Name:"
dataSheet.Range("D2").Formula = "=C3"
totalNoOfRows = dataSheet.UsedRange.Rows.Count
'Don't include blank rows at the end
totalNoOfRows = dataSheet.Range("A" & CStr(totalNoOfRows + 1)).End(xlUp).Offset(1, 0).Row
'Set lastCellInColumnA = Sheet1!Range("A" & CStr(totalNoOfRows))

Set autoFillSource = dataSheet.Range("D2")
Set autoFillTarget = dataSheet.Range("D2:D" & CStr(totalNoOfRows))
autoFillSource.AutoFill autoFillTarget
dataSheet.Calculate
autoFillTarget.Copy
autoFillTarget.PasteSpecial xlPasteValues

For rowIndex = totalNoOfRows To 2 Step -1
    If Len(dataSheet.Range("A" & CStr(rowIndex))) = 0 Then
        dataSheet.Rows(rowIndex).Delete
    End If
Next rowIndex

ThisWorkbook.Save
End Sub

相关内容