VBA将行转换为列

我尝试将TABLE1转换为TABLE2

TABLES

使用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方向(就像你一样)
  • 或者,如下所述,使用带有一些基本SQLQueryTable

使用查询表:

查询表基本上是一些外部数据(文本文件,数据库,另一个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 

    这段代码包含了一些你可能不需要的属性,但是,由于这不是一个性能问题,我们以后总是可以抛弃它们。

为我工作,让我知道如果你需要任何帮助。

在这里输入图像说明

希望这可以帮助。