VB6/VBA → VB.NET 移植メモ

他にもたくさんあるだろうが、気づいたものを列挙。

大きな違い

  • いちばんの違いは、本格的なクラスベースのオブジェクト指向言語になったこと
    • 既存のVB6/VBAのソースがきちんとクラス化/モジュール化されていない密結合なコードの場合、ソースをなるべくそのまま流用するのであれば下記のような方法を取る。
    • (1) モジュールで実装 (静的クラスのようなもの)
    • (2) 静的メソッドで実装 (Public Shared Sub/Function)
    • (3) 単一のクラスで実装し、Partial Class でクラスを分割
    • もちろん、スケジュールとコストが許すなら再設計が望ましい。
  • 次に大きな違いは、スレッドが使えるようになったこと
    • VB6/VBAはシングルスレッドなので、時間のかかる処理も DoEvents でごまかしていた。VB.NETではスレッドで処理すべき。

基本的な文法の差異

  • Attribute VB_Name → クラス名/モジュール名
  • Option Explicit はデフォルトで On (明示的な変数宣言が必要)
  • Option Strict が追加 (厳密な型指定を強制。デフォルトはOff)
  • Type → Structure に置換 (メンバの Dim → Public に置換)
  • Variant → Object に置換
  • Wend → End While に置換
  • If文の終わりにEnd If が必須 (VB6/VBAでは1行の If 文には不要)
  • Continue For/While/Do, Exit For/While/Do が追加
    • GoTo文からの書き換えが望ましいが、多重ループ脱出は要注意
  • Try Catch文が追加 (構造化例外機構)
    • On Error GoTo文は書き換えが望ましい
    • Continue, Exit, Catch, Finallyなどは予約語となったので、ラベル名に使っていた場合は注意して書き換えが必要
  • VB6ではIntegerが16bit, longが32bit → VB.NETではShortが16bit, Integerが32bit, longが64bit
  • Sub/Functionの引数は ( ) で囲む必要がある
  • VB6では引数はByRefがデフォルト → VB.NETではByValがデフォルト
  • 代入文の Set と Let → 廃止 (削除する)
  • 動的配列の ReDim の末尾に「As 型名」を付けない
  • 多次元の動的配列の定義は次元を明示
    • Dim hoge() As String → Dim hoge(,) As String
  • 構造体のメンバーである配列は初期サイズを指定できない → コンストラクタで RiDim する
  • Option Base 1 (配列を1始まりに設定) → 廃止 (用いられている場合は慎重な修正が必要)

GUI関連

  • MsgBox("メッセージ") → MessageBox.Show("メッセージ")
  • フォーム名.Show(vbModal) → フォーム名.ShowDialog()
  • フォーム名.Repaint → フォーム名.Invalidate()
  • Unload フォーム名 → フォーム名.Close()
  • コントロール名_イベント名 (暗黙のイベントハンドラ名)
    → フォームデザイナでイベントとハンドラをひもづけ
  • コントロール配列 (ButtonArray等)は廃止
    → コードでコントロールの配列(Button[ ]等)に格納
    • Load buttonHoge(i) → buttonHoge(i) = New Button()
    • ハンドラもコードで設定。AddHandler buttonHoge(i).Click, AddressOf buttonHoge_Click
    • ハンドラでは sender で判定。Index → Array.Index(buttonHoge, (button)sender)
  • Form_Initialize → Form.Loadイベント
  • Form_QueryClose → Form.FormClosingイベント
    • Cancel → e.Cancel, CloseMode → e.CloseReason
  • Form_Unload → Form.FormClosed イベント
  • CommandButton → Button
  • Label.Caption → Label.Text
  • ProgressBar.Min/Max → ProgressBar.Minimum/Maximum
  • 寸法の単位 Twip → ピクセル (96dpiの環境下では15Twipで1ピクセル)
  • PictureBox → 互換性が無い (画面描画の仕組みが一新された)
  • PopupMenu → ContextMenuStrip
    • contextMenuStripHoge.Items.Add(toolStripMenuItemPiyo)
    • Me.ContextMenuStrip = contextMenuStripHoge
  • FileListBox → 廃止 (いちおう互換クラスはあるが)
  • DoEvents → いちおうApplication.DoEvents() はあるが使わない方が良い
    • 上記のようにスレッドを用いた処理に変更すべき

Excelの操作 (VBAからの移植の場合)

  • Microsoft Excel xxx Object Library を使用する
    • [プロジェクト]→[参照の追加]→[COM] で Microsoft Excel xxx Object Library にチェック
    • ソースの冒頭に Imports を追加
Imports Microsoft.Office.Interop
Imports Microsoft.Office.Interop.Excel ' お好みでこちらも

ファイル操作

  • ファイル操作系も一新されたので作り直したほうが良い。(いちおう互換クラスはある)
  • ファイルの存在確認: Dir(パス) <> "" → File.Exists(パス)
  • ファイルを開く/保存のダイアログ CommonDialog → OpenFileDialog / SaveFileDialog
  • VBA の FileSystemObject → System.IO.Path / File / Directory
    • FSO.BuildPath(,) → Path.Combine(,)
    • FSO.GetFileName() → Path.GetFileName()
    • FSO.DeleteFile() → File.Delete()
    • FSO.GetFolder().SubFolders → Directory.GetDirectories()
    • FSO.GetFolder().Files → Directory.GetFiles()

その他

  • LenB("文字列") → Encoding.GetEncoding(Encoding.UTF8).GetByteCount("文字列")
  • String(文字数, "A") → New String("A"c, 文字数)
  • Format(hoge, "書式") → hoge.ToString("書式") または String.Format("書式", hoge)
    • 書式の記法の違いは要修正
  • Date など予約語が増えたので、変数名などに使っている場合は要修正

VB6→VB.NETの自動変換

下記の記事を参照。