Excelで、セルに入っている図形を、決めた番号の順番で別のシートに並べ替えたいことがありました。最初は関数だけでやろうとしましたが、図形は関数ではコピーできず、うまくいきませんでした。そこでVBAで作りました。
結論から言うと、セルをコピーして ActiveSheet.Pictures.Paste で貼り付ける と、図形を別のシートの好きなセルに並べられます。
要点
- 関数では図形をコピーできないので、VBAを使います
- B列の番号を読み取り、その番号の行に図形を貼り付けます
- 貼り付け先のセルの大きさを合わせておかないと、図形が重なって見づらくなります
やりたいこと
順番がバラバラに入っている図形に番号をふって、別のシートに番号順で並べたい、というのが目的です。フィルター機能は使えない前提です。

- シート「2」のA列に図形(〇、△、□)が入っています
- B列には、並べたい順番の番号が入っています
- これをシート「1」に、1〇、2△、3□の順に並べます
VBAの書き方
VBAは「開発」タブ →「Visual Basic」→「挿入」→「標準モジュール」で書く画面を開きます。「開発」タブが表示されていない場合は、「ファイル」→「オプション」→「リボンのユーザー設定」で「開発」にチェックを入れてください。
実際に動いたコード
私が書いて動いたコードです。普段Pythonを書いているので、インデントは癖です。
Sub cp()
Dim i As Long
Dim R As Long
For i = 1 To 3
Sheets("2").Select
Cells(i, 1).Select
Selection.Copy
R = Cells(i, 2).Value
If R = 1 Then
Sheets("1").Select
Range("A1").Select
ActiveSheet.Pictures.Paste
ElseIf R = 2 Then
Sheets("1").Select
Range("A2").Select
ActiveSheet.Pictures.Paste
Else: R = 3
Sheets("1").Select
Range("A3").Select
ActiveSheet.Pictures.Paste
End If
Next i
End Sub
適当にボタンを作って実行しました。
コードの意味
For i = 1 To 3:1行目から3行目まで、同じ処理をくり返しますCells(i, 1).SelectとSelection.Copy:A列のセル(図形が入っている)をコピーしますR = Cells(i, 2).Value:B列の番号をRに入れますIf R = 1 Then ...:番号に合わせて、シート「1」の貼り付け先を選びますActiveSheet.Pictures.Paste:コピーしたセルを図として貼り付けます
短く書き直したコード
上のコードは番号ごとにIfで分けているので、図形が増えるとコードも長くなります。番号をそのまま貼り付け先の行にすれば、Ifを使わずに書けます。ブログ用に書き直したもので、私の環境ではまだ動作を確かめていません。使う前に、元のファイルのコピーで試してください。
Sub cp2()
Dim i As Long
Dim R As Long
For i = 1 To 3
R = Sheets("2").Cells(i, 2).Value
Sheets("2").Cells(i, 1).Copy
Sheets("1").Select
Sheets("1").Cells(R, 1).Select
ActiveSheet.Pictures.Paste
Next i
Application.CutCopyMode = False
End Sub
図形の数が変わるときは、3 の部分を図形の数に変えてください。最後の Application.CutCopyMode = False は、コピー中の点線の枠を消すための1行です。
実行結果

図形が番号順に並びました。
ただし、貼り付ける側のセルの大きさを図形に合わせておかないと、図形同士が重なって見づらくなりました。先に行の高さと列の幅をそろえてから実行するのがおすすめです。
まとめ
- 図形は関数ではコピーできないので、VBAを使いました
- セルをコピーして
ActiveSheet.Pictures.Pasteで貼り付けると、図として並べられます - 番号をそのまま貼り付け先の行に使えば、Ifを使わずに短く書けます
- 貼り付け先のセルの大きさをそろえておくと、図形が重なりません
PythonでExcelを操作する方法は、Pythonプログラミング備忘録 ―エクセル操作編にまとめています。