エクセルVBA 集計ファイルの作り方①
どうもhiroakiです。
最近、以下のような記事を読みました。
コピペね笑笑
— hiroaki (@hiroakies) 2020年2月20日
期待されて異動した若手社員が酷評された理由 (東洋経済オンライン) https://t.co/AlEDb1xIQp #linenews
実は先日、私も同じような作業をして、大変な思いをしたので、コピペ作業を軽減するVBAを紹介したいと思います。
前提
先日、私がやった仕事は、当社が開く研修会の出席報告者の取りまとめです。
各会社から【研修会受講者名簿】というものが、エクセルファイルで送られてきますので、これを集計します。
ちなみに研修会は日程ごとに1班~4班あり、シート名に入れてもらっています。
研修会を開いてる側ですが、実際、10社20社となると集計作業がだいぶ面倒です(笑)
それだけではなく、時期が近づくと辞退者が出たり新たに参加したいという人が増えたりします。このように、いわゆる変更連絡というものがあれば、その都度名簿を作り直さなければいけません。
これ非常に面倒くさいんで(笑)、私の場合は、これらのファイルを開かずに一気に集計したいと思います。
方法
まず、下のように出席報告フォルダを用意します。
つぎに、そのフォルダ内に各会社より送られてきた受講者名簿のファイルを保存。集計ファイルを用意します。
集計ファイルには作業シートと出力シートを用意します。
画像の通りに作ります~説明は省きます~笑
出力シートはまっさらな状態です。※この線は気にしないでください。
作業シートの青いボタン(VBAが設定されています)を押すと、下のように出力シートに集計結果が出てきます。
以上です。
コピペの作業から解放されるので、少し楽ですね。
コード例
改良の余地ありですが、こんな感じで書きました。
- Sub 開く()
- Dim name As Range
- Dim name_worksheet As String
- Dim hanni As String
- Dim fn As String
- Dim wb As Workbook
- Dim n As Integer
- Worksheets("出力").Cells.Clear
- Worksheets("出力").Range("A1") = "ファイル名"
- Worksheets("出力").Range("B1") = "貼付け内容"
- Worksheets("作業").Activate
- name_worksheet = Worksheets("作業").Range("C1")
- hanni = Worksheets("作業").Range("D1")
- For Each name In Worksheets("作業").Range("A2").CurrentRegion
- fn = ThisWorkbook.Path & "¥" & name.Value & ".xlsx"
- On Error Resume Next
- Application.DisplayAlerts = False
- Set wb = Workbooks.Open(fn)
- 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
- 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
標準モジュールへコピペして使ってみてください。
詳しい使い方や注意点はVBAの基礎的なことを踏まえて、次回以降また説明したいと思います。
質問等はお気軽にツイッターへどうぞ。
ではでは。
『文章力の基本』阿部 紘久さん
どうもhiroakiです。
久々にブログ書きました(笑)
さて最近は積読の解消中で、ペースは遅いのですが、どんどん消化していっています。読んだ本は、ブログだけじゃなく、Twitterにもまとめていっているのですが、今回は文量が収まらなかったので、こちらに書きました。
参考になった箇所
・句点を打って文章を短く言い切る勇気を持つ。
・一度にたくさんの情報を伝えようとしない。何回かに分けるか、一部をあきらめる。
・文章をシンプルに変換してみて、おかしくないか検証する。何が言いたいのか改めて考えてみる。
・原因と結果が逆の文章になっていないか検討する。
・「ら」を加えても可能の意味を失わないなら、「ら」抜き言葉。その際は、「ら」を加える。
一人で着れる⇒一人で着られる
この野草は食べれる⇒この野草は食べられる
夢をかなえれる⇒夢をかなえられる
・話し言葉の影響を避ける。
濃い⇒充実した
はまる⇒のめりこむ
真逆⇒正反対
一生ものの友達⇒一生大切にしたい友達
※一生ものを「物」でなく「人」に対して使っている。
かぶる⇒重複する。重なり合う。同じになる。
わりと⇒わりに、割合に、比較的
なるたけ⇒なるべく
そそられる⇒魅力的だ。ひかれる。
自然と⇒自然に
・本来の意味を考えて言葉を探す。
・異なる概念は混ぜて書かない。いくつかに分けて書くときは、それぞれの違いをはっきりさせる。
・概念のくくり方が極端に大きすぎたり、小さすぎたりしないようにする。
・歪曲的に、あいまいに、漠然と考えないようにする。
・骨子を組み立てて、段落に分ける。
・同じ話はまとめて書く。
・基本は古い話から、時系列にかく。
・簡潔で明瞭に表現するセンスを磨くこと。
・句点は意味の切れ目に打つ。
1.長い主語、長い述語、長い目的語の切れ目
2.原因と結果、理由と結論の間
3.前提と結論の間
4.状況・場の説明とそこで起きていることの間
例:7月に白馬岳を登っていくと、足元に無数の高山植物が咲き乱れている。
5.時間や場所が変わるところ
6.逆接に変わるところ
7.2つのものを対比するとき
8.隣同士の修飾語の間に、予想外の関係が生じてほしくない場合
9.よく使われる別の意味の表現と区別したいとき
例:この製品により、多くの電力を節約することができます。
10.ひらがなばかり、漢字ばかり、カタカナばかりが続く場合
・「~したり」「~など」とぼかして書かず、はっきりと書く。
・なんでも「ことで」でつながない。
・キーワードを抜かさない。
・削れる言葉は徹底的に削る。
・簡潔な表現を選ぶ。
・「基本的に」「これから説明します」「理由としては」などの言葉も削れそうなら削る。
・句点(。)は、カッコ内では省略する。
・漢字本来の意味から離れた言葉は、仮名で書く。
最後に
読んでいて感じたのは、実際に良い文に触れることが大事だということです。
例えば、「句点を打って文章を短く言い切る勇気を持つ」ということを考えてみましょう。この場合、実際どんな文章か考えた時に、本で紹介されていたいくつかの例文(単体)に個別に触れるのではなく、もっと他の文との関わり合いの中で表現されている文に文脈的に触れた方がイメージがつきやすいかなと思いました。
そして、その自分が美しいと思う文章を再現することが近道なような気がしました。
やはり、読書は大事だと改めて感じました。
ではまた。