VBA将行转换为列
我尝试将TABLE1转换为TABLE2
使用vba
code should go here, but when i paste it, i got erro that I have to much code
所以,我添加链接到TXT文档的VBA代码
但无法弄清楚如何将YEAR数据从TABLE1 B1:G1移动到TABLE2的B列。
假设你使用如你的例子所示的安装程序,这为我工作:
Sub tt() Dim ws As Worksheet, nws As Worksheet Dim i As Long, j As Long, c As Long Set ws = ActiveSheet Set nws = Worksheets.Add i = 0 c = 0 nws.Range("A1").Value = "Country" nws.Range("B1").Value = "Year" nws.Range("C1").Value = "Value" nws.Range("D1").Value = "Text" Do While ws.Cells(2 + i, 1).Value <> "" j = 0 Do While ws.Cells(1, 2 + j).Value <> "" nws.Cells(2 + c, 1).Value = ws.Cells(2 + i, 1).Value nws.Cells(2 + c, 2).Value = ws.Cells(1, 2 + j).Value nws.Cells(2 + c, 3).Value = ws.Cells(2 + i, 2 + j).Value nws.Cells(2 + c, 4).Value = "YES" c = c + 1 j = j + 1 Loop i = i + 1 Loop End Sub
对于非VBa解决scheme,您可以使用原生的Worksheets-Functions来执行此操作:
假设你有图片中的设置,把这些公式放在A9,B9和C9中,
对于A9;
=INDIRECT(CONCATENATE("A",ROUNDDOWN((ROW(1:1)-1)/COUNTA($B$2:$G$2),0)+3))
对于B9:
=INDEX($B$2:$G$2,MOD((ROW(1:1)-1),COUNTA($B$2:$G$2))+1)
对于C9:
=INDEX($A$3:$G$5,MATCH(E9,$A$3:$A$5,0),MOD(ROW(1:1)-1,COUNTA($B$2:$G$2))+2)
K,也可以给我一些提示,告诉我如何根据我所掌握的信息来做到这一点。
我觉得有很多方法可以达到这个目标
- 通过自动化
PivotTable
对象 - 通过创build一个
Recordset
,然后循环它的logging和字段名称,如本例所示 - 通过循环你的Table1-
Range
在X和Y方向(就像你一样) - 或者,如下所述,使用带有一些基本
SQL
的QueryTable
使用查询表:
查询表基本上是一些外部数据(文本文件,数据库,另一个Excel文档)的链接。
我喜欢关于查询表的点:
- 连接到几乎所有的数据源
- 需要设置一次,之后可以刷新
- 可以使用基本的SQL知识对其内容(filter,附加列,顺序,计算字段)进行更改,从而避免过度使用某些VBA逻辑。
就我们的目的而言,它主要用两个属性来描述(还有更多,但我们保持简单):
-
Connection
/ConnectionString
存储链接数据(文件types,位置等)的信息。 在我们的情况下,这是我们正在处理的确切的Excel文件。 请查看connectionstrings.com获取更多关于其他types的信息。假设您使用
xlsm
-File,以下是Connection
外观:OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;;Password=;User ID=Admin; Mode=Share Deny Write; Data Source=I:\yourfolder\ThisFile.xlsm; Extended Properties="Excel 12.0 Macro;HDR=YES"
为了简单
con = YourSheet.Cells(1,1)
,将其粘贴到一个单元格中,并使用con = YourSheet.Cells(1,1)
其读入一个stringvariables。 在一个单元格中编辑它比在VBA里面舒服得多。 -
CommandText
存储有关要获取的数据的信息。 我们在这里使用CommandType = xlCmdSql
,这意味着我们的CommandText
将是一个SQLstring,类似于这个:SELECT Country, "1990" as y1, [1990] AS y_value FROM [Tabelle1$A2:G5] UNION ALL SELECT Country, "1991" as y1, [1991] AS y_value FROM [Tabelle1$A2:G5] UNION ALL SELECT Country, "1992" as y1, [1992] AS y_value FROM [Tabelle1$A2:G5] ....
再次,将其粘贴到一个单元格中,将Excel范围调整为您的Table1-Range,并将其读取到
cmd = YourSheet.Cells(1,2)
的stringvariables中。注意:创build这个SQL显然是十年以上的混乱部分。 在这种情况下,find一种方法来半自动地写入SQL,例如使用公式,然后将它们连接成一个string。
-
这让我们开始。 我们现在可以创build一个具有上述属性的
QueryTable
。 最后的子看起来像Option Explicit Sub CreateQT() With ThisWorkbook.Worksheets("sheet50") chkQT: If .QueryTables.Count > 0 Then .QueryTables(.QueryTables.Count).Delete: GoTo chkQT Dim con As String con = .range("con").Value Dim cmd As String cmd = .range("cmd").Value With .QueryTables.Add(Connection:=con, Destination:=.Cells(10, 1)) .CommandType = xlCmdSql .CommandText = cmd .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = False .SaveData = True .AdjustColumnWidth = True .PreserveColumnInfo = True .RefreshStyle = xlOverwriteCells .RefreshPeriod = 0 .Refresh BackgroundQuery:=False .MaintainConnection = False End With End With End Sub
这段代码包含了一些你可能不需要的属性,但是,由于这不是一个性能问题,我们以后总是可以抛弃它们。
为我工作,让我知道如果你需要任何帮助。
希望这可以帮助。