|
▼tamago さん:
こんばんは。
二通りの方法を投稿します。
ADOを使用しました。参照設定で
「Microsoft ActiveX Data Objects x.x Library」にチェックを入れて下さい。
二通りの方法の共通プロシジャー群です。
標準モジュール(Module2)に、
'==============================================================
Public cn As New ADODB.Connection
Public rs As New ADODB.Recordset
'==============================================================
Function open_db(flnm As String) As Long
'Mdbファイルへの接続
'Input : flnm Mdbファイルのフルパス
'output : open_db リターンコード 0正常 その他:異常
On Error Resume Next
With cn
.ConnectionString = "provider=Microsoft.jet.OLEDB.4.0;" & "Data Source=" & flnm
.Open
End With
If Err.Number <> 0 Then
MsgBox Error$(Err.Number)
open_db = Err.Number
Else
open_db = 0
End If
On Error GoTo 0
End Function
'==============================================================
Function sql_exec(str_sql As String) As Long
'指定されたSQLの実行
'Input : str_sql sql構文
'output : sql_exec リターンコード 0正常 その他:異常
On Error Resume Next
cn.Execute str_sql
If Err.Number <> 0 Then
MsgBox Error(Err.Number)
sql_exec = Err.Number
Else
sql_exec = 0
End If
On Error GoTo 0
End Function
'==============================================================
Function open_rs(tblnm As String) As Long
'テーブルへの接続
'input tblnm : テーブル名
'output open_rs : リターンコード 0正常 その他:異常
On Error Resume Next
rs.Open tblnm, cn, adOpenStatic, adLockOptimistic
If Err.Number <> 0 Then
MsgBox Error$(Err.Number)
open_rs = Err.Number
Else
open_rs = 0
End If
On Error GoTo 0
End Function
'==============================================================
Function put_rs(rng As Range) As Long
'データのセット
'input : rng : 書き込みセル範囲
'output: put_rs リターンコード 0正常 その他:異常
On Error Resume Next
With rs
.AddNew
For idx = 1 To rng.Count
.Fields(idx - 1).Value = rng.Cells(idx).Value
Next idx
.Update
End With
On Error GoTo 0
End Function
'==============================================================
Sub close_rs()
'テーブル接続解除
On Error Resume Next
rs.Close
On Error GoTo 0
End Sub
'==============================================================
Sub close_db()
'Mdbファイルへの接続解除
On Error Resume Next
cn.Close
Set cn = Nothing
On Error GoTo 0
End Sub
サンプルのExcelブック名は、「ganyuexcel.xls」
対象シート名は「Sheet1」とします。
二つの方法共に書き込むデータベースファイル(Mdbファイル)は、ダイアログにて
指定する仕様です。
次に第一の方法です。
SQL文で○の検索から書き込みまでしてしまいます。
オートフィルタは使用しません。
(但し、Sheet1の項目名とMdbファイルの書き込みテーブルのフィールド名は
一致している事とします)
'===================================================================
Sub main()
Dim c_db As String
Dim mysql As String
flnm = Application.GetOpenFilename("追加したいDB,(*.mdb)")
If flnm <> False Then
c_db = flnm
If open_db(c_db) = 0 Then
mysql = "INSERT INTO ganyu SELECT * FROM [Excel 8.0;Database=" & ThisWorkbook.Path & "\ganyuexcel.xls]" & _
".[Sheet1$] where" & "[Sheet1$].[含有の有無 有=○/無=空白] = '○';"
If sql_exec(mysql) = 0 Then
MsgBox "データ追加成功"
End If
close_db
End If
End If
End Sub
もうひとつの方法は、tamago さんがおっしゃっていたオートフィルタを使いました。
'=======================================================================
Sub main2()
Dim c_db As String
Dim rng As Range
Dim crng As Range
Set rng = get_match_rng("=○") 'オートフィルタで条件に合うセル範囲の取得
If rng Is Nothing Then Exit Sub
flnm = Application.GetOpenFilename("追加したいDB,(*.mdb)")
If flnm <> False Then
c_db = flnm
If open_db(c_db) = 0 Then
If open_rs("ganyu") = 0 Then
For Each crng In rng
If put_rs(crng.Resize(, 10)) <> 0 Then
Stop
End If
Next
End If
MsgBox "データ追加成功"
close_db
End If
End If
End Sub
'==========================================================
Function get_match_rng(cond As String) As Range
'オートフィルタを使用して指定された条件にあったA列のセルを取得する
'cond 条件文字列
Dim a_rng As Range
Set get_match_rng = Nothing
Set a_rng = Range("a1", Cells(Rows.Count, 1).End(xlUp))
If a_rng.Count = 1 Then Exit Function
With a_rng.Resize(, 10)
.AutoFilter
.AutoFilter Field:=9, Criteria1:=cond
End With
On Error Resume Next
Set get_match_rng = a_rng.SpecialCells(xlCellTypeVisible)
a_rng.Resize(, 10).AutoFilter
If Err.Number = 0 Then
Set get_match_rng = Application.Intersect(get_match_rng, Range("a2", Cells(Rows.Count, 1).End(xlUp)))
End If
On Error GoTo 0
End Function
確認して下さい。
|
|