[[20210901110704]] 『カレンダーの空白欄に誕生者の名前を記載する』(マクロ G g) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『カレンダーの空白欄に誕生者の名前を記載する』(マクロ G g)

横書きのカレンダーの空き欄に、生年月日が一致した方の名前を記載すべくマクロを作成しましたが、「実行時エラー 型が一致しません」となり上手く動きません。「For Each」の使い方に問題があると思うのですが“どう使えばいいのか”わかりません。「For Each 〜 For Each 〜」とFor Eachを2回使う使い方或いは別の使い方があればその方法をご指導願います。

Sub 誕生者記載()

    Dim myr As Range
    Dim cl As Range

    For Each myr In Worksheets("誕生日").Range("A2:A9")
                '("A2:A9")は2021/1/型年月日

      For Each cl In Range("B3").Resize(12, 7)
        If Month(cl) Like Month(myr) And Day(cl) Like Day(myr) Then
             cl.Offset(1).Value = myr.Offset(, 1).Value 
                              'Offset(, 1)は名前
             cl.Offset(1).Font.Color = RGB(255, 0, 0)
             End If

        Next
    Next

End Sub

< 使用 Excel:Excel2016、使用 OS:Windows10 >


↓は正しいですか?
 For Each cl In Range("B3").Resize(12, 7)

 cl.Offset(1).Value = myr.Offset(, 1).Value 'Offset(, 1)は名前

ならば、条件を満たしたときに名前を書き込むのですから、↓になったときに困りませんか?

 Month("名前")

(もこな2 ) 2021/09/01(水) 11:37


ご指摘ありがとうございます。名前の書き込みですが、別シートに生年月日(例:2021/1/1)、そのセルの右横に氏名を書き込んでいます。問題は『Worksheets("誕生日").Range("A2:A9")』のFor Each myr Inと『Range("B3").Resize(12, 7)』で使っているFor Each cl Inでの“For Each”の使い方が分かっていないことです。2つのFor Eachの使い方をお教え願います。
(マクロ G g) 2021/09/01(水) 18:33

落ち着いてステップ実行して確認してみましょう。

例えばB3セルが条件を満たしたら、B4セルに【名前】が書き込まれますよね?

 ※cl.Offset(1)なのですから 書き込まれる対象のセルはB3セルの1行下になります。

そして、ループが進んでいくと「cl」は↓のようになっていきますよね。

 B3,C3,D3,E3,F3,G3,【B4】,C4.....

しかし、B4セルには上記の処理で【名前】が書き込まれてますよね?
Month関数で月を取り出そうとしても【(日付型のデータじゃないから)型があわない】となりませんか?

すなわち、名前が書き込まれるセルと日付が書いてあるセルは別になってないと変じゃないですか?

 カレンダーと仰ってますし、7列なので1週間ごとに行が変わるのは想像できるんですが、
 12行の正体がよくわかりません、
 (4行ごとに1セットとかじゃないかと想像しますが、レイアウトの説明が無いのでよくわかりません)

(もこな2 ) 2021/09/01(水) 20:42


・舌足らずの説明で申し訳ありません。前段にカレンダーの設定構文があり、それには通常カレンダーは6〜7行で1ケ月分の表示が出来るのですが、誕生者の名前を記載したいのでそれぞれの“日”の下に1行設けて12行の設定、即ちRange("B3")を起点とした『Range("B3").Resize(12, 7)』としました。この1行(空白行)に該当者の名前を記述させようとしたところです。しかし、結果は「実行時エラー」となり上手く“動いて”くれません。そこでご指導頂きたいのは別のSheetで作成した年月日の“年”だけをカレンダーの年月日の「年」に変換するのではなく、あくまでカレンダーの「月日」と誕生者の「月日」とを照合させて該当者の名前をカレンダーに記述させる構文の作成型をご指導願うものであります。

(マクロ G g) 2021/09/01(水) 22:17


 こんばんは ^^
回答ではありませんが。。。何かの足しにでも。。。( ̄▽ ̄)
新規の空シート[選択して^^;]でお試しを
Option Explicit
Sub stp2()
    Dim r As Range
    Dim i As Long
    Dim j As Long
    Set r = Range("B3").Resize(12, 7)
    For i = 1 To r.Rows.Count Step 2
        For j = 1 To 7
            If r(i, j) = Empty Then
                r(i, j).Offset(1) = "A"
            End If
        Next
    Next
End Sub
(隠居Z) 2021/09/01(水) 22:40

 奇数行だけ処理させればいいんじゃないですか?

 まぁ、ちょっと冗長ですけど、トラブルは回避できますよ。

 Sub 誕生者記載()
     Dim myr As Range
     Dim cl As Range
     For Each myr In Worksheets("誕生日").Range("A2:A9")
         '("A2:A9")は2021/1/型年月日

         For Each cl In Range("B3").Resize(12, 7)
             If Application.IsOdd(cl.Row) Then '奇数行だけ処理

                 If Month(cl) Like Month(myr) And Day(cl) Like Day(myr) Then
                     cl.Offset(1).Value = myr.Offset(, 1).Value
                     'Offset(, 1)は名前
                     cl.Offset(1).Font.Color = RGB(255, 0, 0)
                     Exit For
                 End If
             End If
         Next
     Next
 End Sub

(半平太) 2021/09/01(水) 22:43


隠居Z様並びに半平太様には早速愚問にお答えいただき痛み入ります。
「For Each」を2回続けて使うことに問題が有るのかと思っていたもので…。ご指導ありがとうございました。
(マクロ G g) 2021/09/02(木) 09:50

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.