VBA将行转换为列

时间:2017-01-25 08:21:00

标签: excel vba excel-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 code

但无法弄清楚如何将YEAR数据从TABLE1 B1:G1移动到TABLE2的B列。

2 个答案:

答案 0 :(得分:1)

假设您使用示例中显示的安装程序,这对我有用:

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解决方案,您可以使用本机工作表 - 函数执行此操作,如下所示:

假设你有像图片中那样的设置,将这些公式放在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)

答案 1 :(得分:0)

K,也许还会根据我的信息给你一些提示,告诉你如何做到这一点。

我在那里找到了很多方法来实现这一目标......

  • 通过自动化PivotTable - 对象
  • 创建Recordset,然后循环显示记录和字段名称as shown in this example
  • 通过在x和y方向循环你的Table1 - Range(就像你一样)
  • 或者,如下所述,使用QueryTable和一些基本的SQL

使用查询表:

查询表基本上是一些外部数据的链接(文本文件,数据库,另一个excel-doc)。

关于查询表我喜欢的点:

  • 几乎连接任何数据源
  • 需要设置一次,之后可以刷新
  • 可以使用基本SQL-knowledge更改其内容(过滤器,其他列,顺序,计算字段),从而无需过度思考某些VBA逻辑。

出于我们的目的,它主要用两个属性来描述(还有更多属性,但我们保持简单):

  • Connection / ConnectionString存储有关您的关联数据的信息(文件类型,位置等)。在我们的例子中,这是我们正在处理的确切Excel文件。查看connectionstrings.com以获取有关其他fiole类型的更多信息。

    假设您使用Connection - 文件:

    xlsm可能看起来如何
    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)的字符串变量。在单元格中编辑它比在VBA中更舒服。

  • CommandText存储有关要获取的数据的信息。我们在这里使用CommandType = xlCmdSql,这意味着我们的CommandText将是一个SQL字符串,与此类似:

    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)的字符串变量。

    注意:如果你有10年以上的话,创建这个SQL显然是一个混乱的部分。在这种情况下,找到一种半自动编写SQL的方法,例如使用公式,然后将它们连接成一个字符串。

  • 这让我们开始了。我们现在可以使用上述属性创建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
    

    此代码包含一些您可能不需要的属性,但是,由于这不是性能问题,我们以后可以随时将其删除。

适合我,如果您需要任何帮助,请与我联系。

enter image description here

希望这有帮助。