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

(2021/01/27 同様のお尋ねをしましたが未解決。タイトルを変えての再度のお尋ねです)

エクセル→開発→Visual Basic→挿入→UserForm1→Image1と進み、
プロパティウインドウで、(”C:\Users\デフォルトOpening画像.jpg")を埋め込みました。
この「デフォルトOpening画像.jpg」を、(”C:\Users\変更希望画像.jpg")に、
書き換えるVBAコードを教えて下さい。

『UserForm1.Image1.Picture=LoadPicture(”C:\Users\変更希望画像.jpg")では、
プログラムRun中は、「変更希望画像.jpg」が表示されますが、終了後に確認すると、
UserForm1.Image1.Pictureは、「デフォルトOpening画像.jpg」のままです。』

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

  • RUN結果01

    「手作業で埋め込んだ、UserForm1.」の補足画像1
    No.1の回答に寄せられた補足コメントです。 補足日時:2021/01/30 21:04
  • RUN結果02

    「手作業で埋め込んだ、UserForm1.」の補足画像2
      補足日時:2021/01/30 21:05
  • どう思う?

    Qchan1962さん、fujillinさん、 01/31 18:15
    ご指摘のエラーCode 91 の回避策として、
    UserForm2を新設! ここに、
    UserForm1の画像差し替えCodeを書き足してみました。
    **結果は、前回と同じCodeで、エラー発生**
    RUN結果は、追加添付の画像の通りです。

    「手作業で埋め込んだ、UserForm1.」の補足画像3
      補足日時:2021/01/31 18:15
  • うーん・・・

    Qchan1962さん No.4のアドバイスCodeでの実施結果報告 2021/02/01
    変更Code1 : UserForm2.Show vbModeless
    変更Code2 : obj.designer.Image1.Picture = LoadPicture(imgPath)
    **Run結果 変更Code2で、エラーが発生しました。

      補足日時:2021/02/01 00:45
  • うーん・・・

    ujillinさん No.5のCodeでの実施結果報告

    >実際になさりたいことがよくわかりません
    *UserForm1の初期画像を希望が画像に変更。
    VBE_Codeで行いたい。

    >FormとButtonの関係が?
    **UserForm1に、Button1とButton2を設けました。
    Button1には、初期画像を希望画像に変更するCode。
    (No.1で頂いたCodeを貼り付け、designer行でエラー)
    Button2には、VBAを終了してExcelに戻るCodeです。

    No,5で頂いた、UserForm1に書くCodeを記述しました。
    VBEの標準モジュールにも、No.5で頂いたCode記述。
    **Run結果は、
    VBEの標準モジュールのSub test()の、designer行で、
    エラー:<指定されたオブジェクトが見つかりません>

      補足日時:2021/02/01 02:01
  • うれしい

    fujillinさん,Qchan1962さん、
    お陰様で、最低限、designer行でのエラーが出ない
    CODEが書けました(添付写真)。
    長時間の辛抱強いサポート。本当に有難う御座いました。

    (10年振りのVBA 苦戦しました (#^^#)。)
    **どこ行のCodeが間違っていたのか、まだ見つけられません。
    UserHorm2を使わないCODEや、実用写真SOFTへの組み込みはこらからです**

    「手作業で埋め込んだ、UserForm1.」の補足画像6
      補足日時:2021/02/01 22:46

A 回答 (7件)

こんにちは



>UserForm1.Image1.Pictureは、「デフォルトOpening画像.jpg」のままです
理由はお分かりとは思いますが、ご提示の方法は表示時に画像を変えているだけなので、オリジナルのFormの画像はそのままだということです。
元の画像を変更なさりたければ、オリジナルのUserFormにアクセスする必要があります。
「UserForm1」の「Image1」に決め打ちで良いのなら・・・

 Dim obj
 Const imgPath = "C:\Users\変更希望画像.jpg"

 Set obj = ThisWorkbook.VBProject.vbcomponents("UserForm1")
 obj.designer.Controls("Image1").Picture = LoadPicture(imgPath)

※ VBAからのVBProjectへのアクセスは、デフォルト設定だと拒否されると思います。
 事前に、「マクロのセキュリティ」でVBAからのアクセスを許可しておく必要があります。

※ 以前の回答(?)と同じ内容にならないためには、以前の質問を見る必要がありますが、質問履歴を公開しておいていただくか、あるいは、前質問へのリンクを質問文内に入れておいたいただかないとわかりませんね。
(前質問&回答を見ていませんので、同じ回答内容になっていたら失礼)
この回答への補足あり
    • good
    • 0
この回答へのお礼

fujillinさん
参考Codeを貼って頂き、大変有難う御座いました。
>前質問へのリンクを質問文内に入れること
https://oshiete.goo.ne.jp/qa/12171713.html

頂いたCODEを厳密COPYし、試行錯誤した結果は、
添付画像の、RUN結果01とRUN結果02、の通りです。
(なお、マクロの設定変更は、実施、無防備状態です)

基礎素養なしで、エラー結果をフォローできません。
なにかアドバイスを頂きたく、お願いいたします。

お礼日時:2021/01/30 20:59

No1です



いったい、どのような状態で実行しているのでしょうか?
ご提示の画像では、Auto Openで自動的にフォームを表示しているようにも見受けられますけれど・・・???
表示中に画像を変更したいのなら、前回ご質問への回答で十分と思いますけれど。

No1の回答は、通常の状態でVBE画面のフォームに設定されている画像を変更するものです。
ですので、そのような状態でしかテストはしていません。

あと、画像のパスは正しく設定されているのですか?
    • good
    • 0
この回答へのお礼

fujillinさん 再度のコメント、有難う御座いました。
"C:\Users\デフォルトOpening画像.jpg"
"C:\Users\変更希望画像.jpg" 、でPathは同一です。
次のCODE:
obj.designer.Controls("Image1").Picture = _
LoadPicture(imgPath)がどうしてもクリアーできませ。
私のレベルでは、Project、を操作するのはハードル高!
今まで通り、手動で、\変更希望画像.jpg に書き直します。
fujillinさん、Qchan1962さん、色々、有難う御座いました。

お礼日時:2021/01/30 23:49

こんばんは、


私の名前がありましたので、横から失礼します。
エラー№でなるほどと合点がいくところがありました。
エラー91
designerなので実行中のUserFormから自身を操作できないかと
なので他のモジュールから実行する必要があると思います。
実行中は、ご質問にあるとおり。
ご質問のコードを見た感じ、#1様のコードを拝借すると
obj.designer.Image1.Picture = LoadPicture(imgPath)
となり、#1様の回答で実現できると言う事では無いでしょうか。。
    • good
    • 0
この回答へのお礼

Qchan1962さん、fujillinさん
ご指摘の、エラーCode91の回避Code試作
RUN結果の画像を添付しました

お礼日時:2021/01/31 18:20

こんばんは、



出かけますので、即レスできませんが、
UserFormモジュール間なので
UserForm2.Show vbModeless
ではどうでしょう。。

あと
Dim obj
Const imgPath = "C:\Users\XX.jpg"
Set obj = ThisWorkbook.VBProject.vbcomponents("UserForm1")
obj.designer.Image1.Picture = LoadPicture(imgPath)
UserForm1.Show
End Sub
    • good
    • 0
この回答へのお礼

頂いたCodeでRunしましたが、
補足に記載のエラーが発生してしまいました。

お礼日時:2021/02/01 00:49

No2です。



「テストなさっている環境」(FormとButtonの関係)がよくわからないのと、実際になさりたいことがよくわかりませんけれど、「表示したForm上の画像」を変更したいのなら、No2にも書きましたように、前回回答による方法が妥当です。

簡単に調べてみましたが、一旦、Formを表示すると、(多分)メモリ上に展開されてそちらを参照して表示している状態になっているものと想像します。
この状態になると、編集モードであるdesignerにはアクセスできなくなります。
Unloadすれば解放されるかもとも思いましたが、一度展開されてしまうとダメなようですね。


一方で、質問者様はFormを表示した状態で、オリジナルを編集したいということでしょうか?
先にも書きましたように、表示中の画像を変えるのが目的なら、前出の方法が妥当と思います。
それでもなおオリジナルを編集したいのであるのなら、一旦、VBAの実行を停止して、無理矢理に編集状態にして実行させるしかないと思います。

例えば、以下の方法であれば、オリジナルを変更可能ですが、一時的(瞬間的ですが)にForm1の表示を消すことになります。
※ なお、下記の実行時には、VBEの画面を閉じておかないと、画面のチラつきの原因になりますのでご注意。

' UserForm1のコードモジュールに記述
Private Sub CommandButton1_Click()
UserForm1.Hide
Unload UserForm1
Application.OnTime Now, "test"
End Sub

' VBEの標準モジュールに記述
Sub test()
Dim obj
Const imgPath = "C:\Users\変更希望画像.jpg"
Set obj = ThisWorkbook.VBProject.vbcomponents("UserForm1")
obj.designer.Controls("Image1").Picture = LoadPicture(imgPath)
UserForm1.Show
End Sub

※ LoadPicture(imgPath) を別に処理しておけば、若干は早くなるかも知れませんが、画像が重たくない限りは大差ないように思います。
    • good
    • 0
この回答へのお礼

補足で、No.5で頂いたCodeの実行結果報告。
Sub test()のdesigner行でエラーがでてしまい、
叉困惑です。難しいです!!!

お礼日時:2021/02/01 02:07

#4です


#4のコード、fujillin氏の#5のコード共に検証環境を作りテストしましたが問題なく期待通りになりました。

何が原因なんでしょう? 実施内容を記します。

#4のテスト環境 
Windows10 64bit
office home & business Excel2013 15.0.5267.1000
新規ブック VBEで UserForm1 UserForm2 を挿入
UserForm1 上でオブジェクト 
Image1 
CommandButton1 及び CommandButton2 を作成

UserForm2 上で CommandButton1 作成
’--
UserForm1のImage1のプロパティをダイアログから設定(初期設定)
他は、デフォルト
作成コード
Private Sub CommandButton1_Click()
Unload Me
UserForm2.Show vbModeless
End Sub

Private Sub CommandButton2_Click()
Unload Me
End Sub

UserForm2
作成コード
Private Sub CommandButton1_Click()
Dim obj
Const imgPath = "C:\Users\xxx\Desktop\XX.jpg"
Set obj = ThisWorkbook.VBProject.vbcomponents("UserForm1")
obj.designer.Image1.Picture = LoadPicture(imgPath)
Unload Me
UserForm1.Show vbModeless '繰り返し呼ばれる時の対策
End Sub

トリガー Alt+F8からtestを実行
標準モジュール
Sub test()
UserForm1.Show
End Sub


Application.Visible などの設定も行ってみましたが、問題ありませんでした。

fujillin氏の内容は#5の手順で実施しました。
詳細は割愛させていただきます。が、UserForm2で画像を指定するなどしないのならば、UserForm2を作成実行する必要がなく良いと思います。

セキュリティセンター設定は添付図で。
「手作業で埋め込んだ、UserForm1.」の回答画像6
    • good
    • 0
この回答へのお礼

Qchan1962さん
やっと、応用できる目途が立ちました。
本当に有難う御座いました。

お礼日時:2021/02/01 22:50

No5です



こちらの環境では、UserFormを表示した状態から実行できています。

まず、VBAが動作しておらず、UserFormも表示していない状態で、直接test()を実行して、画像が変わることを確かめてみてください。
これでもエラーが出るようであれば、基本的に環境が異なるものと考えられます。
(こちらは、Excel 2019でテストしています。)


もしも、変えることができているなら・・・
Sub DispForm()
 UserForm1.Show
End Sub
を、標準モジュールに追加し、こちらを直接実行してください。
(実行したら、VBEウィンドウは閉じておきます)
表示されている、Formのボタンをクリックしても画像は変わりませんか?
あるいは、エラーが出るでしょうか?

No5のコードは、このような状態を想定しています。
異なる状態でテストしている場合は、エラーが出る可能性があります。
(想像の内容ではありますが、説明はNo5を参照ください)
    • good
    • 0
この回答へのお礼

fujillinさん
やっと、応用できる目途が立ちました。
本当に有難う御座いました。

お礼日時:2021/02/01 22:49

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