Excel - 满足条件时将数据转为行
Excel - Transposing Data into Rows when Condition Met
我真的希望有一个巧妙的方法来做到这一点,因为我现在正忙得不可开交。
我的 excel table 看起来像这样:
Company | Department | Area | Project1_B | Project1_A | Project2_B | Project2_A | Project3_B | Project3_A
Company1 Department1 Area1 High Medium High Low
Company1 Department1 Area2 Low Medium
Company2 Department1 Area1 Medium Medium High Low
Company2 Department2 Area1 Low High
基本上,对于每一行(代表组织中的一个区域),有多个项目(项目 1-100)的之前 (b) 和之后 (a) 状态
并非所有行都会有每个项目的值,如上所示,但每个项目总是有一个 'pair'(即前后状态)。
我试图实现的输出如下所示:
Company | Department | Area | Project_Name | Before | After
Company1 Department1 Area1 Project1 High Medium
Company1 Department1 Area1 Project3 High Low
Company1 Department1 Area2 Project2 Low Medium
Company2 Department1 Area1 Project1 Medium Medium
Company2 Department1 Area1 Project2 High Low
Company2 Department1 Area1 Project2 High Low
Company2 Department2 Area1 Project3 Low High
其中只有 'non blank' 条记录被转置。一个区域所从事的每个项目都应该有一行。
我试过各种转置方法和VLOOKUPS,都没有用。它令人沮丧,因为我怀疑它是一个非常简单的解决方案,但我所做的任何搜索都不是我想要的!
我想做的事情是否可行,使用公式或 VB,还是我最好将数据转储到数据库中并尝试这样做?
感谢您的帮助,
一种方法是使用 VBA。
Option Explicit
Sub TransposeData()
Dim FromSheet As Worksheet
Dim ToSheet As Worksheet
Dim FromColumn As Integer
Dim FromRow As Integer
Dim ToRow As Integer
Set FromSheet = Sheets("Sheet1")
Set ToSheet = Sheets("Sheet2")
ToRow = 2
For FromRow = 2 To FromSheet.UsedRange.Rows.Count
For FromColumn = 4 To FromSheet.UsedRange.Columns.Count Step 2
If FromSheet.Cells(FromRow, FromColumn) <> "" Then
ToSheet.Cells(ToRow, 1) = FromSheet.Cells(FromRow, 1) ' Column A: Company
ToSheet.Cells(ToRow, 2) = FromSheet.Cells(FromRow, 2) ' Column B: Dept
ToSheet.Cells(ToRow, 3) = FromSheet.Cells(FromRow, 3) ' Column C: Area
ToSheet.Cells(ToRow, 4) = FromSheet.Cells(1, FromColumn) ' Column D: Project before (from heading)
ToSheet.Cells(ToRow, 5) = FromSheet.Cells(1, FromColumn + 1) ' Column E: Project after (from heading)
ToSheet.Cells(ToRow, 6) = FromSheet.Cells(FromRow, FromColumn) ' Column F: Data - Before
ToSheet.Cells(ToRow, 7) = FromSheet.Cells(FromRow, FromColumn + 1) ' Column G: Data - After
ToRow = ToRow + 1
End If
Next FromColumn
Next FromRow
End Sub
假设您的结果(5 和 6)中的重复行是一个错误,这是一个使用 Power Query 的相对简单的 Pivot 操作(没有聚合,并遵循 Unpivot)。
如果您更改原始 table,Refresh
将更新结果 table。
- table selected 中有一个单元格:
Data => Get & Transform => From Table/Range
- 在 PQ UI、select tdhe 前三列:
"Company", "Department", "Area"
,然后是 Unpivot other columns
- 结果属性列将具有
Project1_B, etc
。
- 在下划线处拆分该列
- 将
B
替换为 Before
,将 A
替换为 After
- Select
Attribute.2
列和数据透视表
- 值列 = 值
- 高级选项“不聚合”
MCode
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Company", type text}, {"Department", type text}, {"Area", type text}, {"Project1_B", type text}, {"Project1_A", type text}, {"Project2_B", type text}, {"Project2_A", type text}, {"Project3_B", type text}, {"Project3_A", type text}}),
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type", {"Company", "Department", "Area"}, "Attribute", "Value"),
#"Split Column by Delimiter" = Table.SplitColumn(#"Unpivoted Other Columns", "Attribute", Splitter.SplitTextByDelimiter("_", QuoteStyle.Csv), {"Attribute.1", "Attribute.2"}),
#"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"Attribute.1", type text}, {"Attribute.2", type text}}),
#"Renamed Columns" = Table.RenameColumns(#"Changed Type1",{{"Attribute.1", "Project_Name"}}),
#"Replaced Value" = Table.ReplaceValue(#"Renamed Columns","B","Before",Replacer.ReplaceValue,{"Attribute.2"}),
#"Replaced Value1" = Table.ReplaceValue(#"Replaced Value","A","After",Replacer.ReplaceValue,{"Attribute.2"}),
#"Pivoted Column" = Table.Pivot(#"Replaced Value1", List.Distinct(#"Replaced Value1"[Attribute.2]), "Attribute.2", "Value")
in
#"Pivoted Column"
源数据
结果
我真的希望有一个巧妙的方法来做到这一点,因为我现在正忙得不可开交。
我的 excel table 看起来像这样:
Company | Department | Area | Project1_B | Project1_A | Project2_B | Project2_A | Project3_B | Project3_A
Company1 Department1 Area1 High Medium High Low
Company1 Department1 Area2 Low Medium
Company2 Department1 Area1 Medium Medium High Low
Company2 Department2 Area1 Low High
基本上,对于每一行(代表组织中的一个区域),有多个项目(项目 1-100)的之前 (b) 和之后 (a) 状态
并非所有行都会有每个项目的值,如上所示,但每个项目总是有一个 'pair'(即前后状态)。
我试图实现的输出如下所示:
Company | Department | Area | Project_Name | Before | After
Company1 Department1 Area1 Project1 High Medium
Company1 Department1 Area1 Project3 High Low
Company1 Department1 Area2 Project2 Low Medium
Company2 Department1 Area1 Project1 Medium Medium
Company2 Department1 Area1 Project2 High Low
Company2 Department1 Area1 Project2 High Low
Company2 Department2 Area1 Project3 Low High
其中只有 'non blank' 条记录被转置。一个区域所从事的每个项目都应该有一行。
我试过各种转置方法和VLOOKUPS,都没有用。它令人沮丧,因为我怀疑它是一个非常简单的解决方案,但我所做的任何搜索都不是我想要的!
我想做的事情是否可行,使用公式或 VB,还是我最好将数据转储到数据库中并尝试这样做?
感谢您的帮助,
一种方法是使用 VBA。
Option Explicit
Sub TransposeData()
Dim FromSheet As Worksheet
Dim ToSheet As Worksheet
Dim FromColumn As Integer
Dim FromRow As Integer
Dim ToRow As Integer
Set FromSheet = Sheets("Sheet1")
Set ToSheet = Sheets("Sheet2")
ToRow = 2
For FromRow = 2 To FromSheet.UsedRange.Rows.Count
For FromColumn = 4 To FromSheet.UsedRange.Columns.Count Step 2
If FromSheet.Cells(FromRow, FromColumn) <> "" Then
ToSheet.Cells(ToRow, 1) = FromSheet.Cells(FromRow, 1) ' Column A: Company
ToSheet.Cells(ToRow, 2) = FromSheet.Cells(FromRow, 2) ' Column B: Dept
ToSheet.Cells(ToRow, 3) = FromSheet.Cells(FromRow, 3) ' Column C: Area
ToSheet.Cells(ToRow, 4) = FromSheet.Cells(1, FromColumn) ' Column D: Project before (from heading)
ToSheet.Cells(ToRow, 5) = FromSheet.Cells(1, FromColumn + 1) ' Column E: Project after (from heading)
ToSheet.Cells(ToRow, 6) = FromSheet.Cells(FromRow, FromColumn) ' Column F: Data - Before
ToSheet.Cells(ToRow, 7) = FromSheet.Cells(FromRow, FromColumn + 1) ' Column G: Data - After
ToRow = ToRow + 1
End If
Next FromColumn
Next FromRow
End Sub
假设您的结果(5 和 6)中的重复行是一个错误,这是一个使用 Power Query 的相对简单的 Pivot 操作(没有聚合,并遵循 Unpivot)。
如果您更改原始 table,Refresh
将更新结果 table。
- table selected 中有一个单元格:
Data => Get & Transform => From Table/Range
- 在 PQ UI、select tdhe 前三列:
"Company", "Department", "Area"
,然后是Unpivot other columns
- 结果属性列将具有
Project1_B, etc
。- 在下划线处拆分该列
- 将
B
替换为Before
,将A
替换为After
- Select
Attribute.2
列和数据透视表- 值列 = 值
- 高级选项“不聚合”
MCode
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Company", type text}, {"Department", type text}, {"Area", type text}, {"Project1_B", type text}, {"Project1_A", type text}, {"Project2_B", type text}, {"Project2_A", type text}, {"Project3_B", type text}, {"Project3_A", type text}}),
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type", {"Company", "Department", "Area"}, "Attribute", "Value"),
#"Split Column by Delimiter" = Table.SplitColumn(#"Unpivoted Other Columns", "Attribute", Splitter.SplitTextByDelimiter("_", QuoteStyle.Csv), {"Attribute.1", "Attribute.2"}),
#"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"Attribute.1", type text}, {"Attribute.2", type text}}),
#"Renamed Columns" = Table.RenameColumns(#"Changed Type1",{{"Attribute.1", "Project_Name"}}),
#"Replaced Value" = Table.ReplaceValue(#"Renamed Columns","B","Before",Replacer.ReplaceValue,{"Attribute.2"}),
#"Replaced Value1" = Table.ReplaceValue(#"Replaced Value","A","After",Replacer.ReplaceValue,{"Attribute.2"}),
#"Pivoted Column" = Table.Pivot(#"Replaced Value1", List.Distinct(#"Replaced Value1"[Attribute.2]), "Attribute.2", "Value")
in
#"Pivoted Column"
源数据
结果