Excel VBA中寫SQL,這些問題你一定爲此頭痛過 在Excel VBA中寫SQL,是一種什麼體驗

  上篇博文【在Excel VBA中寫SQL,是一種什麼體驗中,小爬簡單講了下如何在VBA中把excel文件當數據源,去寫熟悉的SQL語句,進行快速的數據分析。

本篇裏,小爬會重點講講這其中有哪些常見的坑,我們又該如何快速解決。

一、數據源excel文件中有大量合併單元格,非一般的二維表

這類數據源由於格式不規範,不適合使用SQL來處理,建議通過VBA cells(rowIndex,columnIndex).value的方式去訪問單元格。

 

二、數據源對應表的擡頭不在excel首行

 

   此時,我們可以指定數據區域行列的範圍。由於我們無法提前知道表格的行數,我們不妨假定一個很大的整數作爲表格數據的行邊界,最後在sql where子句中剔除空行的數據。

比如上圖中,數據分佈在B至I列,第四行纔是真正的字段名,代碼示例如下:

SELECT *  FROM [Sheet1$B4:$I1000] AS a WHERE a.物料號 IS NOT NULL

 

三、數據源表部分字段名爲空,如何取數

 

 

  上圖中,如何取到J列的值呢?SQL中,如果默認某列無字段名,卻存在具體數據,那麼當我麼Select某張表時,會自動包含這些列並後臺分配列名(Fn),比如J列(第10列),其列名可以用F10來指代,F代表Field(字段)。

 

四、部分數據源字段名中有特殊符號,該如何處理

 

  我們可以用"[  ]"將對應字段名括起來,避免特殊符號對SQL產生影響,如下所示:

Sql = "SELECT 公司代碼,總帳帳目,取數人,交易日期,'',[收/付方名稱],文本,本位幣金額,未達類型 FROM [Sheet1$]"

 

五、方法四不奏效時,該如何處理

 

 

  有的時候,對於一些特殊字段名,我們加上"[  ]" 來引用,發現後臺報錯,提示無效字段名?這時候又該怎麼辦?

我們可以先從recordset中讀出所有字段名,看sql 引擎後臺是如何解析字段名的,再來引用它。

Set RS = CreateObject("ADODB.RecordSet")
RS.Open Sql, CONN, 1, 1 'CONN ,指的是某個connection對象
For i = 0 To RS.Fields.Count - 1
    Debug.Print  RS(i).Name
Next

比如上圖中,F列(Tot.rpt.pr),在sql後臺的字段名是[Tot#rpt#pr],您要是一根筋地,非得 Select [Tot.rpt.pr] From [Sheet1$] ,等待你的永遠是錯誤提示。

  以上這五點,便是小爬在實際工作中接觸各類不規範的數據源表格文件時,經常碰到的高頻問題。如果您也遇到併爲此頭疼過,不妨試試對應的解決方法,一定能讓你有種相見恨晚的感覺!

歡迎掃碼關注我的公衆號 獲取更多爬蟲、數據分析的知識!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章