VBA中使用SQL

博客提供了取出同文件夹下所有表格中相关信息的SQL语句示例,聚焦信息技术领域中数据库操作方面,可帮助使用者了解如何通过SQL语句从同文件夹表格里提取所需信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 取出同文件夹下所有表格中相关信息

Dim Cnn As Object, MyCat As Object, rst As Object, sql$, SheetName$, f$, ph$, r&, strConn$
ph = ThisWorkbook.Path & "\": f = Dir(ph & "*.xls?") '注意写法,创建路径
strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=excel 12.0;Data Source="
Application.ScreenUpdating = False

[A:C].ClearContents: [a1:c1] = [{"文件名","类别","员数"}]

Set MyCat = CreateObject("ADOX.Catalog")
Set Cnn = CreateObject("ADODB.Connection")
Cnn.Open strConn & ThisWorkbook.FullName
Do While f <> "" '循环所有文件
    If (f <> ThisWorkbook.Name) * (f <> "0030.xlsx") Then '如果不是本文件,进行提取
        Set rst = CreateObject("ADODB.recordset")
        MyCat.ActiveConnection = strConn & ph & f
        SheetName = Replace(MyCat.Tables(0).Name, "'", "")
        sql = "select f1,f7 from [Excel 12.0;Hdr=no;Database=" & ph & f & "].[" & SheetName & "i3:o30] where f1 is not null" '写SQL
        rst.Open sql, Cnn, 3, 1: r = Range("a" & Rows.Count).End(3).Row + 1  '执行SQL
        Range("a" & r).Resize(rst.RecordCount) = "'" & Left(f, InStrRev(f, ".") - 1) '
        Range("b" & r).CopyFromRecordset rst '取出记录
    End If
    f = Dir
Loop

Application.ScreenUpdating = True

SQL语句示例

Sql=select a.物料编号,sum(iif(isnull(b.库存),0,b.库存)) as 本周库存,sum(iif(isnull(c.库存),0,c.库存)) as 上周库存,sum(iif(isnull(b.库存),0,b.库存))-sum(iif(isnull(c.库存),0,c.库存)) as 差异 from ((select distinct 物料编号 from (select 物料编号 from [本周$] union all select 物料编号 from [上周$])) a left join [本周$] b on a.物料编号=b.物料编号) left join [上周$] c on a.物料编号=c.物料编号 group by a.物料编号

 

 

### 如何在 Access VBA 使用 SQL UPDATE 语句更新数据库中的记录 为了在 Access VBA使用 SQL `UPDATE` 语句来修改数据库记录,可以采用多种方式执行此操作。以下是几种常见的方式及其适用场景。 #### 方法一:使用 DoCmd.RunSQL 执行即时命令 这种方法适用于简单的查询,不需要返回任何结果集的情况。代码如下: ```vb Dim strSQL As String strSQL = "UPDATE 表1 SET 字段1='新值' WHERE FileName='特定文件名';" DoCmd.RunSQL strSQL ``` 这种方式简单明了,适合快速执行一次性的更新操作[^4]。 #### 方法二:利用 CurrentDb().Execute 提交事务并获取影响行数 对于更复杂的逻辑处理或需要确认受影响的行数时,推荐使用 `CurrentDb().Execute` 方法。这不仅能够执行更新语句,还可以捕获可能发生的错误以及统计实际被更改了多少条记录。 ```vb Dim db As DAO.Database Set db = CurrentDb() On Error GoTo ErrorHandler db.Execute "UPDATE 表1 SET 字段1='新值',字段2='另一新值' WHERE FileName='特定文件名'", dbFailOnError MsgBox "成功更新了 " & db.RecordsAffected & " 条记录" ExitHere: Exit Sub ErrorHandler: MsgBox Err.Description Resume ExitHere End Sub ``` 上述例子展示了如何安全地执行带有多个字段更新的操作,并且加入了基本异常处理机制以提高程序稳定性。 #### 方法三:连接外部 MySQL 数据库并通过 ADO 对象模型发送请求 当目标不是本地的 Access 数据库而是远程的 MySQL 数据库时,则需先建立相应的 ODBC 连接字符串,并创建合适的 ADODB.Connection 和 Command 对象来进行交互。 ```vb Public Function UpdateMySqlRecord() As Boolean Dim conn As Object Set conn = CreateObject("ADODB.Connection") With conn .ConnectionString = MYDRIVER & MYSERVER & MYPORT & MYDATABASE & MYUSER & MYPASS .Open If Not (.State And adStateOpen) Then UpdateMySqlRecord = False Exit Function End If On Error GoTo HandleError .Execute "UPDATE abc.table_name SET column1=value1,column2=value2 WHERE condition;" UpdateMySqlRecord = True HandleError: If Err.Number <> 0 Then Debug.Print Err.Description .Close End With End Function ``` 这段脚本说明了怎样设置好必要的常量参数后,通过 ADO 库实现跨平台的数据同步功能[^3]。 以上三种途径都可以有效地帮助开发者完成基于不同需求下的数据更新任务,在具体应用过程中可根据实际情况灵活选用最恰当的一种方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值