[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『指定した数字を入力するとイラストが挿入される方法』(コンドウ)
@JPEGで作成したイラストがあり、指定した数字を入力すると、イラストが挿入される方法を教えてください。 A指定した数字をクリアにするとイラストも削除される方法を教えてください。
イラスト名前は 「007 文字」・「030 文字」などとなっています。 イラストサイズは、高さ4.71cm 幅5.4cmです。 JPEGのイラストが入っている場所は「マイ ドキュメント」の「イラスト」フォルダに入っています。
A B C D E F
3 7 30 5 8 116
4 24 64 73 93 33
5 9 33 20 50 15
6 120 125 66 124 56
7 106 38 28 25 40
8 161 180 140 155 172
※B3に7を入れるとA14:E22の範囲でイラストが挿入(B3=A14:E22) 他は下記の通りです。 C3=G14:K22 、 D3=M14:Q22 、 E3=Y14:AC22 B4=A26:E34 、 C4=G26:K34 、 D4=M26:Q34 、 E4=Y26:AC34 B5=A37:E45 、 C5=G37:K45 、 D5=M37:Q45 、 E5=Y37:AC45 B6=A48:E56 、 C6=G48:K56 、 D6=M48:Q56 、 E6=Y48:AC56 B7=A59:E67 、 C6=G59:K67 、 D6=M59:Q67 、 E6=Y59:AC67 B8=A70:E78 、 C6=G70:K78 、 D6=M70:Q78 、 E6=Y70:AC78
よろしくお願いします。m(__)m
イラストのファイル名は、たとえば 7 だったら 007ABCD.jpeg とか? フォルダ内に007からはじまる画像が複数あったら、先がちでいいのかな?
追記)それと、セルに入力されたタイミングで画像を挿入、ないしは(空白なら)削除でいいのかな? (すでにセルに数字が書き込まれていても、セルが変更されるまでは何もしなくてもいい?)
(ぶらっと)
@ たとえば 7 だったら 007ABCD.jpeg とか? ← 「007 机.jpeg」「030 椅子.jpeg」です。数字と文字の間に半角スペースが入っています。 A 007からはじまる画像が複数あったら ← 007は一つだけです。複数は存在しません。 B すでにセルに数字が書き込まれていても、セルが変更されるまでは何もしなくてもいい?)←そのままでいいです。
よろしくお願いします。(コンドウ)m(__)m
E列の数字に対する貼り付け先が、A〜D列の数字の貼り付け先とくらべ列番号の規則が不一致だけど、いいの?
それと、貼り付け先は結合セルということじゃないんだね。
あと、画像は貼り付け先領域の左上隅にあわせて、そのまま貼り付けるだけでいいの? それとも、画像の縦横比率も考慮し、同じ比率で、かつ貼り付け先領域をはみださないようにする? (必要なら拡大も?)
追記) 貼り付け先領域の行番号の規則も、3->14 4->26 で 差が12 だけど、4行目以降については差が11。これもいいのかな?
(ぶらっと)
とりあえず「不規則な貼り付け先」という前提で。 なお、領域をはみだす場合は縮小しているけど、領域に収まった場合の拡大はしていない。 (アップ後、コード一部訂正 さらに0:09 訂正)
シートモジュールに。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim picName As String
Dim fName As String
Dim myPath As String
Dim n As Long
Dim myR As Range
If Target.Count > 1 Then
MsgBox "複数セルへの入力はサポートしていません" & vbLf & "入力を取り消します"
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
Exit Sub
End If
If Intersect(Target, Range("B3:E8")) Is Nothing Then Exit Sub
picName = "myPic_" & Target.Address(False, False)
If IsObject(Evaluate(picName)) Then Me.Shapes(picName).Delete
If Len(Target.Value) = 0 Then Exit Sub
myPath = CreateObject("WScript.Shell").SpecialFolders("MyDocuments") & "\イラスト\"
fName = Dir(myPath & "*.jpeg")
Do While Len(fName) > 0
n = Val(fName)
If n = Target.Value Then
Set myR = GetCell(Target)
With Me.Pictures.Insert(myPath & fName)
.Top = myR.Top
.Left = myR.Left
.Name = picName
If .Width > myR.Width Then .Width = myR.Width
If .Height > myR.Height Then .Height = myR.Height
End With
ActiveCell.Activate
Exit Do
End If
fName = Dir()
Loop
If Len(fName) = 0 Then MsgBox Target.Value & "に紐ついた画像ファイルがありません"
End Sub
Private Function GetCell(Target As Range) As Range
Dim y As Long, x As Long
If Target.Column = 5 Then
x = 25 'Y列
Else
x = (Target.Column - 2) * 6 + 1
End If
If Target.Row = 3 Then
y = 14 '14行目
Else
y = (Target.Row - 4) * 11 + 26
End If
Set GetCell = Cells(y, x).Resize(9, 5)
End Function
(ぶらっと)
@E列の数字に対する貼り付け先が、A〜D列の数字の貼り付け先とくらべ列番号の規則が不一致だけど、いいの? ← 間違っていました。 A 追記)貼り付け先領域の行番号の規則も、3->14 4->26 で 差が12 だけど、4行目以降については差が11。これもいいのかな? ← 気づきませんでした(^_^;)。 <正しいは下記の通りでお願いしますm(__)m > B4=A15:E22 、 C3=G15:K22 、 D3=M15:Q22 、 E3=S15:W22 、 F3=Y15:AC22 B4=A26:E33 、 C4=G26:K33 、 D4=M26:Q33 、 E4=S26:W33 、 F4=Y26:AC33 B5=A37:E44 、 C5=G37:K44 、 D5=M37:Q44 、 E5=S37:W44 、 F5=Y37:AC44 B6=A48:E55 、 C6=G48:K55 、 D6=M48:Q55 、 E6=S48:W55 、 F6=Y48:AC55 B7=A59:E66 、 C6=G59:K66 、 D6=M59:Q66 、 E6=S59:W66 、 F6=Y48:AC66 B8=A70:E78 、 C6=G70:K78 、 D6=M70:Q78 、 E6=S70:W78 、 F6=Y48:AC78 ※1つのセル幅は ( 横は4.50(41ピクセル) 、縦は13.50(18ピクセル) )です。
A貼り付け先は結合セルということじゃないんだね。 ← 今現在は結合セルになっていませんが、はみだすのであれば結合セルでもいいです。
B画像は貼り付け先領域の左上隅にあわせて、そのまま貼り付けるだけでいいの? ← 左上隅にあわせて、貼り付けるだけでいいです。
C画像の縦横比率も考慮し、同じ比率で、かつ貼り付け先領域をはみださないようにする? ← すべての画像が同じ比率で、はみださないようにお願いします。
DDo While Len(fName) > 0
n = Val(fName)
If n = Target.Value Then
Set myR = GetCell(Target) ← Target コンパイルエラー 「ByRef 引数の型が一致しません。」と表示します。
よろしくお願いします。(コンドウ)m(__)m
レイアウトの訂正ならびに、他の希望要件了解。 今、時間がとれないので、コンパイルエラーの件(おかしいなぁ・・・)とあわせて、少し時間ちょうだいね。
(ぶらっと)
(ぶらっと)さん、忙しい時に質問してすいません。m(__)m 少し時間ちょうだいね。 ← はい、わかりました。 お手数をお掛けいたしますが、よろしくお願いします。(コンドウ)m(__)m
以下を試してみて。 サブプロシジャのGetCellは廃止。あわせて、コピペ入力等、あるいは複数セル選択のクリア等 複数セル同時入力サポート。 (もし、環境が2007以降なら、すこし直した方がいいところもあるけど)
シートモジュールに
Private Sub Worksheet_Change(ByVal Target As Range)
Dim picName As String
Dim fName As String
Dim myPath As String
Dim n As Long
Dim myO As Range
Dim myR As Range
Dim c As Range
Set myO = Intersect(Target, Range("B3:E8"))
If myO Is Nothing Then Exit Sub
myPath = CreateObject("WScript.Shell").SpecialFolders("MyDocuments") & "\イラスト\"
For Each c In myO
picName = "myPic_" & c.Address(False, False)
If IsObject(Evaluate(picName)) Then Me.Shapes(picName).Delete
If Len(c.Value) > 0 Then
fName = Dir(myPath & "*.jpeg")
Do While Len(fName) > 0
n = Val(fName)
If n = c.Value Then
Set myR = Cells((c.Row - 3) * 11 + 15, (c.Column - 2) * 6 + 1).Resize(8, 5)
With Me.Pictures.Insert(myPath & fName)
.Top = myR.Top
.Left = myR.Left
.Name = picName
If .Width > myR.Width Then .Width = myR.Width
If .Height > myR.Height Then .Height = myR.Height
End With
Exit Do
End If
fName = Dir()
Loop
If Len(fName) = 0 Then MsgBox c.Value & "に紐ついた画像ファイルがありません"
End If
Next
ActiveCell.Activate
Set myR = Nothing
Set myO = Nothing
End Sub
(ぶらっと)
(ぶらっと)さん、忙しいのにたびたびすいません。m(__)m 忘れていました。(T_T) 古いPCを使っているのでバージョンがかなり前のですが、できるのでしょうか? エクセルのバージョン:Excel2003 OSのバージョン:Windows2000
また間違っていました。かさねて申し訳ございません。m(__)m
Set myO = Intersect(Target, Range("B3:E8")) ← Range("B3:F8")
オブジェクトが必要です。(Error 424)
B3=A15:E22 、 C3=G15:K22 、 D3=M15:Q22 、 E3=S15:W22 、 F3=Y15:AC22 B4=A26:E33 、 C4=G26:K33 、 D4=M26:Q33 、 E4=S26:W33 、 F4=Y26:AC33 B5=A37:E44 、 C5=G37:K44 、 D5=M37:Q44 、 E5=S37:W44 、 F5=Y37:AC44 B6=A48:E55 、 C6=G48:K55 、 D6=M48:Q55 、 E6=S48:W55 、 F6=Y48:AC55 B7=A59:E66 、 C7=G59:K66 、 D7=M59:Q66 、 E7=S59:W66 、 F7=Y48:AC66 B8=A70:E78 、 C8=G70:K78 、 D8=M70:Q78 、 E8=S70:W78 、 F8=Y48:AC78
お手数をお掛けいたしますが、よろしくお願いします。(コンドウ)m(__)m
B3:E8 -> B3:F8 そうだったね。
>Target コンパイルエラー 「ByRef 引数の型が一致しません。」と表示します。 >オブジェクトが必要です。(Error 424)
この2つの報告から思いついたこと。 提示したコードは、「提示したコード」のまま、 Private Sub Worksheet_Change(ByVal Target As Range) も、そのままで「シートモジュール」に貼り付けてくれている?
シートモジュールは、このシートのシートタブを右クリックして、コードの表示を選んだところ。 こうすることで、シートのB3:F8の領域のどこかに数字を入れると自動実行される。
標準モジュールに張り付けて、それをマクロ実行していない?
もし、マクロ実行(ボタンでの起動含んで)して、B3:F8にある数字から一括して画像を削除(空白時)、挿入(フォルダに存在時)するということなら 標準モジュール用に、コードを少し手直ししてアップするよ。
あぁ、そうそう。報告から推察するに、モジュールの先頭に Option Explicit の記述がないのかな? なくてもOKなんだけど、必須というぐらいの気持ちで必ず記述することを推奨。 (コードで使用する変数の記述を必須にする)
(ぶらっと)
(ぶらっと)さん、忙しい間に教えていただき、ありがとうございます。
Cドライブのデータが重たすぎるので、イラストをDドライブのイラストのフォルダに移したのですが、
myPath = CreateObject("WScript.Shell").SpecialFolders("MyDocuments") & "\イラスト\"
をどのように変更したらいいのか教えてください。
お手数をお掛けいたしますが、よろしくお願いします。(コンドウ)m(__)m
Dドライブ直下であれば myPath = "d:\イラスト\"
(ぶらっと)
(ぶらっと)さん、忙しい間に教えていただき、ありがとうございます。 B3に007を入力したら「7紐ついた画像ファイルがありません」と表示します。 Dドライブのイラストフォルダには「007 机」がちゃんとあるのですが? お手数をお掛けいたしますが、よろしくお願いします。(コンドウ)m(__)m
B3:E8 は【数値】ではなく文字列としての【数字】なのかな? アップしたコードは、B3:E8が【数値】という前提で、たとえば 7 と入れると 007 机 とマッチするようにしてある。
もし、文字列 007 なのであれば、ちょっとコードを変えて、後ほどアップするね。
(ぶらっと)
↑ と、いったんレスしたけど、文字列形式で 007 と入力しても 007 机 とマッチする。 (当方の xl2003 環境で確認済み)
マッチしないとすれば ・フォルダ名が違っているか ・アップしたコードは 007 机.jpeg と想定しているけど、実際は 007 机.jpg ?
後者かな? 実際のファイル拡張子は? もし拡張子が jpg なら fName = Dir(myPath & "*.jpeg") --> fName = Dir(myPath & "*.jpg") こうして試してみて。
(ぶらっと)
(ぶらっと)さん、忙しい間に教えていただき、ありがとうございます。 「007 机」はjpegですし、 B3:F8 は【数値】ですが、「7紐ついた画像ファイルがありません」と表示します。 「D:\イラスト」にあるイラストの大きさサイズは関係があるのでしょうか?
Set myO = Intersect(Target, Range("B3:F8"))
If myO Is Nothing Then Exit Sub
myPath = "D:\イラスト"
お手数をお掛けいたしますが、よろしくお願いします。(コンドウ)m(__)m
myPath = "D:\イラスト" このように書いたの?
回答したのは myPath = "d:\イラスト\" だけど?
(ぶらっと)
(ぶらっと)さん、忙しい間に教えていただき、ありがとうございます。 思っているようにできました。 涙(T_T)が出るくらい嬉しくてたまりません。 ありがとうございました。(^.^)
今後、挿入位置やイラストの大きさが変更になる場合もありますので、 忙しいのに申し訳ございませんが、 @イラストの「 挿入位置 ( A15 → B13 )」や Aイラストの「 大きさ ( A15:E22 → B13:G22 )」を変えたい場合は、 どこのコードを変更したら良いのか教えてください。 お手数をお掛けいたしますが、よろしくお願いします。(コンドウ)m(__)m
場所、大きさについては、いずれも Set myR = Cells((c.Row - 3) * 11 + 15, (c.Column - 2) * 6 + 1).Resize(8, 5) ここで規定している。
まず、数値を入れるセル(c)と画像を貼り付ける領域の左上隅のセルの相関関係を以下の式で求めている。 左上隅のセルの行:(cの行番号-3)*11+15 左上隅のセルの列:(cの列番号-2)*6+1 これはVBAというより算数の問題で、両者の相関ルールを、その時々で見つけ出して計算式で表す必要があるねぇ。
貼り付け先のサイズは、わかりやすい。 .Resize(8, 5) 8行、5列 ということ。
(ぶらっと)
(ぶらっと)さん、忙しい間に教えていただき、ありがとうございます。 相関関係、難しいですね。 手探りでやってみます。 ありがとうございました。感謝(コンドウ)(^.^)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.