Excel VBA Tips

# はじめに
- Excel VBAに関するTipsです。
- たまにしかExcel VBAを書かないので備忘録を兼ねています。
- 必要に応じて、都度更新していきます。

# 基本的な操作
## ブック

### シートのコピー

```vbnet:標準モジュール_(Main)
Sub Main()
  ActiveSheet.Copy
End Sub
```

## シート

### シートの追加

```vbnet:標準モジュール_(Main)
Sub Main()
  Dim i as Long

  For i = 1 To 12
    Sheets.Add(After:=Sheets(Sheets.Count)).Name = i & "月"
  Next i

End Sub
```

## セル
## その他

- 和暦に変換する

```vbnet:cnvJYear
Private Function cnvJYear (yyyy as Date) as String
  Dim JYear as String

  '2017/7/5 -> "g": H, "gg": 平, "ggg": 平成, "e": 29
  JYear = Format(yyyy, "g") & Format(yyyy, "e")
  cnvJYear = JYear
End Function
```

- オートシェイプを挿入する

```vbnet:標準モジュール_(Main)
Sub Main()
  With Range("B2:D5")
    ActiveSheet.Shapes.AddShape msoShapeRectangle, _
      .Left, .Top, .Width, .Height
  End With

End Sub 
```

- 枠線の色を設定する

```vbnet:標準モジュール_(Main)
Property Let LineColor(sh as shape)
  sh.Line.ForeColor.RGB = RGB(0, 0, 0)
  'ActiveSheet.Shapes(1).Line.ForeColor.RGB = RGB(0, 0, 0)
End Property
```

- オートシェイプの塗りつぶしを設定する

```vbnet:標準モジュール_(Main)
Property Let FillColor(sh as shape)
  With sh.Fill
  .ForeColor.RGB = RGB(255, 255, 255)
  .Solid
End Property
```

# プログラミング


## 変数

### 広域変数

```vbnet:標準モジュール_(Main)
Private mVar1 as String
Dim mVar2 as String
Public gVar1 as String

Sub Main()
  '...
End Sub
```

### プロシージャ変数

```vbnet:標準モジュール_(Main)
Sub Main()
  Dim var3 as String
  '...
End Sub
```

### 定数
- 値の再代入は出来ない

```vbnet:標準モジュール_(Main)
Sub Main()
  Const PI as Long = 3.14
  '...
End Sub
```

### 配列

```vbnet:標準モジュール_(Main)
Sub Main()
  Dim arr(2) as String
  arr(0) = "Excel"
  arr(1) = "Word"
  arr(2) = "Power Point"
  '...
End Sub
```

### 動的配列

```vbnet:標準モジュール_(Main)
Sub Main()
  Dim dinamicArr() as String
  ReDim dinamicArr(2) as String
  dinamicArr(0) = "Excel"
  dinamicArr(1) = "Word"
  dinamicArr(2) = "Power Point"

  '既存の値を保持して、要素数だけを変更
  ReDim Preserve dinamicArr(3)
  dinamicArr(3) = "Access"
  '...
End Sub
```

### 静的変数
- プロシージャ内でのみ宣言が可能

```vbnet:標準モジュール_(Main)
Sub Main()
  Static counter as Long
  counter = counter + 1
  MsgBox counter
End Sub
```

### ユーザ定義変数

```vbnet:標準モジュール_(Main)
Sub Main()
  Type Animal
    name as String
    age as Long
  End Type

  Dim Dog(2) as Animal
  '...
End Sub
```

## 制御構文

### If

```vbnet:標準モジュール_(Main)
Sub Main()
  Dim ans as Long
  ans = 10

  If ans < 5 Then
    MsgBox "ans is small."
  Else
    MsgBox "asn is big."
  End If
End Sub
```

### For

### For Each 


-----

# JScript

```bat:run.bat
@echo off
rem CScript //nologo //E:JScript xlsx2csv.vbs
CScript //nologo //E:JScript xlsx2csv.vbs test.xls Sheet1 test.csv
pause
```

```js:xlsx2csv.vbs
var EXCEL = WScript.CreateObject("EXCEL.Application");
var xlCSV = 6;

var args = WScript.Arguments;
var fso = new ActiveXObject("Scripting.FileSystemObject");
var cwd = fso.getParentFolderName(WScript.ScriptFullName);

var srcFile;
var sheet;
var distFile;

WScript.Echo(args.length);

for(i=0; i < args.length; i++) {
    WScript.Echo(WScript.Arguments(i));
}

switch(args.length) {
    case 0:
        srcFile = 'C:\\Users\\X\\Downloads\\SA.xls';
        sheet = 'P0001';
        distFile = 'C:\\Users\\X\\Downloads\\SA.csv';
        break;
    case 3:
        srcFile = cwd + '\\' + WScript.Arguments(0);
        sheet = WScript.Arguments(1);
        distFile = cwd + '\\' + WScript.Arguments(2);
}

WScript.Echo(srcFile);

var book = EXCEL.workbooks.Open(srcFile);
book.Worksheets(sheet).Activate();
book.SaveAs(distFile, xlCSV);
book.Close(false);
```