エクセルVBA 集計ファイルの作り方⑥
どうもhiroakiです。
先日、下記の記事を書きました。
コードの中身が分からない人のために、解説していきたいと思います。
If~ Else以降について
Else以降は、シート2班のC16:H25までのセル内が空白でない場合の処理です。
- Else
- Worksheets(name_worksheet).Range(hanni).Copy
- Workbooks("集計ファイル.xlsm").Worksheets("出力").Range("B" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial
- Workbooks("集計ファイル.xlsm").Worksheets("出力").Range("B" & Rows.Count).End(xlUp).Offset(0, -1) = name.Value
- n = -1
- Do Until n = 1
- If Workbooks("集計ファイル.xlsm").Worksheets("出力").Range("B" & Rows.Count).End(xlUp).Offset(n, -1) = "" Then
- Workbooks("集計ファイル.xlsm").Worksheets("出力").Range("B" & Rows.Count).End(xlUp).Offset(n, -1) = name.Value
- n = n - 1
- Else
- n = 1
- End If
- Loop
- wb.Close
- End If
- Next
- End Sub
2行目からは、シート2班のC16:H25までのセルをコピーして、出力シートに貼り付けています。PasteSpecialメソッドは、形式を指定して貼り付けるという意味です。これがないと、結合セルなどをコピペできません。
4行目では、貼り付けた隣にファイル名をかき込みます。
ちょっと飛ばして、16行目からワークブックを閉じ、End ifでifの処理を終え、NextでForNextステートメントの処理を終え、End Subでマクロの処理を終えます。
では、飛ばした6~14行について説明していきます。
繰り返し処理 Do Until
6~14行の処理がないと下の画像のような処理となります。
このA列の空いてるセルにファイル名を入れていきたいと思います。
まず、どう考えるかというと、ファイル名を入れたセルの上のセルが空白だったら、そこにも同様のファイル名を入れる、と考えます。
この時、繰り返し処理を行う必要があります。
今回はDo Untilステートメントを使います。
- Do Until 条件式
- 条件式が成立するまで繰り返す処理
- Loop
では、みていきます。
ここではOffsetプロパティの行を指定する位置に変数nを入れておきます。そして、この変数nをスイッチのような役割として用います。
はじめはn=-1としておいて、中に囲ったif条件式が成立しなくなったらn=1として処理を終了させるというものです。
- n = -1
- Do Until n = 1
- If Workbooks("集計ファイル.xlsm").Worksheets("出力").Range("B" & Rows.Count).End(xlUp).Offset(n, -1) = "" Then
- Workbooks("集計ファイル.xlsm").Worksheets("出力").Range("B" & Rows.Count).End(xlUp).Offset(n, -1) = name.Value
- n = n - 1
- Else
- n = 1
- End If
- Loop
nはA列の位置を表します。n=-1から始まり、-2、-3と処理が続く限り、上部に空白がないか調べていきます。
空白がなくなると、n=1として処理を止めます。
最後に注意点~
・フォルダのアルファベットは大文字でも小文字でも同様に取得できます。今回の例でいうと、a社でもA社でも可です。ただ、作業シートA2欄にいれた名前で出力シートに表示されます。
一方、半角全角ではフォルダ名は取得できませんので注意です。
コピーする範囲(今回はC16:H25でした)も半角全角どちらでも同じように検索してくれます。
・シート名(今回は2班でした)は半角、全角が違うと検索できません。検索できるようにするには、新たなコードを加える必要があります。
シート名はこちらで指定して回収するなどの工夫が必要でしょう。
・注意点ですが、結合セルのコピー貼り付けの際、空白箇所をコピーして貼り付ける、と処理が途中で進まなくなる場合があります。その場合はEscキーで処理を止める必要があります。
以上~
以上になります。
お疲れ様でした。途中解説が分かりにくい部分もあったかもしれませんが、今回はここまでにしたいと思います。変更点などがあれば随時内容を入れ換えますのでチェックしておいてください。
他にも有用なものができたら、作り方含めて公表しますので、読んでいただければと思います。質問等はお気軽にツイッターへどうぞ。
では。
エクセルVBA 集計ファイルの作り方⑤
どうもhiroakiです。
先日、下記の記事を書きました。
コードの中身が分からない人のために、解説していきたいと思います。
~の場合 If~
では中核部分に入っていきます。
Ifステートメントについてです。
以下のように使います。
- If 条件式 Then
- 条件式が成立する場合の処理
- Else
- それ以外の処理
- End If
では、具体的にみていきましょう。長いので、まずは、Elseまで。
- If WorksheetFunction.CountBlank(Worksheets(name_worksheet).Range(hanni)) = Worksheets(name_worksheet).Range(hanni).Count Then
- Workbooks("集計ファイル.xlsm").Worksheets("出力").Range("B" & Rows.Count).End(xlUp).Offset(1, 0) = "空白です"
- Workbooks("集計ファイル.xlsm").Worksheets("作業").Activate
- Worksheets("出力").Range("B" & Rows.Count).End(xlUp).Offset(0, -1) = name.Value
- wb.Close
1行目には条件式が書いてあります。
簡単にいうと、if A=B Thenの形になっています。
A=Bの部分は、『シート2班のC16:H25までの空白の数 = シート2班のC16:H25までのセルの数』となっています。
要するに、ここではコピー先が空白かどうか調べています。
WorksheetFunctionはワークシート関数というものです。これはエクセルの関数のこと。
WorksheetFunction.ワークシート関数名
とすればワークシート関数が使えるんです。便利ですね。
CountBlankは空白を数える関数。カッコ内にどこの空白を数えるか入れてあげてください。
2行目には、出力シートB2に、空白ですという文字を入れています。
3行目ではいったん、作業シートをアクティブにします。
4行目では、出力シートの空白です、と書いた隣にname変数の値を代入します。
5行目では、ワークブックを閉じます。
End、Offsetプロパティについて
まず、Endプロパティについてです。
オブジェクト.End(方向)で、基準となるオブジェクトの上端(xlUp)下端(xlDown)左端(xlToLeft)右端(xlToRight)を指定します。オブジェクトがアクティブセル領域にあるかないかで判断するのがポイントです。
- Workbooks("集計ファイル.xlsm").Worksheets("出力").Range("B" & Rows.Count).End(xlUp).Offset(1, 0) = "空白です"
- Worksheets("出力").Range("B" & Rows.Count).End(xlUp).Offset(0, -1) = name.Value
ここでは基準となるオブジェクトを集計ファイル出力シートのBセルとしています。Rows.Countでは行コレクションの数を数えています。つまり、B列の最終行のセルを基準にしているということになります。その位置から、上端を指定しています。
つぎに、Offsetプロパティについてです。
オブジェクト.Offset(行,列)として、オブジェクトから、ずらした位置を指定します。
この場合は、1行下のセル、つまりB2を指定しています。そこに空白ですと書き込みます。
2行目では、先ほど、空白ですと書いたセルの隣に、ブック名を書き込みます。
今回はここまで~
今回はここまでにします。
もっと詳しく知りたい場合は、コメントなどくだされば解説したいと思います。
次回からも続きを解説していきます。
では。