文書番号: 401674
最終更新日: 1997/10/22
SQL Server プログラム実行環境 サーバー SQLServer ODBC ドライバ SQLServerODBC ドライバ (Excel5.0 添付) データソース名 TstSQL TstSQL の内容 サーバー名 serversql1 ユーザー ID sa データベース pubs パスワード Excel ORACLE プログラム実行環境 サーバー ORACLE ODBC ドライバ ORACLE Ver. 6 用 ODBC ドライバ (Access2.0 添付) データソース名 TstORA TstORA の内容 サーバー名 serverora1 ユーザー ID SCOTT パスワード Tiger XLODBC アドイン関数を使用したサンプル プログラムは次の通りです。
Sub GetdataSQL255() Dim sql(7) As Variant Dim con As Variant 'データソースとの接続を確立し SQLOpen のリターン値を変数 con にセット con = SQLOpen("DSN=TstSQL;UID=sa;DATABASE=pubs;PWD=Excel", , 2) '255 バイト以上の SQL 文を 1 要素 127 バイト以下の配列として定義 sql(1) = "SELECT 売上.注文番号, 売上.書籍番号, 書名.書名, " _ & "書店.書店番号, 書店.書店名, 売上.数量 FROM pubs.dbo." sql(2) = "書店 書店, pubs.dbo.書名 書名, pubs.dbo.売上 売上 " _ & "WHERE 書名.書籍番号 = 売上.書籍番号 AND 売" sql(3) = "上.書店番号 = 書店.書店番号 AND ((売上.注文番号 In " _ & "('P3087a','P2121','423LL922','423LL930')) AND (売" sql(4) = "上.数量>=10) AND (書名.書籍番号='MC3021') OR (書名." _ & "書籍番号='BU1032') OR (書名.書籍番号='BU1111') OR" sql(5) = " (書名.書籍番号='BU2075') OR (書名.書籍番号='BU7832')" _ & " OR (書名.書籍番号='MC2222') OR (書名.書籍番号=" sql(6) = "'MC3021') OR (書名.書籍番号='MC3026'))" 'クエリーの実行 SQLExecQuery con, sql '以前に実行されたクエリーの結果を取得し Sheet1 のセル A1 に貼り付け SQLRetrieve con, Range("Sheet1!A1"), , , True 'データソースとの接続を切断 SQLClose con End Sub
Sub GetdataORA255() Dim sql(6) As Variant Dim con As Variant 'データソースとの接続を確立し SQLOpen のリターン値を変数 con にセット con = SQLOpen("DSN=Tstora;UID=SCOTT;PWD=Tiger", , 2) '255 バイト以上の SQL 文を 1 要素 127 バイト以下の配列として定義 sql(1) = "SELECT EMP.EMPNO, EMP.ENAME, EMP.JOB, EMP.MGR," sql(2) = "EMP.HIREDATE, EMP.SAL, EMP.COMM, EMP.DEPTNO FROM " _ & "SCOTT.EMP EMP WHERE (EMP.EMPNO=7369) " sql(3) = "AND (EMP.ENAME Like '%S%') OR (EMP.EMPNO=7499) AND " _ & "(EMP.ENAME Like '%J%') OR" sql(4) = "(EMP.EMPNO=7521) AND (EMP.ENAME Like '%K%') OR " _ & "(EMP.EMPNO=7566) AND (EMP.ENAME Like '%A%') OR" sql(5) = "(EMP.EMPNO=7654) AND (EMP.ENAME Like '%D%') OR " _ & "(EMP.EMPNO=7698) AND (EMP.ENAME Like '%J%') OR" sql(6) = "(EMP.EMPNO=7782) AND (EMP.ENAME Like '%M%') OR " _ & "(EMP.EMPNO=7788) AND (EMP.ENAME Like '%T%')" 'クエリーの実行 SQLExecQuery con, sql '以前に実行されたクエリーの結果を取得し Sheet1 のセル A1 に貼り付け SQLRetrieve con, Range("Sheet1!A1"), , , True 'データソースとの接続を切断 SQLClose con End Sub
Sub GetdataSQL255a() Dim con As Variant Dim sql As String 'データソースとの接続を確立し SQLOpen のリターン値を変数 con にセット con = SQLOpen("DSN=TstSQL;UID=sa;DATABASE=pubs;PWD=Excel", , 2) '255 バイト以上の SQL 文の定義 sql = "SELECT 売上.注文番号, 売上.書籍番号, 書名.書名, 書店." _ & "書店番号, 書店.書店名, 売上.数量 FROM pubs.dbo." sql = sql + "書店 書店, pubs.dbo.書名 書名, pubs.dbo.売上 売上 " _ & "WHERE 書名.書籍番号 = 売上.書籍番号 AND 売" sql = sql + "上.書店番号 = 書店.書店番号 AND ((売上.注文番号 In " _ & "('P3087a','P2121','423LL922','423LL930')) AND (売" sql = sql + "上.数量>=10) AND (書名.書籍番号='MC3021') OR (書名." _ & "書籍番号='BU1032') OR (書名.書籍番号='BU1111') OR" sql = sql + " (書名.書籍番号='BU2075') OR (書名.書籍番号=" _ & "'BU7832') OR (書名.書籍番号='MC2222') OR (書名.書籍番号=" sql = sql + "'MC3021') OR (書名.書籍番号='MC3026'))" '255 バイト以上の SQL 文を自動的に一つの要素 63 文字以下の配列に変換する '関数 QueryToArray を実行し リターン値の配列でクエリー実行 SQLExecQuery con, QueryToArray(sql, 63) '以前に実行されたクエリーの結果を取得し Sheet1 の A1 のセルに貼り付け SQLRetrieve con, Range("Sheet1!A1"), , , True 'データソースとの接続を切断 SQLClose con End Sub '255 バイトを越える SQL 文を 1 要素 63 文字以下の配列に変換する関数 Function QueryToArray(Q As String, Optional MaxLength As Variant) As _ Variant Dim Shift, Size, I As Integer Dim TmpArr() As String '配列の要素の文字列の最大文字数 (MaxLength) が指定されていなかったら '最大文字数を 63 characters にセットします If IsMissing(MaxLength) Then MaxLength = 63 '配列のインデックス番号の最小値の取得 Shift = LBound(Array(1)) - 1 Size = (Len(Q) + MaxLength) \ MaxLength ReDim TmpArr(Size + Shift, 1 + Shift) As String For I = 1 To Size TmpArr(I + Shift, 1 + Shift) = _ Mid$(Q, (I - 1) * MaxLength + 1, MaxLength) Next I% QueryToArray = TmpArr End Function
Sub GetdataORA255a() Dim con As Variant Dim sql As String 'データソースとの接続を確立し SQLOpen のリターン値を変数 con にセット con = SQLOpen("DSN=Tstora;UID=SCOTT;PWD=Tiger", , 2) '255 バイト以上の SQL 文の定義 sql = "SELECT CUSTOMER.CUSTOMER_ID, CUSTOMER.NAME, CUSTOMER." _ & "ADDRESS, CUSTOMER.CITY, CUSTOMER.STATE, CUSTOMER.ZIP_CODE" sql = sql + ", CUSTOMER.AREA_CODE , CUSTOMER.PHONE_NUMBER, " _ & "CUSTOMER.SALESPERSON_ID, CUSTOMER.CREDIT_LIMIT, " sql = sql + "CUSTOMER.Comments FROM BROWSER.CUSTOMER CUSTOMER " _ & "WHERE (CUSTOMER.CUSTOMER_ID=100) AND (CUSTOMER.NAME='J%') " sql = sql + "OR (CUSTOMER.CUSTOMER_ID=101) AND (CUSTOMER.NAME=" _ & "'T%') OR (CUSTOMER.CUSTOMER_ID=102) AND (CUSTOMER.NAME=" sql = sql + "'V%') OR (CUSTOMER.CUSTOMER_ID=103) AND (CUSTOMER." _ & "NAME='J%') OR (CUSTOMER.CUSTOMER_ID=104) OR (CUSTOMER." sql = sql + "CUSTOMER_ID=105) OR (CUSTOMER.CUSTOMER_ID=106) OR " _ & "(CUSTOMER.CUSTOMER_ID=107) OR (CUSTOMER.CUSTOMER_ID=108)" '255 バイト以上の SQL 文を自動的に一つの要素 127 文字以下の配列に変換する '関数 QueryToArray を実行し リターン値の配列でクエリー実行 SQLExecQuery con, sqlQueryToArray(sql, 127) '以前に実行されたクエリーの結果を取得し Sheet1 の A1 のセルに貼り付け SQLRetrieve con, Range("Sheet1!A1"), , , True 'データソースとの接続を切断 SQLClose con End Sub '255 バイトを越える SQL 文を 1 要素 127 文字以下の配列に変換する関数 Function sqlQueryToArray(Q As String, Optional MaxLength As Variant) _ As Variant Dim Shift, Size, I As Integer Dim TmpArr() As String '配列の要素の文字列の最大文字数 (MaxLength) が指定されていなかったら '最大文字数を 127 characters にセットします If IsMissing(MaxLength) Then MaxLength = 127 '配列のインデックス番号の最小値の取得 Shift = LBound(Array(1)) - 1 Size = (Len(Q) + MaxLength) \ MaxLength ReDim TmpArr(Size + Shift, 1 + Shift) As String For I = 1 To Size TmpArr(I + Shift, 1 + Shift) = _ Mid$(Q, (I - 1) * MaxLength + 1, MaxLength) Sheets("sheet2").Range("a1").Offset(I, 0).Formula = TmpArr(I + _ Shift, 1 + Shift) Next I% sqlQueryToArray = TmpArr End Function
Keywords: KBHOWTO KB401674
Technology: kbExcel500 kbExcelSearch kbExcelWinSearch