Microsoft Access 掲示板

OLEオブジェクトのアプリが閉じたときに、連結オブジェクトフレームのLockedをTrueにしたい。

10 コメント
views
4 フォロー

また、宜しくお願い致します。

フォームの連結オブジェクトフレームで、元テーブルはOLEオブジェクト型で、
Excelファイルを格納しています。

ダブルクリックした際に、連結オブジェクトフレームのLockedをFalseにし、
Excelが開いて、編集が終わって閉じたら、連結オブジェクトフレームのLockedをTrueにしたいと思っています。

編集が終わってExcelが閉じたとき、というイベントがあればいいのですが、ないので困っています。

LockedをTrueにする理由は、ドラッグアンドドロップで連結オブジェクトフレームにファイルを格納できてしまうのをLockedで防ぐためです。

あん
作成: 2023/06/29 (木) 14:17:51
通報 ...
1
りんご 2023/07/01 (土) 15:41:25 935bc@0e907

 ロック解除と同時に何某かのプロパティを変更して、間接的に目的を達成できないかを検討するのはどうですか?保証はしませんが、オブジェクト非表示、マウス操作制御など。
 それはさておき、Excel連携するならば、Access以外の選択肢があるんじゃないでしょうか?
 

2

連結オブジェクトフレームでOLEオブジェクトを開いて編集したり閉じるときに更新時イベントが発生するようです。
閉じるときには、Code引数が2になるようです。
上記を利用して閉じたことを検知できそうです。

ただし、更新時イベントでは、更新中なので Locked = True にはできないので、タイマー時イベントで時間を遅らせてロックするようします。

簡単なサンプルの実験では下記のようなコードでうまくいっているようです。
連結オブジェクトフレームの名前は xlsData としています。

Private Sub Form_Timer()
    Me.TimerInterval = 0 'タイマー時イベント停止
    Me.Refresh           'レコード保存
    Me.xlsData.Locked = True
End Sub

Private Sub xlsData_Updated(Code As Integer)
    Select Case Code
    Case 0, 1
        Me.xlsData.Locked = False
    Case 2
        Me.TimerInterval = 10 '0.01秒後にタイマーイベント発動
    End Select
End Sub

連結オブジェクトフレームは普段使ったことがなく、今回、初めて簡単なサンプルで実験しただけなので、実際に使うときはしっかりと動作検証してから使ってください。

3
hiroton 2023/07/03 (月) 09:17:25 修正 9d659@f966d

いろいろ弄ってたんですが連結オブジェクトフレームはなかなか不思議な動きをするんですねぇ
外部からのドラッグアンドドロップが問題になるなら使用可能プロパティを使うのも手だと思います

使用可能 |いいえ
編集ロック|いいえ

使用可能プロパティを「いいえ」にしてるので編集は適当にコマンドボタンを配置してVBAから操作します

Private Sub コマンド0_DblClick(Cancel As Integer)
    '//連結オブジェクトフレームはEnabled = Trueにしないと編集できない(っぽい)
    Me!xlsData.Enabled = True
    Me!xlsData.Action = acOLEActivate
End Sub

Private Sub xlsData_Updated(Code As Integer)
    '//編集の為Enabled = TrueにしたのをFalseに戻す
    '//ベストなイベント発生がないのでここで無理やり変更をかける
    On Error Resume Next
    Me!xlsData.Enabled = False
    On Error GoTo 0

    '//フォーカスを持っているフィールドなのになぜEnabled = Falseできるのか謎
    '//更新時イベント自体は複数回発生するが固定回数のようなのでカウントして対応したほうが丁寧だけど面倒なのでエラーは無視でいいんじゃないかな
End Sub

コマンドボタンの透明プロパティを「はい」にして、連結オブジェクトフレームにぴったり重ね合わせて前面に配置すればそれっぽくなると思います

なお、コードは「なぜか動く」系の怪しさ満点のコードなので十分に動作検証を行ってください


※プログラミング能力を疑うコードだったのでコメントを追加しました
より一層、公開したのを後悔するようなコードになった気がします

4
あん 2023/07/03 (月) 15:05:28 927ea@53b5d

りんご様、hatena様、hiroton様
ご回答ありがとうございます。

りんご様
>Excel連携するならば、Access以外の選択肢があるんじゃないでしょうか?
Excelで作成したファイルをデータベースに収めておきたいです。
Access以外とは、Access以外のデータベースソフトを使うということでしょうか?

hatena様、hiroton様
ご提示いただいたコードをやってみます。
ご指摘の通りに両方ともしっかりと動作検証を行いたいと思います。

結果をまたご連絡させていただきます。

5
りんご 2023/07/03 (月) 15:36:59 935bc@0e907 >> 4

 ファイル管理が目的ならばそれ用の既製品を使えば済みます。または、gitで管理。
 Excel連携するならば、fusion_placeみたいに、ちゃんと考えられているソフトがもうあたり前に登場している時代だと思います。

6
あん 2023/07/03 (月) 15:51:34 927ea@53b5d

りんご様

Accessで構築している最中の業務システム内の「見積作成」で、「見積番号」フィールドで関連するファイル(Excel、PDF等)も一元管理しようと思い、AccessDBに収めようと思っています。

こういうケースでも、既製品ソフトで別途管理の方がよろしいのでしょうか?

7

ちなみに、Accessに格納するファイルというのは、仕様書、注文書、契約書等のExcelまたはPDFファイルになります。

8
りんご 2023/07/03 (月) 16:57:45 935bc@0e907 >> 7

 やろうとしている事は昭和のあるあるですね。それをデータベースと呼ぶ時代も、もしかしたらあったのかもしれませんが、黒歴史です。
 データの一元管理がやりたいのであれば、Excelやpdfの中身を分解して、正規化済みのデータベースソフトに取り込んで下さい。
 既製品じゃ駄目なの?ラインナップは出揃っているし、オワコンの再発明(失敗作)を頑張る必要があるのかな。
 

9
hiroton 2023/07/03 (月) 17:05:43 修正 9d659@f966d

OLEオブジェクトの利点はプレビュー表示ができることです。プレビュー表示の必要なく、関連ファイルの管理をしたいだけならば添付ファイル型を使用したほうがいいと思います

データベースのレコードにファイルやグラフィックスを添付する

プレビューに関しても、対象が単票フォームであれば非連結オブジェクトフレームで対応するという方法がとれるかもしれません


それはそれとして、データベースに埋め込まないでACCESSでファイル管理機能を組む、というのもありだと思います。OLEオブジェクトにしろ添付ファイル型にしろ何かと制限はあるし、このご時世2GBまでというACCESSの制限はちょっと怖いです

ただし、ファイル操作に関して自前でVBAを駆使することになるのでそれなりに難易度は上がります

10
あん 2023/07/10 (月) 10:16:13 927ea@53b5d

hatena様、hiroton様
ご提案のコードでプログラム作成させていただきました。

動作検証も行いましたが、特に問題なさそうです。
どちらかを使わせていただきたいと思います。
また、コードのお勉強もさせていただました。
毎度、ありがとうございます。

hiroton様
バック(テーブル)がSQL Serverを用いておりますので、ファイル容量には問題ありません。
ご心配ありがとうございます。

りんご様
既製品の導入に関してですが、
Accessでファイル管理していくことに問題や不便があれば、検討しますが、何もないので導入はしません。
特に有料であればなおさらです。
無料の場合でも、Accessでの入力とは別途に、ユーザーが既製品ソフトを起動して、ファイルを保存したり、該当ファイルを出力したりの操作をするのは余計な手間になりますし、間違いも起こりえるでしょう。
ただし、Accessから自動的に既製品ソフトを開いてファイルを保存したり、該当ファイルを出力したりするプログラムが出来れば別ですが。

昭和でも、黒歴史でも、目的が達成できればいいです。
ユーザー本位のプログラムができれば。それができなければ、失敗作なのでしょう。

それでは、この度もありがとうございました。