dbfをACCESSのテーブルにリンクするモジュール

ACCESSのテーブルにdbfをリンクするモジュールです。
ACCESS 2010 で成功しました。

標準モジュールにコピペして貼り付けて下さい。

パラメータの設定例は次の通り
① DBFが置いてあるフォルダ名   L:¥・・・など
② DBF名 たとえば"SetCurent,storename,User,Sales"・・・など
③ 0:リンク、1=インポート

これ以下、モジュール文

Option Compare Database
Option Explicit

'******************************************************************************
'テーブルをリンクし直す
'   引値1   DBFがあるフォルダ名
'   引値2   DBF名(カンマ区切り)複数設定できる、拡張子.DBFは不要
'   引値3   0:リンク、か、1=インポート
'******************************************************************************
Function procDBFLink(strDBFFolder As String, strTblList As String, intAcType As Integer)

    On Error GoTo 0
    'On Error GoTo Error_Trap
    '**********************************************************
    '変数定義
    '**********************************************************
    Dim dbsMDB              As DAO.Database                 'リンク中のテーブル
   
    Dim strNowLinkName      As String                       '現在のテーブルのリンク先
   
    Dim strTBLArray()       As String                       'tblテーブル名配列
    Dim strTBLName          As String                       'tblテーブル名個々
    Dim strDBFName          As String                       'DBF名
    Dim strDBFFullPass      As String                       'DBFのフルパス名
   
   
    Dim lngArraySize        As Long                         '配列サイズ0~n
    Dim intIX               As Integer                      '添え字
    Dim blnReturn           As Boolean                      '関数戻り値
   
    '**********************************************************
    'Table名確認
    '**********************************************************
    lngArraySize = 0
    On Error Resume Next                                    '配列に何もないとエラーとなる
    strTBLArray = Split(strTblList, ",")
    lngArraySize = UBound(strTBLArray)                      'DBF名の配列
   
    If lngArraySize < 0 Then                                '配列数なしは-1
        Call procMsgToEnd("DBF名が設定されていません。")
    End If
    On Error GoTo 0
    '-----------------------------------------------------
    'DBFフォルダ名チェック
    '-----------------------------------------------------
    If Right(strDBFFolder, 1) <> "¥" Then
        strDBFFolder = strDBFFolder & "¥"
    End If
   
    '存在チェック
    '-----------------------------------------------------
    'リンクタイプ、指定外設定はリンク
    '-----------------------------------------------------
    If intAcType > 1 Then
        intAcType = 0                                       '0:リンク
    End If
   
    '**********************************************************
    'テーブルをリンクする
    '**********************************************************
    On Error Resume Next                                    'テーブルが無ければエラーが出る
    Set dbsMDB = CurrentDb
   
    For intIX = 0 To lngArraySize
        strTBLName = strTBLArray(intIX)                     'テーブル名称
        strDBFName = strTBLName & ".dbf"                    'XXXX.dbf
        strDBFFullPass = strDBFFolder & strDBFName          'Z:\YYYYY\XXXX.dbf
        '----------------------
        'DBFの存在チェック
        '----------------------
        blnReturn = procCheckFile(strDBFFullPass)
        If blnReturn = False Then
            MsgBox (strDBFFullPass & " が存在しません。")
        Else
            '----------------------
            '現在のリンクテーブル名
            '----------------------
            strNowLinkName = procGetLinkDBFName(strTBLName)
            '----------------------
            '現在のリンクテーブル名と新テーブルを比較
            '----------------------
            If strNowLinkName <> strTBLName Then
               
                dbsMDB.TableDefs.Refresh                    '一旦削除してから新規にリンク
                On Error Resume Next                        'テーブルが無ければエラーが出る
                dbsMDB.TableDefs.Delete strTBLName          'テーブルを一旦削除する
               
                If intAcType = 0 Then                       '0:リンク 1:インポート
                    DoCmd.TransferDatabase acLink, "dBase III", strDBFFolder, acTable, strDBFName, strTBLName, False
                Else
                    DoCmd.TransferDatabase acImport, "dBase III", strDBFFolder, acTable, strDBFName, strTBLName, False
                End If
               
                dbsMDB.TableDefs.Refresh                    'リンク再設定
           
            End If
        End If
    Next
    '------------------------------------
    'DAOを閉じる
    '------------------------------------
    dbsMDB.Close
    Set dbsMDB = Nothing
    '**********************************************************
    '終了処理
    '**********************************************************
Exit_Procedure:
    DoEvents
    Exit Function

Error_Trap:
    MsgBox ("[procTableLink]=" & Err.Description)
    Application.Quit
    Resume Exit_Procedure
  

End Function


'******************************************************************************
'テーブルのリンク先を調べる
'******************************************************************************
Function procGetLinkDBFName(varTableName As Variant) As String

    On Error Resume Next                                    'テーブルが無ければエラーが出る
   
    Dim dbsDB           As DAO.Database
    Dim tblTable        As DAO.TableDef
    Dim blnReturn       As Boolean

    Set dbsDB = CurrentDb
    dbsDB.TableDefs.Refresh
    blnReturn = 0
   
    For Each tblTable In dbsDB.TableDefs
        If tblTable.Name = varTableName Then
            If Len(tblTable.Connect) = 0 Then
            Else
                procGetLinkDBFName = Mid(tblTable.Connect, InStr(1, tblTable.Connect, "DATABASE=", vbTextCompare) + 9)
            End If
            blnReturn = True
            Exit For
        End If
    Next
    dbsDB.Close
    Set dbsDB = Nothing

End Function


ファイルが作られた日付時刻の取得方法

ファイルが作られた日付時刻の取得方法


顧客とか相手先から何らかの指示データをもらって業務を行う時、指示データが複数ダブってくる場合があり得ます。

この時、どのデータが最初なのか、どのデータが最後なのかを調べる方法として、ファイルが作られた時間を取得する、という手段があります。


手っ取り場合のやり方として、エクスプローラを開き、そのファイルのプロパティを表示してみます。
(ファイルとは、例えていえば固定長テキストファイルとします)

そこには、①作成日時、②更新日時、③アクセス日時、の3つが表示されます。

①作成日時
ファイルが作られた日付時刻なのですが、コピーして作られた時もここに日付時刻が入ります。
つまり厳密なところの、当ファイルがアプリなどにより最後に書き込まれた日付時刻ではありません。

②更新日時
これがアプリとかで書き込まれた日付時刻です。
テキストエディタで手修正して更新すると、ここの更新日時が変わります。

③アクセス日時
ファイルが更新したか、更新していないか、関係なく、開いた日付時刻です。

【重要】つまり、更新日時を取得さえすれば、最新のファイルかどうかの判断が出来ます。
では、どうやって更新日時を取得するのか?

◆FileDateTime関数
ファイル名(フルパス)を与えて関数を実行すると、更新日時が返ってきます。
戻り値は、バリアント型 (内部処理形式 Date型)となっています。つまり日付型です。

dtmFileDate = FileDateTime(strFileName)


◇サンプル例

Function procTest()


Dim strFileName    As String
Dim dtmDateTime  As Date


strFileName = "C:¥TransRock¥Operand20120805.csv"
dtmDateTime = FileDateTime(strFileName)


MsgBox (dtmDateTime)


End Function



'実行するマクロは・・・
call  procTest()


16色カラーの設定値

16色カラーの設定値

プロパティとは、フォームやレポ-トの色のプロパティの値のことです。
(例、ForColor = 255 ←red)

拡大して印刷して下さい。

16色カラー設定値














実行中フォームへのフォーカスとマウスの砂時計

VBAでマウスを砂時計にする方法


◆VBA命令文

DoCmd.Hourglass True    'マウスを砂時計にする


DoCmd.Hourglass False   'マウスを元に戻す



◆実行中は・・・
ただし、マウスの形状が何にであれ、
マウスの機能としてのクリックすることはできてしまいます。



実行している間にフォームを操作できないようにするには、


①フォームのコントロールをそれぞれ Enabled にする


②フォームの前面にポップアップで別の実行中表示画面を出して、
フォームにフォーカスがとれないようにする


しかありません

VBAでExcelの最終行を取得

VBAでExcelの最終行を取得


既存のExcelの最終行を得る方法です。
変数 lngRow に最終行が入ります。

'*********************************************
'Excelの存在チェック

    Dim xlApp               As Object                   'Excelアプリ
    Dim xlBook              As Object                   'Excelのブック
    Dim xlSheet             As Object                   'Excelのシート
    Dim lngRow              As Long                     '行番号数値

    '--------------------------------
    'strFileName → Excelのフルパス名
    'blnReturn   → 関数の結果
    'Dir関数使っていますがなんかこれで十分ですね
    '--------------------------------

    If Dir(strFileName) <> "" Then
        blnReturn = True
    Else
        blnReturn = False
    End If

    If blnReturn = False Then
        'Excelファイルがない処理へ・・・


   'EXCELの最後の行を検索
    Else

        'Excelの生成
        Set xlApp = CreateObject("Excel.Application")


        'EXCELブックを開く
        Set xlBook = xlApp.Workbooks.Open(strExcelFile)


        'シートを変数に設定、1は最初のシート
        Set xlSheet = xlBook.Worksheets(1)


        'UsedRangeは一度削除した行も含むため使えない
        'A列の最終行を取得、戻り値Long
 
        lngRow = xlSheet.Range("A65536").End(xlUp).Row


        xlBook.Close                            '閉じる
        xlApp.Quit                              'EXCEL終了

        Set xlSheet = Nothing
        Set xlBook = Nothing
        Set xlApp = Nothing

     End If


livedoor プロフィール
タグクラウド
QRコード
QRコード
  • ライブドアブログ