2014-12-03 28 views
0

当然,在VBA编辑其他人群宏时,我绝对是一个初学者。我正在处理一个项目,需要将第一个数据透视行和列标题中的数据合并到一个新的工作表中。我需要在A列(它可以是数据和计数变量)乘以每行的列数(也可以是数据和计数变量),这样,如果我有3列( A,B,C)和两行(1,2)之后,我将有6行3列,前3行全部具有与原始行1相同的数据,而后面的3行具有相同的数据作为原始行2.按列计数扩展行数VBA

然后,我必须粘贴列以匹配行以及数据以匹配行和列。

原始支点:

enter image description here

进球后宏:

enter image description here

我知道我需要数列数声明一个变量,然后使用该变量复制使用循环将这些行放到新的工作表中。我不相信使用第二个主键会起作用,因为即使我使用表格视图,它也不会使用列标题单元格值。我试过编写一些代码,但我不能在家里的电脑上看到它。

任何有关如何通过计算列数和扩大行的第一部分的建议将不胜感激。

+0

我提供了一个答案来完成你想要的,但我真的认为你的原始表格处于更好的标准化格式。出于好奇,你为什么要把它分解成Sheet2的形式? – peege 2014-12-03 02:53:07

+0

谢谢PJ我会在我的最后测试一下。这是因为项目的后续步骤要求accnt和value部分彼此相邻以上传到公司系统中。 – concs10 2014-12-03 03:03:09

+0

解释它。优秀。 – peege 2014-12-03 03:50:31

回答

0

你在这里。这应该做你正在寻找的东西。你只需要手动设置Sheet2的(“A1”)的值ACCNT ..

进行测试:

Private Sub FormShift() 

Dim tRow As Long  'target Row 
Dim lastCol As Long 
Dim lastRow As Long 

lastCol = Sheets("Sheet1").Cells(1, Columns.Count).End(xlToLeft).Column 
lastRow = Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row 
tRow = 2 

For iRow = 2 To lastRow 
    For iCol = 2 To lastCol 
     Sheets("Sheet2").Cells(tRow, 1) = Sheets("Sheet1").Cells(iRow, 1) 
     Sheets("Sheet2").Cells(tRow, 2) = Sheets("Sheet1").Cells(1, iCol) 
     Sheets("Sheet2").Cells(tRow, 3) = Sheets("Sheet1").Cells(iRow, iCol) 
     tRow = tRow + 1 
    Next iCol 
Next iRow 

End Sub 
+0

感谢这正是我所需要的,现在我知道如何做VBA中的循环。 – concs10 2014-12-03 03:11:47

0
Sub horz_vert() 

noOfColumns = Worksheets("Sheet1").Cells(1, Columns.Count).End(xlToLeft).Column - 1 
noOfRows = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row - 1 

Worksheets("Sheet2").Cells(1, 1) = Worksheets("Sheet1").Cells(1, 1) 

For j = 1 To noOfRows 
For I = 1 To noOfColumns 
Worksheets("Sheet2").Cells((I + 1) + (j - 1) * noOfColumns, 1) = Worksheets("Sheet1").Cells(j + 1, 1) 
Worksheets("Sheet2").Cells((I + 1) + (j - 1) * noOfColumns, 2) = Worksheets("Sheet1").Cells(1, I + 1) 
Worksheets("Sheet2").Cells((I + 1) + (j - 1) * noOfColumns, 3) = Worksheets("Sheet1").Cells(j + 1, I + 1) 
Next 
Next 

End Sub