VBA100本ノック 30本目:名札作成(段組み)
1 今回のお題
古臭いですが名札を作ることになりました。
「名簿」シートのB列に役職、C列に名前が入っています。
「名簿」から「名札」を作成してください。
「名札」はレイアウト・書式を作成済みですが、行数は毎回変わるので3行目以降は1,2行目からコピーしてください。
※画像参照
2 今回のお題の意図
書き込み行が変わる時のフラグを作って、行を追加する。今回のお題で言えば、B列までしか使わないので、B列に書き込んだ後、行の追加をする処理を考える。
3 回答
レイアウトは作成済みということなので、以下の画像のように名札Sheetにレイアウトを準備しておきます。
私の回答
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 感想
こんなの簡単と思っていたら意外と時間がかかってしまいました(;^ω^)。まだまだ修行が足らんです。
ではでは、この辺で(^^)/~~~