Microsoft Access 掲示板

トップページで指定したフォルダパスを参照する

7 コメント
views
4 フォロー

現在「トップフォーム」にてボタンクリックでダイアログを使い、任意のフォルダパスを格納できるようにしています。これは「トップテーブル」に入るようにしました。
そして、「案件フォーム」でボタンをクリックするとフォルダパス+「各レコードごとに生成したファイル名」でリンクを繋ぎ、ファイルの移動に役立てたいと思っています。
そこで質問ですが、
フォルダパスはやはり、クエリで繋いで全てのレコードに1つずつ紐づけないといけないのでしょうか。
リンクを作るのはVBAなのですが、フォルダパスをVBAで一括で指定することができますでしょうか。

訳の分からない質問をしていたら申し訳ありません。

ポンタ
作成: 2020/09/01 (火) 15:45:30
最終更新: 2020/09/01 (火) 15:58:11
通報 ...
1

そして、「案件フォーム」でボタンをクリックするとフォルダパス+「各レコードごとに生成したファイル名」でリンクを繋ぎ、ファイルの移動に役立てたいと思っています。

このファイルの移動はどのようにしてますか。
VBAなら、クエリで生成しなくても、VBAのコードで生成すればいいだけでは。

Dim FilePath As String

FilePath = DLookup("フォルダパス","トップテーブル") & Me!ファイル名
2
ポンタ 2020/09/01 (火) 16:37:27 0029a@1c915

ばっちりです!こういうときのためのDLookupなのですね…忘れないようにしなければ…
ところで、やはりフォルダパスはテーブルに格納する必要がありますよね。
このテーブルはこのフォルダパスのためにしか存在していないのですが、アクセスではテーブル以外にデータを入れる場所はありませんよね。

3
hiroton 2020/09/01 (火) 17:34:50 e6ef5@f966d

厳密な話をしだすとアレですが、一時的に使うだけなら

DLookupする代わりにフォルダパスを指定するダイアログをこのタイミングで呼び出す(VBAのみでフォルダパスを扱う)

案件フォームに非連結の「フォルダパス」テキストボックスを設置して、フォルダパス格納機能も案件フォームに設置する

'案件フォームにフォルダパスを一時確保'
Dim folderPath As String
folderPath = (フォルダパス取得処理)
Me!フォルダパス = folderPath
'ファイル移動処理の中ではフォーム上のフォルダパスを参照'
FilePath = Me!フォルダパス & Me!ファイル名

フォルダパス取得を「トップフォーム」でやりたいのならフォルダパス取得部分は上記同様にトップフォームに作って、案件フォームからトップフォームを参照する

'トップフォームが開かれたままでないとエラーになる'
FilePath = Forms!トップフォーム.form!フォルダパス & Me!ファイル名

など、アクセスを終了したら保存しなくてもいいデータならテーブルにもつ必要はないですね

4
ポンタ 2020/09/01 (火) 18:01:44 f1ed8@69bfc >> 3

なるほど、よくわかりました。
トップに置きたいのですが、閉じる可能性があるので今回はやめておこうと思いますが、今後の参考になりました!
ありがとうございます!!

5

アクセスではテーブル以外にデータを入れる場所はありませんよね。

マクロの「一時変数」というのがあります。
"SetTempVar/一時変数の設定" マクロ アクション - Access

VBAからは、TempVars オブジェクト として参照できます。
TempVars オブジェクト (Access) | Microsoft Docs

下記のような感じで使えます。

    '一時変数登録
    TempVars.Add "FolderPath", "C:\test\" '変数名 FolderPath にパス「C:\test\」を登録
    
    
    '一時変数参照
    Dim FilePath As String
    FilePath = TempVars!FolderPath & "vvvvv" 'Me!ファイル名
    MsgBox FilePath

TempVars!FolderPath の部分は TempVars("FolderPath") とすることもできます。TempVars(0) とインデックスで参照することなできます。

データベースファイルを閉じるまでは、使用できます。
マクロで参照したり、フォーム、レポートのコントロールソースからも下記のような感じで参照できます。

=[TempVars]![FolderPath]

また、クエリからも [TempVars]![FolderPath] という式で参照できます。
なかなか便利な機能だとおもいます。

まとめると、
「トップフォーム」を閉じない(不要の場合は、閉じずに非表示にておく)なら、「トップフォーム」に表示のテキストボックスを配置してそこに格納しておく。

「トップフォーム」を閉じる場合があるなら、TempVars に格納しておく。

データベースファイルを閉じても、保存しておきたい。次に開いたとに前回のものを参照したいという場合は、テーブルに格納しておく。

というように使い分けるといいでしょう。

6
hiroton 2020/09/02 (水) 08:14:25 cc44d@f966d

あとは、VBAでグローバルな変数を用意するとかですかね

また、クエリからも [TempVars]![FolderPath] という式で参照できます。

「案件フォーム」のレコードソースで「ファイルパス: [TempVars]![FolderPath]&ファイル名」なフィールドを用意しておけるとかなかなか良さげですね

7
ポンタ 2020/09/02 (水) 09:36:29 0029a@1c915

高度な技を教えていただきありがとうございます!!
大変勉強になりました。今後も使える技で、とても助かります。

>「トップフォーム」を閉じない(不要の場合は、閉じずに非表示にておく)
ここらへんの設計は後回しにしているので、いずれ質問させていただくかもしれません。。