HOMEへ


データベース======================================================

Option Explicit

'**
' データベースオブジェクト
'  adoCn コネクション
'  adoRs  レコードセット
'  SQL文
'------------------------------------------------------------------
Public adoCn As Object
Public adoRs As Object
Public strSQL As String

'**
' データベース接続
'  @param {Flg : Boolean} trueの場合にオブジェクト作成
'
'------------------------------------------------------------------
Sub DBConnect(Flg As Boolean)

    Dim DbPath As String

    'DbPath = ThisWorkbook.Path
    DbPath = "C:\Users\menta\Desktop\sampleDB"

    Set adoCn = CreateObject("ADODB.Connection")
    If Flg = True Then Set adoRs = CreateObject("ADODB.Recordset")

    ' Providerに指定する外部データベースのプロバイダー名
    '   Access2016/2013/2010/2007 : Microsoft.ACE.OLEDB.12.0
    '  Access2003/2002 : Microsoft.Jet.OLEDB.4.0
    '  SQLServer : SQLOLEDB.1
    '  Oracle : MSDAORA
    '  DB2 : IBMDADB2
    adoCn.Open "Provider=Microsoft.ACE.OLEDB.16.0;Data Source=" & DbPath & "\sampleDB.accdb;"

End Sub

'**
' データベース切断
'  @param {Flg : Boolean} trueの場合に切断、オブジェクト破棄
'
'------------------------------------------------------------------
Sub DBCuttingOff(Flg As Boolean)

    If Flg = True Then adoRs.Close
        
    adoCn.Close
    Set adoRs = Nothing
    Set adoCn = Nothing

End Sub

'**
' データベースへのインサート
'
'------------------------------------------------------------------
Sub DBinsert()

    If MsgBox("データの読み込みを行います。本当にいいですか?", vbOKCancel) = 2 Then
        Exit Sub
    End If

    Dim ws As Worksheet: Set ws = Worksheets("table")
    With ws
            Dim strSQL As String
            Dim start_i As Long, end_i As Long, n As Long
            start_i = 2
            end_i = .Cells(.Rows.Count, 1).End(xlUp).row

            Call DBConnect(False)
            On Error GoTo Err_Handler
            
            adoCn.BeginTrans
            strSQL = "DELETE FROM [販売管理];"
            adoCn.Execute strSQL

            For n = start_i To end_i
                strSQL = ""
                strSQL = strSQL & "INSERT INTO [販売管理](" & vbCrLf
                strSQL = strSQL & "[No], " & vbCrLf
                strSQL = strSQL & "EccubeCD, " & vbCrLf
                strSQL = strSQL & "ItemCD, " & vbCrLf
                strSQL = strSQL & "ParentCD, " & vbCrLf
                strSQL = strSQL & "ItemName, " & vbCrLf
                strSQL = strSQL & "KikakuCD, " & vbCrLf
                strSQL = strSQL & "KikakuName, " & vbCrLf
                strSQL = strSQL & "KosyouCD, " & vbCrLf
                strSQL = strSQL & "KosyouName, " & vbCrLf
                strSQL = strSQL & "ZentyouCD, " & vbCrLf
                strSQL = strSQL & "Zentyou, " & vbCrLf
                strSQL = strSQL & "CategoryCD) " & vbCrLf
                strSQL = strSQL & "VALUES(" & vbCrLf
                strSQL = strSQL & .Cells(n, 1).Value & ", " & vbCrLf
                strSQL = strSQL & "'" & .Cells(n, 2).Value & "', " & vbCrLf
                strSQL = strSQL & "'" & .Cells(n, 3).Value & "', " & vbCrLf
                strSQL = strSQL & "'" & Cells(n, 4).Value & "', " & vbCrLf
                strSQL = strSQL & "'" & Cells(n, 5).Value & "', " & vbCrLf
                strSQL = strSQL & "'" & Cells(n, 6).Value & "', " & vbCrLf
                strSQL = strSQL & "'" & Cells(n, 7).Value & "', " & vbCrLf
                strSQL = strSQL & "'" & Cells(n, 8).Value & "', " & vbCrLf
                strSQL = strSQL & "'" & Cells(n, 9).Value & "', " & vbCrLf
                strSQL = strSQL & "'" & Cells(n, 10).Value & "', " & vbCrLf
                strSQL = strSQL & "'" & Cells(n, 11).Value & "', " & vbCrLf
                strSQL = strSQL & "'" & .Cells(n, 12).Value & "')"

                adoCn.Execute strSQL
            Next n

            adoCn.CommitTrans
            Call DBCuttingOff(False)

            MsgBox "正常に完了しました"
            Exit Sub

Err_Handler:
adoCn.RollbackTrans
Call DBCuttingOff(False)
MsgBox Error$
Debug.Print Error$
Debug.Print strSQL
    
    End With

End Sub

'**
' データベースへのセレクト
'
'------------------------------------------------------------------
Sub DBselect()

    Dim i As Long, end_i As Long

    Call DBConnect(True)
    On Error GoTo Err_Handler

    strSQL = ""
    strSQL = "SELECT * " & vbCrLf
    strSQL = strSQL & "FROM [販売管理] " & vbCrLf
    strSQL = strSQL & "WHERE [No] >= 163;"
    adoRs.Open strSQL, adoCn

    If adoRs.BOF = True And adoRs.EOF = True Then
        Call DBCuttingOff(True)
        MsgBox "対象データがありません"
        Exit Sub
    End If


    Dim ws As Worksheet: Set ws = Worksheets("write")
    With ws

        i = 2
        end_i = .Cells(.Rows.Count, 1).End(xlUp).row
       .Range(.Cells(2, 1), .Cells(end_i, 12)).ClearContents

        Do Until adoRs.EOF
            .Cells(i, 1) = adoRs![No]
            .Cells(i, 2) = adoRs!EccubeCD
            .Cells(i, 3) = adoRs!ItemCD
            .Cells(i, 4) = adoRs!ParentCD
            .Cells(i, 5) = adoRs!ItemName
            .Cells(i, 6) = adoRs!KikakuCD
            .Cells(i, 7) = adoRs!KikakuName
            .Cells(i, 8) = adoRs!KosyouCD
            .Cells(i, 9) = adoRs!KosyouName
            .Cells(i, 10) = adoRs!ZentyouCD
            .Cells(i, 11) = adoRs!Zentyou
            .Cells(i, 12) = adoRs!CategoryCD
             i = i + 1
             adoRs.MoveNext
        Loop

        Call DBCuttingOff(True)
        MsgBox "抽出が完了しました"
        Exit Sub

    End With

Err_Handler:
Call DBCuttingOff(False)
MsgBox Error$
Debug.Print Error$
Debug.Print strSQL

End Sub

'**
' データベースへのアップデート
'
'------------------------------------------------------------------
Sub DBupdate()

    Call DBConnect(False)
    On Error GoTo Err_Handler

    adoCn.BeginTrans

    strSQL = ""
    strSQL = "UPDATE [販売管理] " & vbCrLf
    strSQL = strSQL & "SET " & vbCrLf
    strSQL = strSQL & "EccubeCD = '1100', " & vbCrLf
    strSQL = strSQL & "ItemCD = 'MENTA-3000', " & vbCrLf
    strSQL = strSQL & "ParentCD = '1200', " & vbCrLf
    strSQL = strSQL & "ItemName = '目黒邦江', " & vbCrLf
    strSQL = strSQL & "KikakuCD = '1300', " & vbCrLf
    strSQL = strSQL & "KikakuName = '目黒くにえ', " & vbCrLf
    strSQL = strSQL & "KosyouCD = '1400', " & vbCrLf
    strSQL = strSQL & "KosyouName = '目黒:DK', " & vbCrLf
    strSQL = strSQL & "ZentyouCD = '1500', " & vbCrLf
    strSQL = strSQL & "Zentyou = '全長1000', " & vbCrLf
    strSQL = strSQL & "CategoryCD = '100:200:300' " & vbCrLf
    strSQL = strSQL & "WHERE [No] = 8460;"
    adoCn.Execute strSQL

    adoCn.CommitTrans
    Call DBCuttingOff(False)

    MsgBox "正常に更新しました"
    Exit Sub

Err_Handler:
adoCn.RollbackTrans
Call DBCuttingOff(False)
MsgBox Error$
Debug.Print Error$
Debug.Print strSQL

End Sub

'**
' データベース Excel用 接続テスト
' コード直書き
'------------------------------------------------------------------
Sub DBConnectTest1()

    ' オブジェクト作成
    ' 参照設定チェックが無い場合、CreateObjectにて対応
    '--------------------------------------
    Dim Con As Object
    Dim Rs As Object

    Set Con = CreateObject("ADODB.Connection")
    Set Rs = CreateObject("ADODB.Recordset")

    ' ドライバー & ファイルパス
    '--------------------------------------
    Dim DbPath As String
    Dim strCon As String
    
    DbPath = "C:\Users\menta\Desktop\sample_test\new価格チェッカー.xlsm"
    strCon = "Provider=Microsoft.ACE.OLEDB.16.0;Data Source=" & DbPath & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"
    Con.Open strCon

    ' SQL組み立て
    ' 汎用的なフィールド名には [No] 要ブラケット
    ' FROM句:「Sheet15$A2:L8299」等 $に注意
    '--------------------------------------
    Dim strSQL As String

    strSQL = ""
    strSQL = strSQL & "SELECT [No], ItemCD " & vbCrLf
    strSQL = strSQL & "FROM [write$] " & vbCrLf
    strSQL = strSQL & "WHERE ItemCD = 'BCS00-16-0280-SET-SC-16a'"
    strSQL = strSQL & "ORDER BY [No]"
    Rs.Open strSQL, Con, adOpenKeyset, adLockReadOnly

    ' 書き込みここから
    '--------------------------------------
    Dim i As Long: i = 1
    Do Until Rs.EOF
        Sheets("Sheet3").Cells(i, 1).Value = Rs![No]
        Sheets("Sheet3").Cells(i, 2).Value = Rs!ItemCD
        Rs.MoveNext
        i = i + 1
    Loop

    Rs.Close
    Con.Close
    Set Rs = Nothing
    Set Con = Nothing
  
End Sub

'**
' データベース Access用 接続テスト
' コード直書き
'------------------------------------------------------------------
Sub DBConnectTest2()

    ' オブジェクト作成
    '--------------------------------------
    Dim Con As ADODB.Connection
    Dim Rs As ADODB.Recordset

    Set Con = New ADODB.Connection
    Set Rs = New ADODB.Recordset

    ' ドライバー & ファイルパス
    '--------------------------------------
    Dim DbPath As String: DbPath = "C:\Users\menta\Desktop\sampleDB"
    Con.Open "Provider=Microsoft.ACE.OLEDB.16.0;Data Source=" & DbPath & "\sampleDB.accdb;"

    ' error
    '--------------------------------------
    On Error GoTo Err_Handler

    ' SQL組み立て
    '--------------------------------------
    strSQL = ""
    strSQL = "SELECT * " & vbCrLf
    strSQL = strSQL & "FROM [販売管理] " & vbCrLf
    strSQL = strSQL & "WHERE [No] >= 1 AND [No] <= 800;"
    Rs.Open strSQL, Con, adOpenForwardOnly, adLockReadOnly

    ' BOF EOFチェック
    '--------------------------------------
    If Rs.BOF = True And Rs.EOF = True Then
        Rs.Close
        Con.Close
        Set Rs = Nothing
        Set Con = Nothing
        MsgBox "対象データがありません"
        Exit Sub
    End If

    ' 書き込みシート準備(既存データ削除など)
    '--------------------------------------
    Dim ws As Worksheet: Set ws = Worksheets("write")
    With ws
        Dim last_row As Long, i As Long: i = 2
        last_row = .Cells(.Rows.Count, 1).End(xlUp).row
       .Range(.Cells(2, 1), .Cells(last_row, 12)).Delete

        ' 書き込みここから
        '--------------------------------------
        Do Until Rs.EOF
            .Cells(i, 1) = Rs![No]
            .Cells(i, 2) = Rs!EccubeCD
            .Cells(i, 3) = Rs!ItemCD
            .Cells(i, 4) = Rs!ParentCD
            .Cells(i, 5) = Rs!ItemName
            .Cells(i, 6) = Rs!KikakuCD
            .Cells(i, 7) = Rs!KikakuName
            .Cells(i, 8) = Rs!KosyouCD
            .Cells(i, 9) = Rs!KosyouName
            .Cells(i, 10) = Rs!ZentyouCD
            .Cells(i, 11) = Rs!Zentyou
            .Cells(i, 12) = Rs!CategoryCD
             i = i + 1
             Rs.MoveNext
        Loop

        Rs.Close
        Con.Close
        Set Rs = Nothing
        Set Con = Nothing
        MsgBox "抽出が完了しました"
        Exit Sub

    End With

' error
'--------------------------------------
Err_Handler:
Rs.Close
Con.Close
Set Rs = Nothing
Set Con = Nothing
MsgBox Error$
Debug.Print Error$
Debug.Print strSQL
  
End Sub

'**
' データベース Access用 接続テスト ロールバック
' コード直書き
'------------------------------------------------------------------
Sub DBConnectTest3()

    ' オブジェクト作成
    '--------------------------------------
    Dim Con As ADODB.Connection
    Dim Rs As ADODB.Recordset

    Set Con = New ADODB.Connection
    Set Rs = New ADODB.Recordset

    ' ドライバー & ファイルパス
    '--------------------------------------
    Dim DbPath As String: DbPath = "C:\Users\menta\Desktop\sampleDB"
    Con.Open "Provider=Microsoft.ACE.OLEDB.16.0;Data Source=" & DbPath & "\sampleDB.accdb;"

    ' エラー処理
    '--------------------------------------
    On Error GoTo Err_Handler

    ' トランザクションスタート
    '--------------------------------------
    Con.BeginTrans

    ' SQL組み立て
    '--------------------------------------
    strSQL = ""
    strSQL = "UPDATE [販売管理] " & vbCrLf
    strSQL = strSQL & "SET " & vbCrLf
    strSQL = strSQL & "EccubeCD = '1100', " & vbCrLf
    strSQL = strSQL & "ItemCD = 'MENTA-3000', " & vbCrLf
    strSQL = strSQL & "ParentCD = '1200', " & vbCrLf
    strSQL = strSQL & "ItemName = '目黒邦江', " & vbCrLf
    strSQL = strSQL & "KikakuCD = '1300', " & vbCrLf
    strSQL = strSQL & "KikakuName = '目黒くにえ', " & vbCrLf
    strSQL = strSQL & "KosyouCD = '1400', " & vbCrLf
    strSQL = strSQL & "KosyouName = '目黒:DK', " & vbCrLf
    strSQL = strSQL & "ZentyouCD = '1500', " & vbCrLf
    strSQL = strSQL & "Zentyou = '全長1000', " & vbCrLf
    strSQL = strSQL & "CategoryCD = '100:200:300' " & vbCrLf
    strSQL = strSQL & "WHERE [No] = 8460;"
    
    ' ※UPDATEにおける、Openでの引数は「adOpenDynamic」、「adLockOptimistic」を使用すること
    Rs.Open strSQL, Con, adOpenDynamic, adLockOptimistic

    ' トランザクションコミット
    '--------------------------------------
    Con.CommitTrans

    MsgBox "正常に更新しました"
    Exit Sub




    ' BOF EOFチェック
    '--------------------------------------
    If Rs.BOF = True And Rs.EOF = True Then
        Rs.Close
        Con.Close
        Set Rs = Nothing
        Set Con = Nothing
        MsgBox "対象データがありません"
        Exit Sub
    End If

    ' 書き込みシート準備(既存データ削除など)
    '--------------------------------------
    Dim ws As Worksheet: Set ws = Worksheets("write")
    With ws
        Dim last_row As Long, i As Long: i = 2
        last_row = .Cells(.Rows.Count, 1).End(xlUp).row
       .Range(.Cells(2, 1), .Cells(last_row, 12)).Delete

        ' 書き込みここから
        '--------------------------------------
        Do Until Rs.EOF
            .Cells(i, 1) = Rs![No]
            .Cells(i, 2) = Rs!EccubeCD
            .Cells(i, 3) = Rs!ItemCD
            .Cells(i, 4) = Rs!ParentCD
            .Cells(i, 5) = Rs!ItemName
            .Cells(i, 6) = Rs!KikakuCD
            .Cells(i, 7) = Rs!KikakuName
            .Cells(i, 8) = Rs!KosyouCD
            .Cells(i, 9) = Rs!KosyouName
            .Cells(i, 10) = Rs!ZentyouCD
            .Cells(i, 11) = Rs!Zentyou
            .Cells(i, 12) = Rs!CategoryCD
             i = i + 1
             Rs.MoveNext
        Loop

        Rs.Close
        Con.Close
        Set Rs = Nothing
        Set Con = Nothing
        MsgBox "抽出が完了しました"
        Exit Sub

    End With

' error
'--------------------------------------
Err_Handler:
Rs.Close
Con.Close
Set Rs = Nothing
Set Con = Nothing
MsgBox Error$
Debug.Print Error$
Debug.Print strSQL
  
End Sub

Option Explicit

Private adoCn As Object
Private adoRs As Object
Private strSQL As String

Public Sub dbConnect(flg As Boolean)

    Dim dbPath As String
    dbPath = ThisWorkbook.Path

    Set adoCn = New ADODB.Connection
    With adoCn
        .Provider = "Microsoft.ACE.OLEDB.12.0"
        .ConnectionString = "Data Source = " & ThisWorkbook.FullName & "; Extended Properties =Excel 12.0;"
    End With

    If flg = True Then
        Set adoRs = New ADODB.Recordset
    End If

End Sub

Public Sub dbConnectCut(flg As Boolean)

    If flg = True Then adoRs.Close
    adoCn.Close

    Set adoRs = Nothing
    Set adoCn = Nothing

End Sub