システムメンテナンスのお知らせ

excelで、例えば(品番)を選択して、それをクリックすると自動で画像が現れるようにしたいのですが。
可能なのでしょうか?
どういう方法がありますか?
教えてください。

gooドクター

A 回答 (10件)

> あるフォルダ内の画像はjpgで、あるフォルダ内はbmpという場合はどうすれば?



<対応策1>
 リストの品番に拡張子もつけておき、
 FileName = Selection.Value & Target.Value & ".jpg"
 の部分の最後の & 以降を削除します。
<対応策2>
 回答No.7のモジュールで、
 FileName = Selection.Value & Target.Value & ".jpg"  の部分を
 FileName = Selection.Value & Dir$(Selection.Value & Target.Value & ".*")
 に書き換えます。
いずれの方法でも、同じフォルダ内に異なる拡張子のファイルがある場合にも対応
できます。

> 式が入ってる場合(例えばVlookupとかの関数)はだめなんですよね?

どこにどのような式があるのかわかりませんが、試してごらんになられたらいかが
でしょうか。

この回答への補足

いつも、ありがとうございます。完璧です。

例えば、選択シートセルC1に"Aプラン、Bプラン"と選択できるようになっていて、A1~A5のセルにはそれぞれのプランに合わせて品番が決まって(IF関数などの式が入っています。例:セルA1はAプランの時にはClearが表示され、Bプランの時には、ある品番が表示されます。)このように、セル内に関数が入っている場合は、表示シートに反映されないのですが。できるようになりますか?
いつも無理いってすみません。

補足日時:2005/03/29 18:05
    • good
    • 0

一応今回の回答ですが........



Private Sub Worksheet_Change(ByVal Target As Range)
で始まるマクロは、セル内容が直接編集されて変化した場合に動作するもので、
他のセルの変化によって自動的に表示変更された場合(例えばVLOOKUPの結果など)
では作動しません。
これまで記述させていただいたマクロは、A1:A5が変更入力されたら処理を行なう
ものですが、おっしゃるような条件では、C1などが変更されたときに処理すること
になりますので、マクロの内容を基本的に変更しなければなりません。

ごめんなさいね。
回答させていただくたびに、「実際はこういう内容なのです」を小出しにされて
いらっしゃいますが、本来は様式の内容や条件などの環境を当初からひととおり
提供なさるのが筋なのではないかと思います。
私も、そう思っていながらも何度か拙い回答をさせていただきましたが、この辺が
潮時なのかも知れません。

ご自身のお近くにもマクロを操作されるかたがきっといらっしゃると思いますので、
そういうかたがたにこれまでの経緯を説明されれば、最後のご要望もきっと叶えら
れるものと思います。
    • good
    • 0
この回答へのお礼

すみません。マクロ初心者なものであたしも甘えてました。勉強して頑張ってみます。
何度もありがとうございました。

お礼日時:2005/04/01 10:11

私の説明がまずかったのかもしれませんね。

  m(__)m

名前をつける表範囲に、パスを入力したセル(A1 や B1) が含まれていませんか?
名前の範囲は A2:Axx 、B2:Bxx、.....です。

これで、ちゃんと動けばいいですね。 

あと、
・フルパスの最後には必ず \ をつけてください。
・マウスだけで操作できるように、リストのA2やB2には Clear という項目を入れて
 おいたほうがよいと思います。

この回答への補足

ありがとうございました。できました(^o^)
パスを入力したセルが含まれてました^m^。
またお聞きしたいのですが
・画像のファイルの中にあるフォルダ内の画像はjpg画像だけど、あるフォルダ内の画像はbmpの画像が入っていた場合はどうすればいいのでしょう?
(応用きかなくてすみません。)
・選択セルにリストはあるのですが、式が入ってる場合(例えばVlookupとかの関数)はだめなんですよね?

補足日時:2005/03/29 13:45
    • good
    • 0

> エラーの問題は解決しました。


表示シートの品番表示用セルに、ちゃんと名前が設定されていなかったのではないでしょうか。
名前ボックスに入力するときにIMEが日本語モードになっていると、表示は半角でも一度の[Enter]で
は入力確定されません。
名前を設定するときは、[Enter]で名前が名前ボックスの中央に表示されるのを確認してください。

> 選択シートでいくつかセルが指定できるように、そのセルに合わせてListシートにもいくつも
> リストがある場合
選択シートのA1:A5で表示されるリストがそれぞれ異なる場合でしたら、マクロの修正ではなく、
Listシートの各リスト範囲に名前をつけ、選択シートのA1:A5の各セルの参照先を変更すればよいで
しょう。

でも・・・・・
リストごとにファイルの保存場所が異なるというのでしたら、マクロも含めた修正をしなくてはなり
ません。
この場合は複雑になりますが、次のようにすれば何とか.....。

1)ListシートのA2:Axxに選択シートA1用のリストを作成します。また、ListシートのA1にはそれらの
 ファイルの保存ディレクトリのフルパスを入力します。(C:\............\)
 B列以降も、リストの種類数だけ同じように入力します。
 ListシートのA1とA4が同じリストを使い、A2とA3も別な同一リスト、A5は更に別なリスト、という
 場合は3つのリストになりますね。1行目にはそれぞれのフォルダのフルパスを忘れずに。
2)各リスト範囲に名前をつけます。
 ・選択シートのA1が使うリスト範囲につける名前: ListA1
 ・選択シートのA2が使うリスト範囲につける名前: ListA2
 ・選択シートのA3が使うリスト範囲につける名前: ListA3
 ・選択シートのA4が使うリスト範囲につける名前: ListA4
 ・選択シートのA5が使うリスト範囲につける名前: ListA5
 例えばA1とA4に同じリストを使う場合は、そのリスト範囲に2つの名前を設定してください。
 つまり、一度リスト範囲を選択して ListA1 という名前を設定し、再び同じ範囲に ListA4 という 名前をつけます。
3)表示シートで品番を表示するセルにつける名前は、全回と同じです。
4)一部修正した次のマクロを使います。
  Private Sub Worksheet_Change(ByVal Target As Range)
   Dim JumpToCode, JumpToList, FileName
   Select Case Target.Address
    Case Is = "$A$1", "$A$2", "$A$3", "$A$4", "$A$5"
     GoTo OK
    Case Else
     Exit Sub
   End Select
  OK:
   If Target.Value = "" Then Target.Value = "Clear"
   JumpToCode = "NM" & WorksheetFunction.Substitute(Target.Address, "$", "")
   JumpToList = "List" & WorksheetFunction.Substitute(Target.Address, "$", "")
   Application.ScreenUpdating = False
   Application.Goto Reference:=JumpToCode
   Selection = Target.Value
   If Target.Value = "Clear" Then Selection = ""
   Application.Goto ActiveSheet.Range(Selection.Address).Offset(0, 1)
   On Error GoTo Pfm:
   Sheets("表示").Shapes("Pic" & JumpToCode).Cut
  Pfm:
   If Target.Value = "Clear" Then GoTo Fin
   Application.Goto Reference:=JumpToList
   Application.Goto ActiveSheet.Cells(Selection.Row - 1, Selection.Column)
   FileName = Selection.Value & Target.Value & ".jpg"
   Sheets("List").Select
    Application.Goto ActiveSheet.Range("A1"), True
    ActiveSheet.Pictures.Insert(FileName).Select
    Selection.ShapeRange.LockAspectRatio = msoTrue
    Selection.ShapeRange.Height = 100
    Selection.Copy
    Selection.Cut
   Sheets("表示").Select
    ActiveSheet.Paste
    Selection.Name = "Pic" & JumpToCode
  Fin:
   Application.Goto Reference:=JumpToCode
   Sheets("選択").Select
   Application.ScreenUpdating = True
  End Sub

この回答への補足

いつもすばやいご回答ありがとうございます。

「アプリケーション定義またはオブジェクト定義のエラー」となって、"Application.Goto ActiveSheet.Cells(Selection.Row - 1, Selection.Column)"のところで止まってしまいます。
以前ListシートA1にあった"Clear"の文字はパス名に変更でいいですよね。
すみません。

補足日時:2005/03/29 10:41
    • good
    • 0

> 表示される画像は表示シートでどこのセルにでてくるのでしょう?



回答No.4の<前提>と<動作>を改めて記述します。(一部手を加えました)

<前提>
1)入力規則は、選択シートの A1:A5 の5つのセルに設定されているとします。
2)表示シートでは、5つのセル(任意)に次のような名前をつけてください。
  選択シートのA1で選択された品番を表示したいセルを選択して、名前ボック
  スに NMA1 と入力して [Enter]。
  選択シートのA2で選択された品番を表示するセルには NMA2 という名前。
  このように、5つとも "NM" と "選択シートのセル番地"を組み合わせた名前
  にします。
3)選択シートのタブから、回答No.5のマクロを記述します。
4)前回"標準モジュール"に記述したマクロは使用しません。

<動作>
選択シートのA1:A5で品番を選択すると、表示シートで指定したセルにその品番が
書き込まれ、その2つ右隣りのセルに画像が表示されます。

この回答への補足

できました。ありがとうございます。

シート名とセルの場所を変えてやってみたらどうしても「入力した文字列は参照名または定義名として正しくありません」
"No.4記述の16行目"Application.Goto Reference:=Jumpのところで止まってしまいます。どこがだめなのでしょう?
あと選択シートでいくつかセルが指定できるように、そのセルに合わせてListシートにもいくつもリストがある場合にはどこをなおしたらいいのでしょうか?

ほんとに、何度も何度もすみません。
とても助かっています。

補足日時:2005/03/28 16:39
    • good
    • 0
この回答へのお礼

すみません。エラーの問題は解決しました。
リストの種類も入力するセルごとに違う場合を教えてください。

お礼日時:2005/03/28 17:05

昨夜の回答(No.4)のマクロ部分の差し替えです。



・選択シートで"Clear"を選ばずにセル内容を削除してもエラーになりません。
・選択シートの選択用セルを個別に定義できるようにしましたので、連続セルで
 なくても定義しやすくなりました。


Private Sub Worksheet_Change(ByVal Target As Range)
 Dim Jump, FileName
 Select Case Target.Address
  Case Is = "$A$1", "$A$2", "$A$3", "$A$4", "$A$5"  '←対象セル定義
   GoTo OK
  Case Else
   Exit Sub
 End Select
OK:
 If Target.Value = "" Then Target.Value = "Clear"
 Application.ScreenUpdating = False
 Jump = "NM" & WorksheetFunction.Substitute(Target.Address, "$", "")
 Worksheets("List").Select
  Application.Goto ActiveSheet.Range("A1"), True
 Worksheets("表示").Select
  Application.Goto Reference:=Jump
  Selection = Target.Value
  If Target.Value = "Clear" Then Selection = ""
  Application.Goto ActiveSheet.Range(Selection.Address).Offset(0, 2)
 On Error GoTo Pfm:
 Sheets("表示").Shapes("Pic" & Jump).Cut
Pfm:
 If Target.Value = "Clear" Then GoTo Fin
 FileName = "C:\Z_Graphic\Illust\CG_Girls\" & Target.Value & ".jpg"
 Sheets("List").Select
 ActiveSheet.Pictures.Insert(FileName).Select
  Selection.ShapeRange.LockAspectRatio = msoTrue
  Selection.ShapeRange.Height = 100 'Sheet3する画像の縦サイズです。
 Selection.Copy
 Selection.Cut
 Sheets("表示").Select
  ActiveSheet.Paste
  Selection.Name = "Pic" & Jump
Fin:
 Application.Goto Reference:=Jump
 Sheets("選択").Select
 Application.ScreenUpdating = True
End Sub

この回答への補足

またも早速のご回答ありがとうございます。
でも、どこが悪いのか何度やっても実行がとまらないんですが。。。?
選択シートA1~A5が、入力できる画面ですよね。
それにたいして表示される画像は表示シートでどこのセルにでてくるのでしょう?
何度もお手数おかけしてすみません。

補足日時:2005/03/28 12:19
    • good
    • 0

> Sheet1で選択セルの内容を消した場合エラーになってしまう


 消さないで、リストの中の Clear を選択してください。

> Sheet1でいくつも入力画面があって、それをSheet3で並べたい
 選択セルと表示セルの位置関係がわかりませんので、適当に設定しています。
 シート名もわかりやすいように変更しました。
  (おかげで説明は紛らわしいデス。^^;)
  Sheet1 → 選択、 Sheet2 → List、 Sheet3 → 表示

<前提>
・基本的には前回と同じですが、入力規則(リスト)は A1:A5 に設定されています。
・表示(旧Sheet3)のA1に入れた数式(=IF(Sheet1!A1="Clear","",Sheet1!A1) という
 数式は不要です。
・表示シートで品番を表示するセルは5つです。それぞれのセルに次のような名前
 をつけてください。
  選択シート(旧Sheet1)のA1で選択された品番を表示するセルの名前: NMA1
  選択シート(旧Sheet1)のA2で選択された品番を表示するセルの名前: NMA2
  というように、"NM" と 選択シートのセル番地を組み合わせた名前にします。
・選択シートのタブから以下のマクロを記述します。
・前回の標準モジュールに記述したマクロは使用しませんので、削除します。
  ※画面左のツリーの"Module1"上で右クリックし、[Module1の解放]-[いいえ]。
'
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Jump, FileName
Application.ScreenUpdating = False
If Target.Column <> 1 Then Exit Sub 'A列以外は処理しません
If Target.Row > 5 Then Exit Sub '5行目までしか処理しません
Jump = "NM" & WorksheetFunction.Substitute(Target.Address, "$", "")
Worksheets("List").Select
Application.Goto ActiveSheet.Range("A1"), True
Worksheets("表示").Select
Application.Goto Reference:=Jump
Selection = Target.Value
If Target.Value = "Clear" Then Selection = ""
Application.Goto ActiveSheet.Range(Selection.Address).Offset(0, 2)
On Error GoTo Pfm:
Sheets("表示").Shapes("Pic" & Jump).Cut
If Target.Value = "Clear" Then GoTo Fin
Pfm:
FileName = "C:\...........\" & Target.Value & ".jpg"
Sheets("List").Select
ActiveSheet.Pictures.Insert(FileName).Select
Selection.ShapeRange.LockAspectRatio = msoTrue
Selection.ShapeRange.Height = 100
Selection.Copy
Selection.Cut
Sheets("表示").Select
ActiveSheet.Paste
Selection.Name = "Pic" & Jump
Application.Goto Reference:=Jump
Fin:
Sheets("選択").Select
Application.ScreenUpdating = True
End Sub

<動作>
・選択シートのA1:A5で品番を選択すると、表示シートの指定セルにその品番が表示
 され、その2つとなりのセルに画像が表示されます。
    • good
    • 0

> Sheet1内で入力規則を使って品番を選択し、Sheet2の中のセルに品番が表示され


> るようにリンクさせ、そのSheet2に画像を挿入したい

私もマクロはあまり得意なほうではありませんので、パッチワークのような方法に
なってしまいましたし、表示させるシート名も異なってしまうのですが....^_^;


<前提>
・Sheet2のA2:A20に品番リストがあります。
・画像ファイルはみな同じフォルダにあり、ファイル名は商品コードと同じです。
・Sheet2のA1には"Clear"と入力し、A1:A20に"List"という名前を設定します。
・Sheet1のA1に入力規則(リスト。参照範囲:=List)が設定されています。
ここまでは前回と同じです。以下、追加の前提です。
・Sheet3のA1に =IF(Sheet1!A1="Clear","",Sheet1!A1) という数式を入れます。

Sheet1のシートタブを右クリックして「コードの表示」を選択し、下記モジュール
を記述します。
'
Private Sub Worksheet_Change(ByVal Target As Range)
Dim FileName
Application.ScreenUpdating = False
Application.Run "SetCell"
If Target.Address <> "$A$1" Then Exit Sub
On Error GoTo Pfm:
Sheets("Sheet3").Shapes("Pic").Cut
If Target.Value = "Clear" Then End
Pfm:
FileName = "C:\xxxxxxxx\" & Target.Value & ".jpg"
Sheets("Sheet2").Select
ActiveSheet.Pictures.Insert(FileName).Select
Selection.ShapeRange.LockAspectRatio = msoTrue
Selection.ShapeRange.Height = 100
Selection.Copy
Selection.Cut
Sheets("Sheet3").Select
ActiveSheet.Paste
Selection.Name = "Pic"
Sheets("Sheet1").Select
Range("A1").Select
Application.Run "SetCell"
Application.ScreenUpdating = True
End Sub

そのまま[挿入]-[標準モジュール]で "Module1"を挿入し、次のように記述してか
ら VB Editor を閉じます。
'
Sub SetCell()
Sheets("Sheet2").Select
Range("A1").Select
Sheets("Sheet3").Select
Range("C1").Select
End Sub

<動作>
・Sheet1のA1で品番を選択すると、Sheet3のA1にその品番が表示され、同じシー
トのC3に画像が表示されます。

この回答への補足

遅くに、早速のご回答ありがとうございました。
できました。うれしいです。
また、初歩的なことでお聞きしたいんですが・・・

いま「Sheet3」の1箇所に挿入できました。
これが「Sheet1」で、いくつも入力画面があって
それを「Sheet3」で並べたいのですが。
あと、「Sheet1」で、その選択セルの内容を消した場合エラーになってしまうんですけど、それを回避できますか?
何度もすみません。

補足日時:2005/03/27 13:04
    • good
    • 0

> いくつかの品番をリストで選択し、これにリンクして別シートに選択した品番が


> 出てくるようになっているんですが、そこに画像を簡単に貼り付けたい。

いまいち内容が把握できませんが、下記のような操作は参考になりませんか?

<前提>
・Sheet2のA2:A20に品番リストがあります。
・画像ファイルはみな同じフォルダにあり、ファイル名は商品コードと同じです。
・Sheet2のA1には"Clear"と入力し、A1:A20に"List"という名前を設定します。
・Sheet1のA1に入力規則(リスト。参照範囲:=List)が設定されています。

Sheet1のシートタブを右クリックして「コードの表示」を選択し、下記モジュール
を記述します。
'
Private Sub Worksheet_Change(ByVal Target As Range)
Dim FileName
If Target.Address <> "$A$1" Then Exit Sub
Application.ScreenUpdating = False
On Error GoTo Pfm:
ActiveSheet.Shapes("Pic").Cut
If Target.Value = "Clear" Then End
Pfm:
FileName = "C:\xxxxxxxx\" & Target.Value & ".jpg"
'C:\xxxxxxxx の部分には実際の画像ファイルフォルダのフルパスを記述します。
Sheets("Sheet2").Select
ActiveSheet.Pictures.Insert(FileName).Select
Selection.ShapeRange.LockAspectRatio = msoTrue
Selection.ShapeRange.Height = 100 '表示する画像の縦サイズです。
Selection.Copy
Selection.Cut
Sheets("Sheet1").Select
Range("C1").Select
ActiveSheet.Paste
Selection.Name = "Pic"
Application.ScreenUpdating = True
Range("D2").Select
End Sub

<動作>
・Sheet1のA1で品番を選択すると、C1に画像が表示されます。

この回答への補足

ありがとうございます。そういうイメージでした。
でも、もう1回お聞きしてもよろしいですか?
この場合、同じシート内で入力規則を設定したセルを元に画像が表示されるんですよね。

例えば「Sheet1」内で、入力規則を使って品番を選択し、別のシート「Sheet2」のなかのセルに品番が表示されるようにリンクさせていて、そのSheet2に画像を挿入したいのですが。
応用ができなくてすみません。
教えてください。

補足日時:2005/03/26 17:28
    • good
    • 0

品番が入力されているセルにコメントを挿入し、そのコメントの書式設定から


[色と線]-[塗りつぶし]-[塗りつぶし効果]で画像を指定します。
セルの上にマウスポインタを当てると、画像が表示されます。

この回答への補足

ご回答ありがとうございました。
そういったやり方もあるんですね。
質問が悪かったのかもしれませんが、これはセルに対して画像を確認したいときにいいですよね。

私は、いくつかの品番をリストで選択できるようになっていて、これにリンクして別シートに選択した品番が出てくるようになってるんですが、そこに画像を簡単に貼り付けたいのです。挿入-図-ファイルで取り込んでるんですが、いくつもあると時間がかかってしまうので、何かいい方法はありますか?

補足日時:2005/03/26 12:17
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このカテゴリの人気Q&Aランキング