[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『画像貼り付けVBAのコードについて』(ディアンジェロ)
スクロールボタンと連動してシート内容が変わる(他のシートから参照する)シートが存在します。このときスクロールボタンの押上,または,押下によってセルI1の値が変化します。
このときこのスクロールボタンと連動させてローカルフォルダに存在する画像から(このフォルダへのリンクはセルD29に記載しています)セルD30に記述してあるファイル名(このフォルダ名の中の変数もスクロールボタンまたはセルI1とリンクしている)と合致するものを選び,特定のセル範囲(B31〜I43)に縦横比を変更することなく最大の縮尺でコピー&ペーストするVBAを作成したいのですが,教えて頂けますでしょうか。なおスクロールボタンを押上,または押下したときに,画像が自動で切り替わる仕様にしたいと考えています。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
https://www.excel.studio-kazu.jp/kw/20080209021147.html
現時点では上記のURLと同様にしてコマンドボタンを配置することで,
特定のセル範囲に画像をコピー&ペーストすることはできました。
しかし,この場合このコマンドボタンはスクロールボタンとリンクしていないため
スクロールボタンによってページを切り替えた場合,画像は自動で切り替わることができない状況です。(再度,画像を削除し,コマンドボタンを実行しなければなりません。)
データ数がかなりの量あるため,これを自動で切り替わるようにしたいです。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
また下記のコードを用いています。
Private Sub CommandButton1_Click()
Const foldnm = "ローカルフォルダのリンク" Dim org As Range Set org = Range("b31:i43") On Error Resume Next With ActiveSheet.Pictures.Insert(foldnm & Range("d30").Value) .Left = org.Left .Top = org.Top .Width = org.Width .Height = org.Height End With On Error GoTo 0 End Sub −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ちなみにこのコードの Const foldnm = "ローカルフォルダのリンク" をセル値を参照するようにすることは可能でしょうか。 ローカルフォルダのリンクが変わる可能性があるため,セルに記載したリンクを参照するようにしたいです。 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−- 以上,質問事項が多いですがご回答のほどよろしくお願い致します。
< 使用 Excel:unknown、使用 OS:unknown >
不明のところも少なくないのですが、仮に 現在の CommandButton1_Click が正常に機能するのであれば その中身を Private Sub ScrollBar1_Change() のなかに移動させて、ここで処理してはいかがですか?
で、
>>Const foldnm = "ローカルフォルダのリンク" をセル値を参照するようにすることは可能でしょうか。
ふつうに、 Dim foldnm As String と規定して foldnm = どこかのセル.Value とすれば、いいのですが。
あるいは、今、ファイル名で行っている記述方式、
With ActiveSheet.Pictures.Insert(Range("○○").Value & Range("d30").Value)
こうすることもできますが。
(β) 2016/10/18(火) 19:42
★ 重複してアップされている、もう1つのトピは、コメントを入れてクローズ状態にしておかれるほうがいいですよ。 あちらにも回答が入ると、ややこしいでしょうから。
(β) 2016/10/18(火) 19:48
しかしながら,スクロールボタンでページを移動した時に前のページでペーストされた画像が残ってしまい,その上に新たに参照した画像がコピー&ペーストされる形となります。
スクロールボタンによりページ移動した際は画像は残らず,新たな画像のみペーストされる仕様にしたいのですが,
どうすればよろしいでしょうか。
(ディアンジェロ) 2016/10/19(水) 11:28
Dim org As Range Set org = Range("b31:i43") On Error Resume Next With ActiveSheet.Pictures.Insert(Range("e29") & Range("d30").Value) .Left = org.Left .Top = org.Top .Width = org.Width .Height = org.Height End With On Error GoTo 0
Set org = Range("b45:i57") On Error Resume Next With ActiveSheet.Pictures.Insert(Range("e29") & Range("d44").Value) .Left = org.Left .Top = org.Top .Width = org.Width .Height = org.Height End With On Error GoTo 0
Set org = Range("b86:i60") On Error Resume Next With ActiveSheet.Pictures.Insert(Range("e58") & Range("d59").Value) .Left = org.Left .Top = org.Top .Width = org.Width .Height = org.Height End With End Sub
(ディアンジェロ) 2016/10/19(水) 11:31
画像を挿入したら、
不要になったら削除しないといけないと思います。
それが面倒なら、
図形の塗りつぶしに画像を使えば、参照を変えるだけで、
いいと思います。
https://support.office.com/ja-jp/article/%E3%82%AA%E3%83%BC%E3%83%88%E3%82%B7%E3%82%A7%E3%82%A4%E3%83%97%E3%81%AB%E5%86%99%E7%9C%9F%E3%82%92%E6%8C%BF%E5%85%A5%E3%81%99%E3%82%8B-7bb2abbb-561f-4f40-9762-d86df823d305
(まっつわん) 2016/10/19(水) 13:10
すでに回答がありますので蛇足です。
>>コマンドボタンを配置することで,特定のセル範囲に画像をコピー&ペーストすることはできました。
ということだったんですが、従来の CommandButton処理では、ちゃんと切り替わったということですか? それとも、実は、従来から、切り替えができない状況だったということですか?
それと、スクロールバーのプロパティ設定が見えず、具体的に、スクロールに従って、どこがどうなるのか 不明ですけど、少なくとも、連動してシートがスクロールされているんですよね? 一方、画像挿入は、常に固定位置ですよね。 スクロールしていくと見えなくなるのでは? いいのですか?
(β) 2016/10/19(水) 13:17
>>従来の CommandButton処理では、ちゃんと切り替わったということですか?それとも、実は、従来から、切り替えができない状況だったということですか?
CommandButton処理ではスクロールしてページが切り替わるごとに,ペーストされた画像を削除し再度コマンドボタンを押すことで処理を実行していました。従来から画像の切り替えはできない状態です。
スクロールバーのプロパティ設定が見えず、具体的に、スクロールに従って、どこがどうなるのか不明ですけど、少なくとも、連動してシートがスクロールされているんですよね?
スクロールとセルI1の数値を連動させており,さらにこのセルI1の数値をもとに本シートに他のシート内容を参照しているものとなります。
これによりスクロールするに従ってローカルから参照する画像のファイル名が変わります。
(ディアンジェロ) 2016/10/19(水) 14:05
>>CommandButton処理ではスクロールしてページが切り替わるごとに,ペーストされた画像を削除し再度コマンドボタンを押すことで処理を実行していました
つまり、従来も、どこで処理するかは別にして 古いものを削除し、新しいものを挿入するという処理をしていたんですよね。 であれば、そういったことを盛り込むべきではないですか?
つまり、ページが変わる --> 従来の古い画像削除 --> 新しい画像挿入 という一連のコードにすればよろしいのでは?
スクロールの仕掛けについては、まだ説明をよく読んでいないのですが、それとは別に シートがスクロールされると、固定位置の画像って、見えなくなってしまいませんか? というのが 私の質問です。
(β) 2016/10/19(水) 15:04
んと、用語の使い方が一般的でないので、質問の意図が伝わりにくいと思います。
シート上に配置したActiveXコントロールのスクロールバーのスライダーを
上下したときに、シート上に配置した画像を入れ替えたい。
と解釈しました。
画面をスクロールしているわけではないと思いますがいかがでしょうか?
>その上に新たに参照した画像がコピー&ペーストされる形となります。
画像をコピーしているわけではなく、新たにシート上に挿入しているんですよね?
(コード中に「Copy」という言葉はなさそうだし、実際画像は「Pictures.Insert」と
挿入しているようだし。)
ちなみにやりたいことは、
シート上の画像ファイルのフルパスのリストから、
一部の画像をシート上に表示したいということですよね?
それを、スクロールバーにて表示する対象を上下する感じで替えたい。
ということかなぁと思いましたが、いかがでしょうか?
ちなみに、ファイルのフルパスのリストのある場所と、
画像を表示させる場所は、同じシート上ですか?
(まっつわん) 2016/10/19(水) 15:25
>>画面をスクロールしているわけではないと思いますがいかがでしょうか?
このあたりのイメージがつかめないというか、ピンとこないので、何度か確認しているんですが・・ 質問者さんの文中に「ページが切り替わった時に」という表現があって、なんとなくシートがスクロールしているんじゃなかろうかと。
(β) 2016/10/19(水) 15:42
いずれにしても、たとえば画像を挿入しているプロシジャの最初に
On Error Resume Next ActiveSheet.Pictures("MYPIC1").Delete ActiveSheet.Pictures("MYPIC2").Delete ActiveSheet.Pictures("MYPIC3").Delete On Error GoTo 0
といったコードを書いておいて
3つある
With ActiveSheet.Pictures.Insert(Range("e29") & Range("d30").Value) .Left = org.Left .Top = org.Top .Width = org.Width .Height = org.Height End With
このブロックのなかで .Name = "MYPIC1" といったように 名前を付けておく。
こうすることで、削除 --> 挿入 になりますね。
(β) 2016/10/19(水) 15:53
>ちなみにやりたいことは、
>シート上の画像ファイルのフルパスのリストから、
>一部の画像をシート上に表示したいということですよね?
>それを、スクロールバーにて表示する対象を上下する感じで替えたい。
>ということかなぁと思いましたが、いかがでしょうか?
はい。おっしゃるとおりです。
>ちなみに、ファイルのフルパスのリストのある場所と、
>画像を表示させる場所は、同じシート上ですか?
はい。同一シート上です。
フルパス(ではありませんがファイル名の上までのパス)のあるセルは先のコード内にも記述していますが,e29とe58になります。(ファイル名を参照するフォルダが変わる可能性があるため,ファイルが存在するフォルダのパスとファイル名を別のセルに記載するようにしております。)
ファイル名についてはセルI1を参照した数値を含んだ名前をd30,d44,d59のセルに記述しています。(これによってファイル名に含まれる数値がスクロールするたびに変わります。)
(ディアンジェロ) 2016/10/19(水) 15:54
Option Explicit
Private Sub ScrollBar1_Change()
Dim i As Long
i = Me.ScrollBar1.Value Set表示の初期化
Set画像の挿入 Me.Range("B31:I43"), Me.Range("e29").Value & i & ".jpg" Set画像の挿入 Me.Range("B45:I57"), Me.Range("e29").Value & i + 1 & ".jpg" Set画像の挿入 Me.Range("B60:I86"), Me.Range("e58").Value & i & ".jpg" End Sub
Private Sub Set表示の初期化()
Dim shp As Shape For Each shp In Me.Shapes If shp.Type <> msoOLEControlObject Then shp.Delete End If Next End Sub
Private Sub Set画像の挿入(ByVal Rng As Range, _
ByVal sFullPath As String) On Error GoTo WayOut With ActiveSheet.Pictures.Insert(sFullPath) .Left = Rng.Left .Top = Rng.Top .Width = Rng.Width .Height = Rng.Height End With WayOut: End Sub
スライダーを動かしたら、リンクしているセルの値が変わる「だろう」という前提で
コード書くのは個人的に好きじゃないので。。。^^;
あとは、スクロールバーのMaxとMinの値をいつ取得していつセットするかが問題ですかね。。?
まぁ、いま、上手く動いてるなら、そちらの方式でも大丈夫とは思います。
(まっつわん) 2016/10/19(水) 17:25
>名前の付け方が分かりません。 >どこに.Name = "MYPIC1"を入れればいいのでしょうか。
With ActiveSheet.Pictures.Insert(Range("e29") & Range("d30").Value) .Left = org.Left .Top = org.Top .Width = org.Width .Height = org.Height .Name = "MYPIC1" End With
(β) 2016/10/19(水) 19:59
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.