見出し画像

初めてのexcel vbaマクロ

これはなにか

プログラミング実装経験ゼロの私が、excel vbaの学習を始めた理由と学習の方法をまとめました。

こんな人に読んでほしい

・これから何か新しいスキルを身につけたい方
・新しいスキルを短期間で身につけたい方
・業務の効率化に挑戦したい方
・excel vbaの学習に興味がある方

目次

1. なぜ今excel vbaか?

先にポイントを書きます。
①excelさえあればどこでも使える
②誰でも使いやすい

まず ①excelさえあればどこでも使える  について。
私がそもそもvbaを学ぼうと考えたきっかけは業務効率化のためでした。
世の中には様々なプログラミング言語がありますが、それらを使用するためには実装環境を職場PCに整える必要があります。私は大手メーカーで働いていますが、新しい技術への許容体制はお世辞にも前向きとは言い難いのが実情です。
セキュリティは大丈夫か
・導入コストに見合うメリットは本当にあるのか
このようなことを問われる企業はまだまだ多いのではないでしょうか?

その点vbaはexcelが既に導入されているため、参入障壁は非常に低いです。実際に会社のシステムの一部はマクロを使って構築されているものもあります。

次に ②誰でも使いやすい について。 
新たなものが導入されてもなかなか職場で使われるようになるには時間がかかります。社内で使われてきた独自のシステムに慣れている人が多いため、新たなツールはなかなか浸透しません。実際、弊社ではmicrosoftのoffice365が数年前から導入されているのですが、その機能を十分に活用できている人はほとんどいません。

この点についてもexcelは多くのメンバーにとって使い慣れたツールなので、その延長上のマクロを使って業務効率化を行えれば、より多くの人に利用してもらえると考えました。

2. 新たなスキルを身に着ける方法のすすめ

変化の激しい時代において、新たなスキルを能動的に身に着けることは有益です。”じゃあどうやって身につけたらいいの?”というのは私も含めて多くの方が抱く疑問だと思います。私もまだ実践途中ですが、参考にしている動画と書籍を共有したいと思います。

・TED TALK "最初の20時間 — あらゆることをサクッと学ぶ方法"

これまで新たなスキルを習得するには10000時間かける必要があるというのが定説でした。しかし、それは事実でしょうか?”スキルを習得する”という定義は何かを考え、20時間あれば実践可能な大枠のレベルは習得できるという内容の動画です。
10000時間(1日8時間×週5日×約7年...)といわれると途方もなさ過ぎて”そんなの無理だよ”と思ってしまいますが、20時間といわれると”それくらいなら頑張ってみようかな”と思えませんか?

・ULTRA LEARNING 超・自習法 どんなスキルでも最速で習得できる9つのメソッド


新たなスキルを劇的なスピードで身に着けている人が世の中にはたくさんいます。そのような人たちがどうやって新たなスキルを身に着けているのかの共通点から、自習法の勧めがまとめられた1冊です。ここでは9つのメソッドから、私が特に意識している3つを紹介します。
①メタ学習
 まずはどうやって学習するかを学習することが大切です。研究ではなく学習することが目的なので、その道のプロが既に世の中にはたくさんいます。その人たちがどうやって学んだのか、どのような教材があってどの方法が自分には合うのかを見極めることに時間を使います。
②直接性
 そのスキルを身に着けて、自分が何を実現したいのか。そこから逆算してどのようなスキルが必要か考えます。
③フィードバック
 自分の出すアウトプットに対してフィードバックをもらうことを恐れてはいけません。学習することが自己満足で終わらないためにも第三者からの評価や意見をもらうことは非常に大切です。

以上、少し抽象的な表現で学習の方法を記載しましたが、ここから実際に私が実践している内容を具体的に書いていきます。

3. 実践内容 excel vbaの学習

ここから、実際に学習を進めた手順、内容、時間をまとめます。
冒頭にも書きましたが、私はプログラミングの実装経験がないです。ただ、興味でpythonという言語の書き方を少しだけ勉強したことがあるため、”プログラミングのコードを書くとはどんな感じか”くらいは知見がありました。
そのため、3-2. input でかかった時間は、全くのプログラミング初心者の方よりは短めで終わっていると思います。その前提で以下の文章を参考にしていただければ幸いです。

3-1. 学習の方針

まずは何をどうやって学ぶのかを考えるために様々な教材を調べました(メタ学習)。youtube, net記事, 書籍(立ち読み)など。
特に重点的に確認したのは、実際にどのような業務効率化を実現しているかです。自身の業務と重ね合わせながらはじめにどのような実装をするのかイメージしながら調べました(直接性)
そして以下2つをマクロで実現することを目標にしました。
・ウォーターホールグラフ(ステップチャート)の作成
・マインドマップの作製
イメージ

note_初めてのexcel vbaマクロ_1
ここまで”学習の方針”に約2.5時間。

3-2.  input(教材)

excel vbaは多くの方が実用しており、様々な教材がありました。一方で、実用範囲が広大なため、網羅的に学習するよりも基礎的なことのみインプットして、詳細は都度必要な情報を調べながら実装していくことにしました。
インプットとして利用させてもらったのは以下2つのサイトです。
・youtube "【完全版】Excelマクロ 本の著者が教える、2時間で12の初心者入門講座。忙しい人のための速習コース"

まずは基礎知識をインプットするため、こちらの動画を見ました。実際の操作を見ながらなので非常にわかりやすいです。”マクロってこんなかんじか”というものを掴むことが目的だったので、再生速度2倍でざっと内容を確認しました。
・”excelの神髄 マクロvba練習問題”


次に実際に手を動かしてみました。教材に沿って同じことをするだけだと理解できているのかわからないので、無茶苦茶でもいいので一度書いてみることは必須です。学習初期では何がわかっていて、何がわかっていないかを把握することが近道だと思います。この時点でyoutubeの教材を2倍速で見ただけなので、ほとんどわからないことばかりでしたが、何度も使う構文は意外と頭に入っていることに気づきました。

ここまで”input”に約2.5時間 (youtube 1時間、練習問題1.5時間)。

3-3. output(実践) 

ここまで約5時間の学習ですが、早速実践に移りました。
まずはウォーターホールグラフをマクロで作成することを目指します。
結果はこちら!
①数値を入力して、”グラフ作成ボタン”を押すと。。。

図1





②ウォーターホールグラフを作成することができました!

図2

また、いろいろ調べながら作業をしている中で、”パワーポイントにグラフを出力する方法”というものもあったので、そちらも挑戦してみました。

こちらが実際に書いたコードです。はじめて実装してみましたがなかなか大変でしたが楽しかったです。コードの詳しい説明はまた別の記事で書こうと思います。

ここまで”output”に約7時間 。

Sub graph()

   Dim i As Long
   Dim endcell As Long
   endcell = Cells(Rows.Count, 2).End(xlUp).Row


   'グラフに必要な数値を計算する

   For i = 8 To endcell
       Cells(i, 6) = Cells(i, 2)
       
       If Cells(i, 3) <> "" Then
           Cells(i, 7) = 0
           Cells(i, 8) = Cells(i, 3)
       Else
           If Cells(i - 1, 3) <> "" Then
               If Cells(i, 4) < 0 Then
                   Cells(i, 7) = Cells(i - 1, 8) + Cells(i, 4)
                   Cells(i, 8) = Cells(i, 4) * (-1)
               Else
                   Cells(i, 7) = Cells(i - 1, 8)
                   Cells(i, 8) = Cells(i, 4)
               End If
                   
           ElseIf Cells(i, 4) < 0 Then
               If Cells(i - 1, 4) < 0 Then
                   Cells(i, 7) = Cells(i - 1, 7) + Cells(i, 4)
                   Cells(i, 8) = Cells(i, 4) * (-1)
               Else
                   Cells(i, 7) = Cells(i - 1, 7) + Cells(i - 1, 8) + Cells(i, 4)
                   Cells(i, 8) = Cells(i, 4) * (-1)
               End If
           Else
               If Cells(i - 1, 4) < 0 Then
                   Cells(i, 7) = Cells(i - 1, 7)
                   Cells(i, 8) = Cells(i, 4)
               Else
                   Cells(i, 7) = Cells(i - 1, 7) + Cells(i - 1, 8)
                   Cells(i, 8) = Cells(i, 4)
               End If
           End If
       End If
   Next
   


   'シートを追加する
   On Error GoTo ErrCelVal  'シート名が有効でない場合のエラー処理
   Worksheets.Add After:=Worksheets("format")
   ActiveSheet.Name = Worksheets("format").Cells(2, 2)
       
   'シート1から取得
   Dim ws As String
   ws = Worksheets("format").Range("B2")
   Range(Worksheets("format").Cells(1, 1), Worksheets("format").Cells(endcell, 20)).Copy Destination:=Range(Cells(1, 1), Cells(endcell, 20))

   ActiveSheet.Shapes.SelectAll
   Selection.delete
   
 'グラフを作成する

   With ActiveSheet.Shapes.AddChart.Chart
   
       '棒グラフ追加
       .ChartType = xlColumnStacked
       .SetSourceData Range(Cells(8, 6), Cells(endcell, 8))
       
       'グラフタイトル追加
       .HasTitle = True
       .ChartTitle.Text = Cells(3, 2)
       
       '軸の最大値設定
       .Axes(xlValue).MaximumScale = Cells(4, 2)
       .Axes(xlValue).MinimumScale = Cells(5, 2)
       
       
       '色変更
       ActiveSheet.ChartObjects(1).Chart. _
       SeriesCollection(1).Format.Fill. _
           ForeColor.RGB = RGB(255, 255, 255)
       ActiveSheet.ChartObjects(1).Chart. _
       SeriesCollection(2).Format.Fill. _
           ForeColor.RGB = RGB(192, 192, 192)
           
       '目盛り線削除
       With .Axes(xlCategory)  '横軸
           .HasMajorGridlines = False
           .HasMinorGridlines = False
       End With
       
       With .Axes(xlValue)    '縦軸
           .HasMajorGridlines = False
           .HasMinorGridlines = False
       End With
       
       '目盛り軸削除
       ActiveSheet.ChartObjects(1).Activate
       ActiveChart.Axes(xlValue).Select
           Selection.delete
       '凡例削除
       ActiveChart.Legend.Select
           Selection.delete
       '枠線削除
       ActiveSheet.ChartObjects(1).Chart.ChartArea.Border.ColorIndex = xlColorIndexNone
           
       'グラフの位置を指定
       With ActiveSheet.ChartObjects(1)
           .Top = Range("J7").Top
           .Left = Range("J7").Left
           .Height = 500
           .Width = 950
       End With
       
       'ラベルを表示
       With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(2)
           .HasDataLabels = True
           
       End With

   End With
   
   
   Dim j As Long
   
   'グラフの色変更
   With ActiveSheet.ChartObjects("chart 2").Chart.SeriesCollection(2)
       For j = 1 To .Points.Count
           .Points(j).Interior.Color = Cells(j + 7, 2).Interior.Color
       Next j
   End With
   
  'グラフラベルの文字サイズを変更
   ActiveSheet.ChartObjects("グラフ 2").Chart.FullSeriesCollection(2).DataLabels.Format.TextFrame2.TextRange.Font.Size = 16
  
  'グラフX軸の文字サイズを変更
   ActiveSheet.ChartObjects("グラフ 2").Chart.Axes(xlCategory).TickLabels.Font.Size = 18
  
   'パワポ作成ボタンを追加
   With ActiveSheet.Buttons.Add(Range("H2").Left, _
                                Range("H2").Top, _
                                Range("H2:I3").Width, _
                                Range("H2:I3").Height)
       .OnAction = "power_point"
       .Characters.Text = "パワポ出力"
   End With
   
   'シート削除ボタンを追加
   With ActiveSheet.Buttons.Add(Range("Q2").Left, _
                                Range("Q2").Top, _
                                Range("Q2:R3").Width, _
                                Range("Q2:R3").Height)
       .OnAction = "delete"
       .Characters.Text = "sheet削除"
   End With
   
   Exit Sub
   
ErrCelVal:
   MsgBox "シート名が未入力か重複しています。B2セルを確認してください。"
   
End Sub

Sub delete()

   ActiveSheet.delete
   
End Sub

Sub power_point()
   
   'パワポを起動
   Dim pptObj As powerpoint.Application
   Set pptObj = CreateObject("PowerPoint.Application")
   pptObj.Visible = True
   
   '指定したパワポを開く
   On Error GoTo ErrCelVal  'パス名が有効でない場合のエラー処理
   Dim pptPrs As powerpoint.Presentation
   Set pptPrs = pptObj.Presentations.Open(Cells(2, 11).Value)

   'グラフのコピペ
   Dim ws As Worksheet
   Set ws = ThisWorkbook.Worksheets(Cells(2, 2).Value)
   'グラフを画像としてコピー
   ws.ChartObjects("Chart 2").Chart.CopyPicture xlScreen, xlPicture
   'グラフ画像をペースト
   pptPrs.Slides(Cells(3, 11).Value).Shapes.Paste


   'グラフの位置、サイズ指定
   With pptPrs.Slides(Cells(3, 11).Value).Shapes(1)
       .LockAspectRatio = msoTrue
       .Top = 20
       .Left = 5
       .Width = 950
   End With
   
   Exit Sub
   
ErrCelVal:
   MsgBox "パス名かページが未入力です。G2,G3セルを確認してください。"
   
End Sub

4. さいごに

2回目のnote投稿、本日も記事を読んでくださった方ありがとうございました。コードについてはまだまだ未熟な部分も多々あると思います。こここうした方がいいんじゃない(?)とか、アドバイスあればコメントいただけると嬉しいです。このコードを実装したのは昨年の12/30.31の2日間。年を明けて、会社で実際に使ったり、使ってもらったりしているので、この話にはまだ続きがあります。。。
今後も記事の投稿続けていくので、よろしくお願いいたします。

今回の投稿に関連して今後投稿しようと思っていることメモ
・自習法について
・コードの説明
・実務で使ってみてのフィードバック
・もう一つの目標”マインドマップ”の作成

記事を気に入っていただけましたら、よければサポートお願いします。いただいたサポートはnoteで発信している 1.書籍代 2.学習コンテンツ代に使わさせていただきます。