VBAを活かせる仕事

    VBAとは?

    VBAの案件・業界分布について

    VBAは、Visual bacic for Applictionsの略。マイクロソフトが1990年代に開発したプログラミング言語・Microsoft Visual Bacicを、同社製品のMicrosoft Officeに搭載したものが、VBAです。Ofiice製品があればだれでも手軽に利用でき、習得が容易で開発しやすいのも特徴。主にExcel、Accessで、「マクロ」とよばれる自動処理手順を記述するためのプログラミング言語です。


    データを元に、自動で帳票出力やメール送信を行ったり、数万行のデータの集計、分析、レポート化したり、入力フォームからのボタン動作を定義できるので、ファイル上の作業効率化を図ることができます。


    ただ、VBAは、WEBアプリケーションのように、不特定多数のアクセスを想定して開発されたものではなく、あくまでも、ファイル内のデータを参照したり集計したりするための言語です。活用される場面が限定され、オプション的な使い方になりがちですが、業種を問わず、ほとんどの企業でOffice製品を使っているため、需要のすそ野は広いといえます。

    ビジネス用のツールとしては、全世界で認知されているOffice。この状況が続く限り、VBA開発者は必要とされ続けるでしょう。


    VBAには、オデッセイ社が実施している「VBAエキスパート」という資格があります。

    Excel、Accessのマクロ・VBAのスキルを証明する資格で、

    ⚫ExcelVBAベーシック

    ⚫ExcelVBAスタンダード

    ⚫AccessVBAベーシック

    ⚫AccessVBAスタンダード

    の4科目あり、ExcelVBAスタンダード、AccessVBAスタンダード2科目を取得すると、「VBAエキスパート スタンダードクラウン」という称号が贈られます。

    「資格保有が就職や転職に有利に働く」と言い切れるわけではありませんが、「VBAスキルの証明書」として活用できます。


    【VBAのサンプルコード】


    ⚫ストップウォッチを作るサンプル。

    ボタンを押すと0からスタートして表示が進み、もう一度ボタンを押すとストップする。


    Private blnStop As Boolean

    Private blnStart As Boolean


    Sub StopWatch()

    Dim dblTimer As Double

    If blnStart = True Then

    blnStop = True

    Exit Sub

    End If

    blnStart = True

    blnStop = False

    dblTimer = Timer

    Do Until blnStop = True

    Cells(1, 1) = Int((Timer - dblTimer) * 100) / 100

    DoEvents

    Loop

    blnStart = False

    blnStop = False

    End Sub

    ⚫棒グラフ、折れ線グラフのサンプルマクロ

    2つの商品の、月ごとの売り上げ金額と昨年比を棒グラフ、折れ線グラフで表す。

    Sub sample1()

    Dim i As Integer '系列のFor~Nextで使用

    Dim rowMax As Long 'グラフ範囲の最終行

    Dim colMax As Long 'グラフ範囲の最終列

    Dim MyRange As Range 'グラフ範囲

    Dim chartObj As ChartObject 'Chartオブジェクトのコンテナ

    rowMax = Cells(Rows.Count, 1).End(xlUp).Row 'グラフ範囲の最終行

    colMax = Cells(2, Columns.Count).End(xlToLeft).Column 'グラフ範囲の最終列

    Set MyRange = Range(Cells(1, 1), Cells(rowMax, colMax)) 'グラフ範囲

    'Chartを追加、グラフ範囲の右隣に、グラフ範囲の倍の大きさで作成

    Set chartObj = ActiveSheet.ChartObjects.Add(MyRange.Width, MyRange.Top, MyRange.Width * 2, MyRange.Height * 2)

    '追加されたChartオブジェクトに対する処理

    With chartObj.Chart

    '元データ範囲の設定

    .SetSourceData MyRange

    'タイトル表示

    .HasTitle = True

    .ChartTitle.Text = "=" & MyRange.Cells(1, 1).Address(ReferenceStyle:=xlR1C1, External:=True)

    '全系列に対する処理

    For i = 1 To .SeriesCollection.Count

    With .SeriesCollection(i)

    Select Case i

    Case 1, 3 '売上金額

    .ChartType = xlColumnClustered '縦棒グラフ

    .AxisGroup = 1 '主軸

    .ApplyDataLabels 'データラベル表示

    .DataLabels.NumberFormatLocal = "#,##," 'データラベルの表示形式

    .Interior.Color = Cells(2, i + 1).Interior.Color '棒グラフの色

    Case 2, 4 '昨年比

    .ChartType = xlLine '折れ線グラフ

    .AxisGroup = 2 '第2軸

    .Border.Color = Cells(2, i + 1).Interior.Color '折れ線グラフの色

    End Select

    End With

    Next

    '主軸の書式設定

    .Axes(xlValue).TickLabels.NumberFormatLocal = "#,###," '表示形式

    '第2軸の書式設定

    .Axes(xlValue, xlSecondary).MinimumScale = 0.8 '最小値

    .Axes(xlValue, xlSecondary).MaximumScale = 1.2 '最大値

    .Axes(xlValue, xlSecondary).MajorUnit = 0.05 '目盛間隔

    .Axes(xlValue, xlSecondary).TickLabels.NumberFormatLocal = "0%" '表示形式

    End With

    End Sub


    Sub sample2()

    Dim i As Long '系列のFor~Nextで使用

    Dim rowMin As Long 'グラフデータ範囲の開始行

    Dim rowMax As Long 'グラフデータ範囲の最終行

    Dim strFormula As String 'グラフデータ範囲の設定文字列

    Dim strExternal() As String 'グラフのSERIES関数の引数毎に分割した文字列

    Dim strAddress() As String 'ADDRESS文字列をシートとRANGE指定に分割した文字列

    Dim newAddress1 As String 'SERIES関数の新しい系列名のADDRESS

    Dim newAddress2 As String 'SERIES関数の新しい系列値のADDRESS

    'Chartオブジェクトに対する処理

    With ActiveSheet.ChartObjects(1).Chart

    '全系列に対する処理

    For i = 1 To .SeriesCollection.Count

    'グラフデータ範囲の設定文字列

    strFormula = .SeriesCollection(i).Formula

    '=SERIES(引数・・・)を引数だけにする

    strFormula = Replace(Replace(strFormula, "=SERIES(", ""), ")", "")

    'SERIES関数の引数毎に分割

    strExternal = Split(strFormula, ",")

    '系列名(SERIES関数の第2引数)の処理

    'ADDRESS文字列をシートとRANGE指定に分割、ADDRESSにブック名が入っている場合は消去

    strAddress = Split(Replace(strExternal(1), "[" & ThisWorkbook.Name & "]", ""), "!")

    '系列名の開始行

    rowMin = Worksheets(strAddress(0)).Range(strAddress(1)).Item(1).Row

    '系列名の最終行

    rowMax = Worksheets(strAddress(0).Cells(Rows.Count, Worksheets(strAddress(0)).Range(strAddress(1)).Item(1).Column).End(xlUp).Row

    'SERIES関数の新しい系列名のADDRESS

    newAddress1 = Worksheets(strAddress(0)).Range(strAddress(1)).Resize(rowMax - rowMin + 1, 1).Address(External:=True)

    '系列値(SERIES関数の第3引数)の処理

    'ADDRESS文字列をシートとRANGE指定に分割、ADDRESSにブック名が入っている場合は消去

    strAddress = Split(Replace(strExternal(2), "[" & ThisWorkbook.Name & "]", ""), "!")

    'SERIES関数の新しい系列値のADDRESS

    newAddress2 = Worksheets(strAddress(0)).Range(strAddress(1)).Resize(rowMax - rowMin + 1, 1).Address(External:=True)

    'グラフデータ範囲の再設定

    .SeriesCollection(i).Formula = "=SERIES(" & _

    strExternal(0) & "," & _

    newAddress1 & "," & _

    newAddress2 & "," & _

    i & ")"

    Next i

    End With

    End Sub


    VBAのフレームワーク

    VBAはOfiiceファイルの作業効率化のためのプログラム言語です。アプリケーションを作る目的で開発されているわけではないため、フレームワークはありません。




    VBAについて

    VBAの案件はCやJAVAと比べると多くはありませんが、ExcelやAccessといったアプリケーション関連での需要は常にあります。稀にシステム構築の案件等もあります。

    続きを見る