• ベストアンサー

EXCEL→Access ADO接続

noname#140971の回答

noname#140971
noname#140971
回答No.8

その他のコードは、書き換える必要はありません これは、私が示したコードのことです。 Const 開始行 = 1 Const 開始列 = 1 Private Sub CommandButton1_Click()   Dim I       As Integer   Dim N       As Integer   Dim strEmployees() As String      strEmployees() = Split(DBSelect("質問者のSQL文"), ";")   N = UBound(strEmployees()) - 1   For I = 0 To N     Me.Cells(開始行, 開始列 + I) = strEmployees(I)   Next I End Sub これで、開始行の開始列から横にデータを表示します。 コピぺ方式だと縦に自動表示されます。 そういうエクセルの表示機能を使わずにVBAで横に表示する訳です。 strEmployees() = Split(DBSelect("質問者のSQL文"), ";") N = UBound(strEmployees()) - 1 For I = 0 To N   Me.Cells(開始行, 開始列 + I) = strEmployees(I) Next I 実質、僅か5行ですから、やっていることは理解できませんか? <アドバイス> このように僅か数行で目的を達成するには、作業を分割することです。 Accessからのデータの取得手続きは繰り返し発生するので、そこは関数に任せるのが一番。 CommandButton1_Click()では、関数から受け取ったデータを並べるだけに。 そうすると、何も考えないで2、3分でコードは書けます。 [イミディエイト] ? DBSelect("SELECT * FROM 担当者") 1;01: AAAA;True;True;2;02: BBBB;True;True;3;03: CCCC;False;True; ? DBSelect("SELECT * FROM 担当者",,vbcrlf) 1;01: AAAA;True;True; 2;02: BBBB;True;True; 3;03: CCCC;False;True; では、一体、SQL文の実行結果をどのように受け取れば簡単に配列に取り込めるのかです。 それは、上述のように列と行とのデータを区切り子で区切った文字列として受け取ればいいです。 strEmployees() = Split(DBSelect("質問者のSQL文"), ";") そうすりゃ、この1行で配列に取り込めます。 試しに、上の"質問者のSQL文"部分を正しく書いてコマンドボタンをクリックすりゃ表示されますよ。 <準備> 以下の関数を標準モジュールにコピペ。 もちろん、記号定数 pubCNNSTRING は、ちゃんと設定して下さい。 Public Const pubCNNSTRING = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\xxxx\xxxx.mdb" Public Function DBSelect(ByVal strQuerySQL As String, _              Optional cel_separator As String = ";", _              Optional row_separator As String = "") As String On Error GoTo Err_DBSelect   Dim I      As Integer   Dim J      As Integer   Dim R      As Integer   Dim C      As Integer   Dim M      As Integer   Dim N      As Integer   Dim rst     As ADODB.Recordset   Dim fld     As ADODB.Field   Dim strList   As String      Set rst = New ADODB.Recordset      With rst      .Open strQuerySQL, _         pubCNNSTRING, _         adOpenStatic, _         adLockReadOnly      If Not .BOF Then       M = .RecordCount - 1       N = .Fields.Count - 1       .MoveFirst       For R = 0 To M         C = -1         For Each fld In .Fields           C = C + 1           strList = strList & fld.Value & "" & cel_separator         Next fld         strList = strList & row_separator         .MoveNext       Next R      Else       strList = ""      End If   End With Exit_DBSelect: On Error Resume Next   rst.Close   Set rst = Nothing   DBSelect = strList   Exit Function Err_DBSelect:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSelect)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBSelect End Function

BSR123
質問者

お礼

できましたありがとうございます mdbの数が多すぎが原因だったようです ありがとうございます 感謝感激です

BSR123
質問者

補足

お返事ありがとうございます 現在上記標準モジュール作成(.mdb)のパス記載し フォーム内 下記を記述し(SQL文作成)しました Const 開始行 = 1 Const 開始列 = 1 Private Sub CommandButton1_Click()   Dim I       As Integer   Dim N       As Integer   Dim strEmployees() As String      strEmployees() = Split(DBSelect("質問者のSQL文"), ";")   N = UBound(strEmployees()) - 1   For I = 0 To N     Me.Cells(開始行, 開始列 + I) = strEmployees(I)   Next I End Sub 上記実行すると コンパイルエラー メソッドまたはデータメンバが見つかりません。 とでます。 どこがいけないのでしょうか? よろしくお願い申し上げます

関連するQ&A

  • ADO1とADO2は意味は同じですか?

    Private Sub ADO1() Dim cn As New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName cn.Close: Set cn = Nothing End Sub Private Sub ADO2() Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName cn.Close: Set cn = Nothing End Sub は、 Dim cn As ADODB.Connection Set cn = New ADODB.Connection を簡素化したものが Dim cn As New ADODB.Connection になるのでしょうか?

  • Access ADOについて質問です。

    Access ADOについて質問です。 以下コードでレコードセットを返す関数を使用しています。 動作的には問題ないのですが、標準モジュール内のレコードセットをClose及びNothingしていないのが気になります。 Private Sub Form_Open(Cancel As Integer) Dim rs2 As ADODB.Recordset Set rs2 = New ADODB.Recordset Set rs2 = CreateRecordSet("SELECT * FROM T_Standard;") Set Me.Recordset = rs2 rs2.Close: Set rs2 = Nothing end sub '標準モジュール Public Function CreateRecordSet(strSQL As String) As ADODB.Recordset Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=O:\標準DB\StandardBackEnd.mdb" cn.Open Set rs = New ADODB.Recordset rs.Open strSQL, cn, adOpenStatic, adLockReadOnly Set CreateRecordSet = rs ' rs.Close: Set rs = Nothing   ←この部分 ' cn.Close: Set cn = Nothing   ←この部分 End Function 標準モジュール内ではCloseやNothingしなくてもメモリの開放は行われているのでしょうか? アドバイスよろしくお願いいたします。

  • ADOでAccessファイルに接続して、ファイルの

    ADOでAccessファイルに接続して、ファイルの更新日時を取得するには? access2003です、 Private Sub 更新日時を取得() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim MyFileName As String MyFileName = "D:\My Documents\システム.mdb" cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & MyFileName 'ここで更新日時を取得 rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub この状態で、更新日時を取得するにはどうすればいいでしょう? ご教授よろしくお願いします。

  • ADOでエクセルからSQL Serverへデータを移行するには

    エクセルvbaのADOを使って、 SQL Serverの「test」という名のデータベースの「Table_1」に 新規レコードを追加する事はできますか? エクセルからアクセスには Sub test() Dim データベース名 As String Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordset cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & データベース名 rs.Open "Tテーブル1", cn, adOpenKeyset, adLockOptimistic rs.AddNew rs.Fields("フィールド1") = データ rs.Update rs.Close cn.Close Set rs = Nothing Set cn = Nothing End Sub で移行しています。 これをエクセルからSQL Serverへ移行させるにはどうすればいいのでしょうか? よろしくお願いします。

  • 【ADO】「Execute」を使うときは「Update」は不要?

    Sub test() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Desktop\test1.mdb" Set rs = New ADODB.Recordset rs.Open "テーブル1", cn, adOpenStatic, adLockPessimistic cn.Execute "DELETE FROM テーブル1" rs.Update '保存 Set rs = Nothing Set cn = Nothing End Sub を実行したとき テーブル1にデータがあるときはエラーにはならないのですが 何もデータがないときは「rs.Update」でエラーになります。 なので「Update」は消して実行していますが 「Update」がなくても「Execute」を実行した後は自動的に保存されるのでしょうか? よろしくお願いします。

  • ADO 「Set」は使ったほうがいいのでしょうか?

    Sub test1() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordse End Sub Sub test2() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset End Sub この二つは同じ意味ですか? 「Set」は使ったほうがいいのでしょうか? よろしくお願いします。

  • ADOでテーブルにハイパーリンクを追加したい(アドレスと表示文字列は別)

    アクセスのtblのURLフィールドに 表示文字列→aaa URL→http://www.yahoo.co.jp/ を追加したいのですがうまくいきません。 (URLフィールドのデータ型はハイパーリンク型です) Sub test() Dim moji As String Dim URL As String Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & "C:\Documents" & "\access.mdb" Set rs = New ADODB.Recordset rs.Open "tbl", cn, adOpenStatic, adLockPessimistic moji = "aaa" URL = "http://www.yahoo.co.jp/" rs.AddNew rs("URL") = "#" & moji & "#" rs("URL") = "#" & URL & "#" rs.Update Set rs = Nothing Set cn = Nothing End Sub を実行すると 結果は 表示文字列もアドレスも「http://www.yahoo.co.jp/」になってしまいます。(そりゃそうか) どうすれば 表示文字列→aaa URL→http://www.yahoo.co.jp/ が実現できるのでしょうか? よろしくお願いします。 (ヴァージョンは2003です)

  • アクセス2007でADOは使えないのでしょうか?

    デスクトップにあるDatabase1.accdbを開いて ツールの参照設定で Microsoft ActiveX Data Objects 2.8 Library にチェックを入れ Sub a() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName とやろうとしたら、 ************************************************************ 実行時エラー '-20147467259(80004005)': データベースの形式'C:\Users\○○\Desktop\Database1.accdb'を認識できません。 ************************************************************ となってしまいます。 再起動しても同じです。 ADOは2007では使えないのでしょうか?ご回答よろしくお願いします。

  • ADO+ODBCでテーブルに接続する時のエラー

    VB6.0(SP6)から、ADOとODBCでMySQLに接続しました。 '-------------------------------------------- Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim strCn As String Set cn = New ADODB.Connection strCn = "dsn=MySQL;uid=user;pwd=" cn.CursorLocation = adUseClient cn.Open strCn Set rs = New ADODB.Recordset rs.Open "select * from tbl;", cn, adOpenDynamic, adLockPessimistic Set DataGrid1.DataSource = rs '-------------------------------------------- データグリッドコントロールにテーブルの内容を表示させようとしているのですが、rs.Openの行でエラーが出てしまいます。エラーメッセージは「複数ステップの操作でエラーが発生しました。各状態の値を確認してください」です。 SQL文を変えて試してみると、何故かデータ型がDECIMALのカラムが含まれているとエラーになります。 DECIMALだといけないかと思うと、挿入は問題なく出来ます。 cn.Execute "insert into tbl (id,decimal_clm) values (10,900);" ご存知の方がいらっしゃいましたら宜しくお願いします。

    • ベストアンサー
    • MySQL
  • ADOでRecordsetオブジェクトをレコードソースに設定したい

    Access2000を使っています。リンクテーブルを使わずに、ODBCで繋いだDBのテーブルをフォームのレコードソースにセットしたいのですが、可能でしょうか。 宜しくお願いします。 Private Sub FormNoKansu() Dim cn as New ADODB.Connection Dim rs as New ADODB.Recordset Dim strSql as String 'ODBCでサーバーに接続 cn.ConnectionString = "ODBCでMySQLに..." ... strSql = "SELECT * FROM ..." rs.Open strSql, cn 'ここに[rs]を入れられたらと思っています Me.Recordset = "" End Sub