kakashi-blog・カカシブログ・

Python備忘録を書きドローンやバイクなど好きな事で生きて行こうとしているブログ

Excel・PC

Excel VBAでセルの図形を番号順に別シートへコピーする方法

投稿日:2020年2月23日 更新日:

Excelで、セルに入っている図形を、決めた番号の順番で別のシートに並べ替えたいことがありました。最初は関数だけでやろうとしましたが、図形は関数ではコピーできず、うまくいきませんでした。そこでVBAで作りました。

結論から言うと、セルをコピーして ActiveSheet.Pictures.Paste で貼り付ける と、図形を別のシートの好きなセルに並べられます。

要点

  • 関数では図形をコピーできないので、VBAを使います
  • B列の番号を読み取り、その番号の行に図形を貼り付けます
  • 貼り付け先のセルの大きさを合わせておかないと、図形が重なって見づらくなります

やりたいこと

順番がバラバラに入っている図形に番号をふって、別のシートに番号順で並べたい、というのが目的です。フィルター機能は使えない前提です。

A列に図形、B列に並べたい順番の番号を入れたExcelのシート
  • シート「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で図形を番号順に別シートへ並べた結果

図形が番号順に並びました。

ただし、貼り付ける側のセルの大きさを図形に合わせておかないと、図形同士が重なって見づらくなりました。先に行の高さと列の幅をそろえてから実行するのがおすすめです。

まとめ

  • 図形は関数ではコピーできないので、VBAを使いました
  • セルをコピーして ActiveSheet.Pictures.Paste で貼り付けると、図として並べられます
  • 番号をそのまま貼り付け先の行に使えば、Ifを使わずに短く書けます
  • 貼り付け先のセルの大きさをそろえておくと、図形が重なりません

PythonでExcelを操作する方法は、Pythonプログラミング備忘録 ―エクセル操作編にまとめています。

-Excel・PC
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

関連記事

Windowsの仮想デスクトップのショートカット|作成・切替・削除

Windowsの仮想デスクトップのショートカットを知ってから、仕事がかなり楽になりました。こんなに便利な機能なのに、職場で使っている人を見たことがありません。そもそも、人のパソコン操作を見る機会はあま …