気ままに趣味旅行

面白いコト「拡がる/拡げる」

エクセルVBA 集計ファイルの作り方⑤

どうもhiroakiです。

先日、下記の記事を書きました。

コードの中身が分からない人のために、解説していきたいと思います。

hiroakies.hatenablog.com

hiroakies.hatenablog.com

hiroakies.hatenablog.com

hiroakies.hatenablog.com

 

 

~の場合 If~

では中核部分に入っていきます。

Ifステートメントについてです。

以下のように使います。

  1. If 条件式 Then
  2.  条件式が成立する場合の処理
  3. Else
  4.  それ以外の処理
  5. End If

では、具体的にみていきましょう。長いので、まずは、Elseまで。

  1. If WorksheetFunction.CountBlank(Worksheets(name_worksheet).Range(hanni)) = Worksheets(name_worksheet).Range(hanni).Count Then
  2. Workbooks("集計ファイル.xlsm").Worksheets("出力").Range("B" & Rows.Count).End(xlUp).Offset(1, 0) = "空白です"
  3. Workbooks("集計ファイル.xlsm").Worksheets("作業").Activate
  4. Worksheets("出力").Range("B" & Rows.Count).End(xlUp).Offset(0, -1) = name.Value
  5. 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)を指定します。オブジェクトがアクティブセル領域にあるかないかで判断するのがポイントです。

  1. Workbooks("集計ファイル.xlsm").Worksheets("出力").Range("B" & Rows.Count).End(xlUp).Offset(1, 0) = "空白です" 
  2. Worksheets("出力").Range("B" & Rows.Count).End(xlUp).Offset(0, -1) = name.Value

ここでは基準となるオブジェクトを集計ファイル出力シートのBセルとしています。Rows.Countでは行コレクションの数を数えています。つまり、B列の最終行のセルを基準にしているということになります。その位置から、上端を指定しています。

つぎに、Offsetプロパティについてです。

オブジェクト.Offset(行,列)として、オブジェクトから、ずらした位置を指定します。

この場合は、1行下のセル、つまりB2を指定しています。そこに空白ですと書き込みます。

2行目では、先ほど、空白ですと書いたセルの隣に、ブック名を書き込みます。

 

 

今回はここまで~

今回はここまでにします。

もっと詳しく知りたい場合は、コメントなどくだされば解説したいと思います。

次回からも続きを解説していきます。

 

では。

エクセルVBA 集計ファイルの作り方④

どうもhiroakiです。

先日、下記の記事を書きました。

コードの中身が分からない人のために、解説していきたいと思います。

hiroakies.hatenablog.com

hiroakies.hatenablog.com

hiroakies.hatenablog.com

 

For Each…Nextステートメント

次は、繰り返し処理を行っていきます。

  1. For Each オブジェクト変数 In コレクション
  2.   処理
  3. Next

では実際にみていきます。

  1. For Each name In Worksheets("作業").Range("A2").CurrentRegion
まず、Worksheets("作業").Range("A2").CurrentRegionの部分をみていきます。ここでは、作業シートA2から連続して入力されているセル(アクティブセルといいます)を取得し、コレクションとしています。(CurrentRegionプロパティ)

それをname変数にひとつずつ取り出して、処理していきます。

実際に取り出されるオブジェクトは、以下の通りです。

name=A社

name=B社

name=c社

name=d社

name=f社

For Each…NextステートメントはNextまでが処理なので、コード内のNextを探してみてください。そこまで繰り返して処理を行います。

 

ブックのパスを取得する ThisWorkbook.Path

これから他ブックをひとつずつ開いていきます。上で示したように、A社ブックから開いていくイメージです。

ブックを開くには、どこに保存されているのか分かりやすく示してあげる必要があります。そのためには、ブックのファイルパスを示す必要があります。

まず、ThisWorkbook.Pathで、ブックが保存されているフォルダパスを取得します。ThisWorkbookがオブジェクトで、Pathがメソッドです。

フォルダの位置が分かったら、そのフォルダ内のどのファイルか指定します。

  1. fn = ThisWorkbook.Path & "¥" & name.Value & ".xlsx"

name.Valueでname変数に入っているA社を取り出し、&で連結してあげます。そうすると、例えば"C:¥Users¥Desktop¥出席報告¥A社.xlsx"のようにファイルパスが取得できます。

そのファイルパスを変数fnに代入します。

 

ブックを開く

ブックを開きます。ブックを開くにはOpenメソッドを使います。

オブジェクト.Open(ファイル名)の形を覚えておきましょう。

今回は、上記で取得したfnのファイルを開きます。

  1. Set wb = Workbooks.Open(fn)

そして、開いたブックをWorkbook変数wbに代入します。

その際、注意点として、Setをつけてあげなければいけません。

例えば、下のように宣言する場合の変数をオブジェクト変数とよび、この変数にオブジェクトを代入する場合は、Setをつける必要があります。

  1. Dim wb As Workbook
  2. Dim st As String

 

アラートを消す

フォルダ内ファイルを探す場合、その名前のファイルが見つからない場合があります。この場合、処理が中断してしまいます。

それでは困りますので、 

  1. On Error Resume Next

と記述する必要があります。このコードは、処理がおかしい場合にコンピュータが処理を止めてくれる機能でもありますので、むやみに書かないようにしましょう。

また、いちいち確認画面を出されると処理が止まって面倒ですので、ディスプレイアラート(メッセージ画面)を消します。

  1. Application.DisplayAlerts = False
 

今回はここまで~

今回はここまでとします。

さっと進めましたが、もっと詳しく知りたい場合は、コメントなどくだされば解説したいと思います。

次回からも続きを解説していきます。

 

では。