VBA100本ノック 30本目:名札作成(段組み)

この記事から得るもの

処理行を変えるカウンタの使い方。


1 今回のお題

古臭いですが名札を作ることになりました。
「名簿」シートのB列に役職、C列に名前が入っています。
「名簿」から「名札」を作成してください。
「名札」はレイアウト・書式を作成済みですが、行数は毎回変わるので3行目以降は1,2行目からコピーしてください。
※画像参照

f:id:bimori466:20201201061238p:plain

excel-ubara.com

2 今回のお題の意図

書き込み行が変わる時のフラグを作って、行を追加する。今回のお題で言えば、B列までしか使わないので、B列に書き込んだ後、行の追加をする処理を考える。

3 回答

レイアウトは作成済みということなので、以下の画像のように名札Sheetにレイアウトを準備しておきます。
f:id:bimori466:20201201062015p:plain

私の回答

Sub ノック30本目_1()

Dim ws名簿 As Worksheet: Set ws名簿 = Worksheets("名簿")
Dim ws名札 As Worksheet: Set ws名札 = Worksheets("名札")
Dim Position As String: Dim myName As String
Dim Write_IX As Long: Write_IX = 1
Dim Write_Count As Long: Write_Count = 0
Dim Write_Count_IX As Long: Write_Count_IX = 0


'前回のデータを削除
ws名札.Rows("3:1000").Delete    '1000は適当
ws名札.Rows("1:2").ClearContents

'書込み処理
For i = 2 To ws名簿.Range("A1").CurrentRegion.Rows.Count
    Position = ws名簿.Cells(i, 2)
    myName = ws名簿.Cells(i, 3)
    
    If Write_Count = 0 Then
    
        '名札Sheetに書き込み
        Write_Count = Write_Count + 1
        ws名札.Cells(Write_IX, 1) = Position
        ws名札.Cells(Write_IX + 1, 1) = myName
        
    Else
        '名札Sheetに書き込み
        Write_Count = Write_Count + 1
        ws名札.Cells(Write_IX, 2) = Position
        ws名札.Cells(Write_IX + 1, 2) = myName
        
        
    End If
    
    If Write_Count Mod 2 = 0 Then
        ws名札.Rows("1:2").Copy ws名札.Rows(Write_Count + Write_Count_IX + 1)
        ws名札.Rows(Write_Count + Write_Count_IX + 1).ClearContents
        ws名札.Rows(Write_Count + Write_Count_IX + 2).ClearContents
        Write_Count_IX = Write_Count_IX + Write_Count
        Write_IX = Write_IX + 2 '書き込み先up
        Write_Count = 0 '初期化
    End If
Next

End Sub


解説すると、変数Write_Count で書込んだ回数を+1します。
条件「If Write_Count Mod 2 = 0 Then」に当てはまれば、次の行を作成し、書き込み用の変数をUP、初期化します。

何の変哲もないコードとなっております。

ほかの人のコードを見て勉強になったこと

1,2行目のRowをコピーするので、データまでコピーされます。なのでデータ部分は消すのですが、変数を使った複数行の選択方法が分からず、

ws名札.Rows(Write_Count + Write_Count_IX + 1).ClearContents
ws名札.Rows(Write_Count + Write_Count_IX + 2).ClearContents

と、2行で書いてしまいました。しかし、これは1行で記述が可能でした。↓↓

ws名札.Rows(Write_Count + Write_Count_IX + 1 & ":" & Write_Count + Write_Count_IX + 2).ClearContents


「& ":" &」で変数を繋げれば1行で記述可能でした。一つ勉強になりました。

4 感想

こんなの簡単と思っていたら意外と時間がかかってしまいました(;^ω^)。まだまだ修行が足らんです。


ではでは、この辺で(^^)/~~~