リンク先のテーブルをリンク先でコピーする

リンク先のテーブルをリンク先でコピーする


ACCESSでは、プログラム用accdb と テーブル用accdbに分けて使用していることがあります。
そこで、DoCmd.TransferDatabase を使ってリンクテーブルのコピーを行うと、コピー先のテーブルは、自accdbで作られ、しかも、リンクされたテーブルが出来上がってしまいます。

この目的でいい、というのならそはそれでいいのですが・・・
今回は、リンク先のaccdb に、リンクしてあるテーブルの複製を作る方法です。

① リンク先のaccdbを起動する
② DoCmd.TransferDatabaseを使って、リンク先のaccdbでコピーを実行する

・・・という手順で処理します。

以下は、サンプルプログラム。

**************************************************************************
Private Sub コマンド_Click()

   
    'DoCmd.TransferDatabase コマンドは自分にしかインポートできないので
    'リンク先を起動してそこでコマンドを実行してテーブルをコピーする
   
    '------------------------------------
    'リンク先accdbのパスを取得
    '------------------------------------
    Dim dbDB            As DAO.Database                     'このaccdb
    Dim tdfSet          As DAO.TableDef                     'テーブル名
    Dim strLinkDB       As String                           'テーブルのリンク先accdb
   
    'テーブルの定義
    Set dbDB = CurrentDb
    Set tdfSet = dbDB.TableDefs("tblGOLD")
   
    'リンク先DBのパスを取得
    strLinkDB = Mid(tdfSet.Connect, 11)
   
    Set tdfSet = Nothing
    Set dbDB = Nothing
 

    '------------------------------------
    'リンク先のaccdbを起動してテーブルをコピー
    '------------------------------------
    Dim appAccess       As Access.Application
    Set appAccess = CreateObject("Access.Application")

    'テーブルコピー実行
    With appAccess
        .OpenCurrentDatabase strLinkDB

        .DoCmd.TransferDatabase acImport, "Microsoft Access", _
        strLinkDB, acTable, "tblGOLD", "tblGOLD2011"

             '左がコピー元テーブル名、右がコピー先テーブル名
        .Quit
    End With

    Set appAccess = Nothing

End Sub

『カレント プロシージャ』『カレント モジュール』『カレント プロジェクト』の違い

『カレント プロシージャ』『カレント モジュール』『カレント プロジェクト』の違い

標準モジュールにぱたぱたとVBAを打ち込んでいて、検索画面を出していると、対象として
○カレント プロシージャ
○カレント モジュール
○カレント プロジェクト

の3つが選択できるようになっています。

では、この3つの違いはなんでしょうか。
検索してみて判りました。

モジュール


























○カレント プロシージャ
Function ~ End Function の間、
もしくは、Sub ~  End Sub までの間
赤い丸の部分

○カレント モジュール
ひとつのモジュールの中にいくつか Function があれば、
そのモジュール中を通して検索
緑の丸の部分

○カレント プロジェクト  
いくつかの モジュールをまたいで検索
青い丸の部分

◆検索ならいいのですが、置き換えをしようとして、
カレント プロシージャのつもりがカレント モジュールでやってしまうと取り返しがつかない時があります。

置き換えは十分に確認してから実行しましょう。





フォルダの作成 【途中の階層を含めてフォルダを作る】

'フォルダの作成 【途中の階層を含めてフォルダを作る】

'フォントの関係で円マークは全角の¥で記述しています
'全文丸ごとコピーしたら文字変換で全角の¥を半角の¥にして下さい
'
'アドイン(mda)かaccdbの標準モジュールに記載します
'引数(フォルダ名)を指定して関数を実行します



Option Compare Database
Option Explicit


'*****************************************************************************
'関数名:  procMakeFolder(フォルダ名)
'機  能:  フォルダの作成
'引  数:  フォルダ名(string型)
'戻り値:  なし
'
'【解説】
' ① 作りたいフォルダ名を指定して関数を実行
' ② フルパス名であればフルパスでフォルダを作成
' ③ フルパスでなければ自パスにフォルダが作られる
' ④ すでにフォルダが存在していれば何もしない
' ⑤ フォルダ名引数が空白ならば何もせずに終了する
' ⑥ フォルダ名は途中の階層で存在しないフォルダがあれば全てフォルダが作られる
'****************************************************************************

'フォルダを作成するためのWindowsAPI
Private Declare Function MakeSureDirectoryPathExists _
  Lib "imagehlp.dll" (ByVal lpPath As String) As Long


Function procMakeFolder(ByVal strFolderName As String)


    Dim DB              As DAO.Database                     'パス名を取得するためのDAO
    Dim FSO             As Object                           'FileSystemObject
    Dim fFile           As Object                           'File
    Dim strMyFullPath   As String                           'フルパス名  例("C:¥temp")
    Dim strMyFoldName   As String                           '自パス名

    Dim bytActSW        As Byte                             '処理区分
   
    '------------------------------
    '自パス名を取得
    '------------------------------
    Set DB = CurrentDb()
    strMyFullPath = Trim(DB.Name)
   
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set fFile = FSO.GetFile(strMyFullPath)

    strMyFoldName = FSO.GetParentFolderName(fFile) '末尾¥なし
   
    'フォルダ名がドライブ名の時、末尾に¥が付くので取り除く
    If Right(pstrMyFoldName, 1) = "¥" Then
        pstrMyFoldName = Left(pstrMyFoldName, 2)
    End If
   
    Set fFile = Nothing
    Set FSO = Nothing
    Set DB = Nothing
    '------------------------------
    '指定されたフォルダ名を設置
    '------------------------------
    strFolderName = Trim(strFolderName)
    bytActSW = 0
    '------------------------------
    '入力がない場合、自フォルダとなる
    '------------------------------
    If Len(strFolderName) = 0 Then
        bytActSW = 0  '処理せず
    '------------------------------
    '入力がある場合
    '------------------------------
    Else

        If Mid(strFolderName, 2, 2) = ":¥" Then             'ドライブ名から指定あり
            bytActSW = 1                                    'そのままフォルダ作成
        Else
            If Left(strFolderName, 2) = "¥¥" Then           'ネットワークから指定あり
                bytActSW = 1                                'そのままフォルダ作成
            Else
                If Left(strFolderName, 1) = "¥" Then        '¥付きフォルダ名のみの指定
                    bytActSW = 2                            'フルパス化して作成
                Else                                        '¥なしフォルダ名のみの指定
                    bytActSW = 3                            '¥付けてフルパス化して作成
                End If
            End If
        End If
    End If

    '------------------------------
    'フォルダ名編集
    '------------------------------
    Select Case bytActSW
        Case 0                                              '空白につき処理せず
   
        Case 1                                              'そのままフォルダ作成
      
        Case 2                                              '¥付き フルパス化して作成
            strFolderName = strMyFoldName & strFolderName
       
        Case 3                                              '¥なし フルパス化して作成
            strFolderName = strMyFoldName & "¥" & strFolderName
       
        Case Else                                           '何もしない
            bytActSW = 0
    End Select
    '------------------------------
    'フォルダ作成実行
    '------------------------------
    If bytActSW > 0 Then
   
        'このAPIは必ず末尾に¥を付ける
        If Right(strFolderName, 1) <> "¥" Then
            strFolderName = strFolderName & "¥"
        End If
   
        '□□□□□□□□□□□□□□□
        'フォルダ作成
        '□□□□□□□□□□□□□□□
        MakeSureDirectoryPathExists (strFolderName)
    End If

End Function

このオブジェクトに値を代入することはできません

このオブジェクトに値を代入することはできません


フォームを作って、そのフォームのレコードソースにテーブルを指定します。
まあ、通常のフォームウィザードでテーブルを選んでフォームを作ったとして下さい。

もちろんテキストボックスのコントロールソースには、テーブルのフィールドが指定されています。
(ここら辺もフォームウィザードで自動でできたコントロールですね)

そして、フォームの閉じる時(Form_Close)のイベントで、
テキストボックスへ何か値を入れた、・・・とします。(ここの部分は手入力)

そうすると、「このオブジェクトに値を代入することはできません」と出て、はまってしまいました。

で、解決策ですが、
「読み込み解除時」イベントに、テキストボックスへ値を入れると正常に完了します。


Form_Unload と Form_Close の間のタイミングで、テーブルが閉じてしまうみたいです。


「このオブジェクトに値を代入することはできません」が出る、
というのはいろいろなケースが考えられますし、
Form_Unload に記述すれば間違いなし、とは言い切れませんが、
まあ、いくつかの現象の中で試してみてもいい対応策でしょう。

では。

フォームの色の値指定

フォームの色の値指定

ACCESS 2010 になってから、フォームのプロパティに色の設定が、
「背景 1, 暗め 5%」
とかになっていて、「なんだこれ」という気分にさせられます。
そんな明るかろうが、暗かろうが、何%だろうが、どうでもよくって、
色が決まって指定できればどうでもいいと思うのですが、どうなんでしょうね。

そこで、特定の数字を入れれば色を指定できるので、一覧を作ってみました。
参考にして下さい。

0(black)
16777215(white)
255(red)
65280明るい緑(lime)
16711680(blue)
65535(yellow)
16711935ピンク(fuchsia)
16776960水色(aqua)
128濃い赤(maroon)
32768(green)
8388608濃い青(navy)
32896濃い黄(olive)
8388736(purple)
8421376青緑(teal)
12632256(silver)
8421504濃灰(gray)




16色カラー値

 index 1 index 9
 nameblack namemaroon
 16進数#000000 16進数#800000
 RGB 0,0,0 RGB 128,0,0
 index 2 index 10
 namewhite namegreen
 16進数#FFFFFF 16進数#008000
 RGB 255,255,255 RGB 0,128,0
 index 3 index 11
 namered namenavy
 16進数#FF0000 16進数#000080
 RGB 255,0,0 RGB 0,0,128
 index 4 index 12
 namelime nameolive
 16進数#00FF00 16進数#808000
 RGB 0,255,0 RGB 128,128,0
 index 5 index 13
 nameblue namepurple
 16進数#0000FF 16進数#800080
 RGB 0,0,255 RGB 128,0,128
 index 6 index 14
 nameyellow nameteal
 16進数#FFFF00 16進数#008080
 RGB 255,255,0 RGB 0,128,128
 index 7 index 15
 namefuchsia namesilver
 16進数#FF00FF 16進数#C0C0C0
 RGB 255,0,255 RGB 192,192,192
 index 8 index 16
 nameaqua namegray
 16進数#00FFFF 16進数#808080
 RGB 0,255,255 RGB 128,128,128
livedoor プロフィール
タグクラウド
QRコード
QRコード
  • ライブドアブログ