Excel (VBA)

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

 
(指定なし : 指定なし)
セル範囲をPictureで撮影した画像をUserFormのImageに表示できますか?
投稿日時: 23/11/28 09:28:10
投稿者: taichi

シートA上で作業中にシートBの特定セル範囲を参考にしたいことがあります。
シートBの該当セル範囲をカメラ撮影した画像をUserFormのImageに表示して参考に
したいことがあります。
可能でしようか? よろしくお願いします。

回答
投稿日時: 23/11/28 11:24:10
投稿者: simple

できますよ。
・ペイントか何かで、jpgファイルにでも保存します。
・ImageコントロールのPictureプロパティでそのファイルを指定すればよいと思います。

回答
投稿日時: 23/11/28 12:53:19
投稿者: MMYS

一般機能の
「表示」→「新しいウインドウを開く」
 
で、シートA・シートB を同時に画面に表示すれば、それで目的達成すると思いますが。

回答
投稿日時: 23/11/28 17:34:13
投稿者: WinArrow

最初に
質問時には、OS、Excelのバージョンを選択してください。
 
 
説明の内容から
静的な画像ではなく、
動的に画像を作成する
イメージと考えて・・・・
   
画像にしたいセル範囲を画像として、保存します。
   
キーワード:指定したセル範囲を画像として保存する
でWEB検索すればサンプルコード入手出来ます。
   
その画像ファイルをコントロールのPictureプロパティに取り込みます。

投稿日時: 23/11/28 22:00:48
投稿者: taichi

Microsoft365なら簡単にできそうか記事が多くありましたが、
 
私の環境はWin11+Excel2016なので、ワードかパワーポイントを経由してから保存する
とありました。コードも複雑になありそうなので、カメラ撮影(シートB)画像を
直接シートAに貼り付けて不要になったら削除することにしました
 

回答
投稿日時: 23/11/28 22:22:58
投稿者: WinArrow

「セル範囲を画像としてファイルに保存する」
  
方法は、幾つかあります。
Word、PPT、ペイントなど、他のアプリを経由する方法
OSのクリップボードを経由する方法
・・・この方法は、ファイルの保存しなくても、直接、ユーザーフォームのImageコントロールに
取込むことができます。
Excelだけで、chartオブジェクトを利用して、画像ファイルの保存する方法があります。
多分10行くらいのVBAコードになると思います。
 
探してみてください。

投稿日時: 23/12/02 16:00:46
投稿者: taichi

simpleさん MMYSさん WinArrowさん ありがとうございました。
やっと参考になるコードを探し出してここまできました。
 
Sub セル画像() '<-- UserForm1 上のComandButtonからの命令
    Dim r As Range,tmpChart As chart
    With Sheets(2)
        Set r = .Range("A2:D10") '<-- 実際は複数のセル範囲を選択するようになっています
        r.CopyPicture
        Set tmpChart = .ChartObjects.Add(0, 0, r.Width, r.Height).chart
         
        tmpChart.Parent.Select
        tmpChart.Paste
        tmpChart.Export ThisWorkbook.Path & "\tmpPic.JPG"
        tmpChart.Parent.Delete
    End With
End Sub
 
UserForm1 から UserForm2を呼び出しています。UserForm2には 
Imageコントロールのみを配置しています。
 
Private Sub UserForm_Initialize() '<-- UserForm2
    Image1.Picture = LoadPicture(ThisWorkbook.Path & "\tmpPic.JPG")
End Sub
これで一応目的は達したのですが、画像を保存してそれをImageコントロールに
読み込んでいるので若干時間を要します。できることなら保存せずにImageコントロールに
画像を張り付けたいのですが・・・・
 
※ 1つ気づいたこと:tmpChart.Export ThisWorkbook.Path & "\tmpPic.JPG"
同名のファイルが既に存在していても、警告なしに上書き保存されます。
今はこれの方が都合がいいですが。

投稿日時: 23/12/02 16:06:52
投稿者: taichi

追記
環境は win11+Excel016です

回答
投稿日時: 23/12/02 20:49:55
投稿者: WinArrow

引用:

OSのクリップボードを経由する方法
・・・この方法は、ファイルの保存しなくても、直接、ユーザーフォームのImageコントロールに
取込むことができます。

という紹介しましたが、
昔、ここの掲示板で見たことがありました。
今は、内容が削除さrているので
ヒントだけ、紹介します。
 
次のキーワードで検索してみてください。
OleCreatePictureIndirect
↑32bitAPIツールです。
CreatePictureFromCB
↑ユーザー作成の関数です。
32Bit版がヒットするかも?64bit対応処理を組み込む必要があるかも
 
 

投稿日時: 23/12/04 21:58:28
投稿者: taichi

WinArrowさんの回答を参考にして
 
ClipBoardから直接Imageコントロールに読み込む方法を見つけました。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1167955966
そのままコピペすると、画像ファイルに保存することなくImageコントロールにセル範囲を
画像として取り込めました。成功です。
 
※1 スピードは画像ファイルとして保存したのよりも0.16 → 0.05トと
   早くなったのですが体感的には変わりませんでした。
 
※2 体感スピードはほとんど変わらなかったので、保存ファイルから
  Imageコントロールに読み込む方法でもいいのですが
  ClipBoardから読み込む方法
  UserForm2にはImageコントロールのみ配置しており、UserForm1の中の
  ボタンからUseForm2.Show を実行しています。ここで問題が発生します
  UseForm2の×ボタンで閉じるとUserForm1まで閉じられてしまします。
  UseForm2だけが閉じて、UserForm1()は開いたままにしておきたいのですが、
  APIをコピペして利用しているだけですので解決方法はわかりません。
 
 
  
 

回答
投稿日時: 23/12/04 22:48:50
投稿者: WinArrow

引用:

UseForm2の×ボタンで閉じるとUserForm1まで閉じられてしまします。

まずは、ステップ実行で、流れを確認してみましょう。
 
トライ
 
Userform1
Userform2.Show
だけにする
 
 
Useform2の
UserForm_Initialize
セル範囲copy
API処理
 
ボタンで閉じる
×は使用しない
 
Excel2016は32bit対応なんですね?
何れ、64Bitに対応しなければいけないと思いますが、
いま、改造してもテストできないから、
64Bit対応を心にとめておきましょう。
因みに&4bit対応は、32bitでも動作可能にするようなコードに改造します。
職場に、両方のPCが混在する時のために!

投稿日時: 23/12/05 22:10:40
投稿者: taichi

WinArrowさん 色々ご教授ありがとうございました。
 
>Excel2016は32bit対応なんですね?
使用中のExcelでヴァージョン情報を見ると32bit とありました。
 
>何れ、64Bitに対応しなければいけないと思いますが、
多分、私には手に負えそうもないととだろうと思います。
本当は Office 365にすれば良いのでしようけれど、
勤めも現役をしりぞき15年程たちますので、このままでもいいかな
と思っています。
 
Private Sub CommandButton1_Click() '<-- UserForm2上のボタン
    Unload UserForm2
End Sub
×は使用しないでボタンで閉じる→ UserForm1 も同時に閉じられました。
 
このままでも一応目的は達せられましたので、あと2日ほどで「解決」として
閉じたいと思います。

回答
投稿日時: 23/12/06 11:37:03
投稿者: WinArrow

引用:
本当は Office 365にすれば良いのでしようけれど、

Office 365にしたところで、ユーザーが作成したコードは、自動で変換してくれることはあり得ません。
今回のプログラムに限らず、特にAPIを使用している場合は、
バージョン青鴎したとたんに動かなくなります。
 
企業で作成したプログラムは、その業務が存在する限り生きています。
そのことを理解した上で、引き継ぎができるよう考えた方がよいでしょう。

投稿日時: 23/12/10 16:52:50
投稿者: taichi

simpleさん MMYSさん WinArrowさん
ありがとうございました。特に今回は、WinArrowさんには色々ご教授をいただきました。
一応解決すみとしてこの話題を閉じさせて頂きます。