我尝试将TABLE1转换为TABLE2
使用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列。
答案 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 Range
(就像你一样)QueryTable
和一些基本的SQL
使用查询表:
查询表基本上是一些外部数据的链接(文本文件,数据库,另一个excel-doc)。
关于查询表我喜欢的点:
出于我们的目的,它主要用两个属性来描述(还有更多属性,但我们保持简单):
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
此代码包含一些您可能不需要的属性,但是,由于这不是性能问题,我们以后可以随时将其删除。
适合我,如果您需要任何帮助,请与我联系。
希望这有帮助。