セルの内容を90度回転、-90度回転、180度回転
Excelで座席表やオフィスの配置図などを作ることありますよね。
どちらを上にして作ればいいのか迷ってとりあえず作ったけど
やっぱりこっちの向きが良かった
とか
自分の座っている席から見てこの向きの座席表だと見難い
など
セルの内容を
90度回転(時計回りをプラス方向)させたり、
180度回転させたりしたい
と思ったことありませんか?
こんな場合に使えるマクロを作りたいと思います。
セルの内容を90度回転させるとは
どういう操作なのでしょうか?
下図の左側の配置を右側のように
90度回転させるために必要な操作は何でしょうか?
まず左側の行(A,B,C,D)が列の向きになって
(A,B,C,D)が1行目だったのが2列目になります。
2番目の行は1番目の行と同様に列の向きになって
2行目だったのが1列目になります。
つまり行と列を入れ替えて、列自体を逆順にすることが
セルの内容を90度回転させることです。
-90度回転は下図のとおり
行と列を入れ替えて
列の内容を逆順にする。
90度回転するという操作が
実は、
行と列の入れ替えや逆順にするとできる
というのは不思議な感じです。
では180度回転させるとはどういう操作でしょうか?
下図を見てください。
1行目(A,B,C,D)が逆順になって
さらに列自体も逆順になります。
これをVBAで行うには
列の内容を逆順にして
列ごとの順番を逆にする。
180度回転では行と列の入れ替えはしないで
逆順にするという操作で出来るんですね。
VBAでこれらの操作を行うのに
今回は選択した範囲を配列に格納して
For文とUBoundを使って入れ替えをしていきます。
セルの内容を配列に格納して使用する方法については
こちらの記事も参照してください。
『セルの値を配列に格納して使う』
コードはこちら
Sub macro180211a() Dim i As Integer, j As Integer |
Sub macro180211b() Dim i As Integer, j As Integer |
Sub macro180211c() Dim i As Integer, j As Integer |
ちなみに反転は、
行方向の反転なら行の内容を逆順に
列方向の反転なら列の内容を逆順にすればできそうです。
興味があれば上記のコードを改造して作ってみてください。
| 固定リンク
« 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分