Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Microsoft 365)
非連結オブジェクトで表示したエクセルを編集する件
投稿日時: 22/09/09 13:56:36
投稿者: アロハ

いつもお世話になります。
 
フォームに非連結オブジェクトフレームを配置して、エクセルをリンクで表示しています。
リンク表示なので、自分自身がエクセルを直接開いている状態と同じです。
ユーザは画面の内容を確認したことを証明する為に、画面に配置してあるボタンをクリックすると、A1のセルに日付を入れてエクセルを保存したいのですが、非連結オブジェクトフレームで開いているエクセルを編集するにはどうすればいいでしょうか。

引用:
Dim XLApp As Excel.Application
 
Set XLApp = Me.非連結OLE0.Object.Application
 
XLApp.Workbooks(1).Worksheets(1).Range("A1") = 1

上記はいろいろ検索して参考になりそうでしたが、エラーがでて変更できませんでした。
 
ご指導ご鞭撻のほど、よろしくお願いします。

回答
投稿日時: 22/09/12 13:51:28
投稿者: Suzu

引用:
エラーがでて変更できませんでした。

どんなエラーなのか、具体的に書くようにしましょう。
 
 
VBAではなく、手動の際には編集可能な状態になるのでしょうか?
編集可能な状態にならないのであれば
・Action プロパティー
・OLETypeAllowed プロパティー
・Verb プロパティ
を確認ください。
 
https://docs.microsoft.com/ja-jp/office/vba/api/access.objectframe.action
https://docs.microsoft.com/ja-jp/office/vba/api/access.objectframe.oletypeallowed
https://docs.microsoft.com/ja-jp/office/vba/api/access.objectframe.verb
 
 
 
引用:
リンク表示なので、自分自身がエクセルを直接開いている状態と同じです。

ちょっと違います。
Actionプロパティ の acOLECreateLink 内の説明に
引用:
OLE オブジェクトを保存すると、コントロールにはデータのイメージは含まれていても、ソース データは含まれていないので、このオブジェクトを供給したアプリケーションの名前およびリンク ファイルなどのリンク情報のみが保存されます。

となっています。
以前読み込んだデータを保持していて表示しているだけなんです。
 
・フレームダブルクリックで、Excel を起動し、保存されているパスのファイルを開く
・更新
等を行う事で、最新のデータに更新されるのです。
 
Excelのワークブックは誰かが開いていたら、読み取り云々の表示が出ます。
でも、非連結オブジェクトフレームで表示している状態で、Excelからそのファイルを開いても
その表示が出ない事でも判ると思います。
 
 
なので、事前バインディングを行ってもいますから、そこでは、Excelしか開かないのですよね。
 
であれば
 1. SourceDoc プロパティーから、開きたい Excelブックのパスを取得
 2. Excel Application を生成 (場合により非表示)
 3. 1で取得したパスのファイルを開く
 4. データの書き換え
 5. ファイルを上書き/保存 Excelの終了
 6. 非連結オブジェクトフレーム の更新
でも良いと思います。

投稿日時: 22/09/12 19:01:11
投稿者: アロハ

Suzu様
 
いつもコメントありがとうございます。

引用:
Excelのワークブックは誰かが開いていたら、読み取り云々の表示が出ます。
でも、非連結オブジェクトフレームで表示している状態で、Excelからそのファイルを開いても
その表示が出ない事でも判ると思います。

そんなことはありません。他のユーザが対象のファイルを開いたら非連結オブジェクトフレームで開いているユーザが開いていると警告がでます。だから困って質問しています。
引用:
であれば
 1. SourceDoc プロパティーから、開きたい Excelブックのパスを取得
 2. Excel Application を生成 (場合により非表示)
 3. 1で取得したパスのファイルを開く
 4. データの書き換え
 5. ファイルを上書き/保存 Excelの終了
 6. 非連結オブジェクトフレーム の更新
でも良いと思います。

念のためやってみましたが、単純に2つ目のEXCEL.EXEが起動して「Saveメソッドは失敗しました。」と出て保存はできません。これは想像通りの結果でした。
 
やはり開いている非連結オブジェクトフレームに対して編集→保存をしかけるしかないはずです。
Me.非連結OLE0.Action = acOLEActivate
これを実行するとエクセルとして別ウィンドウで起動します。EXCEL.EXEは1つのままです。
開いたエクセルに試しに手動で操作してみましたが、編集→保存ができました。エクセルを閉じると非連結オブジェクトフレームには更新後の状態で表示されました。
この別ウインドウで起動するエクセルを捕まえることができれば編集可能かと思うのですが、どうやって非連結オブジェクトフレームをエクセルオブジェクトとしてセットさせるか、助けてほしいです。
 
ご指導ご鞭撻のほど、よろしくお願いします。

回答
投稿日時: 22/09/13 10:27:03
投稿者: Suzu

引用:
他のユーザが対象のファイルを開いたら非連結オブジェクトフレームで開いているユーザが開いていると警告がでます。だから困って質問しています。

引用:
単純に2つ目のEXCEL.EXEが起動して「Saveメソッドは失敗しました。」と出て保存はできません。これは想像通りの結果でした。

そうでしたか。混乱をさせてしまった様ですみません。
 
 
引用:
Me.非連結OLE0.Action = acOLEActivate
これを実行するとエクセルとして別ウィンドウで起動します。EXCEL.EXEは1つのままです。
開いたエクセルに試しに手動で操作してみましたが、編集→保存ができました。エクセルを閉じると非連結オブジェクトフレームには更新後の状態で表示されました。
この別ウインドウで起動するエクセルを捕まえることができれば編集可能かと思うのですが、どうやって非連結オブジェクトフレームをエクセルオブジェクトとしてセットさせるか、助けてほしいです。

 
それができるのであれば、GetObject で Excelプロセスを取得できませんか?
 
GetObject ではなく、質問文にある様に非連結オブジェクトフレームから 直接参照できると思うのですが
なにせテストができません。 エラーの内容でも判れば、手掛かりになると思うのですが
エラーの内容も判りませんので、推測できません。

投稿日時: 22/09/13 10:54:31
投稿者: アロハ

Suzu様
  
毎度コメントありがとうございます。

引用:
GetObject ではなく、質問文にある様に非連結オブジェクトフレームから 直接参照できると思うのですが
なにせテストができません。 エラーの内容でも判れば、手掛かりになると思うのですが
エラーの内容も判りませんので、推測できません。

申し訳ありませんでした。説明不足でした。
話を整理して今やろうとしているのは
引用:
Dim XLApp As Excel.Application
Set XLApp = Me.非連結OLE0.Object.Application

上記を実行すると、「このコンポーネントは、オートメーションをサポートしていません。」とエラーがでます。ここを解決したいです。
いろいろ検索した結果
引用:
Sub PrintFormLetter_Click()
 Dim objWord As Object
 Dim strCustomer As String, strAddress As String
 Dim strCity As String, strRegion As String
  
 ' Assign object property of control to variable.
 Set objWord = Me!OLE1.Object.Application.Wordbasic
 ' Assign customer address to variables.
 strCustomer = Me!CompanyName
 strAddress = Me!Address
 strCity = Me!City & ", "
・・・

上記のコードを見つけたのですが、wordの例だったので直接参考になりませんでした。
引用:
Dim XLApp As Excel.Application

上記をオブジェクト型で宣言して
Dim XLApp As Object
Set XLApp = Me.非連結OLE0.Object.Application.***←ここ
上記でいろいろ試していますが、うまくいきません。
 
助けてください。めっちゃ焦ってます。。
 
ご指導ご鞭撻のほど、よろしくお願いします。

回答
投稿日時: 22/09/13 11:48:40
投稿者: Suzu

Dim XLApp As Object
Set XLApp = Me.非連結OLE0.Object
 
だと、 XLApp は どんなクラスになりますでしょうか。
ローカルウィンドから、XLApp の中身を確認し、当該ブックオブジェクトは見つかりませんか?

投稿日時: 22/09/13 11:57:17
投稿者: アロハ

Suzu様
   
毎度コメントありがとうございます。

引用:
Dim XLApp As Object
Set XLApp = Me.非連結OLE0.Object
  
だと、 XLApp は どんなクラスになりますでしょうか。
ローカルウィンドから、XLApp の中身を確認し、当該ブックオブジェクトは見つかりませんか?

実行してみましたが、Set XLApp = Me.非連結OLE0.Objectで「このコンポーネントは、オートメーションをサポートしていません。」となります。
ローカルウィンドから、XLApp の中身(値)を確認しましたが、Nothingとなります。
 
ご報告まで。

回答
投稿日時: 22/09/13 16:24:20
投稿者: Suzu

手動では書き込みなどが出来ている事から、Enable や Lock は問題なさそうですね。
 
 
このコンポーネントは、オートメーションをサポートしていません。
 
https://docs.microsoft.com/ja-jp/office/vba/api/access.objectframe.object
HELP を見る限り Object プロパティーを参照すれば良さそうなのですが。。
 
「サポートしていない」と言うのであれば そうなのかもしれませんね。
Verb を変えても一緒でしょうか。
 
 
テストもできないのでちょっと お手上げです。
 
あとは、先にも述べていますが、GetObject くらいでしょうか。
 
SourceObject で OLEオブジェクトのファイルフルパスを取得
Action = acOLEActivate で オブジェクトを開かせ
GetObject で プロセス取得

投稿日時: 22/09/13 18:06:17
投稿者: アロハ

Suzu様
    
毎度コメントありがとうございます。

引用:
SourceObject で OLEオブジェクトのファイルフルパスを取得
Action = acOLEActivate で オブジェクトを開かせ
GetObject で プロセス取得

Suzu様のアドバイスにて解決しました。解決コードを参考までに記しておきます。
Dim xlApp As Object
Dim xlBook As Object
Dim xlSheet As Object
Dim strFileName As String
            strFileName = "c:\・・・" 'ここにはファイルパスが入ります。
            Me!非連結OLE0.Action = acOLEActivate
            Set xlBook = VBA.GetObject(strFileName)
            Set xlApp = xlBook.Application
            Set xlSheet = xlBook.Worksheets(1)
      ・・・
      xlSheetに対してあれこれ処理
      ・・・
            xlBook.Save
            xlBook.Close
            xlApp.Application.Quit
            Set xlSheet = Nothing
            Set xlBook = Nothing
            Set xlApp = Nothing
今回ネットでもあまり情報の少ない非連結オブジェクトフレームについてあれこれやりましたが、編集状態に持って行って外部アプリケーションで起動したらGetObjectでセットすることでやりたい事ができました。
これを参考にされる方はそう居ないと思いますが、何かの参考になればと思います。
 
どうもありがとうございました。