MatsuoTech

技術メモとひとりごと。

Web系やJavaをやってきた人がVBAやってみた知見

  • 値を返さないなら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プロジェクトのコンパイル