VBAでテーブルを一括削除して、テーブルを作成する方法

Function GetXlData() As Boolean

' パス&ファイル名のエクセルデータを丸ごと読み込んで

' データ変換後 Access に取り込む。 GetObject() 使用。

' Access側の既にあるテーブルに全て文字列フィールドとして格納。

' 参照設定:Microsoft DAO x.x Object Library 必須

 

    Dim InPath As String

    InPath = CurrentProject.Path

    Dim InFile As String

    InFile = "○○.xls"

    

        

    ' Excel用の宣言

    Dim MyXl As Object

    Dim myData As Variant

    Dim r As Integer, c As Integer      ' 行数、列数

    Dim rcnt As Integer, ccnt As Integer

    

    ' Access用の宣言

    Dim mdb As DAO.Database

    Dim rst As DAO.Recordset

    Dim rtn As String                   ' フルパス

    rtn = InPath & "\" & InFile

    

    On Error Resume Next

    ' 既にExcelが起動済みでなければエラー

    Set MyXl = GetObject(, "Excel.Application")

    If Err.Number <> 0 Then Err.Clear   ' Errをクリア

    

    On Error GoTo Err_GetXlData

    ' 読込開始

    Set MyXl = GetObject(rtn)

    MyXl.Worksheets(1).Activate

    myData = MyXl.Worksheets(1).Range("A1:C10").CurrentRegion.Value

    r = UBound(myData, 1)       ' 行数

    c = UBound(myData, 2)       ' 列数

    

    ' Excel 終了

    MyXl.Application.Quit

    ' 変数開放

    Set MyXl = Nothing

    

    ' Accessに読込

    Set mdb = CurrentDb

    

    

    ' テーブル一括削除

    Set rst = mdb.OpenRecordset("SELECT [Name] FROM MSysObjects WHERE ([Name] Not Like 'MSys*') AND ([Type]=1) AND ([Flags]=0);", dbOpenForwardOnly)

    Do Until rst.EOF Or rst.BOF

        TList = TList & ",[" & rst!Name & "]"

        rst.MoveNext

    Loop

    If rst.RecordCount > 0 Then

        mdb.Execute "DROP TABLE " & Mid$(TList, 2) & ";"

    End If

    rst.Close

 

    

    ' ExcelDataの値を仮テーブルに格納

    For rcnt = 2 To r              ' field名以外の、行番号

        If Trim(myData(rcnt, 1) & "") <> "" Then

            If rcnt > 2 Then

                rst.Close

            End If

            createTable (Trim(myData(rcnt, 1) & ""))

            Set rst = mdb.OpenRecordset(Trim(myData(rcnt, 1) & ""))

        End If

        rst.AddNew

        For ccnt = 2 To c          ' 列

            If ccnt = c And myData(rcnt, ccnt) & "" = "" Then

                '『内容』のフィールドが空の時は無視

            Else

                rst(ccnt - 2).Value = myData(rcnt, ccnt) & ""

            End If

        Next ccnt

        rst.Update

    Next rcnt

        

    ' 変数開放

    Set rst = Nothing: Set mdb = Nothing

    

    GetXlData = True        '全て完了(文字列無事格納)

    

exit_GetXlData:

    Exit Function

 

Err_GetXlData:

    MsgBox Err.Description

    Resume exit_GetXlData

 

End Function

 

 

Function createTable(sTableName As String)

 

On Error GoTo Errorhandle

 

    Dim dbsCurrent As Database

    Dim tdfNew As TableDef

    Dim fldLoop As Field

    Dim prpLoop As Property

    Dim strNewTableName As String

    Dim strmsg As String

    Dim strFieldName As String

    

    '■Dim varInputBox As Variant

    '■varInputBox = InputBox("新規作成するテーブル名を入力して下さい。")

    '■空白("")の場合は、以降の処理を中止。

    '■If varInputBox = "" Then MsgBox "空白はダメ。再度トライして下さい。", 16, "管理者": End

    '■strNewTableName = varInputBox

    

    strNewTableName = sTableName '新規作成するテーブル名。

    strmsg = "新規テーブル 「" & strNewTableName & "」 を作成しますか?"

    

    'If 1 = MsgBox(strmsg, 17, "Microsoft Access Club") Then

 

        Set dbsCurrent = OpenDatabase(CurrentDb.Name)

    

        '新しい TableDef オブジェクトを作成します。

        Set tdfNew = dbsCurrent.CreateTableDef(strNewTableName)

    

        With tdfNew

            ' フィールドを作成し、新しい TableDef オブジェクトに追加します。

            ' これは、TableDef オブジェクトを このデータベース上の

            'TableDefs コレクションに追加する前に行う必要があります。

            .Fields.Append .CreateField("コード", dbText, 40)

            .Fields.Append .CreateField("内容", dbText, 255)

            

            ' 新しい TableDef オブジェクトをデータベースに追加します。

            dbsCurrent.TableDefs.Append tdfNew

 

        End With

        

        For Each fldLoop In tdfNew.Fields

            strFieldName = strFieldName & Chr(13) & "●" & fldLoop.Name & _

                            " ,  " & FieldTypeCK(fldLoop.Type) & _

                            "  ,   " & IIf(fldLoop.Size = 0, "--", "Size: " & fldLoop.Size)

        Next fldLoop

        dbsCurrent.Close  '開放します。

        'MsgBox "「" & strNewTableName & "」テーブルの作成が完了いたしました。" & Chr(13) & _

               "フィールドの構成は、下記のとおりです。" & Chr(13) & strFieldName, , "管理者"

        

    'End If

    

    Exit Function

    

Errorhandle:

 

'エラーコード3010は、同名オブジェクトがあり次の作業ができないときのメッセージです。

If Err.Number = 3010 Then

 

        If 1 = MsgBox("同名のテーブル【" & sTableName & "】があります。" & Chr(13) & _

                      "同名のテーブルがあると、テーブルの新規作成ができません。" & Chr(13) & _

                      "これを削除しますか?", 17, "管理者") Then

            

            '既に同名のテーブルがある場合は、テーブルを削除します。

            dbsCurrent.TableDefs.Delete strNewTableName

            Resume 'エラーの発生箇所に戻ります。

    

        Else

        

            MsgBox "同名のテーブルがあると、テーブルの新規ができません。" & Chr(13) & _

                        "テーブル名の変更を行って下さい。" & Chr(13) & _

                        "今回のテーブル作成処理を中止いたします。", 16, "管理者"

                        

        End If

        

Else

    

            MsgBox "予期せぬエラーが発生しました。" & Chr(13) & _

                        "エラーナンバー:" & Err.Number & Chr(13) & _

                        "エラー内容:" & Err.Description, vbOKOnly, "管理者"

                        

End If

    

End Function

 

Function QueryTypeCK(Qtype As Integer)

 

    Select Case Qtype

    

        Case dbQSelect: QueryTypeCK = "選択クエリ"

        Case dbQAction: QueryTypeCK = "アクションクエリ"

        Case dbQCrosstab: QueryTypeCK = "クロス集計クエリ"

        Case dbQUpdate: QueryTypeCK = "更新クエリ"

        Case dbQAppend: QueryTypeCK = "追加クエリ"

        Case dbQDelete: QueryTypeCK = "削除クエリ"

        Case dbQMakeTable: QueryTypeCK = "テーブル作成クエリ"

        Case dbQDDL: QueryTypeCK = "データ定義クエリ"

        Case dbQSQLPassThrough: QueryTypeCK = "パススルークエリ"

        Case dbQSetOperation: QueryTypeCK = "ユニオンクエリ"

        Case Else: QueryTypeCK = "不明"

        

    End Select

    

End Function

Function FieldTypeCK(intType As Integer) As String

 

    Select Case intType

    

        Case dbBoolean: FieldTypeCK = "ブール型"

        Case dbByte: FieldTypeCK = "バイト型"

        Case dbInteger: FieldTypeCK = "整数型"

        Case dbLong: FieldTypeCK = "長整数型"

        Case dbCurrency: FieldTypeCK = "通貨型"

        Case dbSingle: FieldTypeCK = "単精度浮動小数点数型"

        Case dbDouble: FieldTypeCK = "倍精度浮動小数点数型"

        Case dbDate: FieldTypeCK = "日付/時刻型"

        Case dbText: FieldTypeCK = "テキスト型"

        Case dbBinary: FieldTypeCK = "バイナリ型"

        Case dbMemo: FieldTypeCK = "メモ型"

        Case dbGUID: FieldTypeCK = "GUID型"

        Case Else: FieldTypeCK = "不明"

        

    End Select

 

End Function

 

 

 

http://www.accessclub.jp/samplefile/samplefile_163.htm

http://www.nurs.or.jp/~ppoy/access/access/acM002.html

http://www.accessclub.jp/bbs5/0036/vba11490.html