値を返さないならSub、返すならFunction。
でもFunctionでも値返さなくてOK。←ええ…(困惑)Returnなんてものはない。メソッド名を返り値とし、そこに代入する。
Private Function AtaiKaeshite(ByVal tashiteKaeshite As Integer) As Integer ' 1加算して返す AtaiKaeshite = tashiteKaeshite + 1 End Function
Javaのノリで使うと、Integerの範囲が狭い。±32767なので割とすぐ死ぬ。
Longや、金額であればCurrencyを活用しよう。ByVal、ByRef ?
' ByVal Private Sub AtaiKaete1(ByVal kaeruAtai As Integer) ' 呼び出し元の値変わらない kaeruAtai = kaeruAtai + 1 End Sub Private Sub AtaiKaete2(ByVal kaeruAtai As Integer) ' 呼び出し元の値が変わる kaeruAtai = kaeruAtai + 1 End Sub
- よくわかってないけど、オブジェクト?はSetを使わないと変数に代入できない
Dim obj As Worksheet Set obj = Worksheets.Add after:=Worksheets(Worksheets.Count)
Functionで返せない値がある。たとえば、Excelブック、ワークシートそのもの。
Excelのマクロが、ブック単位で単一用途であるなら、フィールド変数を活用すべし。
もしくは、返せないようなものは、実行ルーチンからの参照受け渡しを活用する。ソートは基本的に言語としてライブラリを持ち合わせていないので、Excelの場合はExcel関数。
なければ、バブルソートとかのアルゴリズム実装。Mapは参照ライブラリを設定すると使える。Dictionaryで検索。
番外:基本的にマクロエディターを使用するが、コンパイルエラーは自動では教えてくれないので、
Alt + D → L でVBAのコンパイルを実行する。(デバッグ → VBAプロジェクトのコンパイル)