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$] ,等待你的永远是错误提示。

  以上这五点,便是小爬在实际工作中接触各类不规范的数据源表格文件时,经常碰到的高频问题。如果您也遇到并为此头疼过,不妨试试对应的解决方法,一定能让你有种相见恨晚的感觉!

欢迎扫码关注我的公众号 获取更多爬虫、数据分析的知识!