上篇博文【在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$] ,等待你的永遠是錯誤提示。
以上這五點,便是小爬在實際工作中接觸各類不規范的數據源表格文件時,經常碰到的高頻問題。如果您也遇到並為此頭疼過,不妨試試對應的解決方法,一定能讓你有種相見恨晚的感覺!
歡迎掃碼關注我的公眾號 獲取更多爬蟲、數據分析的知識!