ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3735|回复: 10

[讨论] 为什么SQL标题字段不能由文字与字母组成

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-11-23 18:42 | 显示全部楼层 |阅读模式
SQL IN  EXCEL 中,标题字段不能由文字与字母组成,如车间A,车间F,这样就会出错。

SQL之BUG.rar

45.76 KB, 下载次数: 15

TA的精华主题

TA的得分主题

发表于 2015-11-23 21:38 | 显示全部楼层
@是SQL保留字,如果坚持使用,字段需要用方括号括起来,temp = "[" & temp & "]":
  1. Sub SQL合并数据()
  2.     Dim cnn As Object, rs As Object, rst As Object, d As Object, ds As Object, k
  3.     Dim SQL$, Mypath$, MyFile$, s$, m&, n&, i%, j&, l&, arrf(), arr(), temp$, strField$
  4.     With Application.FileDialog(msoFileDialogFolderPicker)
  5.         .InitialFileName = ThisWorkbook.Path & ""
  6.         If .Show = False Then Exit Sub
  7.         Mypath = .SelectedItems(1) & ""
  8.     End With
  9.     Application.ScreenUpdating = False
  10.     Set d = CreateObject("scripting.dictionary")
  11.     Set ds = CreateObject("scripting.dictionary")
  12.     Cells.ClearContents
  13.     MyFile = Dir(Mypath & "*.xls?")
  14.     Do While MyFile <> ""
  15.         If MyFile <> ThisWorkbook.Name Then
  16.             Set cnn = CreateObject("ADODB.Connection")
  17.             cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & Mypath & MyFile
  18.             Set rst = cnn.OpenSchema(20)    'adSchemaTables
  19.             Do Until rst.EOF
  20.                 If rst.Fields("TABLE_TYPE") = "TABLE" Then
  21.                     SQL = Replace(rst("TABLE_NAME").Value, "'", "")
  22.                     If Right(SQL, 1) = "$" Then
  23.                         Set rs = cnn.Execute("[" & SQL & "]")
  24.                         If Left(rs.Fields(0).Name, 1) <> "F" And Not IsNumeric(Mid(rs.Fields(0).Name, 2)) Then
  25.                             n = n + 1
  26.                             ReDim Preserve arrf(1 To 2, 1 To n)
  27.                             arrf(1, n) = "[Excel 12.0;Database=" & Mypath & MyFile & "].[" & SQL & "]"
  28.                             arrf(2, n) = "'" & Split(MyFile, ".")(0) & "' as 工作簿名,'" & Replace(SQL, "$", "") & "' as 工作表名"
  29.                             strField = ""
  30.                             For i = 0 To rs.Fields.Count - 1    '历遍每个工作表的每个字段(判断列数不等的依据)
  31.                                 temp = rs.Fields(i).Name
  32.                                 If Left(temp, 1) <> "F" And Not IsNumeric(Mid(temp, 2)) Then    '排除其他可能的空字段
  33.                                     If Len(temp) Then
  34.                                         temp = "[" & temp & "]"
  35.                                         If Not d.Exists(temp) Then d(temp) = ""    '字段名写入字典
  36.                                     End If
  37.                                     strField = strField & temp & ","    '字段名用逗号连接
  38.                                     ds(arrf(1, n)) = strField & ","   '工作簿名与工作表名连接添加到字典ds键值,字段名连接字符串添加到字典条目
  39.                                 End If
  40.                             Next
  41.                         End If
  42.                     End If
  43.                 End If
  44.                 rst.MoveNext
  45.             Loop
  46.         End If
  47.         MyFile = Dir()
  48.     Loop
  49.     k = d.Keys
  50.     [a1:b1] = Array("工作簿名", "工作表名")
  51.     [c1].Resize(, d.Count) = k
  52.     For i = 1 To n
  53.         SQL = ""
  54.         For j = 0 To UBound(k)    '逐个不重复字段
  55.             If InStr("," & ds(arrf(1, i)), "," & k(j) & ",") Then    '该工作表存在该字段
  56.                 SQL = SQL & "," & k(j)
  57.             Else
  58.                 SQL = SQL & ",'' as " & k(j)  '该工作表不存在该字段要添加 '' as 字段
  59.             End If
  60.         Next
  61.         SQL = "select " & arrf(2, i) & SQL & " from " & arrf(1, i) & ""
  62.         Range("a" & Range("A1").CurrentRegion.Rows.Count + 1).CopyFromRecordset cnn.Execute(SQL)
  63.     Next
  64.     With ActiveSheet.UsedRange
  65.     .Value = .Value
  66.     End With
  67.     rs.Close
  68.     rst.Close
  69.     cnn.Close
  70.     Set rs = Nothing
  71.     Set rst = Nothing
  72.     Set cnn = Nothing
  73.     Application.ScreenUpdating = True
  74.     MsgBox "查询完成"
  75. End Sub
  76. '@
复制代码

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-23 21:47 | 显示全部楼层
zhaogang1960 发表于 2015-11-23 21:38
@是SQL保留字,如果坚持使用,字段需要用方括号括起来,temp = "[" & temp & "]":

多谢赵老师。昨天在电脑前搞了七八个小时老毛病发作,现已躺在床上!伤不起。

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-24 07:55 | 显示全部楼层
zhaogang1960 发表于 2015-11-23 21:38
@是SQL保留字,如果坚持使用,字段需要用方括号括起来,temp = "[" & temp & "]":

如果字段本身有 [],

如:[车间A]  这样也会出现类似的错误提示的。

TA的精华主题

TA的得分主题

发表于 2015-11-24 08:39 | 显示全部楼层
我也碰上过此类情况,就是数据中如果含SQL中的保留字一定要做特殊处理。
只要数据不规范我就不敢用SQL,比如我前两天碰上一个,数据中有文本也有数字,就一直报错,只好先把数字也先变成文本;另外有空的列,即列标题的也没有的地种整列都是空的,那种也报错,只能把空列删除掉,还有就是字段中有引号,不一而足啊,我这初级水平发现SQL对数据的要求真是太严格了!

TA的精华主题

TA的得分主题

发表于 2015-11-24 08:42 | 显示全部楼层
本帖最后由 autumnalRain 于 2015-11-24 09:09 编辑
zhaogang1960 发表于 2015-11-23 21:38
@是SQL保留字,如果坚持使用,字段需要用方括号括起来,temp = "[" & temp & "]":

请问赵老师,我以前一个求助贴子中,一位老师对我说,VBA+SQL中,只要是列字段都加上[]没有问题,这样说对吗?我试过一个例子,加上确实可以执行。请老师指点!
他的原话是:
“我写的时候 字段都是带着[]的  就不会出错,有时也看别人省略[]的  
具体我也不清楚啊,不偷懒,多写点不会错的。
你要是找到了规范帮助的地方也告诉我声。”

TA的精华主题

TA的得分主题

发表于 2015-11-24 09:48 | 显示全部楼层
autumnalRain 发表于 2015-11-24 08:39
我也碰上过此类情况,就是数据中如果含SQL中的保留字一定要做特殊处理。
只要数据不规范我就不敢用SQL,比 ...

SQL还有很多意想不到的错误,我工作中都遇到过。所以建议使用SQL最好还是确保数据的进和出,表格的格式固定。但是在EXCEL中,这样的情况确实不多。我手头百分之80的工作,表格都是变化的。所以只能先经过处理,再放入ACCESS,起到规范作用。而不能直接去连接读入。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-11-24 12:30 | 显示全部楼层
张雄友 发表于 2015-11-24 07:55
如果字段本身有 [],

如:[车间A]  这样也会出现类似的错误提示的。

加个判断:
If Left$(temp, 1) <> "[" And Right$(temp, 1) <> "]" Then temp = "[" & temp & "]"

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-11-24 12:32 | 显示全部楼层
autumnalRain 发表于 2015-11-24 08:42
请问赵老师,我以前一个求助贴子中,一位老师对我说,VBA+SQL中,只要是列字段都加上[]没有问题,这样说 ...

如t13564865256老师所说,SQL对数据要求严格,如果不能确定其规范性,还是用常规法保险

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-6-14 11:34 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-27 05:46 , Processed in 0.052687 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表