[[20050704110110]] 『VBA:シート画像Imageへの表示』(さんちゃん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBA:シート画像Imageへの表示』(さんちゃん)
 いつもお世話になっております。
 Sheet写真の図1「Picture 1」の画像を、UserForm2のImage1に表示させたいのでしょうが可能でしょうか?
過去ログを調べましたが、別フォルダーからの挿入となっていました。

 UserForm2.Image1.Picture = LoadPicture("Sheets("写真").Picture 1")
 可能であれば、どの変がおかしいのかご教授よろしくお願いします。


 いったんファイルとして出力してからパスを指定して呼び出す。
 もしくは
 APIを駆使してクリップボード経由で表示させる。
  (INA)

 (INA)様、ありがとうございます。
 なにかしら、一旦出力させてから取り込む方法ですね。
 例えば    
 ActiveSheet.Pictures.Insert( _
 "C:\Documents and Settings\XXXXXXXXXXXX\デスクトップ\写真\図1.gif")
 このような構文を記載すると、PC入れ替えなどエクセルを移し変える時にXXXXXXの部分を修正しなくてはなりません。
出来る限り1つのもので、完結しメンテナンスを行いたく問い合わせたしだいです。
 大変参考になりました。ありがとうございます。


 パスの指定が問題なら、Thisworkbook.path 等を利用しては?

 (INA)


  Dim MyPath As String
 MyPath = "C:\Documents and Settings\**********\デスクトップ\写真"
 UserForm2.Image1.Picture = LoadPicture(MyPath & "\図1.gif")
 こんな感じで? 移し変えたときには、MyPath=を修正するのですね。
 (・・;Aあってるのかな?
 INA様、また一つ勉強になりました。ありがとうございました。


 その説明に間違いは無いですが、Thisworkbook.path を使えば
 マクロブックのパスが取得できるので、マクロブックある階層に
 写真フォルダに用意するなら、
   MyPath = Thisworkbook.path & "\写真"
 としておけば、変更しなくてもすると思います。
  (INA)


 INA様、(マクロブックある階層に写真フォルダに用意)とは、どのような
 事なのでしょうか?私の現在の写真は、Sheet写真に「挿入」→「図」→「ファイルから」
 挿入した物ですが、これでもMyPath = Thisworkbook.path & "\写真"として¥図1などから
 表示させれるのでしょうか?
 MyPath= Thisworkbook.path & "\写真" & "図1"となるのでしょうか?
 (さんちゃん)


 2つの問題が混ざってますね。(^_^;)

 1つ目は、最初のシート上の写真をUserFormのImage1に表示させるには?
  ↓
 案1.いったんファイルとして出力してからパスを指定して呼び出す。 
 案2.APIを駆使してクリップボード経由で表示させる。

 2つ目は、画像ファイルを出力する際に指定するパスの問題ですが、
 Thisworkbook.path を使えば、PC入れ替えなどで修正は必要なくなります。 
 こちらは案1を使った際に、どこにファイルを出力するかによって
 使用方法が異なってきます。

 まずは処理の流れを考える必要があります。
 それには、どのようにブックを運用するかが重要です。 
   
  (INA)

 INA様、案1でいかさせてもらっています。APIについては、後日勉強後また質問させて
 いただくとおもいます。GIFアニメーションを動かしたいので。
 案1.いったんファイルとして出力してからパスを指定して呼び出す。
 「ファイルとして出力してから」の意味がよく分かりません。Sheet写真に挿入した図 
 複数枚ありますがファイルとして出力された状態なのでしょうか?
 MyPath = Thisworkbook.path & "\写真"¥Pictre1 
 となるのかな?
 まだまだ、質問の仕方、VBA勉強不足です。INA様には、貴重なお時間を頂ありがとうご
 ざいます。明日、行い不明な点は、もう一度質問させていただきます。
 (さんちゃん)


 案1の方法については、以前同じような質問でSoulManさんが回答していますね。
[[20041214003848]]
  (INA)


 INA様、ありがとうございます。SoulManさんのエクセルをDLLし、朝から悩みましたが
 表示させることが出来ませんでした。(;;)本日、抜け毛100本です。(冗談です)

 Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

......

 Case "B-1"   
 Ncom = Ncom + 1
  Set Mypic = Worksheets("写真").Shapes("Picture " & Ncom)
    Mypic.Select ''''''Test用
    MypicName = "Mypic.gif"
  On Error Resume Next
    Mypic.Export MypicName, "GIF"
     UserForm2.Controls("Image" & Ncom).Picture = LoadPicture(MypicName)
  On Error GoTo 0    
    End Select
  Next roo  
  UserForm2.Show

 こんな感じですが、方法としてはSheet写真の図をMypicNameでファイル名を取り込み
 Exportして、出力させてImageへ取り込む。??なんとなくですが大きくは外れてい
 ないかと思います。
 私の構文は、シートの列から、データ数分ループ「roo」させて、”B-1”であれば、
 写真をUserform2.Imageに取り込むのですが、結果的にエラーは出ないものの図は取
 り込めませんでした。

 また、シートへ複数枚の図の挿入を行うときに、画像は「図1〜図XX」となりますが、
 間違えた図を削除して、次の図を挿入すると削除した図の番号が抜けてしまうのですね。
 図の番号を修正するとShapes("Picture 1")と扱うところが Shapes("図 1")となって
 しまうのですね。変数や名前取得にに対応できなくなってしまいます。

 INA様には、ながながとお付き合いいただき、ありがとうございました。
 使えないにせよ自分の勉強の為、Sheet内の図をImageに貼り付けたいのですが、限界です。
 教えていただいた。MyPathをサーバー経由でImageに挿入させます。
 INA様、貴重なお時間大変ありがとうございます。何度となくお助けいただいた(さんちゃん)
 に愛想尽かさず今後ともご指導よろしくお願いします。


 あきらめるの早すぎますよ。
 私なんて1つの処理で、解決するのに1ヶ月くらい掛かったものもあります。

 図番がずれる件については、使用方法に関わる問題なので、
 どのように 写真を追加したり削除したり、
 どのような条件でUserformに読み込んだりするのかなど、
 細かい仕様を決めていただかないと解決できません。

 必要な写真はあらかじめ全てシートにあるのでしょうか?
 それとも運用中に随時追加されるのでしょうか?

 写真を挿入した際に適当な名前を付けるようにすれば、
 問題ないとは思いますけど。 ようは明確な条件を定めればよいのです。

 写真のファイル出力については、SoulManさんのVBAを参考に
 作ってみましたのでお試し下さい。

 Sub sample()
 Dim myShape As Shape
 Dim myChart As Object

    With ActiveSheet
        Set myShape = .Shapes(1)
        myShape.CopyPicture xlScreen
        Charts.Add.Location xlLocationAsObject, .Name
        Set myChart = .ChartObjects(1)
    End With

    With myChart
        .Width = myShape.Width
        .Height = myShape.Height
        .Chart.Paste
        .Chart.ChartArea.Border.LineStyle = 0
        .Chart.Export ThisWorkbook.Path & "\test.jpg", "JPG"
        .Delete
    End With

 End Sub 

  (INA)

 私の名前が出ているのでちょっろとだけ。。。
2秒ごとに画像を切り替えるものです。適当な画像を配置してお試し下さい。
Option Explicit
Private Sub CommandButton1_Click()
Dim i As Long
With ActiveSheet
    For i = 1 To .Shapes.Count
        .Shapes(i).Copy
        .ChartObjects.Add( _
            .Shapes(i).Left, .Shapes(i).Top, .Shapes(i).Width, .Shapes(i).Height).Chart.Paste
        With .ChartObjects(1)
            .Chart.Export "MyChart.gif", "GIF"
            Me.Image1.Picture = LoadPicture("MyChart.gif")
            .Delete
        End With
        Application.Wait (Now + TimeValue("0:00:02"))
    Next
End With
End Sub
(SoulMan) 


 INAさま、SoulManさま、まことにありがとうございます。
 INAさま
 >私なんて1つの処理で、解決するのに1ヶ月
 INAさまのレベルでも、そこまで時間が掛かってしまう事もありますか!私、勇気付
 け られました。「あきらめるの早い」おっしゃるとおりでした。
 >図番がずれる件・・・細かい仕様を決め
 はい!行っていきます。
 >必要な写真はあらかじめ全てシートにあるのでしょうか?
 現在は、サンプルにてテスト中です。最終的には全画像を挿入します。
 
 SoulManさま
 [[20041214003848]]から、すばらしいファイルを落とさせていただきました。
 動きを見て、Imageに画像挿入出来る事を確信しました。しかしながら、私のレベル
 では(;;)、今回の構文を参考に勉強させていただきます。また、全てに質問した
 いところですが、あつかましいので、ちょっとだけお付き合い願えますでしょうか?
 INAさま?、SoulManさま?

 質問1
 .ChartObjects.Add( _
            .Shapes(i).Left, .Shapes(i).Top, .Shapes(i).Width, .Shapes(i).Height).Chart.Paste
 Pasteとは一般的に貼り付けの命令文ですが、何に対して行っているのですか?
 もしや?Chart.PasteとすることでChartObjectsを認識させているのですか?

 質問2
 今回のSoulManさまの構文をテストしたのですが、画像を4枚貼り付けました。「挿入」
 「図」「ファイルから」の手順です。挿入された図は(図1)(図3)(図6)(図18)
 となっていました。マクロの自動記録から図6をコピー.貼り付けした時の、マクロは
    ActiveSheet.Shapes("Picture 6").Select
    Selection.Copy
    ActiveSheet.Paste

 Picture 6として扱われるわけですが、
     For i = 1 To .Shapes.Count
        .Shapes(i).Copy
 変数iは、挿入画像枚数「.Shapes.Count」で「1 To 4」となるはずです。??
 .Shapes(i).Copyの i が 2 の時は、図2は存在しないのに表示されるのは何故でしょう? 
 (・O・)はっ!私今ShapesとPictureで頭の中ゴチャゴチャです。Shapesとは、図形
 線画を扱うもので、Pictureは挿入画像を扱うものでは??
 挿入画像の名前に関係なく、挿入順にShapes1.Shapes2・・・となっていくのでしょうか?

 質問2は、なんか沢山質問してしまいました。お時間ありましたら、よろしくお願い
 します。明日は、抜け毛200本程度覚悟でやってみます。ながながと失礼しました。

 おはようございます。
 >抜け毛200本程度覚悟でやってみます。
 あまり考えない方がいいですよ(^^;
 ところで、かなり出来る方の様ですのですぐに理解されると思いますが、、
 先ずHELPでExport メソッドを調べてみると
 >グラフを図形形式でエクスポートします。
 とあります。つまりグラフを図にしちゃうんですね。
 次にHELPでPictureをみてみると
 >object.Picture = LoadPicture( pathname )
 >pathname 必ず指定します。ピクチャ ファイルの絶対パスを指定します。 
 となっています。つまりフルパスで指定してあげれば図は表示出来るんですね。
 言いかえれば「フルパスで指定しないと表示出来ない」ということです。
 でも今回の場合は、
 >Sheet写真の図1「Picture 1」の画像を、UserForm2のImage1に表示させたい
 なのでフルパスを指定していたのではある意味、意味をなさいんですよね?
 ここまで書いたらもうおわかりになったと思いますが、
 これまでのサンプルで
 1.グラフはイメージに表示できる。
 2.グラフは図に変換出来る。
 なので、
 Sheet1にある図(Shapes)を適当なグラフを作って(Add)
 そこに貼り付け(Paste)て図に変換(Export)して
 イメージに表示(Me.Image1.Picture = LoadPicture("MyChart.gif"))すればいいのでは?
 と私的な発想になるのです。
 次に順番のことですが
 >Shapes("Picture 6").Select
 これは、身近なところでは
 Sheets("Sheet1").Selectと同じ意味ですよね?(ちょっと語弊があるかな(^^;)
 つまり名前を指定して選択している訳です。でも、名前がわからない時などに
 INDEX番号で指定したりするでしょ?
 Sheets(1).Select
 とかね。それと同じ理屈です。でもINDEX番号で指定する方法は図が複数ある時に特定しにくいですよね?
 以下は余談ですが、そんな時は
 If .Shapes(i).TopLeftCell.Column = 7 Then
 などとすると図の左上端にあるセル情報を取得出来るのでそれを利用して特定してもいいかもしれませんね。
 例の場合はColumn = 7 なのでG列にある図だけが対象になります。
 長々と書いてしまったけどわかりましたか??あせらずに頑張ってくださいね。
 ではでは、
(SoulMan)

 SoulManさま、朝早いんですね。ありがとうございます。
 >かなり出来る方の様ですのですぐに理解される
 とんでもございません。(;;)なるほど!とは言えませんが、構造はなんとなくですけど
 理解しました。エクセルをだましているよな「言い方わりうですかね?(−−;A」すごい
 手法ですね!手法より応用力ですか!
 >以下は余談ですが
 とんでもありません。とても勉強になります。
 本日は他の業務で時間が取れず、まだ修正していませんが後日ご報告させていただきます。
 朝早くから、親切丁寧な解説、まことにありがとうございました。m(..)m多謝 (さんちゃん)


大変お世話になた「SoulManさま・INAさま」後日ご報告すると書いておきながら、だいぶ時間が経ちました。この件のVBA完璧に動作する事が出来ました。当時勤務していた社内でデモを行い非常に有意義な発表を出来た事、お二人のアドバイスのおかげです。勤務していた会社は吸収合併という形で存在しなくなり、単身で茨城の方に勤めておりましたが見切りをつけて地元に戻り再就職をしました。今ではPCを使う仕事ではないのですが、たまに昔勉強していたこのページを再確認して、出来れば忘れていたVBAをもう一度使う事、教えていただいた事を再確認出来ればと思い検索したところ、最後のお礼も言わず残っていた、この画像挿入の件、大変失礼いたしました。現在勤務の会社でも共有PCは有り、データ整理やフォーマットをVBAで処理する事はやっております。大変遅くなりましたが、ありがとうございました。
また、ご教授願える機会がございましたらよろしくお願いいたします。
(さんちゃん)m(。。)m

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.