close

此excel檔放另一貼文 : 我同時使用八種黃金交叉訊號來選股票

狀況一:在同一份工作表內

excel001.JPG

 

 

左邊先從sqlserver把資料抓進來,經過處理顯示在右邊,使用excel巨集來篩選便無法像sql般得心應手

excel程式碼:

Sub 單股營收()
 Sheets("營收").Range("p5:ad65536").ClearContents '清除表格資料   Dim cn As ADODB.Connection
   Dim rs As ADODB.Recordset
   Dim strDataSrcXlsPath As String
   strDataSrcXlsPath = ThisWorkbook.FullName
   'MsgBox "本活頁簿檔案所在之路徑為 " & ActiveWorkbook.Path
   'Workbooks.Open Filename:=ActiveWorkbook.Path & "poem.xls"   
  'ThisWorkbook.FullName = 目前檔案的位置
  'I) 以下建立數據庫連接 
  
  Dim filepath
   filepath = "Data Source = " & ActiveWorkbook.Path & "\" & "股票資訊1.xlsm" & ";Extended Properties=Excel 12.0;"
   'MsgBox aaa
  Set cn = New ADODB.Connection
  With cn
  .Provider = "Microsoft.ACE.OLEDB.12.0"
  .ConnectionString = filepath
  .Open

  cn.CursorLocation = adUseClient

  End With

  'II-1) 準備SQL
  Dim strQuery As String
  Dim strQueryWorksheet As String
  Dim strStartlocation As String
  Dim lngRowCounter As Long

  strStartlocation = "p5"
  strQueryWorksheet = "Query" '數據查詢頁面位置 股票名稱    股票代號    月份    營收最新一年    營收前一年  營收前二年  營收前三年  營收前四年


  '執行SQL
  strQuery = "SELECT 股票名稱 as 股票名稱1 ,股票代號 as 股票代號1,月份 as 月份1,營收最新一年 as 營收2022, 營收前一年 as 營收2021,營收前二年 as 營收2020,營收前三年 as 營收2019,營收前四年 as 營收2018,round((營收最新一年 -營收前一年)/營收前一年*100,2) as [近一年增幅%]  FROM [營收$] where (股票名稱 = '" & Range("v2").Value & "') and (營收前一年 > 0) order by 股票名稱 asc, 月份 asc "
  MsgBox strQuery
  Set rs = cn.Execute(strQuery)


  'III) 把數據抄至所需的位置

' MsgBox rs.Fields(lngColCounter).Name
  If rs.Fields.Count > 0 Then
      For lngColCounter = 0 To rs.Fields.Count - 1
          Sheets("營收").Range(strStartlocation).Offset(0, lngColCounter) = rs.Fields(lngColCounter).Name
      Next lngColCounter
      'III-2 把數據庫資料列表拿出
     Sheets("營收").Range(strStartlocation).Offset(1, 0).CopyFromRecordset rs
      MsgBox "轉檔結果巳完成"
        Else
       MsgBox "轉檔結果無資料"
  End If

  'IV) 關掉/清理連接
  cn.Close
  'rs.Close
  Set cn = Nothing
  Set rs = Nothing  
  
  End Sub

*連線字串要稍作改變先找出excl檔的路徑(filepath變數,每個人放的位置都不會相同),才有辦法執行

*同一個工作表有兩個資料表,欄位名稱不能相同,否則會無法執行(如果在執行後先清除掉相同欄位名稱也可以)

* [營收$]:此指excel的"營收"工作表,查詢excl工作表後面都要加$,加上[ ]是sql規定當遇到 數字 或% 等特殊字在首尾

 

狀況二:使用join也可行,不管是同一工作表或是兩個不同工作表

excel003.JPG

這邊使用"營收" 及 "eps"工作表

excel程式碼:

Sub 營收vseps()
Sheets("營收").Range("p5:ac65536").ClearContents '清除表格資料   Dim cn As ADODB.Connection
   Dim rs As ADODB.Recordset
   Dim strDataSrcXlsPath As String
   strDataSrcXlsPath = ThisWorkbook.FullName
   'MsgBox "本活頁簿檔案所在之路徑為 " & ActiveWorkbook.Path
   'Workbooks.Open Filename:=ActiveWorkbook.Path & "poem.xls"   
  'ThisWorkbook.FullName = 目前檔案的位置
  'I) 以下建立數據庫連接 
  
  Dim filepath
   filepath = "Data Source = " & ActiveWorkbook.Path & "\" & "股票資訊1.xlsm" & ";Extended Properties=Excel 12.0;"
   'MsgBox aaa
  Set cn = New ADODB.Connection
  With cn
  .Provider = "Microsoft.ACE.OLEDB.12.0"
  .ConnectionString = filepath
  .Open

  cn.CursorLocation = adUseClient

  End With

  'II-1) 準備SQL
  Dim strQuery As String
  Dim strQueryWorksheet As String
  Dim strStartlocation As String
  Dim lngRowCounter As Long

  strStartlocation = "p5"
  strQueryWorksheet = "Query" '數據查詢頁面位置 季度    EPS累計最新一年 EPS累計前一年   EPS累計前二年   EPS累計前三年   EPS累計前四年
  '執行SQL
  strQuery = "select a.股票名稱,a.股票代號,a.月份,a.營收最新一年 as 營收2022,a.營收前一年 as 營收2021,營收前二年 as 營收2020,營收前三年 as 營收2019,營收前四年 as 營收2018,round((營收最新一年 -營收前一年)/營收前一年*100,2) as [近一年增幅%]"
  strQuery = strQuery & " ,b.EPS累計最新一年 as eps2022,b.EPS累計前一年 as eps2021,b.EPS累計前二年 as eps2020,b.EPS累計前三年 as eps20219,b.EPS累計前四年 as eps2018 from [營收$] as a left join [eps$] as b on a.股票代號 = b.股票代號 and val(a.月份) = val(b.季度)"
   strQuery = strQuery & "  where (營收前一年 > 0) order by a.股票代號 asc,a.月份 asc,round((營收最新一年 -營收前一年)/營收前一年*100,2) desc"   
  
  MsgBox strQuery
  Set rs = cn.Execute(strQuery)
  'III) 把數據抄至所需的位置

' MsgBox rs.Fields(lngColCounter).Name
  If rs.Fields.Count > 0 Then
      For lngColCounter = 0 To rs.Fields.Count - 1
          Sheets("營收").Range(strStartlocation).Offset(0, lngColCounter) = rs.Fields(lngColCounter).Name
      Next lngColCounter
      'III-2 把數據庫資料列表拿出
     Sheets("營收").Range(strStartlocation).Offset(1, 0).CopyFromRecordset rs
      MsgBox "轉檔結果巳完成"
        Else
       MsgBox "轉檔結果無資料"
  End If

  'IV) 關掉/清理連接
  cn.Close
  'rs.Close
  Set cn = Nothing
  Set rs = Nothing  
  
  End Sub

*[營收$] as a left join [eps$] as b,這兩個資料表以a b來取代,可以減少程式碼,這邊val(a.月份) = val(b.季度),因為月份有1~12月而季度只有1~4,所以esp季度資料只會出現在1~4(目前資料只到第三季),如果使用inner join便無法顯示營收的5~12月,這邊使用left join便能強制把左邊的營收全部顯示

*where (營收前一年 > 0) : 計算漲幅時分母不能為零否則便會出現錯誤

來個影片

arrow
arrow
    全站熱搜

    zen2965 發表在 痞客邦 留言(0) 人氣()