- ベストアンサー
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 よろしくお願いします。
- みんなの回答 (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 参考まで
その他の回答 (1)
- misatoanna
- ベストアンサー率58% (528/896)
基本的には、ご質問で記述された記述法は変更していません。 ブックと同じフォルダの画像を表示します。 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
お礼
上記の回答の補足で、「ランダムにセルが選択されているようなのですが、その時には画像が貼り付けられず、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さんのお陰です。後半の画像を消去するマクロも参考になりました。 お陰で、マクロを使って画像をシート上に貼り付ける方法がわかり、他の場面でも利用できそうです。
補足
早々にご回答ありがとうございます。 さっそくexcel上で試してみたのですが、画像が1つしか表示されません。ランダムにセルが選択されているようなのですが、その時には画像が貼り付けられず、for~nextのあとに画像が貼り付けられているようです。 また、1の時は表示されず、2以上で表示されます。そして、1~6までが画像aaaa.jpgが、7以上でbbbb.jpgが表示されます。この2点はマクロを修正することで解消しました。 しかし、画像が1つしか表示されないことは、私の力では解決出来ませんでした。 アドバイスをいただければ嬉しいです。よろしくお願いします。
お礼
回答ありがとうございます。 シートに貼り付けられている画像を扱うには、shapesを利用すればいいのですね。 期待通りのマクロです。ありがとうございまいました。