• 締切済み

エクセルVBAでカレンダー作成したいのですが(罫線)

エクセルVBAでカレンダーを作りたいのですが、次の点が分かりません。 1. 月末日が4週目にくる場合と5週目にくる場合があり、罫線を引く範囲が変わってしまいます。usedrange等で範囲指定後罫線を引きたいのですが、各セルは数式により日にちを表示させているので、月末日以降の空白セルまで範囲指定指定しまい4週で終わる月であっても5週目まで罫線を引くことになります。セル内の数式を無視し、月末日までの週を範囲指定する方法をご教授ください。

みんなの回答

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.4

どのようなカレンダを作成されているのか質問からだけでは分かりませんが、週初めの曜日がA列、週終わりの曜日がG列なら、(A列に日付が入っている) Or (G列に日付が入っている) 条件に合致する行のA列:G列のみ1行単位に枠線を指定したらどうでしょうか

lether2006
質問者

お礼

ありがとうございます。一度試してみます・

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 最初に、どこかに(シリアル値の)日付はありませんか? UsedRange は、あまりうまくありません。とんでもない場所に飛んでしまうことがあります。CurrentRegion なら分かりますが。しかし、やはり、それは、明示的に範囲を決めたほうがよいと思います。 なお、通常は、マクロではなくて、すべて計算で行います。私の作ったカレンダーで、六曜カレンダだけが、VBAを使っています。罫線をつけたり抜いたりするのは、条件付書式で行います。 このマクロは、週の曜日などが考慮されていませんから、週の数そのままでしか出ません。 lDate は、晦日(みそか)の日付データです。こうすると、晦日が何週目か出てきます。  cnt = Int((Day(lDate) - 1 + Weekday(lDate - Day(lDate))) / 7) + 1   この「+1」のところをひとつ増やせば、出ます。  晦日(lDate)の出し方 mDate は、その月の任意の日付です。 lDate = DateSerial(Year(mDate), Month(mDate) + 1, 1) - 1 これは、あくまでもサンプルで、マクロを読んで、場所の特定化などさせるようにしてください。最初に、何も書かれていないシートで試してみて、実際に当てはまるようにさせてください。 '標準モジュール '----------------------------------------------- Sub WeeksInMonthCount()  Dim mDate As Date  Dim lDate As Date  Dim cnt As Integer '週の数  '日付のあるセルにおきます。  '本来は、ActiveCell ではなく、特定のセルに決めておきます。  If IsDate(ActiveCell.Text) = False Then   MsgBox "日付のあるセルを置いてください。", vbInformation   Exit Sub  Else   mDate = CDate(ActiveCell.Text)   lDate = DateSerial(Year(mDate), Month(mDate) + 1, 1) - 1  End If  '週の数  cnt = Int((Day(lDate) - 1 + Weekday(lDate - Day(lDate))) / 7) + 1  Range("A1").CurrentRegion.Borders.LineStyle = xlNone  With Range("A1").Resize(cnt, 7)   With .Borders    .LineStyle = xlContinuous    .Weight = xlThin    .ColorIndex = 1 '黒   End With  End With  ''Call PutInDate(mDate) End Sub Sub PutInDate(mDate As Date) '日付を入れるマクロです。 Dim n As Integer Dim m As Integer n = 1 Range("A1").ClearContents For i = DateSerial(Year(mDate), Month(mDate), 1) To DateSerial(Year(mDate), Month(mDate) + 1, 1) - 1   If Day(i) = 1 And Weekday(i) = 1 Then     m = Weekday(i)   ElseIf Weekday(i) = 1 Then     n = n + 1     m = Weekday(i)   Else     m = Weekday(i)   End If     Cells(n, m).Value = i Next i End Sub

lether2006
質問者

お礼

ありがとうございます。一度試してみます・

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

色んなやり方がありえる。一例 Sub test01() nen = 2007 tuki = 2 df = DateSerial(nen, tuki, 1) '月初日 wf = Weekday(df) + 1 '開始行がB列で+1 dl = DateSerial(nen, tuki + 1, 1) - 1 '月末日 nissu = Day(dl) '月日数 '--初期化 j = 4 '開始行は第4行 k = wf '開始列B列 Range("B4:H10").Clear '日付範囲クリア '-- For i = 1 To nissu '月の末日までの日数字について If Weekday(DateSerial(nen, tuki, i)) = 1 Then j = j + 1 '次行へ k = 2 'B列に位置づけ End If Cells(j, k) = i '日数字をセット k = k + 1 Next i '--罫線 Dim cl As Range Range(Cells(4, "B"), Cells(j, 8)).Select For Each cl In Selection cl.Borders(xlEdgeLeft).LineStyle = xlContinuous cl.Borders(xlEdgeTop).LineStyle = xlContinuous cl.Borders(xlEdgeBottom).LineStyle = xlContinuous cl.Borders(xlEdgeRight).LineStyle = xlContinuous cl.Borders(xlEdgeLeft).LineStyle = xlContinuous Next End Sub B4:H4に日ー土を入れる。 年、月はA1:B1などに入れる(上記では略) B4:H10の書式は、数に設定

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.1

こんな感じでしょうか。UsedRangeの最終行の1列目が空文字列の場合、それより上の範囲をRにセットします。 Sub test()   Dim R As Range   Set R = UsedRange   If R.Cells(R.Rows.Count, 1).Text = "" Then     Set R = R.Resize(R.Rows.Count - 1)   End If   R.Select End Sub

lether2006
質問者

お礼

ありがとうございます。一度試してみます・・・

関連するQ&A

  • エクセル2007でのカレンダー作成

    エクセルでカレンダーを作成したいのですが、関数がわからず悩んでいます。 カレンダーといっても七曜日のものではなく、月曜日から金曜日までの五日間を繰り返すものです。(勤務体系の資料に使うものです) セルC3に年・月を入力し、その後D3~Z3~AB3の合計25セルに「日付」が、D4~Z4~AB4の合計25セルに「曜日(月~金の繰り返し」を出すことは可能でしょうか? 25セルあるのは、平日五日間×五週間=25セルとなっています。週に合わせて日付が反映されるようにしたいのです。 たとえば、今年の11月の場合だと、3日・月曜日は二週目になるので、二週目月曜日の位置(I3)の位置に3と表示されるように、12月の場合だと、一週目月曜日の位置(D3)の位置に1と表示されるようにしたいです。 加えて、日付が埋まらないセルは、下段の曜日と一緒に空白のセルになるようにしたいです。 ご指導よろしくお願いします。

  • Excelでのカレンダー作成について

    Excelでカレンダー(1カ月分)を作っているのですが、祝日に色を付けるのがどうしてもうまくいきません。 祝日の日付を入れたセルを用意したのですが、1つ関数につき1日分しか色をつけれませんでした =COUNTIF((1),(2))>=1 (1)祝日の日付を入れた複数の範囲のセル (2)カレンダーの日付のセル[1日分] これでやると1カ月分すべてのセルに対して1日ずつ条件を入れなければならないです。 (2)で1カ月分の日付の範囲をすべて選択してみたのですが、うまく表示されませんでした(>_<) どのような関数をつかえば、1カ月分すべての祝日の色を変えることが出来るでしょうか? 回答お願いしますm(_ _)m

  • エクセルVBAのカレンダーコントロールについて

    エクセルVBAでカレンダーコントロールを利用しました。 ユーザーフォームに貼り付け、クリックすれば指定のセルに年、月、日などを取り出すことができました。 が、クリックした日の曜日を取り出す(セルに曜日を入力する)ことはできないのでしょうか。 また、セルの書式設定でユーザー定義の設定のしかたで、日付を曜日に表示変更することができたと思うのですが・・ よろしくお願いします。

  • エクセルのカレンダーコントロールについて

    エクセルでカレンダーコントロールを使用したいと考えています。 目的は使用した物の履歴を管理したいと考えており、その使用日を手入力ではなく、セルをクリックしたらカレンダーコントロールが出てきて、日にちをクリックするとそのセルに日にちが反映されるようにしたいと思っています。 いろいろとHPをみて探してみましたが、分からなかったため質問致しました。 文面が分かりずらいかと思いますが、要はセルをクリックしたらカレンダーコントロールが出てきて、カレンダーコントロール内の日付けをクリックするとその日がセルに出てくれば良いです。(カレンダーコントロールにはこだわっていません) OFFCE-XPのprofessionalを使用しています。 ご回答よろしくお願い致します。

  • エクセルでカレンダーを作ったのですが

    長文で分かりにくいかもしれませんがよろしくお願いします 任意の月であ~おの5種類のチェックを行ったか?というカレンダーを作りました あ~おの欄にはそれぞれチェックした日付が入り、週単位で管理します(ひと月はだいたい5週×5チェック分のセルに分けています) *例*6/21なら6月の第4週の欄が塗りつぶしされる weeknum関数でその週を固定し、指定のセルに条件付き書式で色を付けるように作りました *例*B1=weeknum(A1) A1に6/21と入れると26週目、条件付き書式にはB1のセルに「数式」で=A1=26の時青に塗るみたいに これで一応うまくは動いていました ところが作ってみてわかったのですが、例えば翌週の6/30の場合27週、7/1も27週となりかぶってしまう為、塗り分けられるのが2箇所になってしまうのです そこで新たに month関数とその月の第何週かを導く関数を使用し、上記6/21なら64というような数字ができるようにしました(これでかぶりがないと思いまして。。) *=MONTH(A1)&CEILING((DAY(A1)+7-WEEKDAY(A1))/7,1) ところがこの式でだした数字だと条件付き書式では反応なし。 &を使わず分解して改めて他のセルで合体させてもダメ、=〇〇にしてもダメ 試しにmonth関数のみにすると動きました(もちろん導きした数字は月のみなので役に立ちません) 難しい条件式なら動かないという仕様ならわかるのですが、=〇〇(任意のセル参照)でも動かないっていうのがどうにもわかりません (*条件付き書式は何かシビアな様なので新しくシートを作ってもみましたがやはりダメでした) これは何かあるのでしょうか? 何か動かすよい知恵はないでしょうか? P.S. 結局一番やりたいことは ひと月、週×5チェック分の欄に日付を入れたら綺麗に振分られるというのが出来れば いいので上記のようなやり方をしなくてもという方法があれば教えてください

  • EXCELで罫線が引かれてるのに、見えない!!

    タイトルには十分に書ききれなかったので「オッ!?」と思ってくださった方 ありがとうございます。 実は、他人が作った見積シートを修正していたのですが、行をコピーして コピーしたセルの挿入したら、罫線が消えてしまったんです。 罫線を引く時って、普通セル範囲を指定して、セルの書式設定で引きますよね? でも、今引かれてる罫線はセルの書式設定の罫線で見ても空欄になってるのです。 ???なんで? この会社の人達は、なぜか罫線引く時に、矢印のとなりにある線で引くので めちゃ職人技のような罫線を引いていることが多々見受けられるのですが、 今修正してるシートは、その線、矢印、オートシェイプなどもグレイアウトしてて 使えません・・・。(他のシート=Bookでは使えます) これまで、縦の合計くらいしか出したことのない私です、補足もしますので 何かヒントを教えてください。

  • VBAでカレンダーに祝日を自動反映させる

    いつもお世話になっています。 どうかよろしくお願いします。 営業日報を作ろうと思い、 ・A1に任意の月(yyyy/mm/01)を入れ ・B3からAJ3までのセルに月・・・日、と7曜日を5週分並べ ・直下のセルに数式を入れ、A1に入力した月のカレンダーが表示されるようにしています しかし祝日は稼働見込みが平日土日と異なるため、祝日の曜日を赤く(セル塗りつぶし&白字)表示させたいと思っています。 月によって祝日の日が異なり、しかも振り替え休日も存在しますが、どなたか助けていただければ幸いです。 よろしくお願いします。

  • VBAのヒントを(暦)

    あるカレンダーがありまして、それを指定期間分、自動作成するVBA(Excel)を作りたいと思っています。 まずひとつは1~末日まで日数がありまして、それの特定の日(たとえば、日曜や○週目)のみにセルに色づけするというプログラムを作りたいと思っています。 もうひとつは普通にカレンダーを自動で作りたいんですが、アルゴリズムがよくわかっていません。両方とも手順について詳しく教えていただけると助かります。よろしくお願いします。

  • エクセル2003でカレンダーを作成したのですが

    そのカレンダーに、誕生日に該当する人の名前を 出てくるようにしたいのですがどういった関数?計算式?を 使用すればいいのでしょうか。 ひとまず、A1セルに2010/1/1を入力し、下に =IF(MONTH($A$1)<>MONTH($A$1-WEEKDAY($A$1)+COLUMN(F1)+7*(ROW(F1)-1)),"",$A$1-WEEKDAY($A$1)+COLUMN(F1)+7*(ROW(F1)-1)) を入れて、あとはオートフィルでカレンダーを作りました。 別シートに、「名前」「誕生月」「日にち」が入ったデータはあるので、ここから引っ張ってこれるようにしたいのですが・・ 説明が下手で申し訳ありません。 ちなみにエクセルはほぼ初心者です。カレンダーもネットで調べて、やっとこさ作成しました。 別シートのデータを、「月と日付別々じゃなくて12/3みたいに 打ち直して、こういう関数つかってやればいいんじゃない?」 などなど、あればお聞きしたいです。

  • エクセルでカレンダー

    プライベートでエクセルでカレンダーを作り予定表などを入力して使っています。 やり方は 1.1行の各列にに日、月、・・・・土 2行以下は各曜日の下のセルに日にちが入れてあります。 2.各セルは3行分の行高さが取ってあり日にちは上詰め中央に表示し、予定は下2行に入れています。 3.日にちは日曜日、祝日は赤でその他は黒で表示し、予定は青で書き込みます。 4.本日以前の日にちや、予定は毎日紫に変更しています。 質問 自動で4の操作と本日の日付のあるセルを黄色で塗りつぶす様に出来ないでしょうか? そのプログラムを教えていただきたいのです。

専門家に質問してみよう