2022年11月28日月曜日

【マクロVBA】VBA_TIPS-02 Select文とIf文

今回はSelect文とIf文の使い分けについて話します。

例えばAの値に2が入っているとして、このAの値によって処理を変えるとします。
これをSelect文で表現すると
A = "こんにちは"
Select Case A
    Case "おはよう"
        MsgBox "Aはおはようです"
    Case "こんにちは"
        MsgBox "Aはこんにちはです"
    Case "こんばんわ"
        MsgBox "Aはこんばんわです"
    Case "おやすみなさい"
        MsgBox "Aはおやすみなさいです"
    Case Else
        MsgBox "Aはそれ以外です"
End Select
となります。If文で表現すると
A = "こんにちは"
If A = "おはよう" Then
    MsgBox "Aはおはようです"
ElseIf A = "こんにちは" Then
    MsgBox "Aはこんにちはです"
ElseIf A = "こんばんわ" Then
    MsgBox "Aはこんばんわです"
ElseIf A = "おやすみなさい" Then
    MsgBox "Aはおやすみなさいです"
Else
    MsgBox "Aはそれ以外です"
End If
となります。

どちらで書いても結果は
メッセージボックス Aはこんにちはです

で変わりません。
ではSelect文とIf文をどのように使い分ければよいのか?どちらを使うべきなのか?ですが、Select文を使えるのであればSelect文のほうが処理が速いので良い。という話を聞いたことがあります。
恐らく今のPC性能だとあまり気にする差ではないと思いますが、私はたまに100万行とかのCSVファイルを扱うときがあるので、なるべくSelect文を使うようにしています。

ではSelect文とIf文の明確な違いは何か?ですが、
Select:変数は1つしかできない
If   :変数を複数使うことができる
ですね。

Select文の場合はAの値から選ぶしかできず、例えば
Select Case A
とした場合、
Case A="こんにちは"
だとAがこんにちはのとき
Case A<>"こんにちは"
だとAがこんにちはでないとき
という感じでSelect Caseで決めたものに対して選ぶことしかできません。

逆にIf文を使うと
A = "こんにちは"
B = "こんにちわ"
If A = "おはよう" Then
    MsgBox "Aはおはようです"
ElseIf A = "こんにちは" And B = "こんにちわ" Then
    MsgBox "AもBもこんにちはです"
Else
    MsgBox "Aはそれ以外です"
End If
のように1つのIf文で複数の変数から条件を設定することが可能です。

このようにSelect文とIf文の違いを理解しておくことで、場面場面によって最適なやり方を考えることができるようになります。




2022年11月27日日曜日

【マクロVBA】VBA_TIPS-01 RangeとCells

 今回は案件で実際に使ったマクロのコードについて紹介します。


VBAの本やサイトだと仮にB2セルを指定する場合

ActiveSheet.Range("B2").Select

と記載される場合が多いですが、今回

ActiveSheet.Cells(2,2).Select

とRangeのところをCellsで記載しています。


この違いと便利な使い道について紹介します。


■Rangeオブジェクト

Excelの標準の表記(列をA~XFD、行を1~1048576で表した形式)なります。

ActiveSheet.Range("B2").Select

となる場合は、

”B"列目の"2"行目

を表すことになります。

RangeオブジェクトのB2セル

ダイレクトにセルを指定する場合にはわかりやすいので便利ですが、For文等で各行・列を周回する場合などセルの位置が可変である場合にはあまり適しません。

例えばA1セルからD1セルまでそれぞれ連続で選択していくとすると、

ActiveSheet.Range("A1").Select
ActiveSheet.Range("B1").Select
ActiveSheet.Range("C1").Select
ActiveSheet.Range("D1").Select

と記載するか、Offsetを利用して

For x = 1 To 3
    ActiveSheet.Range("A1").Offset(0, x).Active
Next x

と記載する必要があり、少々面倒です。

そこで使用するのがCellsオブジェクトによる記載方法になります。


■Cellsオブジェクト

こちらはExcelのオプションで設定できるR1C1参照形式による表記になります。

Excelの[ファイル]-[オプション]-[数式]から選択できます。

R1C1形式の設定方法

こちらをチェックするとExcelの表示がこう変わります。
R1C1形式のExcel

で、こちらはR1C1形式(R:Rows=行、C:Columns=列)となりますので、RagngeオブジェクトでB2を表現する場合は

”B"目の"2"

だったものが

R1C1形式では

”2"目の"2"

と行列が逆になります。

CellsオブジェクトはこのR1C1形式での表記となりますので、先ほどのA1~D1セルを連続で選択数場合

For x = 1 To 4
    ActiveSheet.Cells(1, x).Select
Next x

で良くなります。


このように、セル番地が可変になる場合にはCellsオブジェクト、不変の場合はRangeオブジェクトを使用するのが良いと思います。

※正直、Cellsで統一したほうがきれいなのは確かですが。


■範囲の指定

マクロで罫線を引いたり、セルを塗りつぶしたりする場合があります。

しかもセルの位置が可変の場合はどうすればよいか?

そう、そんなときはRangeとCellsの合わせ技です。


例えばB2~C3セルを範囲で選択したい場合、Rangeオブジェクトであれば

ActiveSheet.Range("B2:C3").Select

で良いのですが、Cellsオブジェクトだと

ActiveSheet.Cells(2,2).Select

だとB2セルしか選択できず、複数範囲の選択ができません。


Cellsオブジェクトを使用して複数範囲を選択する以下の場合は

Cellsオブジェクトを使って範囲指定する場合のイメージ

範囲選択できるRangeオブジェクトの中にCellsオブジェクトを入れることで範囲が表現できます。

ActiveSheet.Range(Cells(2,2),Cells(3,3)).Select

このCellsの部分を変数で可変にすることで、範囲指定を複数回実施したりすることが可能になります。


DXを進めるうえで、自動で表を作ったり、自動でグラフを作ったり、自動でやる部分が多くなってきます。

そういったときにこの可変でも範囲指定ができることを知っているかどうかで、仕事の質が変わってきますので、ぜひ覚えておいてください。


TOPページに戻る


■関連ページ

【マクロVBA】VBA_TIPS-02 Select文とIf文

【マクロVBA】VBA_TIPS-03 マクロの可読性


2022年11月21日月曜日

【社内DX案件紹介】アンケートの集計-2-

今回からは実際にプログラムを書いていきます。

前 > 【社内DX案件紹介】アンケートの集計-1-

今回作るマクロ

前回までのおさらいですが、今回の依頼内容は
「特定のフォルダにあるアンケートをデータベースに登録するフォーマットに変換するマクロを組んでもらいたい。」
というものになります。
依頼されたマクロのイメージ

 前回までは作るべきマクロの処理内容までやりましたが、
マクロの処理フローイメージ

実際にプログラミングをしていきますが、こんな感じのプログラムにしていきます。
1.CSVファイルを検索
2.ファイル名を取得
3.CSVファイルを開く
4.情報を取得
5.情報を転記(今回はマクロファイルの別シート「出力先」へ転記する)
インプットデータを基にした処理イメージ

まずは1.ファイルを検索と2.ファイル名を取得(Sub File_Kensaku())

'/--「特定のフォルダ」のフォルダパス--/'
Dim strFolder_Path As String
'/--検索されたcsvファイルのファイル名--/'
Dim strFile_Name As String
'/--シート「出力先」の最終行--/'
Dim lngMax_Row As Long
Sub File_Kensaku()
    
    '/--CSVファイルが入っているフォルダのパス--/'
    strFolder_Path = "C:\temp"
    '/--転記先(シート「出力先」)の最終行を数える--/'
    lngMax_Row = Sheets("出力先").Range("A1048576").End(xlUp).Row
    
    '/--画面の更新を止める--/'
    Application.ScreenUpdating = False
    
    '/--1.CSVファイルを検索 --/'
    '/--フォルダ「Folder_Path」内にあるcsvファイルを検索--/'
    strFile_Name = Dir(strFolder_Path & "\*.csv")
    
    '/--フォルダ内にファイルが無い(File_Nameのサイズが0)のときは終了--/'
    If Len(strFile_Name) = 0 Then
        Exit Sub
    End If
    
    '/--2.ファイル名を取得 --/'
    '/--検索されたファイルが無い(File_Nameのサイズが0)状態になるまでループ--/'
    Do Until Len(strFile_Name) = 0
        '/--ファイルを開く処理(CSV_Hiraku)を呼び出し--/'
        Call CSV_Hiraku
        '/--次のファイルを検索--/'
        strFile_Name = Dir()
    Loop
    
    '/--画面の更新を開始する--/'
    Application.ScreenUpdating = True
    
End Sub

それぞれの細かい式は多分調べれば出てくるので、ここでは簡単な解説だけ。
strFile_Name = Dir(strFolder_Path & "\*.csv")
こちらでまず1発目にstrFolder_Path(C:\temp)内にあるCSVファイルを検索します。
もしファイルがあれば、strFile_Nameにファイル名が入ります。

If Len(strFile_Name) = 0 Then
で、ひょっとしたらC:\temp内にCSVファイルが1つも無いかもしれないので、ファイルが無かったらExit Subで終了にしています。
If strFile_Name = ”” Thenでも良いと思うのですが、strFile_Name = NULLの時を想定してIf Len(strFile_Name) = 0 Then(strFile_Nameの中身の文字数が0)で作っています。

Do Until Len(strFile_Name) = 0
strFile_Nameに値が入っている間はループするようにしています。

Call CSV_Hiraku
2.ファイルを開く処理(CSV_Hiraku)を呼び出します。
CSV_Hirakuが終わると、また戻ってきます。

strFile_Name = Dir()
ここがファイル検索の肝の部分だと思います。
上では
Dir(strFolder_Path & "\*.csv")
と書いていましたが、今回は
Dir()
と括弧の中身が入っていない状態です。

この違いは
Dir(strFolder_Path & "\*.csv") ・・・ 最初から検索(過去検索されたものも含む)
Dir()              ・・・ 次を検索(過去検索されたものは除外)
となります。

strFile_Name = Dir()を繰り返すと次へ…次へ…となり、フォルダ内のCSVファイルが全て検索されることになります。
なので最終的には
Len(File_Name) = 0
となり、
Do Until Len(strFile_Name) = 0
のループを抜けることになります。

続いて、3.CSVファイルを開く~5.情報を転記(Sub CSV_Hiraku())

Sub CSV_Hiraku()
    '/--開くCSVファイルパス--/'
    Dim strHiraku_CSV As String
    '/--CSVファイルの1行分データ--/'
    Dim strGyo_Data As String
    '/--strGyo_Dataの配列格納用データ--/'
    Dim valHairetsu
    '/--valHairetsuの要素数(CSVの列数)--/'
    Dim intRetsu As Integer
    '/--会社名--/'
    Dim strKaisha As String
    '/--販売会社--/'
    Dim strHanbai As String
    '/--国外--/'
    Dim strKokugai As String
    '/--国内--/'
    Dim strKokunai As String
    '/--所見--/'
    Dim strShoken As String
    
    '/--intRetsuの周回用カウンタ--/'
    Dim x As Integer
    '/--シート「出力先」の書き込み行--/'
    Dim y As Long
    
    '/--検索されたCSVのフルパス--/'
    strHiraku_CSV = strFolder_Path & "\ " & strFile_Name
    
    '/--yに最終行を入れる--/'
    y = lngMax_Row
    
    '/--3.CSVファイルを開く--/'
    '/--CSVファイルをテキスト形式でNo1で開く--/'
    Open strHiraku_CSV For Input As #1
    '/--とりあえず1行読み込む(カラム名の部分)--/'
    Line Input #1, strGyo_Data
    
    '/--CSVファイルが最終行になるまでループ--/'
    Do Until EOF(1)
        '/--4.情報を取得--/'
        '/--変数を初期化--/'
        strKaisha = ""
        strHanbai = ""
        strKokugai = ""
        strKokunai = ""
        strShoken = ""
        x = 0
        
        '/--1行読み込む--/'
        Line Input #1, strGyo_Data
        
        '/--読み込んだ1行を配列に格納する--/'
        valHairetsu = Split(strGyo_Data, ",")
        
        '/--配列の要素数(CSVの列数)を取得する--/'
        intRetsu = UBound(valHairetsu)
        
        '/--配列の要素数(CSVの列数)分、周回する--/'
        For x = 0 To intRetsu
            Select Case x
                '/--valHairetsu(0)(会社名)のとき--/'
                Case 0
                    strKaisha = strKaisha & valHairetsu(x)
                '/--valHairetsu(1~4)(販売会社)のとき--/'
                Case Is <= 4
                    If Len(strHanbai) <> 0 Then
                        strHanbai = strHanbai & vbCrLf
                    End If
                    strHanbai = strHanbai & valHairetsu(x)
                '/--valHairetsu(5~8)(国外)のとき--/'
                Case Is <= 8
                    If Len(strKokugai) <> 0 Then
                        strKokugai = strKokugai & vbCrLf
                    End If
                    strKokugai = strKokugai & valHairetsu(x)
                '/--valHairetsu(9~12)(国内)のとき--/'
                Case Is <= 12
                    If Len(strKokunai) <> 0 Then
                        strKokunai = strKokunai & vbCrLf
                    End If
                    strKokunai = strKokunai & valHairetsu(x)
                '/--valHairetsu(13~16)(所見)のとき--/'
                Case Is <= 16
                    If Len(strShoken) <> 0 Then
                        strShoken = strShoken & vbCrLf
                    End If
                    strShoken = strShoken & valHairetsu(x)
            End Select
        Next x
        
        '/-- 5.情報を転記 --/'
        y = y + 1
        Sheets("出力先").Cells(y, 1).Value = strKaisha
        Sheets("出力先").Cells(y, 2).Value = strHanbai
        Sheets("出力先").Cells(y, 3).Value = strKokugai
        Sheets("出力先").Cells(y, 4).Value = strKokunai
        Sheets("出力先").Cells(y, 5).Value = strShoken
    Loop
    
    '/--シート「出力先」の最終行を更新--/'
    lngMax_Row = y
    
    '/--CSVファイルを閉じる--/'
    Close #1
End Sub

こちらについての解説
Open strHiraku_CSV For Input As #1
ここから「Close #1」までが「3.CSVファイルを開く」の部分になります。

処理としては、「開くCSVのフルパス(strHiraku_CSV)」をテキストモードで読み込んでいる。
ちなみにテキストファイルへ書き出すときはFor Output Asとなる。

#1はファイル番号1にテキストデータを読み込む。という意味。
複数のテキストファイルを開く場合(CSVファイルと読み込んで、別のCSVファイルに書き出す場合とか)は#1の部分を別の番号(#2とか)にすることで区別できる。
ちなみにこのファイル番号1は閉じるまでかなりの頻度で使用する。

Line Input #1, strGyo_Data
ファイル番号1(#1)のデータを1行読み込んで、strGyo_Dataへ代入する。
CSVファイルはカンマ区切り(,)で構成されているので、この時格納されるデータは
,販売会社,販売会社,販売会社,販売会社,国外,国外,国外,国外,国内,国内,国内,国内,所見,所見,所見,所見
このようになる。

Do Until EOF(1)
ここから「Loop」までが「4.情報を取得」の部分になります。
「3.CSVファイルを開く」のように別の部分に切り出して呼び出すほうがイメージつきやすいかもしれませんが、あまり意味がないと思い中に入れました。

処理としては、
ファイル番号1(#1)のデータが最後(最終行の次)になるまでループする。
Do Untilで~まで
EOF(End Of File)は最後(最終行の次)
EOF(この中)はファイル番号(#1)
となる。

Hairetsu = Split(strGyo_Data, ",")
strGyo_Dataに代入された1行分のデータをカンマ(,)を区切りとし配列(valHasiretsu)に格納します。
1行分の文字列データから指定の文字(今回は",")で配列が自動生成されるので、非常に便利です。が、自分で配列のサイズを決めないので配列内をループさせるときには注意が必要です。
ちなみに↑のGyo_Data(,販売会社,販売会社,販売会社,販売会社,国外,国外,国外,国外,国内,国内,国内,国内,所見,所見,所見,所見)だったとすると、valHairetuはこんな感じになります。

valHairetsu() = {,販売会社,販売会社,販売会社,販売会社,国外,国外,国外,国外
               ,国内,国内,国内,国内,所見,所見,所見,所見}

ちなみに数え方は0からなので、↑のだと
valHairetsu(0) = NULL
valHairetsu(1) = "販売会社"
となります。

intRetsu = UBound(valHairetsu)
配列(valHairetsu)のサイズをintRetsuに代入します。
↑で少し触れましたが、Splitで配列に格納した場合、配列のサイズがわからない場合があるのでUbound(配列)でサイズを調べます。
配列は0始まりなので。Uboundで調べたサイズも0からの数になります。

For x = 0 To intRetsu
Uboundで調べた配列サイズRetsuの分周回します。
今回は表形式のデータをこんな感じで周回するイメージです。
配列の中身イメージ


Select Case x
今何列目か?(xの値がいくつか?)によって処理を変えています。
上から順に判定されていくので、たとえ
Case Is <= 16(xが16以下)
であっても、その前に
Case Is <= 12(xが12以下)
があるので、
Case Is <= 16
で処理される条件はxが13~16のとき(13~16列目:所見の列)のみとなります。

それぞれのCaseで変数に値を代入しています。

If Len(strHanbai) <> 0 Then
何かの手違いで元のデータシートに値が重複している(販売会社が2つの欄に記載されているとか)場合があるかもしれません。
そういった場合、
strHanbai = valHairetsu(x)
とやってしまうと、値を上書きしてしまいミスがあったことにも気づけなくなるので、
If Len(strHanbai) <> 0 Then
で値が入っているか判定し、もし値が入っていたら
strHanbai = strHanbai & vbCrLf
で改行コード(vbCrLf)を入れています。
特に「所見」の列は必ず複数値が入っているので、
【申入内容】○○○○○○○
【理由】○○○○○○○
【受付媒体】○○○○○○○
【その他】○○○○○○○
となるように、
strShoken = strShoken & vbCrLf
で必ず改行コードを入れます。

Sheets("出力先").Cells(y, 1).Value = strKaisha
ここが「5.情報を転記」の部分になります。
For x = 0 To intRetsuで周回して取得した情報を転記しています。
別ファイルに書き出してもいいのですが、今回はマクロファイル内に値を転記することで結果をわかりやすくしてみました。


以上で案件の1つ目は終了です。


次回は案件の2つ目になります。





2022年11月17日木曜日

【社内DX案件紹介】アンケートの集計-1-

 今回からは実際に友人から依頼された案件とDX化について紹介していきます。

■案件1 アンケートの集計

依頼内容

友人の会社では毎日、指定のフォーマット(CSVファイル)でアンケートが届く。それをスタッフがデータベースに登録するフォーマットに加工し、登録している。

「特定のフォルダにあるアンケートをデータベースに登録するフォーマットに変換するマクロを組んでもらいたい。」というのが依頼内容になります。


イメージとしては

1.スタッフが特定のフォルダにあるCSVファイルを開き

2.手動でシステムに投入できるファイルへ転記する

手動でシステムに投入するイメージ

そのような作業を

1.マクロが特定のフォルダにあるCSVファイルを開き

2.自動でシステムに投入できるファイルへ転記する

自動でシステム投入用ファイルを作成するイメージ

この依頼内容をどう進めていくか紹介していきます。



フォーマット

・アンケートのフォーマット

アンケートのフォーマット表形式で表示される
こんな感じで縦横で情報がちりばめられています


・データベース取り込み用フォーマット(出力先のフォーマット)

出力先のフォーマット。リスト形式で保存される
各項目ごとにデータをまとめたフォーマットとなります。

今回はマクロファイルにそのまま転記されます。



処理内容

ここまでの情報を基に、処理する内容を整理します。

1.CSVファイルを開き、情報を取得する

2.CSVファイルから取得した情報を出力先フォーマットに合わせて転記する

処理内容イメージ1 ざっくりとしたイメージ


この2つを実行すればよいのですが、

1.CSVファイルを開き、情報を取得する

これをするために

1-a.特定のフォルダからCSVファイルを検索する

1-b.検索したCSVファイルを開く

1-c.開いたCSVファイルから情報を取得する

この3つの手順が必要になります。

処理内容イメージ2 1の内容を細分化


また、特定のフォルダ内には1つのCSVファイルだけあるとは限らないので

3.「1.」に戻る

が必要になります。

処理内容イメージ3 戻るの追加

ここで3.「1.」に戻るについてですが、実際に「1.」に戻る処理をしてもいいのですが、「1-a.」で検索するファイルが無くなったら終了なので、「1-a.」をメインに考えてみると一つの大きなループが出来上がります。

1-a. 特定のフォルダからCSVファイルを検索する

 1-b. 見つかったCSVファイルを開く

 1-c. 開いたCSVファイルから情報を取得する

 2.  CSVファイルから取得した情報を出力先フォーマットに合わせて転記する

処理内容イメージ4 ファイル検索にほかの処理を埋め込む


ここで「1-C」、「2」については1-bでファイルを開いたあとに発生するので、1-bの処理の中に含まれることになります。

1-a. 特定のフォルダからCSVファイルを検索する

 1-b. 見つかったCSVファイルを開く

  1-c. 開いたCSVファイルから情報を取得する

  2.  CSVファイルから取得した情報を出力先フォーマットに合わせて転記する

処理内容イメージ5 ファイルを開くの中に情報取得と転記を埋め込み


ここまでくると作るべきマクロが大体見えてきます。

大きな処理としては「ファイルを検索する処理」「ファイルを開く処理」、そしてファイルを開いたら「情報を取得する処理」「転記する処理」を作れば完成になります。

1. ファイルを検索する処理

 2. ファイルを開く処理

  2-1. 情報を取得する処理

  2-2. 転記する処理

作るべきマクロのイメージ1


あとはプログラムを書いていくだけですが、一つポイントが。

1. ファイルを検索する処理

2. ファイルを開く処理

2-1. 情報を取得する処理

2-2. 転記する処理

の順に一つの流れで記載してもいいのですが、

1. ファイルを検索する処理

2. ファイルを開く処理


この2つの処理は結構頻繁に使用するので、それぞれで作成しておくとこの先のマクロを組む際にも流用が簡単になります。

1. ファイルを検索する処理

「2.ファイルを開く処理」を呼び出す


2. ファイルを開く処理

2-1.情報を取得する処理

2-2.転記する処理

「1. ファイルを検索する処理」に戻る


「2.ファイルを開く処理」を呼び出す

次を検索し戻る

ファイルを開く以降を切り出し



あとはプログラムを書いていくだけですが、長くなったので分けます。

次 > 【社内DX案件紹介】アンケートの集計-2-


TOPページに戻る


■社内DX案件紹介

【社内DX案件紹介】架電内容ごとの情報振り分け-1-

【社内DX案件紹介】架電内容ごとの情報振り分け-2-

【社内DX案件紹介】2つのファイルの内容を比較する

【社内DX案件紹介】封入物の重さによって印刷会社を変える

【社内DX案件紹介】データの期間によってレコードを分割しファイル出力する

【社内DX案件紹介】値の入っているシートのみ印刷する


【社内DXの進め方】なぜ今Excelか?

 Excelでの社内DXを進める理由

このブログでは業務の自動化にフォーカスを当てて話をしていますが、ではその自動化をするためのツールは何にするか?そのあたりを話したいと思います。
自動化するためのツール・プログラム言語は数多くあります。


■操作自体の自動化:RPA(ロボティック プロセス オートメーション)ツール

 マウス操作など、実際の操作を自動化するツール。

 独自システム等、プログラムでは対応できないものに対する自動化を実現できる。

 プログラミングを行わなくても自動化させたい動作を作ることができる。

 ・Power Automate(Microsoft)

 ・WinActor(NTTコミュニケーションズ)

 ・UiPath(Ui Path)

 などなど


■プログラムによる自動化

 プログラミング言語を利用して自動化を実現する
 ・マクロ(VBA:Visual Basic for Applications)
 ・C
 ・Python
 ・Java
 などなど


既に知識がある。会社で導入されており実績がある。などがあればそのツール・プログラム言語を利用していくべきですが、特にそういうのが無い。もしくはこれから始めなければならない。という方、私は断然マクロを進めたいと思います。


お勧めする理由は、ひとえに私がマクロをメインで使用していて便利だから。というのもありますが、それ以外にも大きな理由があります。それは

導入のしやすさ


勤めている会社にもよるかもしれませんが、昨今セキュリティやコンプライアンス的な観点で、たとえ無料のフリーソフトであってもインストールできないことが多いと思います。

その点VBAはMicrosoft Officeが入っているPCは必ず使用することができます。

もっというとVB ScriptであればWindowsさえ入っていれば使用可能です。


もちろん目的がAIとかVBAでできないものであれば、Pythonとか目的に合ったソフトを選択する必要がありますが、簡単な社内DX化をまずは進めていく。のであればマクロ(VBA)をお勧めします。


で、マクロが良いのは分かった。でもなぜExcelか?の理由ですが、2点あります。

1.マクロの記録ができる

2.Excel以外でやる必要があまりない


1.マクロの記録ができる

実はこれがExcelマクロを進める最大の理由で、マクロを学ぶ上でも理解度を大幅に向上させる大きな要素です。

この機能は何か?というと

・手動で行った動作を記録し、プログラムにしてくれる機能

です。


普通プログラミングをするときは、こんな感じで進めていくと思います。

プログラミングのながれイメージ



だけど、この2、3が初心者とかちょっと作りたいだけの人、これから学ぼうとする人にとっては非常にハードルが高い部分なんですよね。

処理方法を考えるのとプログラムを書くハードルが高い



やりたいことは分かっている。だけどやり方がわからない。調べても自分のやりたいことがきれいに載っているわけではない。

結局やりたい動作をプログラムにできるまで処理を理解してからでないと作れないんですよね。

プログラミングってそういうものなんだから。と言ってしまえばそれまでですが、結局やろうとしてもこの2、3のハードルの高さから「うん。こういうのはできる人に任せよう」となってしまいがちです。


でもマクロの記録だとこうなります。

マクロだと実際に手でやってみる



調べて理解しなくてもいいんです。

自分で動かした動作を記録し、それを勝手にプログラムにしてくれて、次回からは実行するだけでOK。

単純作業の繰り返しとかなら、正直これだけでお終いです。


ただまぁプログラミングできるようになりたいのであれば、きちんと処理を理解する必要がありますが、先ほどのこちらと大きく異なるのが、

ハードルが高い部分



こうなるんですよね。

実行した後にプログラムを確認する



これ何が違うかというと、普通のプログラミングだと

「処理を考えてやりたいことを実現する」

だったのが、マクロの記録で作ると

「やりたいことの処理が確認できる」

そう、逆引きができるんですね。


プログラミングを学ぶ上で、「やりたいことを実現するにはどう処理させればよいか」がわかるというのは非常に大きく、理解度を上げる要素になります。


で、一度マクロが出来上がると、それが成功体験になり次のマクロを作る活力にもなります。

そういった意味で、Excelマクロが良いと考えています。



2.Excel以外でやる必要があまりない

こちらは1に比べて大きな理由はなく、ほとんど単なる感想になりますが、昔に比べExcelの制限が無くなってきたので、Excel以外でやる必要があまりなくなってきたんですよね。


昔は

・65,535行、256列までしか扱えない

という理由から、データベースなど大規模なデータを扱うときはAccess、小規模なデータを扱うときや計算がメインの場合はExcel、と棲み分けができていました。

ただExcel2007からその制限が1,048,576行、16,384列に拡張されたことで、大規模なデータも扱えるようになることでその棲み分けが怪しくなってきました。


でも、それ以上になるとAccessに分がありそうですが、実はAccessもExcelもですが

扱えるデータは1ファイル2GBまで

という制限があります。

そうなると実は1,048,576行、16,384列でも2GBの壁にぶつかりやすく、Accessなら。のメリットが薄まってしまっています。


特に今はデータベースが2GBで収まることは珍しく、データベースとしてACCESSを使用することは少なくなり、SQL Server等を用意してそちらをデータベースとしてデータを格納。AccessでそのSQL Serverにアクセスしてクエリ等でデータを扱うのがメインだと思います。


ただプログラミングせずにデータベースにアクセスしてクエリ実行できたりするAccessの優位性ですが、Excel2013あたりからの機能「PowerQuery」の登場でまた一段と薄まりました。

だってデータベースソフトの機能を持ったExcelとなりましたので。


もうそうなるとExcelだけで良いのではないか?と思っています。

そういった意味で、Excel以外でマクロをやる必要があまりないと考えています。



このようにExcelマクロについては

・Microsoft Officeがあれば使うことができる導入のしやすさ

・マクロの記録によりプログラミングのハードルが低い

という理由で、私は社内DXを進めるうえでの最初の一歩にお勧めしたいと思います。

で、予算がついたりしてもっと大規模なことができるようになったら外注やらRPAやらで更にDXを促進していけば良いと思います。


↓よろしければクリックをお願いします!

■関連ページ

【社内DXの進め方】ブログの目的(会社が求めるDX)

【社内DXの進め方】社内DXの推進について

【社内DXの進め方】社内DXは具体的に何をすればよいのか?


■社内DX案件紹介

【社内DX案件紹介】アンケートの集計-1-

【社内DX案件紹介】アンケートの集計-2-

【社内DX案件紹介】架電内容ごとの情報振り分け-1-

【社内DX案件紹介】架電内容ごとの情報振り分け-2-

【社内DX案件紹介】2つのファイルの内容を比較する

【社内DX案件紹介】封入物の重さによって印刷会社を変える

【社内DX案件紹介】データの期間によってレコードを分割しファイル出力する

【社内DX案件紹介】値の入っているシートのみ印刷する




2022年11月15日火曜日

【社内DXの進め方】社内DXは具体的に何をすればよいのか?

 内DXは具体的に何をすればよいか?

「業務/製造プロセスの電子化」を行う上で自身の課、部、事業部の業務をすべて棚卸しし、手作業でやっている部分はどこか?を洗い出しその中から自動化できる部分を自動化する。それを繰り返すことで社内DX化を進めます。


が・・・そんなことやるのは予算がついてからで十分で、まずは普段自分の見える範囲での手作業を自動化してみるのが良いと思います。

このブログでは、まずはその一歩目に着目して書いていきます。



で、まず見つけるべき手作業は以下2つだと思います。
①Aのファイルの内容をBのファイルに転記
②ある複数のデータを1つのファイルに集計


今時こんなのを手作業で?と思っている方も多いかと思います。
でも、今でもこんなのを手作業でやっているのです。
具体的に言うと

①Aのファイルの内容をBのファイルに転記

こちらはよくある例ですが、複数の会社から別々のフォーマットで来た情報を自社の管理データベースに合わせたフォーマットで入れる場合(リスト化等)が多いです
手動で複数のファイルから転記するイメージ



こういった作業をスタッフにやらせている場合は、DX化することで他の仕事を割り当てる、もしくは人員削減が可能となります。
自動で複数のファイルから転記するイメージ



②ある複数のデータを1つのファイルに集計

これはどんな企業でも大体やっていると思います。
そう、報告書や会議資料です。

各課のデータを取りまとめて集計し、会議資料を作成して報告する。
本当なら会議資料が作りやすいように、各課にフォーマットに合わせて提出してもらえれば
こんなことはしなくてもよいのですが、各課の都合や文化もありますし、もちろんそんな調整は稼働が膨大にかかります。

手動での会議資料データとりまとめイメージ



そんなときにDXです。

各課別々の報告フォーマットで作られたデータから1つの報告資料を作成する。
それを毎回VLOOKUP使って、ピポッドテーブルで集計して、グラフを作る。
ここを自動化するだけで、DXです。

自動での会議資料データとりまとめイメージ



あなたがこの稼働を減らしただけでは、ただ楽になるだけです。
ただ、ここで考え方を変えると

より多くの時間を分析に充てることができるので、より高いレベルの仕事ができる

月次報告等、限られた時間の中で進めなければならない業務のわりに高い精度を求められるため、より早くデータをまとめ、より多くの時間を分析に充てられることでより質の高い仕事が実現します。

また人事異動等であなたがいなくなっても、資料作成までの時間は変わらないので後任は分析に重点を置けるメリットもあります。

こちらは少し稼働削減とはそれますが、社内DXの大きな利点だと思います。




このように、社内DXを進め今まで手作業でやっていた部分を自動化していくことで、人員削減や質の高い仕事を実現し、スリムかつ筋肉質な会社へと変化していくことを求められています。

↓よろしければクリックをお願いします!




2022年11月14日月曜日

【社内DXの進め方】社内DXの推進について

 社内DXでやるべきこと

DX推進としてまず最初にやるべきことは「業務/製造プロセスの電子化」ですが、この

「業務/製造プロセスの電子化」

は一体何をするのか?ですが、一言でいうと


手作業を自動化


この一言に尽きます。

例えば、以下のようなパートナー各社から届いたデータを社内の管理データへ投入する業務があったとします。


仮にその投入作業をスタッフを雇って従事させていたとします。

手作業のデータ投入イメージ



それをプログラミング等により自動で記入できるようにした場合、

データ投入の自動化イメージ


手投入するスタッフは必要なくなるので、1人工分の稼働削減が図られることになります。


いやいや今どきExcelでデータ管理なんて。という方もいるでしょう。独自システムもしくはそれに準ずるものでデータを管理している場合もあると思います。

データ投入の自動化イメージ2



そういうときはシステムに投入できるファイルの作成までをプログラムに委ねることで、1人分の稼働削減を図ることができます。


これが社内DXの推進で求められている「業務/製造プロセスの電子化」です。
手作業をプログラムで自動化されるだけ。簡単でしょう?


ただ、注意しなければいけないことがあります。
よく効率化により稼働削減が図られたときに「XX時間からxx分(削減率200%)になった!」と表現する場合があります。
しかしこのコロナ禍、どの会社もコスト削減に非常に目が向いていると思います。

そんな中、「社内DXの推進」を求められているので、

「XX時間からxx分(削減率200%)になりました!」

と言っても

「じゃあ何人減らせるの?」

と聞かれるだけです。単なる効率化は求められていません。
「業務/製造プロセスの電子化」を進める中では「人がやらなくてよくなる=人が減らせるか?」を意識して進める必要があります。

↓よろしければクリックをお願いします!





2022年11月12日土曜日

【社内DXの進め方】ブログの目的(会社が求めるDX)

ブログの目的 

このブログは会社から

「DXを推進しろ!」

と言われつつも、


いざやろうとしたら

「予算つかない」

「SEいない」

「自分の業務は通常どおり」

と三重苦を味わっている30~40代の中堅?社員へ、簡単なのに効果の大きいVBAマクロを紹介するブログです。


私自身もこの三重苦を味わっていますが、別の会社の友人から、この「DX推進」という名の相談に何度か乗っていたので、Tipsとして載せようと思います。

私自身の主観・偏見がかなり入っていますが、参考になれば何よりです。


会社が求めるDX

さて、DX推進と言いつつも、まずは「DXとはなんぞや?」から行きたいと思います。


DX(デジタルトランスフォーメーション)の定義

’’企業が外部エコシステム(顧客、市場)の破壊的な変化に対応しつつ、内部エコシステム(組織、文化、従業員)の変革を牽引しながら、第3のプラットフォーム(クラウド、モビリティ、ビッグデータ/アナリティクス、ソーシャル技術)を利用して、新しい製品やサービス、新しいビジネス・モデルを通して、ネットとリアルの両面での顧客エクスペリエンスの変革を図ることで価値を創出し、競争上の優位性を確立すること’’

※経済産業省HP「DXレポート ~ITシステム「2025年の崖」克服とDXの本格的な展開~」より抜粋


ここだけ読むと、デジタル技術を駆使して新たな価値を創出し、その価値を高めていこう。という目的の話です。
そしてその目的に向かって各企業はDXに取り組んでいる(であろう)と思います。

ただ、会社って「国が掲げた目標にひたむきに走っていく!」そんなものじゃないことはわかっているはずです。

ここに1枚のフレームワークがあります。
DX の各アクションを取組領域とDXの段階に分けて整理したものですが、で囲った部分が理想形(ゴール)となります。

経産省HP「DXレポート2(中間とりまとめ)DXフレームワーク1」

※経済産業省HP「DXレポート2(中間取りまとめ) DXレポート2(本文)」より抜粋

しかしこのブログを読んでくれるような人は、コロナ禍も相まっての部分を求められていると思っています。

経産省HP「DXレポート2(中間とりまとめ)DXフレームワーク2」

そしてその先にある「効率化という名の人減らし」。

DXはそもそもそんなものでは無いのですが、業務プロセスだけに着目すると

DX→人口減少が課題→人のやる作業を自動化→自動化すれば人がやらなくてよい?→従業員が減らせる?→コスト削減!→DXを推進しろ!

こんなフローが成り立つわけで。

このブログではDX推進という名の業務プロセス効率化を求められている30~40代の中堅?社員に向けて実例を踏まえつつ情報発信していきたいと思います。


↓よろしければクリックをお願いします!

TOPページに戻る


■関連ページ

【社内DXの進め方】社内DXの推進について

【社内DXの進め方】社内DXは具体的に何をすればよいのか?

【社内DXの進め方】なぜ今Excelか?


■社内DX案件紹介

【社内DX案件紹介】アンケートの集計-1-

【社内DX案件紹介】アンケートの集計-2-

【社内DX案件紹介】架電内容ごとの情報振り分け-1-

【社内DX案件紹介】架電内容ごとの情報振り分け-2-

【社内DX案件紹介】2つのファイルの内容を比較する

【社内DX案件紹介】封入物の重さによって印刷会社を変える

【社内DX案件紹介】データの期間によってレコードを分割しファイル出力する

【社内DX案件紹介】値の入っているシートのみ印刷する