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$] ,等待你的永遠是錯誤提示。

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM