将SQL表结果除以1 - 循环遍历recorset

时间:2017-08-14 13:33:40

标签: sql excel vba

我有一个输出特定货币值的SQL查询。我需要将该表提取到我的Excel工作表,然后将货币除以1.在我的情况下,当前只检索第一批货币,然后只是复制与第一种货币相同的值。我应该采用不同的方法吗?

       Dim rst As ADODB.Recordset
       Set rst = conn.Execute("SELECT [midpoint] " _
                    & "FROM[FOREX] " _
                    & "Where currency in ('CAD','AUD','EURO','HKD','JPY','MYR','NZD','SGD','THB') and " _
                    & "xdate=(select max(xdate) FROM [FOREX] where currency  in ('CAD','AUD','EURO','HKD','JPY','MYR','NZD','SGD','THB'))")
    If rst.EOF Then
      Exit Sub
    End If

    Dim rstCAD As Double

     Sheets("Tables").Range("FX2USD_CAD").Value = 1 / rst(0)
     Sheets("Tables").Range("FX2USD_AUD").Value = 1 / rst(1)
     Sheets("Tables").Range("FX2USD_EURO").Value = 1 / rst(2)
    Sheets("Tables").Range("FX2USD_HKD").Value = 1 / rst(3)
    Sheets("Tables").Range("FX2USD_JPY").Value = 1 / rst(4)    
    Sheets("Tables").Range("FX2USD_MYR").Value = 1 / rst(5)
    Sheets("Tables").Range("FX2USD_NZD").Value = 1 / rst(6)
    Sheets("Tables").Range("FX2USD_SGD").Value = 1 / rst(7)
    Sheets("Tables").Range("FX2USD_THB").Value = 1 / rst(8)
    Sheets("Tables").Range("FXLastUpdated").Value = Now

End If

2 个答案:

答案 0 :(得分:1)

rst(1)尝试阅读第一行的 2nd 列,但您只有一列。

你需要调用.movenext移动到下一行,你可以循环,但你有一个预定义的值顺序,所以你可以:

dim sht as worksheet: set sht = Sheets("Tables")

with sht 
   .Range("FX2USD_CAD").Value = 1 / rst(0)
   rst.movenext

   .Range("FX2USD_AUD").Value = 1 / rst(0)
   rst.movenext

   ... and so on
end with

您需要修改SQL&添加ORDER BY子句以确保查询结果中的行顺序与代码中FX2USD_CAD_*的顺序一致。

答案 1 :(得分:0)

您必须将代码包装到while-loop

i = 0
While Not rs.EOF ' keep cycling untill all rows have been retrived
    ' write the value of the i-th cell
    Sheets("Tables").offset(index).Range("FX2USD_CAD").Value = 1 / rst(0) 
    ' one line per column (FX2USD_AUD, FX2USD_EURO, ...)
    rst.MoveNext ' retrive the next row
    i = i + 1 ' mode the index by one
Wend

当然,当你完成时关闭你的陈述:rst.Close