発展編1 フォローメールセミナー 第29回

この講座は有料講座です。
講座の購入後ご覧になれます。

ログインアカウントの新規作成

解説

発展編1のフォローメールセミナー第29回のフィードバック記入ページです。 【動画はありません】個別ページにて重要事項満載のフォローメールをお読みいただけます。

この教材についての過去の質問・感想

12978 : 小川慶一の回答 (2021-04-16 16:39:39)

受講生 さん:

こんにちは。

成果報告、ありがとうございます。
順調にお仕事での結果につながっているようで、何よりです。

> こういう便利なものが作れるようになり、人の役にも立てて本当に良かったです。ありがとうございます。

本人も楽しめて、周囲の人の役にも立てて、マクロを使えるようになると本当に良いですよね。

ひきつづき、よい学び/よい成果を!
ますますのご活躍、祈念しております☆


12976 : 受講生さんのコメント (2021-04-15 22:53:47)

お世話になっております。

先日、職場で出社/在宅勤務の予定表(縦が社員一覧、横が日にちの表)を作る機会があり、カレンダー作成マクロを活用することができました。

「とりあえず4月分を作って!」との依頼でしたが、5月以降も必要になるので、来年3月分まで作ってしまいました。

手作業だと1ヶ月分を作るのも大変ですが、マクロなら1年分、土日祝日に色付けをしてもあっという間ですね。

こういう便利なものが作れるようになり、人の役にも立てて本当に良かったです。ありがとうございます。


12913 : 小川慶一の回答 (2021-02-26 11:35:39)

らりおさん:

追加でひとつお伝えしたいことを思い出してお返事しています。

> 職場でこのような宣言の仕方をしているマクロを発見し、使ってみたのですが、最後のものしか型指定できていないことになるのですね。

この間違いは、よく見かけますね。

VBはVBでも、VB.NETという別の言語だと、提案のような書き方で、すべてについて型を指定できます。
そのため、混同されている方が多いようです。

以下の両記事を参考にしてください。
どちらも、Microsoftが出している公式ドキュメントです。
前者はVBAの、後者は VB.NETの変数宣言についての記事です。それぞれで引用しているコードをドキュメント内で見つけて、読んでみてください。
良い勉強になるかと思います。


【VBA】
Docs > Office VBA > リファレンス > 言語リファレンス > リファレンス > ステートメント > Dim
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/dim-statement

'この例では、変数を宣言する目的で使用された Dim ステートメントを示しています。 また、配列を宣言する目的で使用された Dim ステートメントも示しています。 配列の添字の既定の下限は0で、 Option Baseステートメントを使用してモジュールレベルで上書きすることができます。
'
' Multiple declarations on a single line. AnotherVar is of type Variant 
' because its type is omitted. 
Dim AnotherVar, Choice As Boolean, BirthDate As Date 



【VB.NET】
Docs > .NET > Visual Basic ガイド > 言語リファレンス > Dim ステートメント (Visual Basic)
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/statements/dim-statement

複数の変数の宣言

'1 つの As 句で複数の変数を宣言する場合、その変数のグループの初期化子を指定することはできません。
'宣言する変数ごとに個別の As 句を使用して、異なる変数に異なるデータ型を指定できます。 各変数は、variablename 部分の後に最初に検出される As 句に指定されたデータ型を受け取ります。
Dim a, b, c As Single, x, y As Double, i As Integer
' a, b, and c are all Single; x and y are both Double


12910 : らりおさんのコメント (2021-02-22 20:30:19)

小川慶一さん:
こんばんは。早速の添削ありがとうございました。
職場でこのような宣言の仕方をしているマクロを発見し、使ってみたのですが、最後のものしか型指定できていないことになるのですね。
使う前に自分でもよくよく吟味してみるべきでした。
ご指摘ありがとうございます。

> 受講生 さん:
>
> おはようございます。
>
> 拝見しました。
> 特に重要な指摘事項はないかと思います。
>
> 変数宣言では、各変数ごとに、型を示してください。
> でないと、最後の1つ以外は型宣言なし(Variant型)とみなされてしまいます。
>
>

'Dim c, saKi, saiGo, yoKo, Gyo As Long '変数をカテゴリー別にまとめた
> Dim c As Long, saKi As Long, saiGo As Long, yoKo As Long, Gyo As Long

>
> このくらいできるようになれば、発展編1技術は十分に習得できていることと思います。
>


12906 : 小川慶一の回答 (2021-02-22 11:12:08)

受講生 さん:

おはようございます。

拝見しました。
特に重要な指摘事項はないかと思います。

変数宣言では、各変数ごとに、型を示してください。
でないと、最後の1つ以外は型宣言なし(Variant型)とみなされてしまいます。

'Dim c, saKi, saiGo, yoKo, Gyo As Long '変数をカテゴリー別にまとめた
Dim c As Long, saKi As Long, saiGo As Long, yoKo As Long, Gyo As Long


このくらいできるようになれば、発展編1技術は十分に習得できていることと思います。


12901 : 受講生さんのコメント (2021-02-20 10:50:21)

お世話になっております。
空でカレンダーマクロを1から作りましたので添削して頂けると嬉しいです。
コメント部分に自身なりの考えでアレンジした部分を示しています。
よろしくお願いします。(`・ω・´)

Option Explicit
Dim c, saKi, saiGo, yoKo, Gyo As Long '変数をカテゴリー別にまとめた
Dim Hiduke, hiNiti As Date
Dim Sum, Ctrl, ws As Worksheet
Dim SumrA, CtrlA1, CtrlF2 As Range
Dim Syuku As Boolean
'これくらいのものであれば、シート作成とカレンダ―内の作業の
'プロシージャを分けなくてもそこまでややこしくないと考え、一緒にした。
Sub Carenda_soukatu()
    Sheet_sakujo
    Hiduke = #1/1/2021#
    Set Sum = Worksheets("Summary")
    Set Ctrl = Worksheets("Control")
    Set CtrlA1 = Ctrl.Range("A1")
    For c = 1 To 12
        Sum.Copy after:=Sheets(Sheets.Count)
        ActiveSheet.Name = c & "月"
    Next
    For c = 1 To 12
        Worksheets(c & "月").Activate
        saiGo = Sum.Range("A" & Sum.Rows.Count).End(xlUp).Row + 1
        Carenda_main
        Hiduke = DateAdd("m", 1, Hiduke)
    Next
    Ctrl.Activate
End Sub
Sub Carenda_main()
    hiNiti = Hiduke
    saKi = 0
    With Range("A2")
        Do While Month(hiNiti) = Month(Hiduke)
            .Offset(saKi).Value = hiNiti
            .Offset(saKi, 1).Value = WeekdayName(Weekday(hiNiti))
            .Offset(saKi, 2).Value = #9:00:00 AM#
            .Offset(saKi, 3).Value = #5:00:00 PM#
            .Offset(saKi, 4).Formula = "=" & .Offset(saKi, 3).Address & "-" & .Offset(saKi, 2).Address
            Set SumrA = Sum.Range("A" & saiGo)
            For yoKo = 0 To 4
                SumrA.Offset(saKi, yoKo).Formula = "=" & .Worksheet.Name & "!" & .Offset(saKi, yoKo).Address
            Next
            
            Syuku_hantei
            Set CtrlF2 = Ctrl.Range("F2") '4回も出てきて煩わしいので1つの変数として置いた
            If Syuku = True Then
                With Range(.Offset(saKi), .Offset(saKi, 4))
                    .Interior.Color = CtrlF2.Interior.Color
                    .Font.Color = CtrlF2.Font.Color
                End With
                With Range(SumrA.Offset(saKi), SumrA.Offset(saKi, 4))
                    .Interior.Color = CtrlF2.Interior.Color
                    .Font.Color = CtrlF2.Font.Color
                End With
            Else
                With Range(.Offset(saKi), .Offset(saKi, 4))
                    .Interior.Color = CtrlA1.Offset(Weekday(hiNiti)).Interior.Color
                    .Font.Color = CtrlA1.Offset(Weekday(hiNiti)).Font.Color
                End With
                With Range(SumrA.Offset(saKi), SumrA.Offset(saKi, 4))
                    .Interior.Color = CtrlA1.Offset(Weekday(hiNiti)).Interior.Color
                    .Font.Color = CtrlA1.Offset(Weekday(hiNiti)).Font.Color
                End With
            End If
            
            hiNiti = DateAdd("d", 1, hiNiti)
            saKi = saKi + 1
        Loop
    End With
End Sub
Sub Syuku_hantei()
    Syuku = False
    For Gyo = 2 To 18
'あくまで今年のカレンダーを作ったため↓。
        If Month(hiNiti) = Month(Ctrl.Range("C" & Gyo).Value) And _
           Day(hiNiti) = Day(Ctrl.Range("C" & Gyo).Value) Then
            Syuku = True
            Exit For
        End If
    Next
End Sub
Sub Sheet_sakujo()
    Application.DisplayAlerts = False
    For Each ws In Worksheets
        If ws.Name <> "Control" And ws.Name <> "Summary" Then
            ws.Delete
        End If
    Next
    Application.DisplayAlerts = True
    Sum_clear
End Sub
Sub Sum_clear()
    Set Sum = Worksheets("Summary")
    saiGo = Sum.Range("A" & Sum.Rows.Count).End(xlUp).Row
    If saiGo > 1 Then
        With Sum.Range("A2:E" & saiGo)
            .ClearContents
            .Interior.Color = xlNone
            .Font.Color = vbBlack
        End With
    End If
End Sub


12527 : 小川慶一の回答 (2020-10-21 17:19:39)

たかちゃんさん:

こんにちは (^^

> 基礎編から初めてちょうど2ヶ月経ちましたが、自分でも驚くほど上達しました。
> 今回の経験を通じてプログラミング能力だけでなく、自信もついてきました。(^^)

それは、何よりです。
成功体験、大切ですよね (^^*

> 多少考えながらリラックスして

これ、重要です。

> 過去の質問者さんとのやり取りも本当に勉強になりました。良い質問が出尽くしていて、疑問はコメントをチェックするだけで殆ど解決しました。

そうなんですよね。
過去の受講生のみなさんにも感謝です。

ひきつづき、学習お楽しみください☆


12526 : たかちゃんさんのコメント (2020-10-21 05:40:40)

【感想】
発展編1を終了後、一通り復習して戻ってきました。
基礎編から初めてちょうど2ヶ月経ちましたが、自分でも驚くほど上達しました。良い先生に勉強方法からきちんと指導して貰えると、こんなにも違うんですね。今、このタイミングで本当に良い教材に会えて良かったと心から思います。現在、某国で特に仕事もしていないので、直ぐに実践に生かせず残念ですが。。今回の経験を通じてプログラミング能力だけでなく、自信もついてきました。(^^)

今のレベルはと言うと、一番苦戦したカレンダー課題も(前回から日が空いて記憶も薄れている状態でも)多少考えながらリラックスして、なんとか動くプログラムが書ける状態までになりました。

業務では社内ヘルプ、サーバー部門でのエンジニアさんのアシスタント、営業事務&売上管理などを行っていて、エクセルは良く使っていましたが、マクロは自動記録を使っていた程度です。

過去の質問者さんとのやり取りも本当に勉強になりました。良い質問が出尽くしていて、疑問はコメントをチェックするだけで殆ど解決しました。また、「励ましの言葉を下さい」といったコメントに対する先生の回答にも、何度か励まされました。
それでは、そろそろ発展2へ進もうと思います。引き続き宜しくお願いします。


12167 : 小川慶一の回答 (2020-06-06 20:56:06)

受講生 さん:

添削を返送します。

ご自身でも思われていると思いますが、処理全体のロジックはしっかりしています。
なので、細かい改善点をいくつか挙げてみたという程度です。

複数の処理方法で選択に迷う場合は、以下のような考え方をするとよいです。
[1] コードがより読みやすいのはどちらだろうか
[2] 処理の件数が増えた場合に有利なのはどちらだろうか
[3] 処理件数は事前に想定できているか/不定であるか

添削内でコメントしたのは[2]にかかる部分です。
[2-1] 変数名は、変数をよりたくさん宣言したときには可読性の高いものにしておいたほうがよい。
[2-2] ループ内での処理は少ないほうがよい
[2-3] 個別に処理すると、、件数が増えると処理が重たくなる

[3] は、くり返し構文で For 文を使うか? Do Loop を使うか?という選択にもなりますし、最終的に作成するシートの数が事前に分からない場合は「伝票作成」の課題で示したようなやり方でシートを追加することになります。
カレンダーの場合は「1月-12月のシートを作る」ということで、作成するシートの枚数は既知ですね。

Option Explicit

Dim dt1 As Date
Dim n As Long ' SheetWriteにてりようするためのグローバル変数nを宣言
Dim b As Boolean '[2-1] モジュールレベル変数はもっと機能や目的が分かりやすい名前のほうがよいです。たとえば IsHoliday As Boolean とか

Sub SheetCreate()
    Dim c As Long
    Dim ws As Worksheet
    
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    
    Worksheets("Summary").Select
    If Range("E" & Rows.Count).End(xlUp).Row > 1 Then
        With Worksheets("Summary").Range("A2", "E" & Range("E" & Rows.Count).End(xlUp).Row)
            .ClearContents
            .Font.Bold = False
            .Interior.ColorIndex = xlNone
        End With
    End If

    
    
    SheetDelete
    n = 0

    For c = 1 To 12
        Sheets("Summary").Copy After:=Sheets(Worksheets.Count)
        ActiveSheet.Name = c & "月"
    Next
    
    c = 1
    For Each ws In Worksheets
'        ws.Select
        If Right(ws.Name, 1) = "月" Then
            ws.Select '[2-2] このコードの置き場所こちらのほうが良いかと( .select を実行する回数が2回減る)
            dt1 = #1/1/2009#
            dt1 = DateAdd("m", c - 1, dt1)
            SheetWrite
            c = c + 1
        End If
    Next
    Worksheets("Summary").Select
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    
End Sub

Sub SheetDelete()
    Dim ws As Worksheet
    
    Application.DisplayAlerts = False

    For Each ws In Worksheets
        If Right(ws.Name, 1) = "月" Then
            ws.Delete
        End If
    Next
    Application.DisplayAlerts = True
End Sub

Sub SheetWrite()
    Dim dt2 As Date
    Dim lnTate As Long
    lnTate = 0
    Dim wsSummary As Worksheet
    Dim wsControl As Worksheet
    Set wsSummary = Worksheets("Summary")
    Set wsControl = Worksheets("Control")
    Dim x As Long
    Dim rgCtrl As Range
    

    dt2 = dt1
    With Range("A2")
        Do While Month(dt1) = Month(dt2)
            .Offset(lnTate, 0).Value = dt1
            .Offset(lnTate, 1).Value = WeekdayName(Weekday(dt1))
            .Offset(lnTate, 2).Value = #9:00:00 AM#
            .Offset(lnTate, 3).Value = #5:00:00 PM#
            .Offset(lnTate, 4).Formula = "=" & .Offset(lnTate, 3).Address & "-" & .Offset(lnTate, 2).Address
            
            Holiday
            
            For x = 0 To 4  '各シートA列~E列にどう処理が入る場合のコードをfor next構文でまとめましたが、小川先生の書き方のほうがベターでしょうか
                '[回答] [2-3] 処理の回数が多い場合を考えてみてください。たとえば同じ行のセルが30個あり、そのすべてに装飾をする場合です。
                '       すると、1回のほうが30回に比べて大幅に勝りますね
                wsSummary.Range("A2").Offset(n, x).Formula = "='" & .Worksheet.Name & "'!" & .Offset(lnTate, x).Address
                Set rgCtrl = wsControl.Range("F2") '←この書き方、うまいですね。以下のコードの可読性が上がります。
                If b = True Then
                    .Offset(lnTate, x).Interior.ColorIndex = rgCtrl.Interior.ColorIndex
                    .Offset(lnTate, x).Font.ColorIndex = rgCtrl.Font.ColorIndex
                    .Offset(lnTate, x).Font.Bold = True
                    wsSummary.Range("A2").Offset(n, x).Interior.ColorIndex = rgCtrl.Interior.ColorIndex
                    wsSummary.Range("A2").Offset(n, x).Font.ColorIndex = rgCtrl.Font.ColorIndex
                    wsSummary.Range("A2").Offset(n, x).Font.Bold = True
                Else
                    .Offset(lnTate, x).Interior.ColorIndex = wsControl.Range("A1").Offset(Weekday(dt1), 0).Interior.ColorIndex
                    .Offset(lnTate, x).Font.ColorIndex = wsControl.Range("A1").Offset(Weekday(dt1), 0).Font.ColorIndex
                    wsSummary.Range("A2").Offset(n, x).Interior.ColorIndex = wsControl.Range("A1").Offset(Weekday(dt1), 0).Interior.ColorIndex
                    wsSummary.Range("A2").Offset(n, x).Font.ColorIndex = wsControl.Range("A1").Offset(Weekday(dt1), 0).Font.ColorIndex
                End If
                
            Next
            n = n + 1
            
            dt1 = DateAdd("d", 1, dt1)
            lnTate = lnTate + 1
        Loop
    End With
End Sub

Sub Holiday()

    b = False
    Dim c As Long
    
    For c = 2 To 18
        If Worksheets("Control").Range("C" & c).Value = dt1 Then
            b = True
        End If
    Next
End Sub


12165 : 受講生さんのコメント (2020-06-06 20:06:10)

小川慶一さん:
お世話になります。ご指示を受けて再度コードを一から書き直し、コメントを入れてみました。
(1週間たってもう一度1から書き直したのでかなりコード内容は変わってしまいましたが、こちらで確認お願いします)
小川先生のサンプルコードと比較すると、各処理を実行するサブプロシージャのタイミングの違いゆえにコード全体としては記述が異なる部分も多いですが、大まかな流れは同じかと思います。
一点明確な違いがコメントに記入しているfor next構文の処理部分かと思いますがこちらの記述はいかかでしょうか(処理負荷、可読性等の点から)

なお、小川先生の仰っていた
>・あえて違う書き方をしたのはどこか
>・その書き方にしたことでのメリット、デメリットはどういうものか
の部分に対する回答としては、あえて違う書き方をした認識はなかったのですが、記述をする際、すでにあるFor next構文でまとめれそうな個所を見つけてまとめていったら書きコードになった、といったところです。
メリットは・・・正直思い浮かばないですが、個人的には直感的にこちらの記述のほうが書きやすかったです。
デメリットは繰り返し構文による処理を多用していることによる処理数の増加でしょうか?(デメリットとしてあげられるほどのものかもわかりませんが・・・)

>※よろしければ、上記のワークをやってみた感想もそのときにお知らせください (^^
1週間前に書き上げて投稿したときは「サンプルコードと全然違うな、とりあえず添削してもらおう」という印象でしたが、今回もう一度書き上げ自分の記述とサンプルコードを見比べながら処理の違いを比較していったところ、記述は違えど変数宣言や別プロシージャに入るタイミングの差であってやっていることは変わらない、みたいな部分がほとんどでした。
(もちろんタイミング一つとっても直したほうが良い部分はあるかもしれませんが)
同じゴールであっても書き方は無数にあり、「別に違ってても良い部分」と「本質的に改善したほうが良い部分」の見極めが必要だと今回感じました。(今回のコメント部分は「本質的に改善したほうが良い部分」か否かの相談です)

すみません。長くなりましたが以下今回書き上げたコードと質問部分のコメントです。
なお、当方が気づいていないだけで「ここも改善したほうが良い」部分がありましたらそちらもご教示頂けると幸いです。


Option Explicit

Dim dt1 As Date
Dim n As Long ' SheetWriteにてりようするためのグローバル変数nを宣言
Dim b As Boolean

Sub SheetCreate()
    Dim c As Long
    Dim ws As Worksheet
    
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    
    Worksheets("Summary").Select
    If Range("E" & Rows.Count).End(xlUp).Row > 1 Then
        With Worksheets("Summary").Range("A2", "E" & Range("E" & Rows.Count).End(xlUp).Row)
            .ClearContents
            .Font.Bold = False
            .Interior.ColorIndex = xlNone
        End With
    End If

    
    
    SheetDelete
    n = 0

    For c = 1 To 12
        Sheets("Summary").Copy After:=Sheets(Worksheets.Count)
        ActiveSheet.Name = c & "月"
    Next
    
    c = 1
    For Each ws In Worksheets
        ws.Select
        If Right(ws.Name, 1) = "月" Then
            dt1 = #1/1/2009#
            dt1 = DateAdd("m", c - 1, dt1)
            SheetWrite
            c = c + 1
        End If
    Next
    Worksheets("Summary").Select
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    
End Sub

Sub SheetDelete()
    Dim ws As Worksheet
    
    Application.DisplayAlerts = False

    For Each ws In Worksheets
        If Right(ws.Name, 1) = "月" Then
            ws.Delete
        End If
    Next
    Application.DisplayAlerts = True
End Sub

Sub SheetWrite()
    Dim dt2 As Date
    Dim lnTate As Long
    lnTate = 0
    Dim wsSummary As Worksheet
    Dim wsControl As Worksheet
    Set wsSummary = Worksheets("Summary")
    Set wsControl = Worksheets("Control")
    Dim x As Long
    Dim rgCtrl As Range
    

    dt2 = dt1
    With Range("A2")
        Do While Month(dt1) = Month(dt2)
            .Offset(lnTate, 0).Value = dt1
            .Offset(lnTate, 1).Value = WeekdayName(Weekday(dt1))
            .Offset(lnTate, 2).Value = #9:00:00 AM#
            .Offset(lnTate, 3).Value = #5:00:00 PM#
            .Offset(lnTate, 4).Formula = "=" & .Offset(lnTate, 3).Address & "-" & .Offset(lnTate, 2).Address
            
            Holiday
            
            For x = 0 To 4  '各シートA列~E列にどう処理が入る場合のコードをfor next構文でまとめましたが、小川先生の書き方のほうがベターでしょうか?
                wsSummary.Range("A2").Offset(n, x).Formula = "='" & .Worksheet.Name & "'!" & .Offset(lnTate, x).Address
                Set rgCtrl = wsControl.Range("F2")
                If b = True Then
                    .Offset(lnTate, x).Interior.ColorIndex = rgCtrl.Interior.ColorIndex
                    .Offset(lnTate, x).Font.ColorIndex = rgCtrl.Font.ColorIndex
                    .Offset(lnTate, x).Font.Bold = True
                    wsSummary.Range("A2").Offset(n, x).Interior.ColorIndex = rgCtrl.Interior.ColorIndex
                    wsSummary.Range("A2").Offset(n, x).Font.ColorIndex = rgCtrl.Font.ColorIndex
                    wsSummary.Range("A2").Offset(n, x).Font.Bold = True
                Else
                    .Offset(lnTate, x).Interior.ColorIndex = wsControl.Range("A1").Offset(Weekday(dt1), 0).Interior.ColorIndex
                    .Offset(lnTate, x).Font.ColorIndex = wsControl.Range("A1").Offset(Weekday(dt1), 0).Font.ColorIndex
                    wsSummary.Range("A2").Offset(n, x).Interior.ColorIndex = wsControl.Range("A1").Offset(Weekday(dt1), 0).Interior.ColorIndex
                    wsSummary.Range("A2").Offset(n, x).Font.ColorIndex = wsControl.Range("A1").Offset(Weekday(dt1), 0).Font.ColorIndex
                End If
                
            Next
            n = n + 1
            
            dt1 = DateAdd("d", 1, dt1)
            lnTate = lnTate + 1
        Loop
    End With
End Sub

Sub Holiday()

    b = False
    Dim c As Long
    
    For c = 2 To 18
        If Worksheets("Control").Range("C" & c).Value = dt1 Then
            b = True
        End If
    Next
End Sub



> 受講生 さん:
>
> こんにちは。
>
> > 今回のセミナーまでのカレンダー作成を何も見ずに1から書き上げてみました。
>
> おお、すごいですね!
>
> > サンプルコードと違う部分記述やまとめ方をしている部分もいくつかありますので添削していただけると幸いです。
>
> まずは、ご自身で添削し、コメントを付記してみてください。
> ・あえて違う書き方をしたのはどこか
> ・その書き方にしたことでのメリット、デメリットはどういうものか
>
> 「自分で自分のコードを批評する」というのは、とてもよい勉強になります。
> コードを書き上げたときの自分以上のスキルの自分になったつもりで、ちょっとレベルが自分より劣る人に指導するつもりでコメントしてみてください。もちろん、気になるところがあれば、今から再度リライトしてもOKです。
>
> そのうえで、メリットデメリットがはっきりしないところ、この書き方で良いのか?と疑問に思ったところについては、ご自身の考えを書き添えたうえで意見を僕に求めてください。
>
> その状態で再度投稿いただいたところでコメントさしあげたいと思います。
>
>
> ※よろしければ、上記のワークをやってみた感想もそのときにお知らせください (^^
>
>


12157 : 小川慶一の回答 (2020-05-31 19:36:08)

受講生 さん:

こんにちは。

> 今回のセミナーまでのカレンダー作成を何も見ずに1から書き上げてみました。

おお、すごいですね!

> サンプルコードと違う部分記述やまとめ方をしている部分もいくつかありますので添削していただけると幸いです。

まずは、ご自身で添削し、コメントを付記してみてください。
・あえて違う書き方をしたのはどこか
・その書き方にしたことでのメリット、デメリットはどういうものか

「自分で自分のコードを批評する」というのは、とてもよい勉強になります。
コードを書き上げたときの自分以上のスキルの自分になったつもりで、ちょっとレベルが自分より劣る人に指導するつもりでコメントしてみてください。もちろん、気になるところがあれば、今から再度リライトしてもOKです。

そのうえで、メリットデメリットがはっきりしないところ、この書き方で良いのか?と疑問に思ったところについては、ご自身の考えを書き添えたうえで意見を僕に求めてください。

その状態で再度投稿いただいたところでコメントさしあげたいと思います。


※よろしければ、上記のワークをやってみた感想もそのときにお知らせください (^^


12156 : 受講生さんのコメント (2020-05-31 18:47:32)

お世話になります。
今回のセミナーまでのカレンダー作成を何も見ずに1から書き上げてみました。
サンプルコードと違う部分記述やまとめ方をしている部分もいくつかありますので添削していただけると幸いです。

Option Explicit

Dim dt1 As Date
Dim b As Boolean
Sub shCreate()
    
    Dim lnMon As Long
    Dim shTo As Worksheet
    Dim lnMx As Long
    
    Application.ScreenUpdating = False
    lnMx = Worksheets("Summary").Range("A" & Worksheets("Summary").Rows.Count).End(xlUp).Row
    
    Dim dt As Date
    dt = #1/1/2009#
    
    If lnMx > 1 Then
        Worksheets("Summary").Range("A2", "E" & lnMx).ClearContents
        Worksheets("Summary").Range("A2", "E" & lnMx).Interior.Pattern = xlNone
        Worksheets("Summary").Range("A2", "E" & lnMx).Font.ColorIndex = 1
        Worksheets("Summary").Range("A2", "E" & lnMx).Font.Bold = False
    End If
    
    shDelete
    For lnMon = 1 To 12
        Sheets("Summary").Copy After:=Sheets(Worksheets.Count)
        Set shTo = ActiveSheet
        shTo.Name = lnMon & "月"
    Next
    
    Dim c As Long
    c = 1
    Dim ws As Worksheet
    For Each ws In Worksheets
        If Right(ws.Name, 1) = "月" Then
            ws.Select
            dt1 = DateAdd("m", c - 1, dt)
            shKousei
            c = c + 1
        End If
    Next
    Worksheets("Summary").Select
    Application.ScreenUpdating = True
End Sub

Sub shDelete()
    Dim ws As Worksheet
    Application.DisplayAlerts = False
    For Each ws In Worksheets
        If Not ws Is Worksheets("Control") Then
            If Not ws Is Worksheets("Summary") Then
                ws.Delete
            End If
        End If
    Next
    Application.DisplayAlerts = True
End Sub

Sub shKousei()
    Dim dt2 As Date
    Dim c As Long
    Dim n As Long
    Dim shSummary
    Set shSummary = Worksheets("Summary")
    Dim shControl
    Set shControl = Worksheets("control")
    Dim lnSumMx
    
    lnSumMx = shSummary.Range("A" & shSummary.Rows.Count).End(xlUp).Row - 1
    
    dt2 = dt1
    c = 0
    
    Dim rgSummary As Range
    Dim rgControl As Range
    
    With Range("A2")
        Do While Month(dt1) = Month(dt2)
            .Offset(c, 0).Value = dt1
            .Offset(c, 1).Value = WeekdayName(Weekday(dt1))
            .Offset(c, 2).Value = #9:00:00 AM#
            .Offset(c, 3).Value = #5:00:00 PM#
            .Offset(c, 4).Formula = "=" & .Offset(c, 3).Address & "-" & .Offset(c, 2).Address
            Holiday
            For n = 0 To 4
                Set rgSummary = shSummary.Range("A2").Offset(lnSumMx + c, n)
                Set rgControl = shControl.Range("A1").Offset(Weekday(dt1), 0)
                rgSummary.Formula = "='" & .Worksheet.Name & "'!" & .Offset(c, n).Address
                With .Offset(c, n)
                    If b = True Then
                        .Interior.ColorIndex = shControl.Range("F2").Interior.ColorIndex
                        .Font.ColorIndex = shControl.Range("F2").Font.ColorIndex
                        .Font.Bold = shControl.Range("F2").Font.Bold
                        rgSummary.Interior.ColorIndex = shControl.Range("F2").Interior.ColorIndex
                        rgSummary.Font.ColorIndex = shControl.Range("F2").Font.ColorIndex
                        rgSummary.Font.Bold = shControl.Range("F2").Font.Bold
                    Else
                        .Interior.ColorIndex = rgControl.Interior.ColorIndex
                        .Font.ColorIndex = rgControl.Font.ColorIndex
                        rgSummary.Interior.ColorIndex = rgControl.Interior.ColorIndex
                        rgSummary.Font.ColorIndex = rgControl.Font.ColorIndex
                    End If
                End With
            Next
            dt1 = DateAdd("d", 1, dt1)
            c = c + 1
        Loop
    End With
End Sub

Sub Holiday()
    b = False
    Dim c As Long
    For c = 2 To 18
        If dt1 = Worksheets("Control").Range("C" & c).Value Then
            b = True
        End If
    Next
End Sub


10021 : 小川慶一の回答 (2018-05-21 17:58:50)

受講生 さん:

> 私は今まで、同じモジュール内であっても別のSubプロシージャになると変数はリセットされると解釈してましたが、これは間違いだったのでしょうか?

間違いです。

以下の動画からはじめて、第5章をひととおり復習されることをおすすめします。
https://online.pc5bai.com/movie/index/29/227

そもそもなぜモジュールレベル変数を使いたいか?
という質問を持ち、それへの回答を探すつもりで見直してください。

以下の質問については、上記のとおりに復習していただいた上でそれでも僕に確認したいことがあれば、改めてご質問ください。

もっとも、上記のとおりの手順で復習すれば、そのあと、改めて僕にこれを質問する前にご自身でテストコードを作って動作させることでその答えは確認できるかと思いますが。

> これは、オブジェクト型変数にも有効でしょうか?
> モジュールレベル変数でオブジェクト型変数を設定しておいて、
> 最初のSubプロシージャでSet~でオブジェクトを指定しておけば
> 以降、同じモジュール内のSubプロシージャであれば、ずっと有効なのでしょうか?


10019 : 小川慶一の回答 (2018-05-21 17:52:43)

受講生 さん:

確認しました。
手違いです。もうしわけありません。
差し替えの指示を事務局にしました。

前のページのものとシート「Contorl」の内容は同じですので、とりあえずは、前回DLされたもののシート「Control」を活用ください。

お手間いただき恐縮で。
よろしくお願いいたします。





> 第29回のwebページからDLするExcelファイルには、「control」シートがありませんが(summaryシートのみ)、これは何かの手違いでしょうか?


10006 : 受講生さんのコメント (2018-05-20 15:54:54)

モジュールレベル変数の有効性について教えて下さい。
第29回のModule23において、
Dim b As Boolean
のモジュールレベル変数は、IsHoliday23でTrueかFalseになったあと
別のSubプロシージャであるExeCreateCalendar23へ戻ってきても
TrueかFalseが保持さていました。
私は今まで、同じモジュール内であっても別のSubプロシージャになると変数はリセットされると解釈してましたが、これは間違いだったのでしょうか?
これは、オブジェクト型変数にも有効でしょうか?
モジュールレベル変数でオブジェクト型変数を設定しておいて、
最初のSubプロシージャでSet~でオブジェクトを指定しておけば
以降、同じモジュール内のSubプロシージャであれば、ずっと有効なのでしょうか?


10005 : 受講生さんのコメント (2018-05-20 15:16:59)

第29回のwebページからDLするExcelファイルには、「control」シートがありませんが(summaryシートのみ)、これは何かの手違いでしょうか?


4986 : 小川慶一の回答 (2015-09-02 01:10:49)

森 則彦 さん:

拝見しました。

>予習の意味で新しい構文を使ってみました。作り込む最中で色々なアイデアを試しながら出来、再発見、再確認ができました。

よいですよね。

> プログラムは出来上がりは同じでも課程はいろいろある所がじつに面白いですね。

手順書ですからね。
どういう書き方でも、仕上がりが同じになるのであればOKかと。

このレベルの方に対してもはやコメントというほどではありませんが、Goto文はロジックが複雑になるので使うのは可能な限り避けたほうが。
boolean型変数で処理を振り分けるとか。

>Summaryのシートにデータを入れるタイミングは1か月分が出来上がった段階で一気にそれをコピーした方がスピードが速いのではないかなと思いました。

計算式が入っているシートでセルの値を書き換える等のイベントが発生すると、エクセルがすべての計算式の入ったセルについて自動的に再計算を実行します。
計算式が入っているセルが増えれば増えるほど(また、計算にかかるコストの高い式が多いほど)、ここで処理が重たくなります。

その問題を避けるには、 Application.Calculation プロパティをFalseにしてから処理をしていき、終了後、 True に戻します。
このプロパティの値がFalseの間は、エクセルは上述の再計算を行いません。



>小川先生、お世話になっております。発展編フォローセミナーNo.29のカレンダー問題がようやく自分なりの解釈で何とか出来ました。
>予習の意味で新しい構文を使ってみました。作り込む最中で色々なアイデアを試しながら出来、再発見、再確認ができました。
>今回はいかに効率よく走るかを私なりに考えてつくりました。先生のご感想よろしくお願いします。先生のNO.29のメールからダウンロードしたファイルの中に、ControlのシートがなかったのでNO.26のファイルを使用して、祭日には、文字を赤、背景を黄色とする、前提条件としました。後で思ったのですが、
>Summaryのシートにデータを入れるタイミングは1か月分が出来上がった段階で一気にそれをコピーした方がスピードが速いのではないかなと思いました。プログラムは出来上がりは同じでも課程はいろいろある所がじつに面白いですね。もっといろいろな構文、アルゴリズムを勉強すればさらにプログラミングの世界が広がる思うと、今後がたのしみです。上級編もまた、お願いしたいと思います。では、先生の感想をお待ちしております。
>追伸。2015年のカレンダーにしました。


4984 : 森 則彦さんのコメント (2015-09-01 23:12:26)

小川先生、お世話になっております。発展編フォローセミナーNo.29のカレンダー問題がようやく自分なりの解釈で何とか出来ました。
予習の意味で新しい構文を使ってみました。作り込む最中で色々なアイデアを試しながら出来、再発見、再確認ができました。
今回はいかに効率よく走るかを私なりに考えてつくりました。先生のご感想よろしくお願いします。先生のNO.29のメールからダウンロードしたファイルの中に、ControlのシートがなかったのでNO.26のファイルを使用して、祭日には、文字を赤、背景を黄色とする、前提条件としました。後で思ったのですが、
Summaryのシートにデータを入れるタイミングは1か月分が出来上がった段階で一気にそれをコピーした方がスピードが速いのではないかなと思いました。プログラムは出来上がりは同じでも課程はいろいろある所がじつに面白いですね。もっといろいろな構文、アルゴリズムを勉強すればさらにプログラミングの世界が広がる思うと、今後がたのしみです。上級編もまた、お願いしたいと思います。では、先生の感想をお待ちしております。
追伸。2015年のカレンダーにしました。

code

Dim dStart As Date, wNa As Integer
Dim list(6, 2) As Variant, sAijitu(16, 2) As Variant

Private Sub CalenCre()
CreMSht
dStart = #1/1/2015#
Dim mCnt As Long
Dim cOnws As Worksheet
Dim c As Integer
Set cOnws = Worksheets("Control")
With cOnws.Range("a2")
For c = 0 To 6
list(c, 0) = c + 1
list(c, 1) = .Offset(c).Interior.ColorIndex
list(c, 2) = .Offset(c).Font.ColorIndex
Next
End With
With cOnws.Range("c2")
For c = 0 To 16
sAijitu(c, 0) = .Offset(c).Value
sAijitu(c, 1) = .Offset(c).Interior.ColorIndex
sAijitu(c, 2) = .Offset(c).Font.ColorIndex
Next
End With
Worksheets("Summary").Copy after:=Worksheets(Worksheets.Count)
ActiveSheet.Name = "dami"
For mCnt = 1 To 12
Worksheets("dami").Copy after:=Worksheets(Worksheets.Count)
ActiveSheet.Name = mCnt & "月"
calen_exe
dStart = DateAdd("m", 1, dStart)
Next
Application.DisplayAlerts = False
Worksheets("dami").Delete
Application.DisplayAlerts = True
Worksheets("Summary").Activate
End Sub

Public Sub calen_exe()
Dim dCnt As Date, sAicnt As Integer, mEmo
Dim c As Long, cYoko As Long, mAx As Long, yOucnt As Integer
Dim jyuS As String
Dim sH As Worksheet
Set sH = Worksheets("Summary")
Dim rg As Range
mAx = sH.Range("a" & Rows.Count).End(xlUp).Row
Set rg = sH.Range("a" & mAx + 1)
dCnt = dStart
c = 0
With Range("a2")
Do While Month(dCnt) = Month(dStart)
.Offset(c, 0).Value = dCnt
wNa = Weekday(dCnt)
.Offset(c, 1).Value = WeekdayName(wNa)
.Offset(c, 2).Value = #9:00:00 AM#
.Offset(c, 3).Value = #5:00:00 PM#
jyuS = "=" & .Offset(c, 3) & "-" & .Offset(c, 2).Value
.Offset(c, 4).Formula = jyuS
For cYoko = 0 To 4
rg.Offset(c, cYoko).Formula = "='" & .Worksheet.Name & "'!" & .Offset(c, cYoko).Address
Next
For sAicnt = mEmo To 16
If dCnt = sAijitu(sAicnt, 0) Then
With Range(rg.Offset(c, 0), rg.Offset(c, 4))
.Interior.ColorIndex = sAijitu(sAicnt, 1)
.Font.ColorIndex = sAijitu(sAicnt, 2)
End With
With Range(.Offset(c, 0), .Offset(c, 4))
.Interior.ColorIndex = sAijitu(sAicnt, 1)
.Font.ColorIndex = sAijitu(sAicnt, 2)
End With
mEmo = mEmo + 1
GoTo line1
End If
Next
For yOucnt = 0 To 6
If wNa = list(yOucnt, 0) Then
With Range(rg.Offset(c, 0), rg.Offset(c, 4))
.Interior.ColorIndex = list(yOucnt, 1)
.Font.ColorIndex = list(yOucnt, 2)
End With
With Range(.Offset(c, 0), .Offset(c, 4))
.Interior.ColorIndex = list(yOucnt, 1)
.Font.ColorIndex = list(yOucnt, 2)
End With
GoTo line1
End If
Next
line1:
dCnt = DateAdd("d", 1, dCnt)
c = c + 1
Loop
End With
End Sub

Public Sub CreMSht()
Dim wS As Worksheet
Dim orWs As Worksheet, nEwws As Worksheet, orCws As Worksheet
Set orWs = Worksheets("Summary")
Set orCws = Worksheets("Control")
Application.DisplayAlerts = False
For Each wS In Worksheets
If Not (wS Is orWs Or wS Is orCws) Then
wS.Delete
End If
Next
Application.DisplayAlerts = True
clean
End Sub

Public Sub clean()
Worksheets("Summary").Activate
Dim gyo As Long
gyo = Range("a" & Rows.Count).End(xlUp).Row
If gyo > 1 Then
With Range("a2", "e" & gyo)
.ClearContents
.Interior.ColorIndex = xlNone
.Font.ColorIndex = 0
End With
End If
End Sub

/code


3252 : ガラパゴスタディー事務局の回答 (2013-08-23 10:02:00)

望月さん:

> 受けたら終わりではなく、マクロを組むヒントを見つける資料として活用していきます。

ご自身のレベルがあがってから読み直すとまた違った視点で学べることも多いです。
テキストは、何度も読み返している間に学びが深くなくように作っています。
発展編テキスト、Visual Basic Editorの操作ガイドも、ページをめくって何かおもしろいことが書いてないか探してみてください。


3251 : 望月 晋一さんのコメント (2013-08-22 23:11:00)

小川先生、早速コメントを下さり、ありがとうございました。基礎編のサンプルコード見てみました。基礎編受講時では、たぶんよく理解できなかったと思います。発展編まで学ぶと、違和感なくコードの意味がわかります。基礎編で使った教材にも、後から見直して役立つネタがいろいろと盛り込まれていたんですね。受けたら終わりではなく、マクロを組むヒントを見つける資料として活用していきます。


3250 : ガラパゴスタディー事務局の回答 (2013-08-21 23:22:00)

望月さん:

すばらしい見本です。指摘しなければならないようなことは、特にないです。

あえていうなら、 with の中にある do loop 構文は一段インデントする、とか。

> セルの範囲指定で、Rangeの()内にレンジオブジェクトをカンマで区切って、
> 最初と最後を指定する方法がありますが、これは使えますね。

使い分けられるレベルになってから見ると便利さが分かりますね。

基礎編のサンプルコードをもう一度みてみてください。
kiso01.xls です。種々のセル指定方法を紹介しています。 daihon0012 です。
今見ると、へーて思うことも多いかと。




3249 : 望月 晋一さんのコメント (2013-08-21 12:59:00)

小川先生、先ほどの投稿の補足の続きがありました。先生の解説で、セルの範囲指定で、Rangeの()内にレンジオブジェクトをカンマで区切って、最初と最後を指定する方法がありますが、これは使えますね。「:」で間を繋ぐ方法より、時にわかりやすく、色々と応用が効くと思いました。


3248 : 望月 晋一さんのコメント (2013-08-21 12:53:00)

作成してみましたので、アドバイスをいただければ幸いです。

Option Explicit
Dim wsSum As Worksheet
Dim nEgyo As Long
Dim wsCal As Worksheet
Dim nTsuki As Long
Dim dtMhi As Date
Dim wsCon As Worksheet
Dim bShuku As Boolean

Sub CalendarSakusei()
    SummaryShokika
    DelWorksheets
    CreWorksheets
    CalKisai
    wsSum.Activate
End Sub

Sub SummaryShokika()
    Set wsSum = Worksheets("Summary")
    nEgyo = wsSum.Range("A" & Rows.Count).End(xlUp).Row
    If nEgyo > 1 Then
        wsSum.Range("A2:E" & nEgyo).ClearContents
    End If
End Sub

Sub DelWorksheets()
    Dim ws As Worksheet
    Application.DisplayAlerts = False
    For Each ws In Worksheets
        If ws.Name <> "Summary" And ws.Name <> "Control" Then
            ws.Delete
        End If
    Next
    Application.DisplayAlerts = True
End Sub

Sub CreWorksheets()
    For nTsuki = 1 To 12
        wsSum.Copy after:=Worksheets(Worksheets.Count)
        ActiveSheet.Name = nTsuki & "月"
    Next
End Sub

Sub CalKisai()
    Dim nKiai As Long
    Dim dtShi As Date
    Dim rgSums As Range
    Dim nHicnt As Long
    Dim nKyoko As Long
    Set wsCon = Worksheets("Control")
    For nTsuki = 1 To 12
        Worksheets(nTsuki & "月").Activate
        Set wsCal = ActiveSheet
        dtMhi = DateAdd("m", nTsuki - 1, #1/1/2009#)
        dtShi = dtMhi
        
        nEgyo = wsSum.Range("A" & Rows.Count).End(xlUp).Row
        Set rgSums = wsSum.Range("A" & nEgyo + 1)
        
        nHicnt = 0
        With wsCal.Range("A2")
        Do While Month(dtMhi) = Month(dtShi)
            .Offset(nHicnt).Value = dtMhi
            .Offset(nHicnt, 1).Value = WeekdayName(Weekday(dtMhi))
            .Offset(nHicnt, 2).Value = #9:00:00 AM#
            .Offset(nHicnt, 3).Value = #5:00:00 PM#
            .Offset(nHicnt, 4).Formula = "=" & .Offset(nHicnt, 3).Address & _
                                            "-" & .Offset(nHicnt, 2).Address
            For nKyoko = 0 To 4
                rgSums.Offset(nHicnt, nKyoko).Formula = "='" & wsCal.Name & "'!" & _
                                                            .Offset(nHicnt, nKyoko).Address
            Next
            
            ShukuHantei
            If bShuku = True Then
                With Range(.Offset(nHicnt), .Offset(nHicnt, 4))
                     .Interior.ColorIndex = wsCon.Range("F2").Interior.ColorIndex
                     .Font.ColorIndex = wsCon.Range("F2").Font.ColorIndex
                     .Font.Bold = True
                End With
                With Range(rgSums.Offset(nHicnt), rgSums.Offset(nHicnt, 4))
                     .Interior.ColorIndex = wsCon.Range("F2").Interior.ColorIndex
                     .Font.ColorIndex = wsCon.Range("F2").Font.ColorIndex
                     .Font.Bold = True
                End With
            Else
                With Range(.Offset(nHicnt), .Offset(nHicnt, 4))
                     .Interior.ColorIndex = wsCon.Range("A1").Offset(Weekday(dtMhi)).Interior.ColorIndex
                     .Font.ColorIndex = wsCon.Range("A1").Offset(Weekday(dtMhi)).Font.ColorIndex
                     .Font.Bold = False
                End With
                With Range(rgSums.Offset(nHicnt), rgSums.Offset(nHicnt, 4))
                     .Interior.ColorIndex = wsCon.Range("A1").Offset(Weekday(dtMhi)).Interior.ColorIndex
                     .Font.ColorIndex = wsCon.Range("A1").Offset(Weekday(dtMhi)).Font.ColorIndex
                     .Font.Bold = False
                End With
            End If
            
            dtMhi = DateAdd("d", 1, dtMhi)
            nHicnt = nHicnt + 1
        Loop
        End With
        wsCal.Rows(nHicnt + 2 & ":" & 367).Delete shift:=xlUp
    Next
End Sub

Sub ShukuHantei()
    Dim nGyoE As Long
    Dim nGyo As Long
    nGyoE = wsCon.Range("C" & Rows.Count).End(xlUp).Row
    bShuku = False
    For nGyo = 2 To nGyoE
        If dtMhi = wsCon.Range("C" & nGyo).Value Then
            bShuku = True
            Exit For
        End If
    Next
End Sub

補足)・祝日のセルが太字になっていたので、その指定も加えてみました。
・祝日の真偽判定結果を入れる変数の初期化(「False」にする)を、最初見落としていて、全ての日が祝日の色になってしまう結果になり、ちょっと手間取りました。気が付いて、LOOPの前に入れましたが、小川先生の記述では、判定処理の直前に入れていたのでそれに倣い修正しました。このような事柄も実際にコーディングしてみると、気を付けなければならない点として、よく理解できますね。


3221 : ガラパゴスタディー事務局の回答 (2013-05-18 00:32:00)

山根さん:

> 最初サンプルコードをダウンロードしたらシートControlがなかったのでエラー出てびっくりしました。

あれれ。no.29の最初にあるリンクですか?

> 祝日と土曜日・日曜日が重なった場合は色が2度塗られるのを回避してたんですね。
> 私はそれを知りながら結果が同だからまあいいやと模索せずに終わらせてしまってました。

慣れてきたら、こういうところストイックにやってください。
小人ちゃんの立場になって、面倒と思えることは極力排除することです。

特に、セルの書式を編集する作業は負荷が大きいので。

ひきつづき、お楽しみを!


3220 : 山根信行さんのコメント (2013-05-15 00:05:00)

最初サンプルコードをダウンロードしたらシートControlがなかったのでエラー出てびっくりしました。

祝日と土曜日・日曜日が重なった場合は色が2度塗られるのを回避してたんですね。私はそれを知りながら結果が同だからまあいいやと模索せずに終わらせてしまってました。

.Font.Bold = True は要らなかったんですね。
次回の配列、楽しみにしております。


3日がかりのその仕事、3分で終わらせる方法教えます。ガラパゴスタディーオンライン講座 ユーザー登録

本講座の動画一覧

  1. 【動画1】 発展編1 フォローメールセミナー 第1回
    【動画1】 発展編1 フォローメールセミナー 第1回 未習得
  2. 【動画2】 発展編1 フォローメールセミナー 第2回
    【動画2】 発展編1 フォローメールセミナー 第2回 未習得
  3. 【動画3】 発展編1 フォローメールセミナー 第3回
    【動画3】 発展編1 フォローメールセミナー 第3回 未習得
  4. 【動画4】 発展編1 フォローメールセミナー 第4回
    【動画4】 発展編1 フォローメールセミナー 第4回 未習得
  5. 【動画5】 発展編1 フォローメールセミナー 第5回
    【動画5】 発展編1 フォローメールセミナー 第5回 未習得
  6. 【動画6】 発展編1 フォローメールセミナー 第6回
    【動画6】 発展編1 フォローメールセミナー 第6回 未習得
  7. 【動画7】 発展編1 フォローメールセミナー 第7回
    【動画7】 発展編1 フォローメールセミナー 第7回 未習得
  8. 【動画8】 発展編1 フォローメールセミナー 第8回
    【動画8】 発展編1 フォローメールセミナー 第8回 未習得
  9. 【動画9】 発展編1 フォローメールセミナー 第9回
    【動画9】 発展編1 フォローメールセミナー 第9回 未習得
  10. 【動画10】 発展編1 フォローメールセミナー 第10回
    【動画10】 発展編1 フォローメールセミナー 第10回 未習得
  11. 【動画11】 午後のフォローアップ No.1
    【動画11】 午後のフォローアップ No.1 未習得
  12. 【動画12】 発展編1 フォローメールセミナー 第11回
    【動画12】 発展編1 フォローメールセミナー 第11回 未習得
  13. 【動画13】 午後のフォローアップ No.2
    【動画13】 午後のフォローアップ No.2 未習得
  14. 【動画14】 発展編1 フォローメールセミナー 第12回
    【動画14】 発展編1 フォローメールセミナー 第12回 未習得
  15. 【動画15】 午後のフォローアップ No.3
    【動画15】 午後のフォローアップ No.3 未習得
  16. 【動画16】 発展編1 フォローメールセミナー 第13回
    【動画16】 発展編1 フォローメールセミナー 第13回 未習得
  17. 【動画17】 午後のフォローアップ No.4
    【動画17】 午後のフォローアップ No.4 未習得
  18. 【動画18】 発展編1 フォローメールセミナー 第14回
    【動画18】 発展編1 フォローメールセミナー 第14回 未習得
  19. 【動画19】 午後のフォローアップ No.5
    【動画19】 午後のフォローアップ No.5 未習得
  20. 【動画20】 発展編1 フォローメールセミナー 第15回
    【動画20】 発展編1 フォローメールセミナー 第15回 未習得
  21. 【動画21】 午後のフォローアップ No.6
    【動画21】 午後のフォローアップ No.6 未習得
  22. 【動画22】 発展編1 フォローメールセミナー 第16回
    【動画22】 発展編1 フォローメールセミナー 第16回 未習得
  23. 【動画23】 午後のフォローアップ No.7
    【動画23】 午後のフォローアップ No.7 未習得
  24. 【動画24】 発展編1 フォローメールセミナー 第17回
    【動画24】 発展編1 フォローメールセミナー 第17回 未習得
  25. 【動画25】 午後のフォローアップ No.8
    【動画25】 午後のフォローアップ No.8 未習得
  26. 【動画26】 発展編1 フォローメールセミナー 第18回
    【動画26】 発展編1 フォローメールセミナー 第18回 未習得
  27. 【動画27】 午後のフォローアップ No.9
    【動画27】 午後のフォローアップ No.9 未習得
  28. 【動画28】 発展編1 フォローメールセミナー 第19回
    【動画28】 発展編1 フォローメールセミナー 第19回 未習得
  29. 【動画29】 午後のフォローアップ No.10
    【動画29】 午後のフォローアップ No.10 未習得
  30. 【動画30】 発展編1 フォローメールセミナー 第20回
    【動画30】 発展編1 フォローメールセミナー 第20回 未習得
  31. 【動画31】 午後のフォローアップ No.11
    【動画31】 午後のフォローアップ No.11 未習得
  32. 【動画32】 発展編1 フォローメールセミナー 第21回
    【動画32】 発展編1 フォローメールセミナー 第21回 未習得
  33. 【動画33】 午後のフォローアップ No.12
    【動画33】 午後のフォローアップ No.12 未習得
  34. 【動画34】 発展編1 フォローメールセミナー 第22回
    【動画34】 発展編1 フォローメールセミナー 第22回 未習得
  35. 【動画35】 午後のフォローアップ No.13
    【動画35】 午後のフォローアップ No.13 未習得
  36. 【動画36】 発展編1 フォローメールセミナー 第23回
    【動画36】 発展編1 フォローメールセミナー 第23回 未習得
  37. 【動画37】 午後のフォローアップ No.14
    【動画37】 午後のフォローアップ No.14 未習得
  38. 【動画38】 発展編1 フォローメールセミナー 第24回
    【動画38】 発展編1 フォローメールセミナー 第24回 未習得
  39. 【動画39】 午後のフォローアップ No.15
    【動画39】 午後のフォローアップ No.15 未習得
  40. 【動画40】 発展編1 フォローメールセミナー 第25回
    【動画40】 発展編1 フォローメールセミナー 第25回 未習得
  41. 【動画41】 午後のフォローアップ No.16
    【動画41】 午後のフォローアップ No.16 未習得
  42. 【動画42】 発展編1 フォローメールセミナー 第26回
    【動画42】 発展編1 フォローメールセミナー 第26回 未習得
  43. 【動画43】 午後のフォローアップ No.17
    【動画43】 午後のフォローアップ No.17 未習得
  44. 【動画44】 発展編1 フォローメールセミナー 第27回
    【動画44】 発展編1 フォローメールセミナー 第27回 未習得
  45. 【動画45】 午後のフォローアップ No.18
    【動画45】 午後のフォローアップ No.18 未習得
  46. 【動画46】 発展編1 フォローメールセミナー 第28回
    【動画46】 発展編1 フォローメールセミナー 第28回 未習得
  47. 【動画47】 午後のフォローアップ No.19
    【動画47】 午後のフォローアップ No.19 未習得
  48. 【動画48】 発展編1 フォローメールセミナー 第29回
    【動画48】 発展編1 フォローメールセミナー 第29回 未習得
  49. 【動画49】 午後のフォローアップ No.20
    【動画49】 午後のフォローアップ No.20 未習得
  50. 【動画50】 発展編1 フォローメールセミナー 第30回
    【動画50】 発展編1 フォローメールセミナー 第30回 未習得
  51. 【動画51】 午後のフォローアップ 最終回
    【動画51】 午後のフォローアップ 最終回 未習得

塾長 小川慶一

メニュー

コメント紹介

もっと見る

ページの先頭へ