VBA あれこれ

最近初めてExcelのマクロを触りました。
初歩的なことから調べたので、メモ書きを残します。

※初心者の記事のため、誤り・もっと良い書き方があるかもしれません。お気づきの点はご指摘お願いいたします。


# ファイル出力
出力したい先のパス（~\XXX\）＋ファイル名（mmm.sql）で出力
※今回はsqlファイルを出力したかったので.sql　別の拡張子でも可？
```
ファイルパス = "~\XXX\mmm.sql
Open ファイルパス For Output As #1
Print #1, "ファイルに記載したい内容"
Close #1
```
[Excelのファイルからマクロで.sqlファイルを生成する #ExcelVBA - Qiita](https://qiita.com/hellscare/items/32f9d1d391f3ca46b415)
[Excel VBA：テキストファイルへ書き込み｜Open For Output As](https://excel-excel.com/tips/vba_106.html)


# 戻り値
Functionでのみ使用可能。
関数名に値を入れる、呼び出し元で変数に入れることで使用可能
```
Sub test()

  Dim hoge
  hoge = sample()
  
  MsgBox hoge
  
End Sub
  
Function sample()
  
  sample = "test"

End Function
```
[【VBA】Functionの使い方【戻り値の取得、複数の引数や配列を渡す】](https://daitaideit.com/vba-function-usage/)


# 条件分岐
If,caseが使えることは確認した（これしか使ってない）
```
Sub sample()
  
  If hoge <> "" Then
    MsgBox "hogeは空じゃない"
  Else
    MsgBox "hogeは空！"
  End If

  select case hoge
  case "朝"
    MsgBox "朝だよ"
  case "昼"
    MsgBox "昼だよ"
  case Else
    MsgBox "日が暮れたよ"
  end select
End Sub
```
[【Excel VBA入門】Select Case文の使い方。複数条件をスッキリ書く！ – Valmore](https://valmore.work/excel-vba-case/)


# セル取得
RowとかColumnの取得がしたいとき、これで取れる
Findと組み合わせて、特定のセルと同じ内容のセルを探す・・・とかもできる、そのRow取得とか（サンプル）
※Findで見つからなかった場合はNothingになる。Find内の細かい設定オプションはリンク先参照
```
Sub sample()
  Dim hoge
  Dim fuga
  
  hoge = workbook.Worksheets("Sheet1").Range("A3")
  'Excelの「Sheet1」シートのA3セルがhogeにとれた状態
  
  MsgBox hoge.Row
  '取得したセルのRowを出力（3)
  MsgBox hoge.Column
  '取得したセルのColumnを出力（A)
  
  fuga = workbook.Worksheets("Sheet2").Range("B3:B20").Find(What:hoge)
  'Excelの「Sheet2」シートのB3～B20セルで、A3と同様の内容のセルを取得する
  
  MsgBox fuga.Row
  '取得したセルのRowを出力
  MsgBox fuga.Column
  '取得したセルのColumnを出力
  
end sub
```
[【VBA】Rangeの行、列、行数、列数を取得【Row、Column、Countを使う】](https://daitaideit.com/vba-range/#mokuzi2)
[【Excel VBA入門】Findメソッドで条件に一致するセルを検索する方法 – Valmore](https://valmore.work/find-cell-by-find/#:~:text=Find%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AE%E5%BC%95%E6%95%B0%201%20What%EF%BC%88%E5%BF%85%E9%A0%88%EF%BC%89:%20%E6%A4%9C%E7%B4%A2%E3%81%99%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%BE%E3%81%99%202%20After:%20%E6%A4%9C%E7%B4%A2%E9%96%8B%E5%A7%8B%E3%81%AE%E3%82%BB%E3%83%AB%E3%82%92%E6%8C%87%E5%AE%9A%E3%80%82%20...,5%20SearchOrder:%20%E6%A4%9C%E7%B4%A2%E6%96%B9%E5%90%91%E3%82%92%E6%8C%87%E3%81%97%E3%80%81%EF%BC%91%E5%88%97%E3%81%94%E3%81%A8%E6%A4%9C%E7%B4%A2%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AFxlByColumns%E3%80%81%EF%BC%91%E8%A1%8C%E3%81%94%E3%81%A8%E6%A4%9C%E7%B4%A2%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AFxlByRows%E3%82%92%E6%8C%87%E5%AE%9A%206%20SearchDirection:%20%E6%A4%9C%E7%B4%A2%E3%81%AE%E5%90%91%E3%81%8D%E3%82%92%E6%8C%87%E5%AE%9A%E3%80%82%20...%20%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0)



# 未入力チェック
記載した内容を使って処理するものは入力チェックが必要だよね～ってあとから追記しました
[Excel VBA 入力が必要なセルが未入力の場合メッセージを出す](https://kosapi.com/post-991/)



# 文字列操作系
javaのsubstringぽいものはなさそうなので、Replaceを駆使した
```
Sub sample()
  Dim hoga
  hoga = Replace("Hello World!","World","")
  'Worldを取り除く
  MsgBox hoga 'Hello !
  
  hoga = Replace("Hello World!","World","everyone")
  '勿論置換もできる
  MsgBox hoga 'Hello everyone!
  
  hoga = Replace("World World World!","World","everyone",2,1)
  '置換の位置指定（この場合は真ん中のWorldだけ置換
  MsgBox hoga 'World everyone World!
  
end sub
```
[【VBA】Replace（置換）をマスター！基本と応用テクニック – COMMAND LAB -TECH](command-lab.com)
[VBA関数（文字列操作,Replace,InStr,StrConv）｜VBA入門](https://www.excel-ubara.com/excelvba1/EXCELVBA347.html)
[Excel VBAで文字列の切り出しを行う：Left, Right, Mid | UX MILK](https://uxmilk.jp/50074)



# ループ系
[繰り返し処理（For Next)｜VBA入門](https://www.excel-ubara.com/excelvba1/EXCELVBA316.html)
[EXCEL VBA 繰り返し処理の使い分け（For Next・Do While Loop・Do Until Loop)](https://akira55.com/for_next_do_loop/)


# ワイルドカード
Like判定でワイルドカード使えば一部合致するものとかで条件作れる
[【VBA】文字列をLikeで判定【ワイルドカード、Notを使う】](https://daitaideit.com/vba-char-like/)