FAQ > 金融建模 > 第三方交互 > Excel

Q:VBA中如何从天软中获取一组股票的数据    

  • A:实现:提取A列指定好的股票组合的最新的收盘价,成交量等数据,可用于盘中刷新。
    本章中提供两种写法,主推第二种优化方式,效率高,结果刷新快。

    一般的写法:通过对股票的循环,一个个指标进行交互提取,这种方式计算很慢,交互本身存在消耗,如下面这种,供参考实现方式
    Private Sub CommandButton1_Click()
     Dim Obj As Object
     Set Obj = CreateObject("TSExpert.CoExec") 'com对象
     Dim ws As Worksheet
     Set ws = ThisWorkbook.Sheets("Sheet1") ' 工作表
      
     Dim rng As Range
     lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row '找到最后一行的下标
     For i = 2 To lastRow
      Obj.Stock = ws.Cells(i, "A").Value
      ws.Cells(i, "B").Value = Obj.RemoteCallFunc("stockName", ws.Cells(i, "A").Value)
      ws.Cells(i, "C").Value = Obj.RemoteCallFunc("close", "")
      ws.Cells(i, "D").Value = Obj.RemoteCallFunc("vol", "")
      ws.Cells(i, "E").Value = Obj.RemoteCallFunc("amount", "")
      ws.Cells(i, "F").Value = Obj.RemoteCallFunc("stockzf3", "")
      ws.Cells(i, "G").Value = Obj.RemoteCallFunc("base", 10029)
     Next i
     
     ws.Range("I6") = ws.Range("I6") + 1 '记录运行次数,方便观察是否运行完成
    End Sub


    优化写法:封装取数模型,通过一次交互提取需要的指标数据,这种方式效率快
    Private Sub CommandButton1_Click()
     Dim Obj As Object
     Set Obj = CreateObject("TSExpert.CoExec") 'com对象
     Dim ws As Worksheet
     Set ws = ThisWorkbook.Sheets("Sheet1") ' 工作表
      
     lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row '找到最后一行的下标
     Dim dataArray() As Variant
     dataArray = ws.Range("A2:A" & lastRow).Value ' 将A列的数据放入数组
     ws.Range("B1:G" & lastRow) = Obj.RemoteCallFunc("getStockData_VBA", Array(dataArray))

     ws.Range("I6") = ws.Range("I6") + 1
    End Sub


    其中,封装的天软函数getStockData_VBA脚本如下:
    Function getStockData_VBA(stocks);
    Begin
      setsysparam(pn_date(),today());
      t:= select //thisrow as "代码",
          stockName(thisrow) as "名称",
          spec(close(),thisrow) as "价格",
          spec(vol(),thisrow) as "成交量",
          spec(amount(),thisrow) as "成交金额(万)",
          spec(stockzf3(),thisrow) as "涨幅(%)",
          spec(base(10029),thisrow) as "行业"
         from stocks end;
      return t;
    End;

    示例中vba实现的文件:
    一般的写法:
    附件:VBA_CallTSDemo01.xlsm
    优化写法:
    附件:VBA_CallTSDemo02.xlsm