Office中國(guó)論壇/Access中國(guó)論壇

 找回密碼
 注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

12下一頁(yè)
返回列表 發(fā)新帖
查看: 8066|回復(fù): 14
打印 上一主題 下一主題

[模塊/函數(shù)] 【原創(chuàng)】vba中拼接SQL語(yǔ)句不再煩惱

[復(fù)制鏈接]

點(diǎn)擊這里給我發(fā)消息

跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2015-8-13 10:00:57 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 盜夢(mèng) 于 2015-8-13 10:20 編輯

      我們用vba編程操作數(shù)據(jù)庫(kù)的時(shí)候,經(jīng)常拼接SQL語(yǔ)句。稍微一不留神就容易弄錯(cuò)。
      例如簡(jiǎn)單帶條件的Select語(yǔ)句,需要這么寫(xiě)
  1. Dim  strSql  as  string
  2. strSql = "select * from 表名 where 文本字段 = '" & 值1 & "' and 數(shù)字字段 = " & 值2
復(fù)制代碼
     再例如,典型的 Insert into 新增記錄語(yǔ)句,需要這么寫(xiě)
  1. Dim  strSql  as  string
  2. strSql = "Insert into 表名 (字段1,字段2,字段3)  values  ('" & 值1 & "'," & 值2 & ",'" & 值3 & "')"
復(fù)制代碼
     要特別留意哪些需要加單引號(hào),再添加一個(gè)字段也不方便。
     而且哪個(gè)值和哪個(gè)字段對(duì)應(yīng)也不容易分別清楚,很容易就會(huì)眼花繚亂。

      對(duì)vba字符串拼接和SQL語(yǔ)句不太熟的,很容易出錯(cuò)。而且這樣書(shū)寫(xiě)也不好維護(hù)。

      吐槽一大堆現(xiàn)狀之后,說(shuō)說(shuō)我的方法吧。
      我的方法靈感是來(lái)自 C#的String.Format()方法。

      C#的String.Format()方法可以設(shè)置文本格式,預(yù)先騰出位置給各個(gè)參數(shù)填寫(xiě)。
      例如 String.Format("你好,我是{0}。我今年{1}歲","張三",12)
      會(huì)得到 "你好,我是張三。我今年12歲"。利用這個(gè)方法,再結(jié)合vba的特性,我寫(xiě)了一個(gè)函數(shù)
  1. '函數(shù):按順序設(shè)置參數(shù),拼接字符串
  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
復(fù)制代碼

      我們就可以用我寫(xiě)的這個(gè)函數(shù)拼接字符串,包括SQL語(yǔ)句。例如
      
      怎樣 ^_^ ,用這個(gè)函數(shù)是不是方便清晰很多。

      特別說(shuō)明:
      1、在該函數(shù)中 ParamArray VarExpr() As Variant  是可變多個(gè)參數(shù)的意思。
      就像Switch函數(shù)可以帶多個(gè)不定個(gè)數(shù)的參數(shù)。
      該函數(shù)就是利用這個(gè)特性可以彈性設(shè)置多個(gè)參數(shù)。
      
      2、第一個(gè)參數(shù)是格式文本參數(shù)。
      其中需要替換的內(nèi)容,一定要從0開(kāi)始編號(hào),用花括號(hào)加數(shù)字作為標(biāo)記,中間編號(hào)不可斷層 {0},{1},{2}.....
      但可以重復(fù)使用替換標(biāo)記,例如 GetStringByPara("{0}:{1}{1}","id",5) 返回結(jié)果為 "id:55"

      最后,附上文件,函數(shù)在模塊modString 中

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒(méi)有帳號(hào)?注冊(cè)

x

評(píng)分

參與人數(shù) 1經(jīng)驗(yàn) +30 收起 理由
admin + 30 (其它)優(yōu)秀教程、原創(chuàng)內(nèi)容、以資鼓勵(lì)、其.

查看全部評(píng)分

本帖被以下淘專(zhuān)輯推薦:

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享分享 分享淘帖1 訂閱訂閱

點(diǎn)擊這里給我發(fā)消息

2#
發(fā)表于 2015-8-13 13:26:38 | 只看該作者
{:soso_e179:}{:soso_e179:} 非常好,趕快下來(lái)試下

點(diǎn)擊這里給我發(fā)消息

3#
 樓主| 發(fā)表于 2015-8-13 13:38:35 | 只看該作者
制定一個(gè)格式規(guī)則,結(jié)合vb\vba代碼的特性,所以這個(gè)函數(shù)比較精簡(jiǎn)
4#
發(fā)表于 2015-8-13 14:42:55 | 只看該作者
謝謝分享.
好像和todaynew斑竹的那個(gè)異曲同工{:soso_e120:}
他的靈感好像是來(lái)自vb.net的,呵呵,思路擴(kuò)展的都很好,給贊

點(diǎn)擊這里給我發(fā)消息

5#
 樓主| 發(fā)表于 2015-8-13 14:50:55 | 只看該作者
風(fēng)中漫步 發(fā)表于 2015-8-13 14:42
謝謝分享.
好像和todaynew斑竹的那個(gè)異曲同工
他的靈感好像是來(lái)自vb.net的,呵呵,思路擴(kuò)展的 ...

他也寫(xiě)過(guò)呀?!可否有鏈接看看
6#
發(fā)表于 2015-8-13 15:09:24 | 只看該作者
盜夢(mèng) 發(fā)表于 2015-8-13 14:50
他也寫(xiě)過(guò)呀?!可否有鏈接看看

好,我抽空幫你找找,你也搜一下.也就幾個(gè)月之前發(fā)的吧,因我一般只看框架,所以不小心給你們聯(lián)系上了

點(diǎn)擊這里給我發(fā)消息

7#
 樓主| 發(fā)表于 2015-8-13 15:16:55 | 只看該作者
風(fēng)中漫步 發(fā)表于 2015-8-13 15:09
好,我抽空幫你找找,你也搜一下.也就幾個(gè)月之前發(fā)的吧,因我一般只看框架,所以不小心給你們聯(lián)系上了

找著了
http://mzhfr.cn/thread-119792-1-1.html
基本上是一樣的

點(diǎn)擊這里給我發(fā)消息

8#
發(fā)表于 2015-8-13 23:35:44 | 只看該作者
好東西,一定要收藏

點(diǎn)擊這里給我發(fā)消息

9#
發(fā)表于 2015-8-14 16:42:21 | 只看該作者
盜夢(mèng) 發(fā)表于 2015-8-13 15:16
找著了
http://mzhfr.cn/thread-119792-1-1.html
基本上是一樣的

你們想到一塊去了

點(diǎn)擊這里給我發(fā)消息

10#
 樓主| 發(fā)表于 2015-8-14 16:43:17 | 只看該作者
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則

QQ|站長(zhǎng)郵箱|小黑屋|手機(jī)版|Office中國(guó)/Access中國(guó) ( 粵ICP備10043721號(hào)-1 )  

GMT+8, 2025-7-17 05:13 , Processed in 0.085878 second(s), 37 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表