【发布时间】:2017-05-24 00:24:23
【问题描述】:
我对 Excel 中的 VBA 完全陌生。
我的数据由 G 列(包含奖牌列表)和 H 列(代表国家/地区)组成。我想转置我的 NOC,使 J 列代表金牌,其余为其他奖牌(只要它们在同一行,顺序无关紧要是银牌还是铜牌)。请参考我下面的图片,这对我想要做什么是不言自明的。
我尝试编写 VBA 代码,以便它将列向下复制三并转置,但有很多次它没有通过三。有时有两枚铜牌,有时没有铜牌。
我认为它的工作方式是读取 G 列并沿着该列向下查找 Gold,如果找到“Gold”,那么我希望它转置下一列 H 的值,直到下一个 Gold 是在 G 列中找到。
下面由红色箭头指示的附图是我想要做的。
非常感谢您的帮助。
== 我设法在 stackoverflow 的帮助下解决了我的问题,这就是结果。
Public Sub RunSQL()
Dim conn As Object, rst As Object
Dim strConnection As String, strSQL As String
Dim i As Integer
Set conn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
' CONNECTION STRING
strConnection = "DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" _
& "DBQ=C:\Path\To\Current\Workbook.xlsm;"
' SQL STATEMENT
strSQL = "TRANSFORM MAX(m.NOC) AS CountryCode" _
& " SELECT m.[Event], m.[Event Gender]" _
& " FROM (SELECT t.[Event], t.[Event Gender], t.[Medal], t.NOC," _
& " (SELECT Count(*) FROM [MAIN$] sub" _
& " WHERE sub.[Event] = t.[Event]" _
& " AND sub.[Event Gender] = t.[Event Gender]" _
& " AND sub.[Medal] = t.[Medal]" _
& " AND (IIF(sub.[Medal]='Gold', 1, IIF(sub.[Medal]='Silver', 2, 3)) <" _
& " IIF(t.[Medal]='Gold', 1, IIF(t.[Medal]='Silver', 2, 3))" _
& " OR sub.[NOC] <= t.[NOC])) AS rn" _
& " FROM [MAIN$] t) m" _
& " GROUP BY m.[Event], m.[Event Gender]" _
& " PIVOT m.[Medal] & m.[rn] IN" _
& " ('Gold1', 'Gold2', 'Gold3', 'Silver1', 'Silver2', 'Silver3'," _
& " 'Bronze1', 'Bronze2', 'Bronze3')"
' OPEN DB CONN
conn.Open strConnection
rst.Open strSQL, conn
' COLUMN HEADERS
For i = 1 To rst.Fields.Count
Worksheets("RESULTS").Cells(1, i) = rst.Fields(i - 1).Name
Next i
' DATA ROWS
Worksheets("RESULTS").Range("A2").CopyFromRecordset rst
rst.Close: conn.Close
End Sub
【问题讨论】:
-
用括号绘制的指标列(即事件?)非常重要。定义这 2 或 3 个分组的 F 列或之前的列中有什么?
-
这是每场比赛的事件。所以我的专栏是,A:奥运会年份,B:主办城市 C:体育(例如 Auqatics) D:纪律(例如游泳) E:赛事(例如 100m 仰泳) F:赛事性别。所以我想要得到的是一个名单,列出了哪个国家在每场比赛中获得了金银铜牌。 :)
-
您使用的是 Excel for Windows 还是 Mac?
-
亲爱的 Parfait,我正在使用 Excel 2013 for windows!
-
亲爱的 Parfait,这是完整列的列表。(i.stack.imgur.com/KFC3I.jpg) 正如您所看到的,有些赛事有两枚铜牌,一个赛事总计多达 4 枚奖牌。尽管未在此列表中显示,但有些赛事只有一两枚奖牌(金牌、金牌和银牌)。我会很感激你的帮助!谢谢!!
标签: vba loops conditional-statements