设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 7509|回复: 14
打印 上一主题 下一主题

[模块/函数] 【原创】vba中拼接SQL语句不再烦恼

[复制链接]

点击这里给我发消息

跳转到指定楼层
1#
发表于 2015-8-13 10:00:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 盗梦 于 2015-8-13 10:20 编辑

      我们用vba编程操作数据库的时候,经常拼接SQL语句。稍微一不留神就容易弄错。
      例如简单带条件的Select语句,需要这么写
  1. Dim  strSql  as  string
  2. strSql = "select * from 表名 where 文本字段 = '" & 值1 & "' and 数字字段 = " & 值2
复制代码
     再例如,典型的 Insert into 新增记录语句,需要这么写
  1. Dim  strSql  as  string
  2. strSql = "Insert into 表名 (字段1,字段2,字段3)  values  ('" & 值1 & "'," & 值2 & ",'" & 值3 & "')"
复制代码
     要特别留意哪些需要加单引号,再添加一个字段也不方便。
     而且哪个值和哪个字段对应也不容易分别清楚,很容易就会眼花缭乱。

      对vba字符串拼接和SQL语句不太熟的,很容易出错。而且这样书写也不好维护。

      吐槽一大堆现状之后,说说我的方法吧。
      我的方法灵感是来自 C#的String.Format()方法。

      C#的String.Format()方法可以设置文本格式,预先腾出位置给各个参数填写。
      例如 String.Format("你好,我是{0}。我今年{1}岁","张三",12)
      会得到 "你好,我是张三。我今年12岁"。利用这个方法,再结合vba的特性,我写了一个函数
  1. '函数:按顺序设置参数,拼接字符串
  2. '作者:阿航
  3. '日期:2015/08/07
  4. '参考:GetStringByPara("我是{0},今年{1}岁","张三",12)
  5. '返回:字符串,"我是张三,我今年12岁"
  6. Public Function GetStringByPara(strFormat As String, ParamArray VarExpr() As Variant)
  7.     Dim i As Long
  8.     For i = 0 To UBound(VarExpr)
  9.         strFormat = Replace(strFormat, "{" & i & "}", VarExpr(i))
  10.     Next

  11.     GetStringByPara = strFormat
  12. End Function
复制代码

      我们就可以用我写的这个函数拼接字符串,包括SQL语句。例如
      
      怎样 ^_^ ,用这个函数是不是方便清晰很多。

      特别说明:
      1、在该函数中 ParamArray VarExpr() As Variant  是可变多个参数的意思。
      就像Switch函数可以带多个不定个数的参数。
      该函数就是利用这个特性可以弹性设置多个参数。
      
      2、第一个参数是格式文本参数。
      其中需要替换的内容,一定要从0开始编号,用花括号加数字作为标记,中间编号不可断层 {0},{1},{2}.....
      但可以重复使用替换标记,例如 GetStringByPara("{0}:{1}{1}","id",5) 返回结果为 "id:55"

      最后,附上文件,函数在模块modString 中

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1经验 +30 收起 理由
admin + 30 (其它)优秀教程、原创内容、以资鼓励、其.

查看全部评分

本帖被以下淘专辑推荐:

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享分享 分享淘帖1 订阅订阅

点击这里给我发消息

2#
发表于 2015-8-13 13:26:38 | 只看该作者
{:soso_e179:}{:soso_e179:} 非常好,赶快下来试下

点击这里给我发消息

3#
 楼主| 发表于 2015-8-13 13:38:35 | 只看该作者
制定一个格式规则,结合vb\vba代码的特性,所以这个函数比较精简
4#
发表于 2015-8-13 14:42:55 | 只看该作者
谢谢分享.
好像和todaynew斑竹的那个异曲同工{:soso_e120:}
他的灵感好像是来自vb.net的,呵呵,思路扩展的都很好,给赞

点击这里给我发消息

5#
 楼主| 发表于 2015-8-13 14:50:55 | 只看该作者
风中漫步 发表于 2015-8-13 14:42
谢谢分享.
好像和todaynew斑竹的那个异曲同工
他的灵感好像是来自vb.net的,呵呵,思路扩展的 ...

他也写过呀?!可否有链接看看
6#
发表于 2015-8-13 15:09:24 | 只看该作者
盗梦 发表于 2015-8-13 14:50
他也写过呀?!可否有链接看看

好,我抽空帮你找找,你也搜一下.也就几个月之前发的吧,因我一般只看框架,所以不小心给你们联系上了

点击这里给我发消息

7#
 楼主| 发表于 2015-8-13 15:16:55 | 只看该作者
风中漫步 发表于 2015-8-13 15:09
好,我抽空帮你找找,你也搜一下.也就几个月之前发的吧,因我一般只看框架,所以不小心给你们联系上了

找着了
http://www.office-cn.net/thread-119792-1-1.html
基本上是一样的

点击这里给我发消息

8#
发表于 2015-8-13 23:35:44 | 只看该作者
好东西,一定要收藏

点击这里给我发消息

9#
发表于 2015-8-14 16:42:21 | 只看该作者
盗梦 发表于 2015-8-13 15:16
找着了
http://www.office-cn.net/thread-119792-1-1.html
基本上是一样的

你们想到一块去了

点击这里给我发消息

10#
 楼主| 发表于 2015-8-14 16:43:17 | 只看该作者
轻风 发表于 2015-8-14 16:42
你们想到一块去了

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-25 07:56 , Processed in 0.090562 second(s), 40 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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