在excel中将具有多个类别的宽数据重塑为高数据

在excel中将具有多个类别的宽数据重塑为高数据,excel,vba,Excel,Vba,excel中的数据集如下所示: Date Country1-GDP Country2-GDP Country1-Unemp Country2-Unemp Date1 Country1_Name Country1-GDP Country1-Unemp Date1 Country2_Name Country2_GDP Country2_Unemp Date2 Country1_Name Country1-GDP Country1-Unemp 我想

excel中的数据集如下所示:

Date   Country1-GDP   Country2-GDP  Country1-Unemp   Country2-Unemp
Date1   Country1_Name   Country1-GDP   Country1-Unemp
Date1   Country2_Name   Country2_GDP   Country2_Unemp
Date2   Country1_Name   Country1-GDP   Country1-Unemp
我想生成一个规范化的数据集,如下所示:

Date   Country1-GDP   Country2-GDP  Country1-Unemp   Country2-Unemp
Date1   Country1_Name   Country1-GDP   Country1-Unemp
Date1   Country2_Name   Country2_GDP   Country2_Unemp
Date2   Country1_Name   Country1-GDP   Country1-Unemp
我想在VBA中这样做,这样我可以在拉入数据后直接在excel中将其作为宏调用


有什么想法或建议吗?

首先确保将问题分解成更小的问题:

查找图纸布局

确定国家的数量(以便您知道不同的数据范围在哪里)

国家1作为其余国家的基础

收集country 1列并为其添加country name列(使用.xlEnd命令将其应用于适当数量的单元格,或与date列相比的.OFFSET)

我们需要这个国家的名字。我猜国家名称在列标题中(后面是-GDP,-UnEmp等),因此您可以很容易地从-GDP列中获得它,例如=LEFT(Range.Value2;LEN(Range.Value2)-4),去掉最后4个字符。将其作为局部变量保留

保留一份日期范围(a列:a)的副本以供重复使用

我们将存储一份日期范围的副本,因为我们将使用该副本将其他国家的日期粘贴到a:a列中的日期下

使用国家1中的布局在其余国家/地区循环

现在我们开始循环遍历所有国家2-N。将存储的日期副本粘贴到列A:A下(因此1个国家设置为1),获取coutnry名称(与国家1相同),并将其放在新粘贴的日期旁边。 和country by country为该国家选择不同的国家特征,并将数据移动到相应的country 1列下

对表格进行排序


按照您想要的任何顺序对数据进行排序(在您的案例中是日期/国家)

首先,请确保将您的问题分解为更小的问题:

查找图纸布局

确定国家的数量(以便您知道不同的数据范围在哪里)

国家1作为其余国家的基础

收集country 1列并为其添加country name列(使用.xlEnd命令将其应用于适当数量的单元格,或与date列相比的.OFFSET)

我们需要有这个国家的名称。我猜国家的名称在列标题中(后面是-GDP,-UnEmp等),所以你可以很容易地从-GDP列中得到它,比如=LEFT(Range.Value2;LEN(Range.Value2)-4),去掉最后4个字符。将其作为局部变量保留

保留一份日期范围(a列:a)的副本以供重复使用

我们将存储一份日期范围的副本,因为我们将使用该副本将其他国家的日期粘贴到a:a列中的日期下

使用国家1中的布局在其余国家/地区循环

现在我们开始循环遍历所有国家2-N。将存储的日期副本粘贴到列A:A下(因此1个国家设置为1),获取coutnry名称(与国家1相同),并将其放在新粘贴的日期旁边。 和country by country为该国家选择不同的国家特征,并将数据移动到相应的country 1列下

对表格进行排序


按您想要的顺序对数据进行排序(案例中的日期/国家)

是否总是有相同数量的国家?列是否总是相同的ie名称、GDP、Unemp等?如果您采用
CountryX\u名称
列的形式,因为在您的基本数据集中没有类似的列?@simon1979国家的数量可以更改,我有一个列出国家的命名范围,并且始终有相同的数字国家的数量?列是否总是相同的,即名称、GDP、Unemp等?您采取的形式是
CountryX_Name
列,因为在您的基本数据集中没有类似的列?@simon1979国家的数量可能会改变,我有一个命名范围,其中列出了国家的数量,但您的“保留一份D”步骤只有一个小问题重复使用的日期范围。这可能看起来很新,但在内存中创建和存储临时范围的最佳方法是什么?创建一个
range
对象(
Dim rDates as range
)。请参考A2:Axxx中的日期范围(
Set rDates=range(fromcell,tocell)
)。我猜
fromcell
(也是一个
range
)应该类似于
Range(“A2”)
tocell
类似于
Range(“A2”)。End(xlDown)
。非常感谢,在“保存日期范围副本以供重用”这一步中只有一个小问题。这可能看起来很新,但在内存中创建和存储临时范围的最佳方法是什么?创建一个
范围
对象(
Dim rDates as range
)。请参考A2:Axxx(
Set rDates=range)中的日期范围(fromcell,tocell)
)。我想
fromcell
(也是一个
Range
)应该类似于
Range(“A2”)
,而
tocell
类似于
Range(“A2”)。End(xlDown)