[[20161018185318]] 『画像貼り付けVBAのコードについて』(ディアンジェロ) >>BOT

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

 

『画像貼り付けVBAのコードについて』(ディアンジェロ)

スクロールボタンと連動してシート内容が変わる(他のシートから参照する)シートが存在します。このときスクロールボタンの押上,または,押下によってセルI1の値が変化します。
このときこのスクロールボタンと連動させてローカルフォルダに存在する画像から(このフォルダへのリンクはセルD29に記載しています)セルD30に記述してあるファイル名(このフォルダ名の中の変数もスクロールボタンまたはセルI1とリンクしている)と合致するものを選び,特定のセル範囲(B31〜I43)に縦横比を変更することなく最大の縮尺でコピー&ペーストするVBAを作成したいのですが,教えて頂けますでしょうか。なおスクロールボタンを押上,または押下したときに,画像が自動で切り替わる仕様にしたいと考えています。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
http://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


ご回答ありがとうございます。
CommandButton1_Clickの中身を Private Sub ScrollBar1_Change() のなかに移動させて、ここで処理することができました。
またローカルフォルダのリンクをご指導いただきましたとおり,セル値を参照することができました。

しかしながら,スクロールボタンでページを移動した時に前のページでペーストされた画像が残ってしまい,その上に新たに参照した画像がコピー&ペーストされる形となります。
スクロールボタンによりページ移動した際は画像は残らず,新たな画像のみペーストされる仕様にしたいのですが,
どうすればよろしいでしょうか。
(ディアンジェロ) 2016/10/19(水) 11:28


なお書き換えた現在のコードは以下になります。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Sub スクロール1_Change()
    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の数値をもとに本シートに他のシート内容を参照しているものとなります。
これによりスクロールするに従ってローカルから参照する画像のファイル名が変わります。


つまりスクロールによりローカルから参照する画像のファイル名が変わるたびにコピー&ペーストしたいです。
この際,画像挿入は同一シート内の固定位置で行いたいので,先のコードではスクロールするたびに画像が重ね合わせてペーストされてしまう状況です。(見た目としてはちゃんとセル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


>画面をスクロールしているわけではないと思いますがいかがでしょうか?
はい。おっしゃるとおりです。私の「スクロールしてページが切り替わる」等に語弊がありました。申し訳ありません。あくまで同一シート内でスクロールとリンクしたセルI1に従ってセルの内容が変わるだけです。

>ちなみにやりたいことは、
>シート上の画像ファイルのフルパスのリストから、
>一部の画像をシート上に表示したいということですよね?
>それを、スクロールバーにて表示する対象を上下する感じで替えたい。
>ということかなぁと思いましたが、いかがでしょうか?
はい。おっしゃるとおりです。

>ちなみに、ファイルのフルパスのリストのある場所と、
>画像を表示させる場所は、同じシート上ですか?
はい。同一シート上です。
フルパス(ではありませんがファイル名の上までのパス)のあるセルは先のコード内にも記述していますが,e29とe58になります。(ファイル名を参照するフォルダが変わる可能性があるため,ファイルが存在するフォルダのパスとファイル名を別のセルに記載するようにしております。)
ファイル名についてはセルI1を参照した数値を含んだ名前をd30,d44,d59のセルに記述しています。(これによってファイル名に含まれる数値がスクロールするたびに変わります。)


先ほどβ様がご回答下さいました
ページが変わる --> 従来の古い画像削除 --> 新しい画像挿入
のコードを書けばいいとは思いますが,
シート内の画像を一括削除するようなコードを先のコードの前に記述すれば良いということでしょうか。
今ざっくり調べて先のコードに追加して試してみましたが,削除のコードがなかなかうまくいきません。

(ディアンジェロ) 2016/10/19(水) 15:54


> 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" といったように 名前を付けておく。
すみません。初心者なので名前の付け方が分かりません。
どこに.Name = "MYPIC1"を入れればいいのでしょうか。
(ディアンジェロ) 2016/10/19(水) 16:12

ども^^
こんな感じなんですかね。。。?

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


誠にありがとうございます。解決しました。
(ディアンジェロ) 2016/10/20(木) 12:15

コメント返信:

[ 一覧(最新更新順) ]


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