SQLをvbaで扱うサンプルについてまとめています。
SQLをvbaで使うには、CreateQueryDefでSQL文字列を指定する
以下は、vbaから簡単なSQLを実行するサンプルコードです。
Public Sub GetOrders() Dim dbs As DAO.Database Dim qdf As DAO.QueryDef Dim strSQL As String Set dbs = CurrentDb strSQL = "SELECT * FROM Orders WHERE OrderDate >#3-31-2006#;" Set qdf = dbs.CreateQueryDef("SecondQuarter", strSQL) End Sub
変数とコントロールを含む SQL ステートメントを構築する | Microsoft Docs
以下のSQLを、vbaから実行しています。
SELECT * FROM Orders WHERE OrderDate >#3-31-2006#;
下記のコードは、MicrosoftAccessのデータベースNorthwind.mdbのテーブルEmployeesから、名前がKingのデータを取得するコードです。
Sub WhereX() Dim dbs As Database, rst As Recordset ' Modify this line to include the path to Northwind ' on your computer. Set dbs = OpenDatabase("Northwind.mdb") ' Select records from the Employees table where the ' last name is King. Set rst = dbs.OpenRecordset("SELECT LastName, " _ & "FirstName FROM Employees " _ & "WHERE LastName = 'King';") ' Populate the Recordset. rst.MoveLast ' Call EnumFields to print the contents of the ' Recordset. EnumFields rst, 12 dbs.Close End Sub
参考)WHERE 句 (Microsoft Access SQL) | Microsoft Docs
visual basicとSQL Serverを連携させることも可能です。
事前に接続先のSQL Serverへの接続情報をxml形式で作成しておき、接続後に以下のSQLを送信、戻ってきた値をWord文書上に取り込みます。
SELECT CompanyName, ContactName, ContactTitle, Phone FROM Customers WHERE CustomerID=@customerID
@customerIDはバインド変数で、vbaスクリプト内の変数が割り当てられます。
Imports System.Collections.Generic Imports System.Data Imports System.Data.SqlClient Imports System.IO Imports System.IO.Packaging Imports System.Linq Imports System.Xml Imports System.Web Imports System.Web.UI Imports System.Web.UI.WebControls Public Class WebForm1 Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load End Sub Private Const strRelRoot As String = "https://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Private Sub CreateDocument() ' Get the template document file and create a stream from it Const DocumentFile As String = "~/App_Data/CustomerLetterGenerator.docm" ' Read the file into memory Dim buffer() As Byte = File.ReadAllBytes(Server.MapPath(DocumentFile)) Dim memoryStream As MemoryStream = New MemoryStream(buffer, True) buffer = Nothing ' Open the document in the stream and replace the custom XML part Dim pkgFile As Package = Package.Open(memoryStream, FileMode.Open, FileAccess.ReadWrite) Dim pkgrcOfficeDocument As PackageRelationshipCollection = pkgFile.GetRelationshipsByType(strRelRoot) For Each pkgr As PackageRelationship In pkgrcOfficeDocument If (pkgr.SourceUri.OriginalString = "/") Then ' Get the root part Dim pkgpRoot As PackagePart = pkgFile.GetPart(New Uri(("/" + pkgr.TargetUri.ToString), UriKind.Relative)) ' Add a custom XML part to the package Dim uriData As Uri = New Uri("/customXML/item1.xml", UriKind.Relative) If pkgFile.PartExists(uriData) Then ' Delete part "/customXML/item1.xml" part pkgFile.DeletePart(uriData) End If ' Load the custom XML data Dim pkgprtData As PackagePart = pkgFile.CreatePart(uriData, "application/xml") GetDataFromSQLServer(pkgprtData.GetStream, ddlCustomer.SelectedValue) End If Next ' Close the file pkgFile.Close() ' Return the result Response.ClearContent() Response.ClearHeaders() Response.AddHeader("content-disposition", "attachment; filename=document.docx") Response.ContentEncoding = System.Text.Encoding.UTF8 memoryStream.WriteTo(Response.OutputStream) memoryStream.Close() Response.End() End Sub Private Sub GetDataFromSQLServer(ByVal stream As Stream, ByVal customerID As String) 'Connect to a SQL Server database and get data Dim source As String = ConfigurationManager.ConnectionStrings("NorthwindConnectionString").ConnectionString Const SqlStatement As String = "SELECT CompanyName, ContactName, ContactTitle, Phone FROM Customers WHERE CustomerID=@customerID" Dim conn As SqlConnection = New SqlConnection(source) conn.Open() Dim cmd As SqlCommand = New SqlCommand(SqlStatement, conn) cmd.Parameters.AddWithValue("@customerID", customerID) Dim dr As SqlDataReader = cmd.ExecuteReader If dr.Read Then Dim writer As XmlWriter = XmlWriter.Create(stream) writer.WriteStartElement("Customer") writer.WriteElementString("CompanyName", CType(dr("CompanyName"), String)) writer.WriteElementString("ContactName", CType(dr("ContactName"), String)) writer.WriteElementString("ContactTitle", CType(dr("ContactTitle"), String)) writer.WriteElementString("Phone", CType(dr("Phone"), String)) writer.WriteEndElement() writer.Close() End If dr.Close() conn.Close() End Sub Protected Sub SubmitBtn_Click(ByVal sender As Object, ByVal e As EventArgs) CreateDocument() End Sub End Class
参考)データ ストア内の項目を SQL Server データベースに接続する | Microsoft Docs
また、ODBCドライバ経由でアクセスすることで、Oracleなどその他のデータベースへの接続が可能です。ただし、高速なデータのやりとりを行う場合、ODBC経由ではパフォーマンスが出ないこともあります。
まとめ
- vbaからSQLを実行するには、vbaコード内でSQL文字列を送信する。
- vbaからは、MicrosoftAccessやSQLサーバへの接続が可能。
- ODBCドライバを利用して、その他のデータベースへの接続も可能。