« Calculation of units 1/10 sec and 1/100 sec | トップページ | Rotate cell contents 90 degrees, -90 degrees and 180 degrees »

2018年2月12日 (月)

セルの内容を90度回転、-90度回転、180度回転

Excelで座席表やオフィスの配置図などを作ることありますよね。

どちらを上にして作ればいいのか迷ってとりあえず作ったけど
やっぱりこっちの向きが良かった
とか
自分の座っている席から見てこの向きの座席表だと見難い
など

セルの内容を
90度回転(時計回りをプラス方向)させたり、
180度回転させたりしたい
と思ったことありませんか?

こんな場合に使えるマクロを作りたいと思います。

セルの内容を90度回転させるとは
どういう操作なのでしょうか?

下図の左側の配置を右側のように
90度回転させるために必要な操作は何でしょうか?

Vba20180212a

まず左側の行(A,B,C,D)が列の向きになって
(A,B,C,D)が1行目だったのが2列目になります。
2番目の行は1番目の行と同様に列の向きになって
2行目だったのが1列目になります。

つまり行と列を入れ替えて、列自体を逆順にすることが
セルの内容を90度回転させることです。

-90度回転は下図のとおり
行と列を入れ替えて
列の内容を逆順にする。

Vba20180212b

90度回転するという操作が
実は、
行と列の入れ替えや逆順にするとできる
というのは不思議な感じです。

では180度回転させるとはどういう操作でしょうか?
下図を見てください。

Vba20180212c

1行目(A,B,C,D)が逆順になって
さらに列自体も逆順になります。

これをVBAで行うには

列の内容を逆順にして
列ごとの順番を逆にする。

180度回転では行と列の入れ替えはしないで
逆順にするという操作で出来るんですね。

VBAでこれらの操作を行うのに
今回は選択した範囲を配列に格納して
For文とUBoundを使って入れ替えをしていきます。
セルの内容を配列に格納して使用する方法については
こちらの記事も参照してください。
セルの値を配列に格納して使う

 

コードはこちら

セルの内容を90度回転するコード:

Sub macro180211a()
'セルの内容を90度回転
'回転させたい範囲を選んでマクロ実行する
'回転後の内容はセルA1を基準 に出力

    Dim i As Integer, j As Integer
    Dim vData As Variant
   
    'Variant型の変数に選択範囲の値を入れる
    vData = Selection
   
    For i = 1 To UBound(vData, 1)
        For j = 1 To UBound(vData, 2)
            '行を逆順にして、行と列を入れ替える
            Cells(j, UBound(vData, 1) - (i - 1)) = vData(i, j)
        Next j
    Next i
       
End Sub


セルの内容を-90度回転するコード:

Sub macro180211b()
'セルの内容を-90度回転
'回転させたい範囲を選んでマクロ実行する
'回転後の内容はセルA1を基 準に出力

    Dim i As Integer, j As Integer
    Dim vData As Variant
   
    'Variant型の変数に選択範囲の値を入れる
    vData = Selection
   
    For i = 1 To UBound(vData, 1)
        For j = 1 To UBound(vData, 2)
            '行と列を入れ替えて列ごとの内容を逆順にする
            Cells(UBound(vData, 2) - (j - 1), i) = vData(i, j)
        Next j
    Next i
   
End Sub


セルの内容を180度回転するコード:

Sub macro180211c()
'セルの内容を180度回転
'回転させたい範囲を選んでマクロ実行
'回転後の内容はセルA1を基準に 出力

    Dim i As Integer, j As Integer
    Dim vData As Variant
   
    'Variant型の変数に選択範囲の値を入れる
    vData = Selection
   
    For i = 1 To UBound(vData, 1)
        For j = 1 To UBound(vData, 2)
            '列の内容を逆順にして列ごとの順番を逆にする
             Cells(UBound(vData, 1) - (i - 1), _
                UBound(vData, 2) - (j - 1)) = vData(i, j)
        Next j
    Next i
   
End Sub

ちなみに反転は、
行方向の反転なら行の内容を逆順に
列方向の反転なら列の内容を逆順にすればできそうです。
興味があれば上記のコードを改造して作ってみてください。

|

« Calculation of units 1/10 sec and 1/100 sec | トップページ | Rotate cell contents 90 degrees, -90 degrees and 180 degrees »

コメント

配置表を回転させるコードを公開いただきましてどうもありがとうございます。

セルの値だけでなく、書式 (背景色や罫線)も含めて、
向きを回転させたい場合はどのようにすればよいのか、悩んでいます。

書式も含めた回転方法を教示いただくことはできませんでしょうか?

どうぞよろしくお願いいたします。

投稿: 書式付き座席表の回転 | 2020年5月16日 (土) 10時52分

コメントありがとうございます。
確かに記事内のコードでは値のみしか回転されません。

書式も含めた回転は
Copyメソッドで可能です。

記事内の「セルの内容を90度回転するコード」を
書式を含めて回転できるように変更したものを
次に記載しますので参考にしてください。
Sub macro180211a1()
'セルの内容を90度回転
'回転させたい範囲を選んでマクロ実行
'回転後の内容はセルA1を基準に出力

Dim i As Integer, j As Integer
Dim vData As Variant

'Variant型の変数に選択範囲の値を入れる
vData = Selection

For i = 1 To UBound(vData, 1)
For j = 1 To UBound(vData, 2)
'行を逆順にして、行と列を入れ替えてコピー
Selection.Cells(i, j).Copy _
Destination:=Cells(j, UBound(vData, 1) - (i - 1))
Next j
Next i

End Sub

投稿: 管理人やむえむ | 2020年5月16日 (土) 21時36分

やむえむさま、

Copyメソッドとその貼り付けに対応するコードを回答いただきましてどうもありがとうございます。

(自分でも Copy メソッドに取り組んでみていたのですが、エラーばかり発生して正しい使い方に辿り着けない状態でしたので、たいへん助けになりました。)

参考にして、早速明日「180度回転するコード」を試してみようと思います。またご報告します。

取り急ぎお礼まで。

投稿: 書式付き座席表の回転 | 2020年5月17日 (日) 00時32分

やむえむさま、

Copyメソッドとその貼り付けに対応するコードを回答いただきましてどうもありがとうございます。

参考にして「180度回転するコード」を別シートにコピーするようにしてみました↓。
(この記述が良いのか分からないのですが、もし改善案がありましたらお知らせいただけませんでしょうか?)

Sub rotate180degree()
'セルの内容を180度回転
'回転させたい範囲を選んでマクロ実行
'回転後の内容はセルA1を基準に 出力

Dim i As Integer, j As Integer
Dim vData As Variant

Dim OldSheet As Worksheet
Set OldSheet = ActiveSheet
Dim NewWorkSheet As Worksheet
Set NewWorkSheet = Worksheets.Add()
NewWorkSheet.Name = "向き反転"
OldSheet.Activate

'Variant型の変数に選択範囲の値を入れる
vData = Selection

For i = 1 To UBound(vData, 1)
For j = 1 To UBound(vData, 2)
'列の内容を逆順にして列ごとの順番を逆にしてコピー
Selection.Cells(i, j).Copy _
Destination:=Sheets("向き反転").Cells(UBound(vData, 1) - (i - 1), UBound(vData, 2) - (j - 1))
Next j
Next i

End Sub

残る課題として、以下の再設定が必要になります。
- 解除されたセル結合
- 列幅と行高さ

これらは一括設定できず、個別の設定やコードが必要になるのでしょうか?
もし対応案ありましたら、教示いただくことはできませんでしょうか?

何度も申し訳ございません。
どうぞよろしくお願いいたします。

投稿: 書式付き座席表の回転 | 2020年5月17日 (日) 13時53分

記載いただいたコードで
こちらでも実行できました。
元々即席でCopyメソッドに修正したのものですので
書き方の細かい点はご容赦を。

セルの結合が解除されてしまう問題について
コピー前に結合解除して結合時の値を各セルに入力しておき,
コピー先でセルの内容が同じものを再結合する方法で
クリアできないでしょうか。
コードは次の記事を参照ください。
https://yumem.cocolog-nifty.com/excelvba/2020/05/post-7a4bae.html

列幅と行高さは
自分であれば,
コピーするという発想よりは
コピー先で新たに設定します。
設定の例:
Cells(1, 1).ColumnWidth = 10
Cells(1, 1).RowHeight = 10

参考になれば幸いです。
成功されますこと願っております。

投稿: 管理人やむえむ | 2020年5月17日 (日) 22時42分

やむえむさま、

優しいお気持ち/言葉で、
セル再結合の方法を紹介いただきましてどうもありがとうございます。

参考にして、明日以降組み込んでみようと思います。

書き方で質問したかったのは、Copyメソッドではなく、
私が追加したコピー先を別シートにするコードです。
(VBA に詳しくないため、自信がありません)

列幅と行高さについてもご検討ありがとうございます。
90度回転の場合、回転前の列幅が回転後の行高さになるため、
ColumnWidth を RowHeight に設定してみようと思います。

結果はまたご報告します。
取り急ぎお礼まで。

投稿: 書式付き座席表の回転 | 2020年5月18日 (月) 12時49分

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: セルの内容を90度回転、-90度回転、180度回転:

« Calculation of units 1/10 sec and 1/100 sec | トップページ | Rotate cell contents 90 degrees, -90 degrees and 180 degrees »