| 
    
     |  | ▼大雪男 さん: こんばんは。再送です(さっき、投稿したコードにちょっとしたバグがあったもので)。
 
 >
 >テーブルは3つのフィールドから出来ており、データ型が
 >1.テキスト型
 >2.テキスト型
 >3.OLEオブジェクト型
 >となっています。
 >
 >このテーブルは5レコードあるのですが、最初の1レコードのみ
 >を取り込んで、2レコード以後がありません。
 >OLEオブジェクト型のフィールドがあると取り込めないのでしょうか?
 前回のコードは、OLEオブジェクト型を想定していませんでした。
 OLEオブジェクト型のI/Oは、バイナリデータしかやったことがありません。
 中のデータは色々ありますからねえ・・・。
 
 >OLEオブジェクト型のフィールドは無しとしてでも、全てのレコードを
 >読み込む事は可能でしょうか?
 ↑これを可能に改造してみました。
 とりあえず、変更のないプロシジャーも全部載せますね!!
 まず、標準モジュール(Modile1)に
 '===============================================================
 Sub main()
 Dim tblnm
 Dim fldlist
 Dim mysql As String
 If open_cat("D:\EXCELファイル\import.mdb") = 0 Then
 tblnm = get_tblnm
 If VarType(tblnm) <> vbBoolean Then
 For idx = 1 To UBound(tblnm) - 1
 Worksheets.Add after:=Worksheets(idx)
 Next
 For idx = LBound(tblnm) To UBound(tblnm)
 If chk_tbl(tblnm(idx), fldlist, mysql) = 0 Then
 '        ↑ここで、フィールド名一覧取得とフィールドチェックとSqlを作成
 With Worksheets(idx)
 .Range("a1").Value = tblnm(idx)
 .Range(.Cells(2, 1), .Cells(2, UBound(fldlist))).Value = fldlist
 Call copy_rs(.Range("a3"), mysql)
 End With
 Else
 Exit For
 End If
 Next
 End If
 End If
 Call close_cat
 End Sub
 
 '標準モジュール(Module2)に
 '===============================================================
 Private cat As ADOX.Catalog
 '===============================================================
 Function open_cat(flnm As String) As Long
 On Error Resume Next
 Set cat = New ADOX.Catalog
 cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
 "Data Source=" & flnm
 open_cat = Err.Number
 On Error GoTo 0
 End Function
 '===============================================================
 Function get_tblnm()
 'テーブル名の列挙
 Dim mytbl()
 Dim tbl As ADOX.Table
 idx = 1
 For Each tbl In cat.Tables
 If UCase(tbl.Type) = UCase("table") Then
 ReDim Preserve mytbl(1 To idx)
 mytbl(idx) = tbl.Name
 idx = idx + 1
 End If
 Next
 If idx > 1 Then
 get_tblnm = mytbl()
 Else
 get_tblnm = False
 End If
 End Function
 '===============================================================
 Function chk_tbl(tblnm, fldnm, mysql As String)
 '指定されたテーブルのフィールドのチェックとSqlの作成
 On Error GoTo err_chk_tbl
 Dim nmlist()
 Dim sql() As String
 Dim err_flg As Boolean
 Dim rs As ADODB.Recordset
 chk_tbl = 0
 err_flg = False
 Set rs = New ADODB.Recordset
 With rs
 .Open "select * from " & tblnm, cat.ActiveConnection, adOpenDynamic, adLockPessimistic
 For idx = 0 To .Fields.Count - 1
 ReDim Preserve nmlist(1 To idx + 1)
 ReDim Preserve sql(1 To idx + 1)
 nmlist(idx + 1) = .Fields(idx).Name
 If .Fields(idx).Type = adChapter Or .Fields(idx).Type = adLongVarBinary Then
 sql(idx + 1) = """"" as f" & idx + 1
 err_flg = True
 Else
 sql(idx + 1) = .Fields(idx).Name
 End If
 Next
 .Close
 End With
 fldnm = nmlist()
 If err_flg = False Then
 mysql = "select * from " & tblnm
 Else
 mysql = "select " & Join(sql(), ",") & " from " & tblnm
 End If
 ret_chk_tbl:
 Set rs = Nothing
 On Error GoTo 0
 Exit Function
 err_chk_tbl:
 MsgBox Error(Err.Number)
 chk_tbl = Err.Number
 Resume ret_chk_tbl
 End Function
 '===============================================================
 Function copy_rs(rng As Range, sql_str) As Long
 'データのコピー
 Dim rs As ADODB.Recordset
 copy_rs = 0
 Set rs = New ADODB.Recordset
 On Error GoTo err_copy_rs
 rs.Open sql_str, cat.ActiveConnection, adOpenDynamic, adLockPessimistic
 rng.CopyFromRecordset rs
 rs.Close
 ret_copy_rs:
 On Error GoTo 0
 Exit Function
 err_copy_rs:
 MsgBox Error(Err.Number) & sql_str
 copy_rs = Err.Number
 Resume ret_copy_rs
 End Function
 '===============================================================
 Sub close_cat()
 cat.ActiveConnection.Close
 Set cat = Nothing
 End Sub
 
 コードを差し替えて確認をお願いします。
 
 |  |