凡人も語りたい

VBAに関すことや日々考えている事柄について投稿しようと思っています。

VBA 100本ノックNo91

お題

解答コード

Class1 コード(クラスモジュール)

Option Explicit
Private rest As Integer
Private St1_ As Double
Private fin1_ As Double
Private WT_ As Long
Private Ded_ As Long
Private NT_ As Long
Private Ovt_ As Integer
'Letプロパティの一括設定
Sub SetProp(ByVal new_st1 As Double, ByVal new_fin1 As Double)
    rest = 60 '休憩時間 60分
    If new_st1 < TimeSerial(9, 0, 0) Then
        St1_ = 9 / 24 '9時のシリアル値
    Else
        St1_ = new_st1
    End If
    fin1_ = new_fin1
    WT_ = WorkTime
    Ovt_ = OverTime
    NT_ = Night
End Sub
'労働時間の計算
Private Function WorkTime() As Long
    Dim WT As Double
    WT = fin1_ - St1_
    WorkTime = WorksheetFunction.RoundDown((WT) * 1440, 0) - rest
End Function
'残業時間の計算
Private Function OverTime() As Integer
    If WT_ > 480 Then
        OverTime = WT_ - 480
    Else
        OverTime = 0
    End If
End Function
'深夜時間の計算
Private Function Night() As Long
    Dim i As Long, dbStr As Double, dbFin As Double, dbNT As Long
    dbStr = St1_
    If fin1_ >= 1 Then
        dbFin = fin1_ - 1
    Else
        dbFin = fin1_
    End If
'始業時刻の条件分岐
'始業時刻が0時~5時までかつ、
    If dbStr < TimeSerial(5, 0, 0) Then
'終業時刻が0時~5時までの場合
        If dbFin < TimeSerial(5, 0, 0) Then
            dbNT = WorksheetFunction.RoundDown((dbFin - dbStr) * 1440, 0)
'終業時刻が22時~24時までの場合
        ElseIf dbFin > TimeSerial(22, 0, 0) Then
            dbNT = WorksheetFunction.RoundDown(((5 / 24 - dbStr) + dbFin - 22 / 24) * 1440, 0)
'終業時刻が5時~24時までの場合
        Else
            dbNT = WorksheetFunction.RoundDown((5 / 24 - dbStr) * 1440, 0)
        End If
'始業時刻が22時~24時までかつ、
    ElseIf dbStr >= TimeSerial(22, 0, 0) Then
'終業時刻が0時~5時までの場合
        If dbFin < TimeSerial(5, 0, 0) Then
            dbNT = WorksheetFunction.RoundDown((dbFin + (1 - dbStr)) * 1440, 0)
'終業時刻が22時~24時までの場合
        ElseIf dbFin > TimeSerial(22, 0, 0) Then
            dbNT = WorksheetFunction.RoundDown(((dbFin - dbStr) + dbFin - 22 / 24) * 1440, 0)
'終業時刻が5時~24時までの場合
        Else
            dbNT = WorksheetFunction.RoundDown((5 / 24 + (1 - dbStr)) * 1440, 0)
        End If
'始業時刻が8時~22時までかつ、
    Else
'終業時刻が0時~5時までの場合
        If dbFin < TimeSerial(5, 0, 0) Then
            dbNT = WorksheetFunction.RoundDown((dbFin + 2 / 24) * 1440, 0)
'終業時刻が22時~24時までの場合
        ElseIf dbFin > TimeSerial(22, 0, 0) Then
            dbNT = WorksheetFunction.RoundDown((dbFin - 22 / 24) * 1440, 0)
'終業時刻が翌日5時~8時までの場合
        ElseIf dbFin < dbStr Then
            dbNT = 420
'終業時刻が8時~24時までの場合
        Else
            dbNT = 0
        End If
    End If
    Night = dbNT
End Function
’プロパティ取得の設定
Property Get 勤務時間() As Double
    勤務時間 = WT_
End Property
Property Get 深夜時間() As Double
    深夜時間 = NT_
End Property
Property Get 始業時刻() As Double
    始業時刻 = St1_
End Property
Property Get 終業時刻() As Double
    終業時刻 = fin1_
End Property
Property Get 残業時間() As Integer
    残業時間 = Ovt_
End Property

Module1 コード(標準モジュール)

Sub ノック91本目()
    Dim ID As Integer
    Dim Dic_ID As Object: Set Dic_ID = CreateObject("Scripting.Dictionary")
    Dim cnt_ID As Long
    Dim y As Integer, m As Integer
    Dim 年月 As String
    Dim Dic_年月 As Object: Set Dic_年月 = CreateObject("Scripting.Dictionary")
    Dim cnt_年月 As Long
    Dim i As Long
'ID,年月に関する連想配列生成と二次元配列の要素数決定
    For i = 2 To Sheet1.Cells(Rows.Count, 1).End(xlUp).Row
        ID = Sheet1.Cells(i, 1).Value
        年月 = Nengetsu(Sheet1.Cells(i, 2).Value)
        If Not (Dic_ID.exists(ID)) Then
            cnt_ID = cnt_ID + 1
            Dic_ID.Add ID, cnt_ID
        End If
        If Not (Dic_年月.exists(年月)) Then
            cnt_年月 = cnt_年月 + 1
            Dic_年月.Add 年月, cnt_年月
        End If
    Next
'ID,年月ごとの残業時間集計
    Dim obj As Class1
    Dim StartTime As Double, FinishTime As Double
    Dim arr() As Variant
    ReDim arr(1 To cnt_ID, 1 To cnt_年月) As Variant
    For i = 2 To Sheet1.Cells(Rows.Count, 1).End(xlUp).Row
        ID = Sheet1.Cells(i, 1).Value
        年月 = Nengetsu(Sheet1.Cells(i, 2).Value)
        StartTime = Sheet1.Cells(i, 3).Value
        FinishTime = Sheet1.Cells(i, 4).Value
        Set obj = New Class1
        obj.SetProp StartTime, FinishTime
        arr(Dic_ID(ID), Dic_年月(年月)) = arr(Dic_ID(ID), Dic_年月(年月)) + obj.残業時間
        Set obj = Nothing
    Next

'残業シートへの転記
    Dim j As Long, k As Long, r As Long
    Dim Keys_ID As Variant: Keys_ID = Dic_ID.keys
    Dim Keys_年月 As Variant: Keys_年月 = Dic_年月.keys
    r = 1
    For j = 1 To cnt_ID
        For k = 1 To cnt_年月
            r = r + 1
            Sheet2.Cells(r, 1).Value = Keys_ID(j - 1)
            Sheet2.Cells(r, 2).Value = Keys_年月(k - 1)
            If arr(j, k) Mod 60 < 30 Then
                Sheet2.Cells(r, 3).Value = "'" & arr(j, k) \ 60 & ":00"
            Else
                Sheet2.Cells(r, 3).Value = "'" & arr(j, k) \ 60 & ":30"
            End If
        Next
    Next
End Sub

'年月文字列を生成する関数
Function Nengetsu(ByVal d As Date) As String
    Nengetsu = Year(d) & Month(d)
    If Month(d) > 9 Then
        Nengetsu = Year(d) & Month(d)
    Else
        Nengetsu = Year(d) & "0" & Month(d)
    End If
End Function

振り返りと感想

完成まで3時間。以前に近いものを作った経験があったのでそのノウハウを応用。
表記は文字列で扱っており手抜き…本来はFormat関数やNunberFormat関数で整形するのが理想だと思います。
始業時刻、終業時刻から様々なデータを生成できるのでクラスを活用しています。
そのため、インスタンスのプロパティを変更するだけで、総労働時間や深夜時間を切り替えて集計できます。

個人的な時間計算における時刻データの取り回しは

  1. 日付型ではなくシリアル値(Double型)で取得
  2. シリアル値のまま時刻計算
  3. 端数処理は分単位に変換してから取り回し([シリアル値] ×1440)
  4. 最後に時刻表記に変換

という方法で基本的に行っています。

回りくどい方法ですが、日付型はシリアル値が1以上になると「時刻のみ」から「日付+時刻」で取り扱われるので直感的に扱いづらいためこのような変換を行っています。
マスタ上の時刻標記が[h]:mm:ss型であるため、労働時間の算出は非常にやりやすかったです。マスタの記述ルールの重要性を実感しました。
日付をまたぐ条件分岐(出題違反以外ですが、今回でいえば深夜時間の算出)はh:mm:ss型にも対応できるように、かなり面倒な処理をしています。

VBAの悩みはVBAerに聞け! 第7回 1次会 話題のメモ帳

関数について

やまとさんが関数(Function)を使う理由

  1. コーディングで楽をしたいため
  2. メインのプロシージャが何やっているかがわかりやすい
関数を作るとは?
Worksheet関数を作れる?

条件があるものの、標準モジュールで作成したFunctionプロシージャ
ADD2とするとエラー→ADD列2行目の参照と認識してしまった
参照とみなせる関数は作れない

FunctionとSubの違い

sub:プロシージャ名は値を返さない
Function:プロシージャ名自体が値を返す

「:=」とは?

:= :関数の名前付き引数を指定して値を代入する。引数の順番を入れ替えても関数が機能する
= :変数へ値を代入する

引数のヒントを出すショートカット

Ctrl+i (りゅうりゅうさん)

  • 引数のヒントをコピペするショートカットなかった?
ワークシート関数の引数入力ショートカット

Ctrl+Shift+A
→自作関数も同じく出る

ByVal、ByRef

ByVal:引数で渡した変数が呼び出し先の影響を受けない、省略不可

  • ByValでしかできないこと

分割した先のプロシージャ内で引数を変数に代入しなくてもよい

ByRef:引数で渡した変数が呼び出し先の影響を受ける、省略可

  • ByRefでしかできないこと

一つの関数で渡した複数の引数に対して複数の値を返してほしいとき

その他

変数日本語派?
  • やまとさんの考え

業務で使うものは日本語、自分で使うものは英語
→以前モジュール名日本語でバグったことがある

goto gosubの違い

gotoは戻る場所を自分で管理する必要がある
→どこに戻るかわかりくい

gosubはreturnで元の処理に戻れる

  • エラー処理の共通化、特定の計算値算出にjika便利(ほえほえさん)
  • 「変数を共有して他から呼べない処理」という意味でスーパーPrivate sub と思っていい(和風スパゲティさん)

VBA 100本ノックNo11~14

Sub ノック11本目()
With Worksheets("セル結合")
Dim r As Long: r = .Cells(Rows.Count, 1).End(xlUp).Row
Dim c As Long: c = .Cells(1, Columns.Count).End(xlToLeft).Column

Dim i As Long, j As Long
For i = 1 To r
    For j = 1 To c
        If .Cells(i, j).MergeCells Then .Cells(i, j).AddComment.Text "セル結合…しましたね…(´・ω|"
    Next
Next
End With
End Sub

Sub ノック12本目()
With Worksheets("セル結合")
Dim r As Long: r = .Cells(Rows.Count, 1).End(xlUp).Row
Dim c As Long: c = .Cells(1, Columns.Count).End(xlToLeft).Column

Dim i As Long, j As Long, k As Long, md As Integer
Dim trg As Range
Dim amount As Long '金額
For j = 1 To c
    For i = 1 To r
        If .Cells(i, j).MergeCells Then                                                          'セルの結合判定
            Set trg = .Cells(i, j).MergeArea
            trg.UnMerge
            md = .Cells(i, j).Value Mod trg.Rows.Count                                              '余りの計算
            If md = 0 Then                                                                          '割り切れる場合
                amount = .Cells(i, j).Value / trg.Rows.Count
                For k = 1 To trg.Rows.Count                                                             '結合範囲のループ処理
                    .Cells(i + k - 1, j).Value = amount
                Next
            Else                                                                                    '端数が出る場合
                amount = WorksheetFunction.RoundDown(.Cells(i, j).Value / trg.Rows.Count, 0)
                For k = 1 To trg.Rows.Count                                                             '結合範囲のループ処理
                    Select Case k
                    Case Is <= md                                                                       '余りの配賦
                        .Cells(i + k - 1, j).Value = amount + 1
                    Case Else
                        .Cells(i + k - 1, j).Value = amount
                    End Select
                Next
            End If
        End If
    Next
Next
End With

End Sub

Sub ノック13本目()
Dim arr As Variant, Target As Range
If TypeName(Selection) = "Range" Then
    Set Target = Selection
    For Each arr In Target
        Dim i As Long
        Dim start As Integer: start = 1
        
        Do
        If Not (InStr(start, arr.Value, "注意") = 0) Then
            arr.Characters(InStr(start, arr.Value, "注意"), 2).Font.Color = RGB(255, 0, 0)
            start = InStr(start, arr.Value, "注意") + 2
        End If
        Loop Until InStr(start, arr.Value, "注意") = 0
    Next
End If
End Sub

Sub ノック14本目()
Dim wsName As String
Dim ws As Worksheet
Dim cnt As Long
For Each ws In Worksheets
    wsName = ws.Name
    If Not (InStr(wsName, "社外秘") = 0) Then
        Application.DisplayAlerts = False
        Worksheets(wsName).Delete
        Application.DisplayAlerts = True
        cnt = cnt + 1
    End If
Next
MsgBox cnt & "枚のコードを削除しました"
End Sub

振り返りと反省

  • セル結合に関わるメソッド(MergeCells、MergeAreaなど)をうまく使いこなせていない
  • 結合セルのカウントと端数処理が回りくどい気がする
  • Charactersプロパティ使ったのが久々。Value(値)とCharacters(文字列オブジェクト)の違いをしっかり理解する
  • InStrは便利なので使いこなせるように意識して使ってみる

VBAの悩みはVBAerに聞け! 第6回 話題のメモ帳

2021/2/12 20時から行われた VBAの悩みはVBAerに聞け! に今回も参加しました。

主催者のしゃあさんも議事録を作っております。
今回の登壇者である「あこ」さんが作成したマクロもダウンロード可能ですので、コイらもぜひご覧ください。
note.com

聞き取れた範囲ですが以下にまとめました。

話題抜粋

SheetsコレクションとWorksheetsコレクションの違い

Worksheets:ワークシートのみのコレクション。インデックスで指定してもワークシートのみ指定される。
Sheets:ワークシート、グラフシート、Excel4.0マクロなども含むコレクション。
SheetsコレクションからWorksheetオブジェクトを指定する場合、インデックスで指定するとワークシート以外のシートも指定される
→グラフシートなどが挿入されていると想定外の挙動になる可能性あり

sleep、wait、doevents の違い

ループ処理の際、一時停止の方法として利用される手法として上記の3つがあるが、その違いは何なのか?という質問から

ほえほえ先生の回答

sleep: プロセスが停止→バックグランドも停止
wait:VBAスレッドが停止→バックグラウンドは動作する
doevent: 実行権の放棄

フォームコントロールActiveXコントロールフォームの違い

  • 宗教の違い
  • ActiveXの方はWindouwアップデートに影響されてバグが発生する可能性がある
  • ActiveXコントロールはワークシートモジュールのメンバになるため、標準モジュールから直接コントロールできない

Shell,VBSの使い方

Shell関数:Shell で起動したプログラムが、他のプログラムが非同期に実行させる関数

(VBSは聞き逃しました…すみません)

VBEからMicrsoftDocsの開き方

キーワード上にマウスカーソルを置き、F1キー(ヘルプ)を押す

「””」と「Null」の違い

””:空文字。
Null:有効な数値ではないことを示す値

チャットで挙げられていた例え
  • 「””」はトイレットペーパーの紙がない状態
  • 「Null」はそもそもトイレがない

感想

今回も非常に勉強になりました!
Shell関数やVBSは触れたことがまだないので、もっと勉強が必要だなぁ…と実感。
しっかり理解できていないことが多いから、ブログでアウトプットしながら整理したいです。

VBA 100本ノックNo6~10

Sub ノック6本目()
    Dim ws As Worksheet: Set ws = Worksheets("Sheet6")
    Dim i As Long
    For i = 2 To ws.Cells(Rows.Count, 1).End(xlUp).Row
        If ws.Cells(i, 1).Value Like "*-*" Then
            ws.Cells(i, 4).Value = ""
        Else
            ws.Cells(i, 4).Formula = "=B" & i & " * C" & i
        End If
    Next
End Sub

Sub ノック7本目()
    Dim ws As Worksheet: Set ws = Worksheets("Sheet7")
    Dim i As Long
    For i = 2 To ws.Cells(Rows.Count, 1).End(xlUp).Row
        Dim stDate As String
        stDate = ws.Cells(i, 1).Value
        If IsDate(stDate) Then
            Dim dDate As Date
            dDate = DateValue(stDate)
            ws.Cells(i, 2).NumberFormatLocal = "mmdd"
            ws.Cells(i, 2).Value = DateSerial(Year(dDate), Month(dDate) + 1, 1) - 1
        End If
    Next
End Sub

Sub ノック8本目()
    Dim arr As Variant: arr = Worksheets("成績表").Range("a1").CurrentRegion
    Dim i As Long, j As Long, Goukei() As Long
    For i = 2 To UBound(arr, 1)
        ReDim Goukei(0)
        For j = 2 To 6
            If arr(i, j) >= 50 Then
                Goukei(0) = Goukei(0) + arr(i, j)
            End If
        Next
        If Goukei(0) >= 350 Then
            Worksheets("成績表").Cells(i, 7).Value = "合"
        End If
    Next
End Sub

Sub ノック9本目()
    Dim ws As Worksheet
    For Each ws In Worksheets
        If ws.Name = "合格者" Then
            Call Pass(ws)
            Exit Sub
        End If
    Next ws
    Dim newws As Worksheet: Set newws = Worksheets.Add
    newws.Name = "合格者"
    Call Pass(newws)
End Sub

Sub Pass(ws As Worksheet)
    Dim cnt As Long, i As Long
    Dim arr1() As String
    ReDim arr1(1 To 1) As String
    With Worksheets("成績表")
        For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
            If .Cells(i, 7).Value = "合" Then
                cnt = cnt + 1
                ReDim Preserve arr1(1 To cnt)
                arr1(cnt) = .Cells(i, 1).Value
            End If
        Next
    End With
    ws.Cells(1, 1).Value = "合格者名"
    Dim j As Long
    For j = 1 To UBound(arr1)
        ws.Cells(j + 1, 1).Value = arr1(j)
    Next
End Sub

Sub ノック10本目()
    Dim ws As Worksheet: Set ws = Worksheets("受注")
    Dim i As Long
    For i = 2 To ws.Cells(Rows.Count, 1).End(xlUp).Row
        If ws.Cells(i, 4).Value Like "*削除*" Or ws.Cells(i, 4).Value Like "*不要*" Then ws.Rows(i).Delete
    Next
End Sub

振り返りと反省

所要時間2時間30分… 想定より結構かかってしまった…

ここら辺に手間取ってしまい、いろいろ調べながら解決。
NumberFormatLocalを使うところを最初Format関数で処理しようとしてうまくいかなかった。ここら辺のニュアンスの違いはしっかりと理解したい(´・ω・`)
Likeはだいぶ使い方がなじんだので、今後使っていきたい。

Excel 「条件付き書式」を利用した外枠罫線・格子罫線設定の切り替え自動化

どうも、こんぺです。

今回は、先日登壇させていただいた VBA座談会にて誕生した条件付き書式の小技をまとめました。

登壇した座談会についてはこちら↓
yumeoi10nen.hatenadiary.com

外枠罫線と格子罫線の自動切換え

帳票を作るにあたり、最後見栄えを整えるときに「外枠を太線に変更」や「格子線を点線に変更」といった操作をする方、結構いるのではないでしょうか。
見栄えのために「複数の罫線を設定する」という作業は地味に面倒くさい作業だと思います。(私は面倒です…)

ですが、条件付き書式は「セルの高さが変わる書式変更はできない」仕様となっているとのこと…
そのため「条件に合わせて太線に変更する」という書式設定はできないのでした!
(座談会に参加するまで全く知りませんでした…)

しかし、使い方を工夫することで太い罫線を使いながら罫線を自動で切り替えできるようになります。

テクニックが活用できる条件

  1. 格子罫線とを外枠罫線を使い分ける判断をするの「キー列」の設定ができること
  2. 条件付き書式の設定範囲が大きくならないこと(小さくなる分には対応可)

留意事項

  • 条件付き書式の範囲や条件式によってはExcelファイルの処理が重くなる可能性があります

設定手順

1.使用を想定している罫線の種類のうち、最も太い線の種類で罫線を作る

Excel,条件付き書式,参照,罫線,変更

2.条件付き書式を適用するセル範囲を選択した状態で「条件付き書式」の「新しいルール」を選択する

Excel,条件付き書式,参照,罫線,変更

3.「数式を使用して、書式設定するセルを決定」を選択し、数式バーに条件式を入力する

例では、「前後の支店名が同じ場合」が条件であるため、「=$(キー列番号)(先頭行番号)=$(キー列番号)(次の行番号)」(画像では=$A3=$A4)と入力
Excel,条件付き書式,参照,罫線,変更

4.「書式」ボタンをクリックし、「罫線」タブで格子罫線の種類と罫線を適用する辺を選択する

例では「条件に該当するセルの下部罫線を点線に変更」するため、画像のような書式を設定
Excel,条件付き書式,参照,罫線,変更

5.「OK」ボタンを2回クリックし、条件付き書式を適用する

Excel,条件付き書式,参照,罫線,変更
このように、支店名を変更する(厳密にはA列の上下のセルで違う文字列になる)ことで罫線が自動で変更されるようになります。

最後に

今回のテクニックは、 VBAで罫線を引く条件を書く段階に差し掛かったときに
→ 参加者A「条件付き書式で解消できるのでは?」
→ 参加者B「そういえば条件付き書式はセルの高さが変わる書式設定を指定できない!」
→ 参加者C「条件付き書式で罫線を太くできないけど、細くはできるんじゃない?」
できた
という会話の中で生まれたテクニックです。

三人寄れば文殊の知恵、座談会パワーが存分に発揮された結果だと思います。
次回の座談会でも、もしかしたらこれ以上の便利テクニックが生まれるかも…
ということで次回以降のスケジュールも決まっております↓
note.com

気になる方はぜひご参加してみてください!

VBA座談会&勉強会 #VBAの悩みはVBAerに聞け 第3回、ありがとうございました

どうも、こんぺです。

昨日、TwitterVBA界隈でひっそり?話題の座談会&勉強会に登壇しました。
ことの経緯はこちら↓
yumeoi10nen.hatenadiary.com

今回はこの会に登壇に際しての感想がメインとなります。
コードについてはまた後日

今回の座談会で個人的に得られた知識、知恵

1. Eraseを使うと、動的変数は一つずつ初期化しなくてもOK

動的変数を用いてカウンターを作るときは、今まで

Dim cnt(1 to 3) as Long

cnt(1)=0
cnt(2)=0
cnt(3)=0

としていましたが

Dim cnt(1 to 3) as Long

Erase cnt

で済む(整数型の場合、Eraseすら不要)ということをアドバイスされました。
知らなかった…

2. IsEmpty(空白の判定)

恥ずかしながら5年間存在を知らずにいました… IS関係の関数、勉強しようと反省

3. 条件付き書式の書式設定では「セルの高さ」が変わるものは変更不可

具体的に「設定している罫線より太い罫線」 「フォント」「文字の大きさ」の変更不可。しかし、座談会内で新たなテクが開発されました

登壇して良かったこと

つよつよVBAerの方々から様々なアドバイスを直接受けられること!

独学の道を進むことが多いVBAerにとってこれほど勉強になることはありません!
ありがたや…

コーディングするにあたって今までにない考え方を吸収できる

改善を強く意識している参加者それぞれの「自分の当たり前=効率化のノウハウ」がドンドン出てくるので、登壇前と登壇後では明らかに「成長した自分」を実感します。

VBAの勉強モチベーションが爆上がりする

入念にシミュレーションしたうえで臨んだものの、想像以上に時間が経つのが早かったです。そのため、「( ^ω^)…まだまだ修行が足りん…」となります。すごく修業したい気分になります。
Let's VBA100本ノック!

とにかく、めちゃくちゃ楽しい

普段は内線や周囲の横やりが多くコーディングに集中しにくい環境にいる私にとって、周囲に望まれた中でVBAのコーディングに何時間も集中できるのはすごく贅沢な時間でした。
コーディング中は緊張や焦りもありましたが、集中していた分時間がアッという間に過ぎました。

今後登壇する方へのアドバイス

生コーディングは予習しない方が吉

頭の中でシミュレーションするのはいいですが、挙動を事前確認はオススメしません!なぜなら、スリルを味わえないから…というようなものではないです。
「失敗(バグ)を起点とした新しい視点の指摘」が減ってしまうからです。
新しい視点を得ることはものすごい成長の機会になるので、バグやエラーを恐れず挑戦してほしいです。

どんなに簡単な処理でもいいので、ひとまず一つの処理を完成させる

生コーディグは最初は緊張の頭がうまく回りません。そして時間が想像しているよりずっと少なく、だんだん焦ってきます。
ですが、一つ処理を完成させるだけで不思議と一気に安心します。安心した後は想像以上に集中しますし、とにかく一つ処理を完成させることが吉だと思います。

あっという間に時間が過ぎる

私は気づいたら1時間半経過していました。ビビります。

チャットは読めません!

チャットに目をやる余裕はほとんどなくなると思います。どうしてもチャット内容が気になる人は読み上げソフトなど検討されると良いかもしれません。

わからなかったら、ググるより質問が吉

登壇者は、コーディング中はほんとに喋ることができません!そして、チャットが盛り上がっているのかも全然わかりません!
ですが、質問をすると話題提供ができ、「盛り上がりが全然ないのでは?」という不安感はだいぶ払しょくできます。

MCが読み上げてくれた質問の応答には耳を傾けた方がお得

声に出して話題に上がっている質問への応答は聞いた方がいいです。Enumの件、詳しく聞きたかった…(話題になっていた記憶がない)

最後に

まず主催をしていただいたしゃあ 様、しゃあ 様とともにMCで盛り上げて頂いたりゅうりゅう 様、長時間にわたり本当にありがとうございました。そしてお疲れ様でした。
参加していただいた皆様も長い時間お付き合いいただき、本当にありがとうございました。

正直緊張しましたし、終わった後に実力不足も感じました。それでも、登壇前と登壇後では明らかに成長した実感と自信が持てましたしたし、何より楽しかったです!
次回以降、参加できるときはできる限り参加したいと思っております。