VBA 连接数据库,查询中的变量如何赋值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VBA 连接数据库,查询中的变量如何赋值相关的知识,希望对你有一定的参考价值。

数据库里有一个很复杂的查询,使用了日期变量作为查询条件,VBA调用的时候应该怎么给这个变量赋值?只能用SQL="" 的方法么?因为查询语句非常多,里面使用了很多"" 这个赋给SQL的时候就全部出错。。。

注释的!
Private Sub CommandButton5_Click()
Dim Conn As New ADODB.Connection '定义ADODB连接对象
Dim ConnStr As String '定义连接字符串
Dim xiao As String

xiao = ComData.Text

'对于SQL 2008,如果以IP方式访问服务器,必须要启动SQL Server Browser服务,如果是Express版本,要以“IP(计算机名)\实例名”方式访问
ConnStr = txtData.Text

Dim Records As New ADODB.Recordset '定义ADODB对象的记录集
Dim Sheet As Worksheet '定义工作表

Set Sheet = ThisWorkbook.Worksheets("Sheet2") '给变量Sheet赋值,注意:是工作簿中索引为1的那个表(通常一个新的工作簿Sheet1的索引为1)
'Sheet.Name = "Data" '把Sheet名称改为Data
Sheet.Cells.Clear '清空表中原有的数据

'连接状态是打开就不在进行Open操作

Conn.Open ConnStr
Dim SQLStr As String '要执行的SQL语句
SQLStr = "select * from Shift_Code where Club='" + xiao + "'" '可以执行更复杂的SQL语句

Records.Open SQLStr, Conn, adOpenStatic, adLockBatchOptimistic '读取SQL查询结果到Records记录集
'Records.Open
Dim i, j, TotalRows, TotalColumns As Integer
j = 0
TotalRows = Records.RecordCount
TotalColumns = Records.Fields.Count

'下面的循环把表头(即列名)写到Excel表的第一行
For i = 0 To TotalColumns - 1
Sheet2.Cells(1, i + 1) = Records.Fields(i).Name
Next

'下面的循环把查询结果写到Excel表中
Do While Not Records.EOF

For i = 0 To TotalColumns - 1
Sheet2.Cells(j + 2, i + 1) = Records.Fields(i).Value
Next

Records.MoveNext
j = j + 1

Loop
Records.Close '关闭记录集
Conn.Close '关闭连接

Set Records = Nothing '清空对象
Set Conn = Nothing '清空对象

End Sub

有什么不懂的话Hi我!
参考技术A 以下代码没有运行测试,如果有手误,自行改一下或HI我.
Dim cn As New ADODB.Connection
cn.Open "...." '连接句自己写吧.
Dim cmd As New ADODB.Command
cmd.ActiveConnection = cn
cmd.CommandText = "select * from tb where dt >@d1 and dt<@d2 "
Dim p1 As ADODB.Parameter, p2 As ADODB.Parameter
Set p1 = cmd.CreateParameter("@d1", adDate, adParamInput)
Set p2 = cmd.CreateParameter("@d2", adDate, adParamInput)
p1.Value = Format(Now(), "yyyy-MM-1")
p2.Value = Now()

cmd.Parameters.Append p1
cmd.Parameters.Append p2
Dim rs As ADODB.Recordset

Set rs = cmd.Execute

'这个rs是你要的返回值

rs.Close
Set rs = Nothing
Set cmd = Nothing
'cn.Close
'Set cn = Nothing追问

感谢,不过还是要给查询语句赋值。cmd.CommandText = "select * from tb where dt >@d1 and dt@d1 and dt<@d2 ",cn,3,3 差别也不是很大吧,可能运行速度要快些。有没有直接运行查询的方法,然后打开的时候给变量赋值?像直接在数据库里打开那样。顺带一提我用的是ACCESS。

本回答被提问者采纳
参考技术B 具体问题具体分析,可以百度HI我,或MSN:abdias520@live.cn

如何将连接名称视为 Excel VBA 中 ActiveWorkbook.Connections 中的参数

【中文标题】如何将连接名称视为 Excel VBA 中 ActiveWorkbook.Connections 中的参数【英文标题】:How can treat the connection name as parameter in ActiveWorkbook.Connections in Excel VBA 【发布时间】:2015-11-23 02:28:00 【问题描述】:

首先,我现在正在研究一个 Excel 矩阵,通过与多个库的 ODBC 连接来提取数据。

我已经通过从 Excel 单元格传递参数为动态 SQL 查询创建了 VBA 脚本。

但是,我现在卡在了将 VBA 中参数中的连接名称变暗的问题上。

Dim sSQL As Variant
Dim qt As QueryTable
Dim rDest As Range
Dim AWS As Worksheet
Dim Table1 As Variant
Dim Current As Variant
Dim Year As Range
Dim PD_Fm As Range
Dim PD_To As Range
Dim myArray As Variant
Dim Connection_Name As Variant



'--Defin Table"1-3" as cell
Set AWS = ActiveSheet
Table1 = Worksheets("CO CODE").Range("B22:E33")
Current = Worksheets("CO CODE").Range("G7:G18")
Connection_Name = Range("G22").ListObject.DisplayName
Set Year = Worksheets("MASTER").Cells(6, 3)
Set PD_Fm = Worksheets("MASTER").Cells(7, 3)
Set PD_To = Worksheets("MASTER").Cells(8, 3)

myArray = Worksheets("CO CODE").Range("B18:E29")

'--Define SINGLEQUOTE for SQL QUERY USE
Const SINGLEQUOTE = "'"


Application.ScreenUpdating = False

For i = 1 To 12

sSQL = Array( _
        "SELECT Sum(GLH.LHDRAM-GLH.LHCRAM)" & Chr(13) & "" & Chr(10) & "FROM " & Table1(i, 1) & ", " & Table1(i, 2) & ", " & Table1(i, 3) & ", " & Table1(i, 4) & "" & Chr(13) & "" & Chr(10) & "WHERE GHH.HHJNEN = GLH.LHJNEN AND GHH.HHYEAR = GLH.LHYEAR AND GHH.HHPERD = GLH.LHPERD AND GH" _
        , _
        "H.HHBOOK = GLH.LHBOOK AND GLH.LHIAN = GCR.CRIAN AND ((GLH.LHID='LH') AND (GLH.LHYEAR=" & Year & ") AND (GCR.CRSG02=GSV.SVSGVL And GCR.CRSG02=" & SINGLEQUOTE & "" & Current(i, 1) & "" & SINGLEQUOTE & ") AND (GSV.SVSGMN='ACCOUNT') AND (GLH.LHPERD>=" & PD_Fm & " And GLH." _
        , "LHPERD<=" & PD_To & "))")





With ActiveWorkbook.Connections(Connection_Name).ODBCConnection
        .BackgroundQuery = True
        .CommandText = sSQL

Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False

End With



Next i

我正在尝试从 Excel 单元格中获取连接名称并将名称放回脚本 With ActiveWorkbook.Connections("""""PARAMTER"""").ODBCConnection

我已经尽力从这里和谷歌搜索相关信息,但仍然没有答案。

感谢您的帮助

【问题讨论】:

你遇到了什么错误,在哪一行? 【参考方案1】:

你遇到了什么错误,在哪一行?

添加您从中获取单元格值的工作表。

改变

Connection_Name = Range("G22").ListObject.DisplayName

拥有工作表对象

Connection_Name = Worksheets("CO CODE").Range("G22").ListObject.DisplayName

【讨论】:

您好 Matthew,感谢您的回复我在此脚本“With ActiveWorkbook.Connections(Connection_Name).ODBCConnection”中收到错误消息“下标超出范围”【参考方案2】:

只是谷歌搜索,发现 Excel VBA Listobject Name 和 Connection Name 之间没有连接

因此,只能在另一个工作表中建立连接名称表作为变通方法。

可以从以下链接参考答案的详细信息。

http://answers.microsoft.com/en-us/office/forum/office_2007-excel/modify-a-connection-string-in-a-odbc-connection/309c6c73-042a-43f7-926b-c3a5c29e4e8e

【讨论】:

以上是关于VBA 连接数据库,查询中的变量如何赋值的主要内容,如果未能解决你的问题,请参考以下文章

使用 Excel VBA 将多个值插入连接查询

如何从访问数据库中的左连接中选择excel表 - EXCEL VBA

使用 VBA 复制和修改连接

对象变量或块变量未设置访问vba [重复]

如何将数据库查询结果放入变量中

比较两个 Access 数据库 VBA - 唯一连接