パソコンスキルの教科書

パソコンスキルの教科書

東京大学大学院卒。博士課程に進学を志すも、担当教授と折が合わず、無職になる。医者を目指すも結局断念。田舎で派遣社員として働く。「スキルがなければ、仕事ももらえない」と悟り、ビジネススキルを学ぶ。プログラミング、英語を学び、一部上場企業へ転職。年間100時間以上の業務効率化を行い、社内講師に抜擢。海外の案件を担当し、数億円のプロジェクトに携わる。個人の事業でも、月売上100万を達成。現在は、自分の価値を高めるためのスキル向上支援を行う

エクセルマクロで企業ごと(会社顧客別)にデータ印刷|8時間→30分に改善したVBA事例を紹介

f:id:gene320:20181217015314j:plain

エクセルを使った仕事の一つに、企業や顧客別にデータを集計し印刷まで行うものがあります。

例えば、以下のような元データから顧客別にデータを集計し印刷をするのです。

●元データ

f:id:gene320:20181217004256j:plain

●顧客別(法人ごと)にデータを集計し印刷する

f:id:gene320:20181217004318j:plain

このとき顧客数が5,6社であれば、コピペで対応可能です。

しかし、顧客数が増えれば話は別です。実際には、100を超えるデータを印刷することもあります。

100を超えると、コピペして印刷すると作業完了に数時間はかかってしまいます。

このとき作業だけする仕事であればいいかもしれません。

ただ他の仕事を抱えていると、このようなコピペ作業があると思っただけで、他の仕事のやる気が起きなくなります。

このとき、多くの人は手作業で頑張ります。しかし、エクセルマクロVBAを使えば自動で処理できます。

そこで、マクロを使って改善をした内容を事例とインタビューを合わせてお伝えしていきます。

なお、これは実際に私(管理人)がAさんの事例に相談にのった案件です。

50法人で合計300店舗のデータを1法人ごとに別シートに抽出し印刷する

●管理人

まずはどのような仕事か教えていただけませんか?

●Aさん

以下の元データがあります。

f:id:gene320:20181217004743j:plain

このデータを顧客別に集計し印刷する仕事です。

f:id:gene320:20181217004747j:plain

●管理人

この仕事をする上で困っていたことは何ですか?

●Aさん

はい。この仕事では、50法人の顧客、合計300店舗の評価データ一覧表(元データ)から、1法人ごとにデータを別シートに抽出して印刷をする必要があります。

しかも、元データは3種類のエクセルファイルで管理されていて、それぞれのエクセルファイルで項目数と内容が異なります。

それだけではありません。法人により店舗数が異なるため、1法人ずつ確認しながら作業する必要があります。

したがってこの作業を行うたびに、エクセルを手作業でコピペして抽出から印刷まで行っていました。

そのため、この仕事が発生するたびに毎回1日かけて作業する必要がありました。

エクセル関数では対応できなかった

●管理人

300店舗をエクセルの手作業で抽出、印刷するのは大変ですね。考えるだけで嫌になります。

ただこれだけ厄介な仕事であれば、すでに何か対策をされていたのではないでしょうか?

●Aさん

はい。予め雛形を作成しエクセル関数の数式を活用して作業の自動化を考えていました。

具体的には、以下のような感じです。

まず法人名リストを別シートに作り、出力したいシートの左上に入力規則でリストを設定しました。

そしてリストから法人名を選択します。

そうすると、その法人名をキーとしてHLOOKUP、IFERROR、INDEX、MATCH 等の関数で一覧データから該当データを引っ張る様にしました。

ただもう少しのところで、上手くいきませんでした。

というのも、各法人で店舗数が異なるため、エクセル関数では最終的に罫線や書式設定を思った通りに設定できなかったのです。

1週間で300店舗のデータ、エクセル130シート分を印刷する必要があった

●管理人

エクセル関数での努力が素晴らしいです。試行錯誤されていたのが伝わってきます。

●Aさん

はい。エクセル関数では上手くいかなかったので、なんとかしなくてはいけないと思ってました。

というのも、1週間で300店舗のデータ、エクセルで130シート程を印刷する必要があったからです。

そこで、マクロで作成をしようとチャレンジしました。しかし、思った通りにマクロを作ることが出来ませんでした。

マクロVBAは付け焼刃の知識では対応ができなかった

●管理人

なぜマクロを作ることができなかったのでしょうか?

●Aさん

はい。マクロで処理をしようと試みたとき、一番困った部分は法人毎に店舗を引っ張るところでした。

それ以外にも、数式だとVLOOKUP(HLOOKUP)で対応する部分があったのですが、これらをマクロでどのようにプログラムをするか分かりませんでした。

それでも、エクセル関数とマクロを組み合わせれば解決できると考えたんです。

具体的には、法人毎の店舗をシート毎に出力するまでをエクセル関数で処理する。

そして、書式設定と印刷をマクロで作成しようとしたのです。

しかし、「値が入力されている列まで罫線をつける」などの条件による指定方法が分かりませんでした。

ここまでやって、付け焼刃の知識では対応が難しいと感じたんです。

基礎的な本や、インターネットで調べたが、マクロに関してもっと高度且つ色々な知識を応用する必要があると感じました。

「パソコンスキルの教科書」(ウェブサイト)で相談して解決した

●管理人

その後、パソコンスキルの教科書(当サイト)からお問い合わせいただいたとのことですが、その経緯を教えてください。

●Aさん

すぐに参加出来るマクロ1日講座をインターネットで探していました。

基礎を学びつつ、当日講師に可能な範囲で、現在困っている業務について質問できればと思っていました。

●管理人

なるほど。そうだったのですね。

それでは、なぜその一日講座を受講せず、パソコンスキルの教科書を選んだのでしょうか?

もっと言えば、エクセルVBAについて学べるサイトは数多くあるのに、なぜ「パソコンスキルの教科書」に問い合わせをしようと思ったのでしょうか?

●Aさん

色々検索をしてみて、お問合せのページに「今すぐマクロを作りたい人のためのコンサルティング」という文言を見つけ、問合せをさせて頂きました。

HPの雰囲気が良かったので問合せをし易かったからです。

余談ですが、当時、ケイエックスというパソコンスクールの1日講座に申し込む直前でした。

理由は1日講座、半日講座、午後だけなど時間帯が何種類かあり、毎日実施可能で、料金も検索した中で一番安かったためです。

しかしながらHPの至るところに代表の方による注意書きがあり、雰囲気がこわかったのと、実際に問合せをしたところ、回答が意に沿わないものでしたのでいったん止めました。

お問合せのページに以下のような文言が書いてありました。

なお、常識的にお答えのしようがないご質問にはお答えできません。
(例:「必ずできるようになるのか?」など、ご本人の能力次第のもの。「初心者コースの受講料と同じ安い料金で、科目や時間を好きなものに変えられるか?」などのご質問。
授業を受ければわかる「○○の操作方法を教えて」など。
「○○という教科はあるか?」「○○日に予約できるか?」など、ホームページに書いてあることを質問してくる、日本語の読解力がない方のご質問かメールアドレス収集が目的と思われるご質問。
「かわいい先生いますか?」など、いたずらや不謹慎としか思えないご質問。
マイクロソフトの試験内容や評価基準や採点についてのご質問。 富士通のテキストについてのご質問。
当社ではなく、マイクロソフトやオデッセイや富士通など他社に問い合わせるべき内容。パソコン教室部門以外の当社の別部門へのご質問。)
なんでも相談室ではありません。

実際に作成したマクロの紹介

●管理人

ここで実際に作成したマクロを動画で紹介します。


エクセルマクロで企業ごと(会社顧客別)にデータ印刷|8時間→30分に改善したVBA事例を紹介

なお動画では、データ処理を2社分にし、印刷部分も紹介していません。

理由は、データ処理の会社数を多くすると動画が長くなるからです。また、印刷も同じ理由で省略しています。

なお秘密保持の観点から、実際にAさんにお渡ししたエクセルとは違うものを動画で紹介しています。

ここで紹介したマクロのダウンロードはこちら

動画で紹介しているマクロ入りのエクセルファイルは以下からダウンロードできます。

ダウンロードすればマクロのプログラムも見れますので、ぜひご活用ください。

現在、準備中です。

マクロのプログラムは以下に載せます。

Option Explicit

'シートを企業ごとに分けるプログラム
Sub WriteSheets()
    Dim i As Long, j As Long, cnt As Long, cmax As Long
    Dim company As String, tenpo As String
    
    Dim ws1 As Worksheet, ws2 As Worksheet
    Set ws1 = Worksheets("法人一覧表")
    Set ws2 = Worksheets("template")
    
    cmax = ws1.Range("C1048576").End(xlUp).Row
    cnt = ws1.Range("XFD2").End(xlToLeft).Column
    
    For i = 3 To cnt
        
        If company <> ws1.Range("A2").Offset(0, i - 2).Value Then
            If Not ws1.Range("A2").Offset(0, i - 2).Value = "" Then
                company = ws1.Range("B2").Offset(0, i - 2).Value
                ws2.Copy After:=ws1
                ActiveSheet.Name = company
                Worksheets(company).Range("A2").Value = company
                j = 0
            End If
        End If
        
        If ws1.Range("A2").Offset(0, i - 2).Value <> "" Then
            tenpo = ws1.Range("A3").Offset(0, i - 2).Value
            
            Worksheets(company).Range("H1").Offset(1, j).Value = tenpo
            With Worksheets(company).Range(Cells(2, 8 + j), Cells(3, 9 + j))
                .HorizontalAlignment = xlCenter
                .VerticalAlignment = xlCenter
                .Merge
                .Borders.LineStyle = xlContinuous
                .Borders.Weight = xlThin
            End With
            
            With Worksheets(company).Range("H4:I" & cmax).Offset(0, j)
                .Value = ws1.Range("B4:C" & cmax).Offset(0, i - 2).Value
                .Borders.LineStyle = xlContinuous
                .Borders.Weight = xlThin
            End With

        End If
        
        j = j + 1
    
    Next
End Sub

'企業ごとに分けたシートを印刷するプログラム
Sub PrintSheets()
    Dim c
    Dim kazu
    
    kazu = Worksheets.Count
    For c = 0 To kazu - 1
        If Worksheets(kazu - c).Name <> "法人一覧表" Then
            If Worksheets(kazu - c).Name <> "template" Then
                Worksheets(kazu - c).Activate
                Application.DisplayAlerts = False
                
                With Worksheets(kazu - c).PageSetup
                    .Zoom = False
                    .FitToPagesWide = 1
                    .FitToPagesTall = 1
                End With
                
                Worksheets(kazu - c).PrintPreview '印刷プレビューを表示して印刷する
                
                Application.DisplayAlerts = True
            End If
        End If
    Next
End Sub

本来8時間超かかる仕事が30分で完了しました

●管理人

今回のマクロを使ってどれくらいラクになりましたか?

●Aさん

本来8時間超かかる仕事が30分で完了しました。

一瞬で最終フォーマットに近づけることができ驚きました。

何よりも面倒な作業のほとんどがマクロで自動処理できたので、精神的な余裕をもって仕事を進めることができました。

もう少し勉強すれば、元データから最終フォーマットに一発で処理できるマクロを作成できると思います。

今後の自分でマクロを作成できるようになるために

●管理人

今後の学習プランについて教えてください。

●Aさん

はい、まずは現状の私は、「マクロの記録」で記録したものに少し手を加えられるレベルです。

それでも、一覧表から定型フォーマットに出力するマクロだけでも十分に時短が出来て助かっています。

今後の学習プランとしては、まずは基礎は固めたいと思っています。

ただ業務上の視点で見ると、応用編まできちんと学び、一から作成出来る様になりたいです。

そのためには仕事と家庭と両立できるオンライン講座を検討しています。

場合によっては有給休暇を取りつつ、単発の講座を受講していこうと思っています。

●管理人

私としてはこちらのオンライン講座をお勧めします。

私の知る限り最も分かりやすいオンライン講座です。まずは無料のものから始めてほしいと思います。

無料のもので成果が出たら、有料を試すという感じでステップアップするのがお勧めです。

親切丁寧であったので、とても安心して質問など出来ました

●管理人

今回のパソコンスキルの教科書(武田)を利用してみていかがでしたか?

●Aさん

武田さんの対応が最初からずっと親切、丁寧であったので、とても安心して質問など出来ました。

どうも有難うございました。また是非お世話になりたいと思います。

仕事に活かせるマクロを作る

今回は、実際の仕事を事例してマクロについてお伝えしました。

ここで紹介した内容と同じような案件で困っている人は多いはずです。

ぜひこの記事で紹介したプログラムを活用し、仕事をラクにしてほしいと思います。