質問: 手作業で埋め込んだ、userform1.image1の画像を、vbaコードで書き換えたい (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」のままです。』
回答: 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) を別に処理しておけば、若干は早くなるかも知れませんが、画像が重たくない限りは大差ないように思います。