Excel VBAでグラフの作成を自動化する

### Excel VBAでグラフ作成を自動化させる
業務上よく装置が出力したテキストファイルから可視化する作業が多く手作業でグラフ作成するのが億劫なのでVBAを使って楽しようと思った次第です。

---
### 実現したい事
1.サーバーから取得した複数のファイルをマージする
2.マージしたファイルとマージ前のファイルは別フォルダで管理する
3.マクロを使いマージしたファイルのデータを整形する
4.何度も使いまわし可能なマクロファイルにしたい
5.ダイアログでファイルを開き任意のファイルからグラフを作成できるようにしたい

---
### 全体フロー
1.実現したい事で述べた1に関して、カレントディレクトリにマージしたい複数のファイルを格納する
2.バッチファイルを実行することによりファイルをマージし、ファイルを移動させる。
3.マージされたファイルを読み込みcsvファイルを生成する
4.csvファイルの内容を確認しデータに欠陥がないか確認する
5.csvファイルを読み込みグラフを作成する。
6.開発が完了したらbackupはVBCAで取得し、ソースコードはGithubで管理する

---
### 実装
マージされたファイルを読み込みcsvファイルを生成するコード
```
Option Explicit
Sub data_set()
    Application.ScreenUpdating = False

    'シートにデータがある場合は削除する
    Call del
    
    'グラフ作成用のデータを生成
    Call file_open
    Call writing2
    Application.Quit
    ThisWorkbook.Close

End Sub
Sub del()
    Cells.clear
    If ActiveSheet.ChartObjects.Count = 1 Then
        ActiveSheet.ChartObjects.delete
        Else
    End If
End Sub
Sub file_open()
    Application.ScreenUpdating = False
    
    Dim txtName As String  'ダイアログで任意のファイルを開く
    Dim buf As String
    
    txtName = Application.GetOpenFilename("テキストファイル,*.log")
    
    If txtName <> "False" Then  '読み込みモードで file open
        Open txtName For Input As #1
    End If
    
    Call writing1
    
End Sub
Sub writing1()
    Application.ScreenUpdating = False
    
    Dim r As Long

    r = 1 '1行目から書き出す

    'EOF関数でファイルを読み込む
    Do Until EOF(1)
        Dim buf As String
        Line Input #1, buf
        
        Dim arry1 As Variant

        arry1 = Split(buf, ",")


        Dim i As Long
            For i = LBound(arry1) To UBound(arry1)
            Cells(r, i + 1) = arry1(i)
            Next
            r = r + 1
    Loop
       
    Close #1
    
End Sub
Sub writing2()
    Application.ScreenUpdating = False
    
    '不要データの削除
    Columns("C:F").delete
    Columns("D").delete
    
    Dim j As Variant
    j = 1
    
    Do While Cells(j, 3) <> ""
         Cells(j, 4) = Replace(Cells(j, 3), ":", ";")
          j = j + 1
    Loop
    
    Columns("C").delete
    
    ThisWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\Marge.csv", FileFormat:=xlCSV
    ThisWorkbook.Close
    
End Sub
```

グラフ作成用のデータを作成するコード
```
Option Explicit
Sub single_macro()
    Application.ScreenUpdating = False

    'シートにデータがある場合は削除する
    Call del
    
    'グラフ作成用のデータを生成
    Call file_open
    Call writing2
    
    '折れ線グラフ
    'Call Graph1
    '散布図
    Call Graph2

End Sub
Sub del()
    Cells.clear
    If ActiveSheet.ChartObjects.Count = 1 Then
        ActiveSheet.ChartObjects.delete
        Else
    End If
End Sub
Sub file_open()
    Application.ScreenUpdating = False
    
    Dim txtName As String
    Dim buf As String
    
    'ダイアログで任意のファイルを開く
    'txtName = Application.GetOpenFilename("テキストファイル,*.csv")
    
    'FILE PATHを指定
    txtName = "C:\Users\darry\デスクトップ\TempGraph\temp_graph\bin\Marge.csv"
    
    If txtName <> "False" Then  '読み込みモードで file open
        Open txtName For Input As #1
    End If
    
    Call writing1
    
End Sub
Sub writing1()
    Application.ScreenUpdating = False
    
    Dim r As Long

    r = 1 '1行目から書き出す

    'EOF関数でファイルを読み込む
    Do Until EOF(1)
        Dim buf As String
        Line Input #1, buf
        
        Dim arry1 As Variant
        Dim arry2 As Variant

        arry1 = Replace(buf, ";", ",")   '置換
        arry2 = Split(arry1, ",")


        Dim i As Long
            For i = LBound(arry2) To UBound(arry2)
            Cells(r, i + 1) = arry2(i)
            Next
            r = r + 1
    Loop
            
    Close #1
    
End Sub
Sub writing2()
    Application.ScreenUpdating = False
    
    '不要データの削除
    Columns("C").delete
    
    Dim j As Variant
    j = 1
    
    '温度の計算
    Do While Cells(j, 3) <> ""
        Cells(j, 4) = Cells(j, 3) * 0.1
        j = j + 1
    Loop
    
    Columns("C").delete
    Columns("C").Select
    Selection.NumberFormatLocal = "0.0"
    
    '1行目に行を挿入する
    Cells(1, 1).EntireRow.Insert

    Range("B1").Value = "Time"
    Range("C1").Value = "Runnung"
    Range("D1").Value = "Not Runnung"

    Columns("A:D").Select
    Selection.AutoFilter
    
End Sub
```

グラフ作成用コード
```
Option Explicit
Sub Graph2()
        
        Range("B1:D1").Select
        Range(Selection, Selection.End(xlDown)).Select
        
        'Graph_Create
        ActiveSheet.Shapes.AddChart2.Select
        'Graph_Type
        ActiveChart.ChartType = xlXYScatter '散布図
        
        'Add_Title
        ActiveChart.HasTitle = True
        'Title_Name
        ActiveChart.ChartTitle.Text = "TEMP"
        '時間軸の位置を下にする
        ActiveChart.Axes(xlCategory).Select
        Selection.TickLabelPosition = xlLow
        
        With ActiveChart
        .Axes(xlCategory).Select
        '.Axes(xlCategory).MajorUnit = 0.041667 '1hr
        '.Axes(xlCategory).MajorUnit = 0.0125 '3hr
        .Axes(xlCategory).MajorUnit = 0.5 '12hr
        .Axes(xlCategory).MinorUnit = 0.01
End With

End Sub
```

---
###【参考記事】
[vbacでエクセルVBAのソースコードをGitバージョン管理する方法](https://tonari-it.com/vba-vbac-git/)
[]()