• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:コードの簡略化(変数を少なくできますか?))

VBAコードでカレンダーの表示を短くする方法

このQ&Aのポイント
  • VBAのコードでカレンダーの表示を簡略化する方法について教えてください。
  • 現在のコードでは変数の数が多く、無駄に感じます。もっとスッキリとしたコードにする方法はありますか?
  • セルの幅や高さを調整する際に、より短くなる方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率66% (1725/2595)
回答No.4

For i = 1 To 40 Step 13 この時「i」には各月の先頭行(月の行)が入っていますので ↓先頭行(月の行)と次の行(曜日の行) Range(Rows(i), Rows(i + 1)).RowHeight = 14 先頭行の2行下(月-日の行)と3行下(Do i)から始まって2行おきに5回 For j = 2 To 11 Step 2 Rows(i + j).RowHeight = 16 Rows(i + j + 1).RowHeight = 40 Next Next 2 To 11は 2 To 10で良かったです。 NuboChanさんのコード For i3 = 3 To 11 Step 2 Rows(i3).RowHeight = 16 Next の所をコピペして書き替えたときに11を書き替え忘れてました。 NuboChanさんのコードを見ても 'セルの高さ調整(月-日の行)//月の行の2行下から始まる i3 = 3 i4 = 16 以下略 'セルの高さ調整 - Do it //月の行の3行下から始まる i7 = 4 i8 = 17 以下略 となっていますし、各5回ループの始まりは13行飛ばしになっています。

NuboChan
質問者

お礼

説明を受けて理解が深まり作成の手順が少しは理解できました。 コードを少し変更しました。 こちらの方が私には判りやすいです。 iiを上から順番に行幅に対応するように当てはめて行きました。 (iとjは既に、他の場所で利用しているのでiiとjjに変更しました。) For ii = 1 To 40 Step 13 '月のカレンダー開始行は、1,14,27,40 の4回 (同じ処理) Rows(ii).RowHeight = 14   ’月の行 (先頭) Rows(ii + 1).RowHeight = 14 '曜日の行 (次の行) For jj = 1 To 5 '月-日の行、Do-Itの行は、月に5回作成で2行がセット Rows(ii + 2 * jj).RowHeight = 16 Rows(ii + 2 * jj + 1).RowHeight = 40 Next Next

その他の回答 (3)

回答No.3

質問の目的が理解できません。 セル幅及び高さをVBAで指定したいとは、目的によって幅、高さを変えて作成したいということでしょうか? VBAの勉強が目的というのでなければ、Excelの基本的機能で対応したほうが良いと思うのですがいかが? セル幅の調整 1)列B~Hを選択 2)ホーム/セル/書式/列の幅 で幅を指定すれば一度に設定できる セルの高さ調整 1)幅と同様指定したい行を選択(ctrlキーを押しながら選択すれば離れた行も選択可) 2)ホーム/セル/書式/行の高さ で高さを指定すれば一度に設定できる どうしてもVBAでやってみたい場合は、No.2の方法になります。

NuboChan
質問者

補足

おっしゃるようにシートの列、行に対して 直接数値を設定して変更出来ることは理解しています。 今回の場合は、1度実行すれば 同じフォーム(カレンダー)なので毎回VBAで再設定する必要も無いことも承知しています。 自分で作成したコードに納得が行かなかったのでVBAの勉強も兼ねた相談です。 アドバイスを受けて 既にコードの簡略化ができたので個人的には満足しています。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

質問文には、したいことを(エクセルの列、行、セルなどのエクセルの用語で)文章で書いてほしい。こんな繰り返しのコードを読むのは苦痛。 一例としての 参考で ・繰り返しの利用 ・(限定のために)配列で値の列挙の利用 を勧める。 繰り返すときに変化する箇所をどう表現するか、がポイント。 Sub test01() n = 1 For Each r In Array(3, 5, 7, 9) For Each cl In Range("A" & r & ":" & "G" & r) MsgBox cl cl.Interior.ColorIndex = 6 cl.RowHeight = 22 cl.ColumnWidth = 23 n = n + 1 If n > 20 Then Exit Sub Next Next End Sub を挙げてみる。 n=1 n = n + 1 If n > 20 Then Exit Sub は テスト用で、実際は省くもの。

NuboChan
質問者

お礼

imgashiさんへ、 コードだけで読見とくのは難しいと考えて 1ヶ月分だけですコードを実行した後の画像を参考にのせています。 (4ヶ月だと画像が小さくなってしまうので1ヶ月分だけす。   画像には罫線がありますが他のコードで書いていますが。  今回の質問には、無関係なので気にしないでください。) 回答は、配列を利用したものですが初心者には難しいので kkkkkmさんの回答を先に追いかけたいと思います。

NuboChan
質問者

補足

以下、先の「お礼」が変な記事になり 読みにくいので以下のように修正させてください。 ’------------------------------------------------ imgashiさんへ、回答かんしゃします。 コードだけで読見とくのは難しいと考えて 1ヶ月分だけですがコードを実行した後の画像を参考にのせています。 (4ヶ月だと画像が小さくなってしまうので1ヶ月分だけです。   画像には罫線がありますが他のコードで書いていますので、  今回の質問には、無関係なので気にしないでください。) 回答は、配列を利用したものですが初心者には難しいので kkkkkmさんの回答を先に追いかけたいと思います。

  • kkkkkm
  • ベストアンサー率66% (1725/2595)
回答No.1

以下で試してみてください。 1か月ごとでセットして4か月分ループしてます。 Sub Test() Dim i As Long, j As Long Columns("B:H").ColumnWidth = 10 For i = 1 To 40 Step 13 Range(Rows(i), Rows(i + 1)).RowHeight = 14 For j = 2 To 11 Step 2 Rows(i + j).RowHeight = 16 Rows(i + j + 1).RowHeight = 40 Next Next End Sub

NuboChan
質問者

お礼

kkkkkmさん、今回もお世話になります。 提示いただいたテスト用のマクロと 私が作成したマクロを交換して上手く同じ処理が出来ている事を確認しました。 いただいたコードをですが、構造を読み解こうとするのですが 現在まで理解できていません。 「1か月ごとでセットして4か月分ループしてます。」 For i = 1 To 40 Step 13 - Next が4ヶ月分の4回ループ と言う事は何となく分かったのですが後は理解が及びません。 Kkkkkmさんは、どうやってこのコードに至ったのか、 もう少し解説いただけませんか?

関連するQ&A

専門家に質問してみよう