アプリ版:「スタンプのみでお礼する」機能のリリースについて

*.jpgファイルの撮影日時を読み出す方法にチャレンジ中です。
この過程で、色々とお尋ねし、いろいろと手取り足取りお教え頂き、感謝しております。
標準モジュールに、写真撮影日時読出ユーザー定義関数(myFunction)を置いて使える様になりました。

今回、便利なシステム関数の様に、他のBookから参照する手法にチャレンジ中です。
今までに頂いたアドバイスやWEB検索で得たヒントを元に、次のCodeを検証中です。
'' ------- 検証中のCode 環境:Excel2013/32ビット ----
'' C:\Users\myPC\Documents\Book1.xlsm
Sub myMain()
Dim ret As String
ret=Application.Run("Book2!myFunc")
MsgBox ret
End Sub
'' ----------------
'' C:\Users\myPC\Documents\Book2.xlsm
Public Function myFunc()
myFunc="ここはBook2です。参照成功 おめでとう!"
End Sub
'' ------

Q1:同じカレントFolderなら、上記CodeでOKのはずですが?
Book1と2を、C:に置くと、エラー
Book1と2を、C:\Usersに置くと、エラー
Book1と2を、C:\Users\myPCに置くと、エラー
Book1と2を、C:\Users\myPC\Documentsに置くと、正常にRun!!
このエラーはなぜ発生するのでしょうか??

Q2:テストRun終了後、Book2とBook1をClose するCode??
上記myMainに、
Workbooks(Book2.xlsm).Close
Workbooks(Book1.xlsm).Close
とCodeを追記しましたが、うまく機能しません??

質問者からの補足コメント

  • 使い方は、エクスプローラで、Book1をクリックし開き、VBAを立ち上げ、
    Book1のSub_myMain()を実行します。
    こうして参照したBook2のmyFuncのコメントを確認後、
    Book2とBook1を閉じ、エクスプローラに戻りたいのですが?
    デスクトップ画面には、myMainが残ったり、myFuncが残ったり、
    不規則な結果で、????です。

      補足日時:2017/07/07 23:48

A 回答 (2件)

こんばんは。



>標準モジュールに、写真撮影日時読出ユーザー定義関数(myFunction)を置いて使える様になりました。
>今回、便利なシステム関数の様に、他のBookから参照する手法にチャレンジ中です。
(組み込み関数と同じようにするというご質問でしょうか。)

>ret=Application.Run("Book2!myFunc")
Book1 からの呼び出しで、"Book2!myFunc" で呼び出せることが驚きです。
"Book2.xlsm!myFunc" のはずです。ただし、ユーザー定義関数なら、引数が必要なはずですが。

「他のBookから参照する手法」という主旨からすれば、グローバル関数化(アドイン化)にするというのが、一般的だと思います。(グローバル関数化とは、どのブックでも、すぐに使えるようになるユーザー定義関数)

一般のブックからの呼び出しは、フルパスで書き、呼び出しコードを使います。
そして、他のブックのモジュールで常に使うなら、アドイン化した後に参照設定をします。

アドインで、
C:\Users\[Your ID]\AppData\Roaming\Microsoft\AddIns\
側に入れておけば、改変も自由にできます。C:\Program Files 側にいれると、改変には、管理者モードでないといけなくなります。(ただし、関数はワークシート上)

そして、
>Q2:テストRun終了後、Book2とBook1をClose するCode??
これは、別件ですね。とにかく、グローバル関数化をしてみてからにしたらいかがですか?起動した自分のブックまでいきなり閉じるような内容は、現実的ではないように思います。なお、同様のマクロを書いてみましたが、ブックオブジェクト.Close False にするぐらいでしょうか?
(Falseの意味は、Saved=False です。)

開発-アドイン
「VBA_Book2のFunctionを参」の回答画像2
    • good
    • 0
この回答へのお礼

WindFallerさん、こんばんは。コメント、有難う御座いました。

前回の、2017/06/27のお尋ね:
『VBAで、Functionを、クラスモジュールに置くか? 標準モジュールに置くか? 使い勝手は?』
のご回答No.2で、アドインを含めて3段階ほどのやり方のアドバイス頂いておりました。

今回は、手始めに、カレントフォルダー内で、Book1からBook2を参照する方法を検証しています。

Q2のお尋ねは、的外れとのことで、取り下げます。

Q1のエラーが出る原因は、自分で試行錯誤してきた中で得た結論は:
Excel2013/32ビットでは、Book間参照は、Defaultで、Book1とBook2は、
C:\Users\myPC\Documentsに置くことになっているようだ、でした。

なお、コメント頂いた、
>"Book2!myFunc"で、Book2のFunction myFunc()を呼び出すCodeは、
WEB検索で得たCodeで、実際にRunできています。
今回頂いた、「"Book2.xlsm!myFunc"」でもRunでき,同じ結果が得られました。
実際のユーザー定義関数では、まだテストしていませんが、ご指摘のとおり、
引数として、撮影日時を読み出す写真のフルパス記述が必要です(戻り値の指定も必要)。

WEB検索で得たCode:Book1とBook2を別のフォルダーに置き、1から2を呼び出す:もTEST済。
Book1:C:\Users\myPC\Documents
path="C:\Users\myPC\Book2.xlsm"
ret = Application.Run("'" & path & "'" & "!myFunc")

今回、重ねて頂いた、アドインなどの手法は、これからトライしてみます。
本当に、有難う御座いました。

お礼日時:2017/07/08 01:23

多分ですが、


Q1:
このマクロを記述したブックは「C:\Users\myPC\Documents」フォルダーに置いてあるからではないでしょうか?
Q2:
「Workbooks(Book2.xlsm).Close」実行したとたん「Function myFunc()」は使えなくなるはずなので「Function myFunc()」を、「Book2」ではなく、このマクロを記述したブックに登録したらよいのでは?
    • good
    • 0
この回答へのお礼

GooUserラックさん、こんばんは;
いつもコメント頂き、有難う御座います。

Q1:
Book1とBook2を、C:\Users\myPC\Dokyumennts,に置きました。
動作確認後に、これを切り取り、
Book1とBook2を、C:\Users¥myPC、に貼り付けました。エラーが出ます?

Q2:
今回のチャレンジは、Book1からBook2のmyFuncを参照する事か目標です。
Book1に、Sub_myMainとFunction_myFuncを置いての動作は確認済です。

お礼日時:2017/07/07 21:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!