• ベストアンサー

excelのマクロで画像ファイルを操作する方法

winのexcel2003を使っています。 画像を限定されたシート内でランダムに表示する方法を教えてください。 ☆(文字)を1~10個ランダムに、限定されたシート内で表示することはできるのですが、☆の代わりに画像(gifまたはjpeg)を1~10個ランダムに表示できる方法がわかりません。 表示するのはシート1で、表示したい画像は、同じフォルダ内にある画像ファイル(画像1、画像2の2ファイル、大きさは50×50ピクセル程度)または、シート2に貼り付けてある画像ファイルです。 具体的には画像ファイルを指定する方法がわかりません。指定の方法がわかれば何とかなるような気がするのですが… 以下が自分で考えたマクロです。”星の表示”マクロをシート上のボタンに登録して、ボタンをクリックするたびにランダムに星が表示され、メッセージボックスにその数が表示されるはずです。 6個目の星から色が変わるようになっていますが、画像ファイルの場合は1~5個までは画像1を、6個目から画像2を表示できるようにしたいです。たとえば画像1は赤い車、画像2は青い車で、5までは赤い車を、6以上は青い車を表示したいのです。そしてすべての車の数もメッセージボックスに表示するマクロです。 条件に合うような表示ができれば、下のマクロにこだわり必要はありません。質問の仕方が不十分だとは思いますが、よろしくお願いします。 Sub 星の表示()  Dim i As Integer  a = 2  c = Int(10 * Rnd() + 1)  For i = 1 To c    a = 2 + a    Randomize  b = Int(10 * Rnd() + 1)  Cells(b, a).Value = "★"  If i < 6 Then   Cells(b, a).Font.ColorIndex = 3  Else   Cells(b, a).Font.ColorIndex = 4  End If  Next i  MsgBox c  Range("A1:X25").Select  Selection.ClearContents  Range("A1").Select End Sub よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.2

>または、シート2に貼り付けてある画像ファイルです。 私はこちらの方を Sub 星の表示_sheet2_ver() Dim i As Integer Dim a As Long, b As Long, c As Long a = 2 c = Int(10 * Rnd() + 1) For i = 1 To c a = 2 + a Randomize b = Int(10 * Rnd() + 1) Cells(b, a).Select If i < 6 Then Sheets("Sheet2").Shapes(1).Copy Else Sheets("Sheet2").Shapes(2).Copy End If ActiveSheet.Paste Next i MsgBox c ActiveSheet.Shapes.SelectAll Selection.Delete Range("A1").Select End Sub 参考まで

r-inarin
質問者

お礼

回答ありがとうございます。 シートに貼り付けられている画像を扱うには、shapesを利用すればいいのですね。 期待通りのマクロです。ありがとうございまいました。

その他の回答 (1)

回答No.1

基本的には、ご質問で記述された記述法は変更していません。 ブックと同じフォルダの画像を表示します。 Sub 図の表示()  Dim myDir, Pic1, Pic2, a, b, c, i, rng, shp  myDir = ActiveWorkbook.Path  Pic1 = myDir & "\aaaa.jpg" '実際のファイル名に  Pic2 = myDir & "\bbbb.jpg" '実際のファイル名に  a = 2  c = Int(10 * Rnd() + 1)  For i = 1 To c   a = 2 + a   Randomize   b = Int(10 * Rnd() + 1)   Cells(b, a).Select   If i < 6 Then    ActiveSheet.Pictures.Insert(Pic1).Select   Else    ActiveSheet.Pictures.Insert(Pic2).Select   End If  Next i  MsgBox c  Set rng = Range("A1:X25")  For Each shp In ActiveSheet.Shapes   If Not Intersect(shp.TopLeftCell, rng) Is Nothing Then shp.Delete  Next  Set rng = Nothing  Range("A1").Select End Sub

r-inarin
質問者

お礼

上記の回答の補足で、「ランダムにセルが選択されているようなのですが、その時には画像が貼り付けられず、for~nextのあとに画像が貼り付けられているようです。」と書きましたが、これは間違いでした。セルがランダムに選択されるのですが、それとは別にfor~nextの中で、左上B2付近に画像が貼られます。そこで、以下のようにしてみました。 ActiveSheet.Pictures.Insert(Pic1).Select この.selectを.cutに代えて、ActiveSheet.Pasteを加えました。 for~nextの中を以下のように書き換えました。 For i = 1 To c a = 2 + a Randomize b = Int(10 * Rnd() + 1) Cells(b, a).Select If i < 6 Then ActiveSheet.Pictures.Insert(Pic1).Cut Else ActiveSheet.Pictures.Insert(Pic2).Cut End If ActiveSheet.Paste Next i これでできました。ありがとうございます。misatoannaさんのお陰です。後半の画像を消去するマクロも参考になりました。 お陰で、マクロを使って画像をシート上に貼り付ける方法がわかり、他の場面でも利用できそうです。

r-inarin
質問者

補足

早々にご回答ありがとうございます。 さっそくexcel上で試してみたのですが、画像が1つしか表示されません。ランダムにセルが選択されているようなのですが、その時には画像が貼り付けられず、for~nextのあとに画像が貼り付けられているようです。 また、1の時は表示されず、2以上で表示されます。そして、1~6までが画像aaaa.jpgが、7以上でbbbb.jpgが表示されます。この2点はマクロを修正することで解消しました。 しかし、画像が1つしか表示されないことは、私の力では解決出来ませんでした。 アドバイスをいただければ嬉しいです。よろしくお願いします。

関連するQ&A