データ転記マクロ
VBA初心者向けブログみたいなタイトルなのに、全然初心者向けじゃなかったので、ちょっと初心者の頃を思い出して書く。
私がVBAにハマるきっかけになったマクロです。
こんな個票のデータを、
こんな集約表に転記していく、という作業です。
集約用のExcelファイルと、データ個票のExcelファイルは、この「集約テスト」フォルダの中に、
こんな風に収まっているという想定で。
「データ集約用.xlsm」の標準モジュールに以下のコードを書く。
Option Explicit
Sub sendDataVer1()
'作業フォルダパスを変数に格納
Dim folderPath As String
folderPath = ThisWorkbook.Path
'アクティブシートを変数にセット
Dim objSheet As Worksheet
Set objSheet = ActiveSheet '……(1)
'個票ブックのファイル名を変数にセット
Dim objFileName As String
objFileName = objSheet.Parent.Name '……(2)
'データの転記
With ThisWorkbook.Worksheets("集約") '……(3)
Dim tgtRow As Integer
tgtRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1 '……(4)
.Range("A" & tgtRow).Value = objSheet.Range("B3").Value 'No '……(5)
.Range("B" & tgtRow).Value = objSheet.Range("B7").Value '級
.Range("C" & tgtRow).Value = objSheet.Range("C7").Value '班
.Range("D" & tgtRow).Value = objSheet.Range("F3").Value '氏名
.Range("E" & tgtRow).Value = objSheet.Range("F5").Value '期別
.Range("F" & tgtRow).Value = objSheet.Range("B5").Value '登録
.Range("G" & tgtRow).Value = objSheet.Range("F7").Value '戦法
End With
'個票ファイルを閉じてフォルダ移動
objSheet.Parent.Close False '……(6)
Name folderPath & "\" & objFileName As _
folderPath & "\処理済\" & objFileName '……(7)
End Sub
かなり細かくコメントを入れているので、説明不要かも知れないけど、一応説明。
(1)の
Set objSheet = ActiveSheet
でアクティブシートを変数にセットしている。このマクロは、個票ファイルのシートを開いた状態で実行するので、データが入っているシートを変数にセットしておく。ActiveSheet
のままだと、途中でActiveSheet
が切り替わってしまったときに思いもかけない結果になることがあるので一応。
(2)の
objFileName = objSheet.Parent.Name
で、個票ブックのファイル名を取得しておく。後の転記のことを考えて、シートを変数にセットしたので、ブック名はParent
プロパティから取得している。子オブジェクトからさかのぼって親オブジェクトの値を取得することができるというのはちょっとした便利ワザかも。
(3)の
With ThisWorkbook.Worksheets("集約")
で、ThisWorkbook.Worksheets("集約")
というWorkheet
オブジェクトに関する記述をまとめているので、以後10行下のEnd With
までの間、「.
」(ピリオド)で書き始めると、ThisWorkbook.Worksheets("集約")
が省略されているとみなされる。
(4)の
tgtRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1
で、転記先(集約シート)のデータ記入済み最終行の次の行の番号を割り出している。このやり方は手が勝手に動くレベルまでマスターしておくべき。データ転記系の処理ではやたらよく使うので。
いちおうコードを翻訳しておくと、
1列目(A列)の全行数行目(要するに最終行)から上方向にデータが入っているセルに突き当たった行の行番号+1を変数tgtRow
に代入せよ
ということ。
(5)からの7行
.Range("A" & tgtRow).Value = objSheet.Range("B3").Value 'No.' .Range("B" & tgtRow).Value = objSheet.Range("B7").Value '級' .Range("C" & tgtRow).Value = objSheet.Range("C7").Value '班' .Range("D" & tgtRow).Value = objSheet.Range("F3").Value '氏名' .Range("E" & tgtRow).Value = objSheet.Range("F5").Value '期別' .Range("F" & tgtRow).Value = objSheet.Range("B5").Value '登録' .Range("G" & tgtRow).Value = objSheet.Range("F7").Value '戦法'
で一つ一つデータを転記している。すげー原始的な書き方だけど、初心者のうちはこれで良いと思う。
(6)の
objSheet.Parent.Close False
は超重要。個票ファイルを保存せずに閉じている。この「閉じる」という手順を抜かすと、次のName
ステートメントの実行でエラーが出る。
(7)の
Name folderPath & "\" & objFileName As _ folderPath & "\処理済\" & objFileName
がフォルダ移動の処理。初心者にはとっつきにくく感じる処理かも知れない。普通、フォルダ移動って「切り取って貼り付ける」ってイメージだから。でもファイルシステム的にはファイルフルパスを書き換えたらディレクトリが変わるってことだから、こうなる。
まず、集約用ブックを開いておいて、クイック アクセス ツールバーに今回のマクロを登録しておく。
個票ファイルを開いたら、クイック アクセス ツールバーのアイコンをクリック!
ほれ、一瞬でデータが転記されておる。
次のファイルを開いて、クイック アクセス ツールバーのアイコンをクリック!
ほれ、この通り。
この段階で、フォルダ内はこの通り。処理済みのファイルはもうここにはない。
同じように、個票ファイルを開いてはクイック アクセス ツールバーのアイコンをクリック、を繰り返すと、転記完了。
んで、「処理済」フォルダの中はこの通り。
コード面ではツッコミどころ満載ですが、データ転記系の業務が多い場合は、これをマスターしたらかなり楽になると思う。