VB6のプロジェクトをVB.NETに変換

はじめに

Visual Studio 2005/2008 にはVB6のプロジェクトをVB.NETに変換する機能 (「アップグレード」と称する) があったが、現在のVisual Studio 2019 にはない。
そこで、VS2008をインストールし、いったんVB6のプロジェクトをVS2008で開いてアップグレードしてから現行のVS2019で開いてアップグレードするという2段階の手順を踏む。VS2008→VS2019に関しては特に大きな問題はない。VB6→VS2008のアップグレードについて次に述べる。

環境の準備

(1) Visual Studio 2008 Expressのインストール

2022年9月現在、すでにVisual Studio 2008 ExpressのダウンロードはMicrosoftのサイトからはできなくなっている。(たぶん)
ただし、Visual Studio サブスクリプションからダウンロードすることができる。無償の「Dev Essentials」に登録すればダウンロードできた。下記ページで「Visual Studio Express 2008」と検索すれば「Visual Studio Express 2008 with Service Pack 1」が見つかる。

https://my.visualstudio.com/Downloads

(2) VB6またはVB6ランタイムのインストール

アップグレードを実行するPCにはVB6のランタイム(DLLやOCX)がインストールされている必要がある。ランタイムがないと、プロジェクトのアップグレード時にエラーが発生する。
もしもVB6がインストールされていても「MSCOMCTL.OCXが見つからない」などエラーが出る場合にはランタイムのバージョンが古いので最新のものに更新する。下記の更新プログラムをインストールすると MXCOMCTL.OCX および COMCTL32.OCX が更新される。ただし、VB6SP6がインストールされている必要がある。

VB6ラインタイムのみをインストールする場合は、Vectorなどで配布されているものをインストールする。いくつか見つかるが、下記一つ目の XTRM Runtime がおすすめ。

VB6からVB.NETへの変換

  • VS2008 (VIsual Basic 2008) を起動する。
  • [ファイル]>[プロジェクトを開く] からVB6のプロジェクトファイル(.vbp)を開く。
  • [Visual Basic アップグレード ウィザード] が起動してプロジェクトとソースの変換がおこなわれる。
  • VS2008を閉じて、変換されたプロジェクトのソリューション(.sln)をVS2019で開く。
  • プロジェクトをビルドするとたいてい大量のエラーが出る。

ソースの修正

エラーが出やすいのは主にUI関連である。特に下記の2つは大きく書き直さないといけない。

  • コントロール配列がVB.NETでは廃止になった
  • PictureBoxの互換性が無い

また、Asなしの変数宣言で型があいまいだと大量の警告コメントがソース中に書きこまれる。変換前のVB6のソースを修正してなるべく適切な型で変数を宣言したほうが良いかも。
詳しくは下記の記事を参照。

参考記事



VB.NET → C# 移植メモ

C#への自動変換

方法1はソースレベルでの変換のため可読性は高い(コメントも保持される)が、ビルドエラーが多発する。On Error Goto文やLike演算子などC#がサポートしない文法を用いている箇所はエラーになる。VBでは許される明示的でない型変換などもエラーになるので修正が必要になる。フォームデザイナによるフォームのデザイン編集はいちおう維持されるが、かなり修正が必要 (後述)

方法2は逆コンパイルのため等価なソースにはなるが可読性は低い。当然ながらコメントは消える。ILからの逆コンパイルのため、変数名などは維持される。フォームデザイナでフォームのデザインを編集できなくなる。またリソースの参照情報も失われる。

いずれも一長一短であり、完璧な変換にはならない。

SharpDevelopでプロジェクトをコンバート

  • SharpDevelopオープンソースの.NETのIDE
  • VBからC#へのコンバート機能がある(あった)。
  • ただし最新版ではコンバート機能がなくなっているので、バージョン4.4を用いる。
  • バージョン4.4を下記からダウンロードしてインストールする。

  • 変換元のソリューションファイルとプロジェクトファイルのバージョン番号を改竄する。(古いソフトのため最新のVisualStudioで作成されたソリューション/プロジェクトを開くとエラーになる)

ソリューションファイル

VisualStudioVersion = 16.0.29409.12  ← 16を12に改竄する

プロジェクトファイル

<Project ToolsVersion="15.0" …  ← 15を4に改竄する
  • SharpDevelop 4.4 でソリューションを開き、[Project]→[Convert]→[From VB.NET to C#]
  • 同じソリューション内にC#のプロジェクトが生成される。
  • SharpDevelopを終了し、ソリューションと変換前後のプロジェクトの改竄を元に戻す。
  • VisualStuduoでソリューションを開き、ビルドしてみる。(たぶんエラーが多発する。)
  • あとは手動で修正する。

【参考記事】

コンバートの前に

VB.NETのコードに Option Explicit On を追加して、曖昧な型を使用している箇所をチェックしてあらかじめ修正して動作確認しておいたほうがコンバート後の修正が減ってラクかもしれない。

コードの修正

型変換
  • VBでは数値型⇔文字列型の暗黙の変換が許されるが、C#ではエラーになる。
  • long型⇔int型の暗黙の変換すらC#ではエラーになるので、明示的にキャストする。
  • 代入文だけでなく、比較演算子でも型の不一致はエラーになる。
動的型
  • VBのObject型は動的型のような呼び出しができるが、C#のobject型ではエラーになる。
    • 動的な呼び出しが必要ならobject型のかわりにdynamic型を用いる。
    • そうでないなら適切な型宣言をするか、var(型推論)で宣言する。
    • VBでは変数の宣言時に型を省略するとObject型になることにも注意。
    • Option Strict OnであればVBでもエラーになる。
ループ変数の型
  • VBではfor文やforeach文のループ変数の型を省略できるがC#では明示しなければならない。
Exit ForとExit Do, Continue ForとContinue Do
  • VBではループが入れ子のとき、 Exit ForとExit Doはそれぞれ独立。
  • C#ではループが入れ子のとき、breakはループの種類によらずいちばん内側のループから脱出。
  • VBのContinue For, Continue Do と、C#のcontinueについても同様。
On Error GoTo文
  • On Error GoTo文を用いたエラー処理は try / catch文による構造化例外処理に書き換える。
引数の省略
  • VBでは Hoge(a, ,b) のように省略可能な引数は途中の引数であっても省略できる。
  • C#では通常の引数(位置引数)は途中の引数を省略できない。
  • 途中の引数を省略したい場合は名前付き引数を用いる。 Hoge(A:a, B:b)
論理演算子と ビット演算子
Like演算子
配列の宣言
  • VBでは添字の最大値を指定して宣言する。
  • C#では要素の数を指定して new する。 (移植するには+1する)
ラベル
  • C#ではラベルの後に何も文がないとエラーになる。
  • ラベルのあと何もしない場合はセミコロンだけの空文を入れる。
エスケープシーケンス
  • VBの文字列リテラルにはエスケープシーケンスは無い。vbNewLineなどの定数を用いる。
My

フォームデザインの修正

フォームのソースは *.cs と *.Designer.cs に分けて変換されるが、変換に不具合があるのかフォームデザイナで開くと「データが失われる可能性を防ぐため、デザイナーの読み込み前に以下のエラーを解決する必要があります。 」と表示される。
*.Designer.cs をエディタで開いてみると、コントロールの宣言が奇妙なことになっているので修正する。以下に修正の例を示す。ただし修正をするとイベントハンドラの紐づけが失われるので、再設定する必要がある。
【修正前】

private System.Windows.Forms.Button withEventsField_btn_Cancel;
public System.Windows.Forms.Button btn_Cancel {
    get { return withEventsField_btn_Cancel; }
        set {
            if (withEventsField_btn_Cancel != null) {
                withEventsField_btn_Cancel.Click -= btn_Cancel_Click;
            }
        } …(中略)...
}

【修正後】

private System.Windows.Forms.Button btn_Cancel ;

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の自動変換

下記の記事を参照。

いろいろなメモ(3)

Visual Basic 6.0 でOCXが読み込めないとき

VB6のプロジェクトを開くときに「MSCOMCTL.OCXを読み込めません」というエラーが出る場合、
メニューの 「プロジェクト」→「コンポーネント」→「参照」ボタンで、

Microsoft Windows Common Controls 6.0(SP6)
(C:\Windows\System32\MSCOMCTL.OCX)

をチェック。


C#で「あいまいな参照」エラー

using 識別子 = 全名; で解決。

エラー CS0104 'Application' は、'Microsoft.Office.Interop.Excel.Application' と 'System.Windows.Forms.Application' 間のあいまいな参照です。

using Application = Microsoft.Office.Interop.Excel.Application;

いろいろなメモ(2)

IARでスタック解析

  • 「プロジェクト」>「オプション」>「リンカ」>「アドバンスト」>「スタック使用量解析を有効化」をチェック
  • 割り込みハンドラやOSタスクの関数は制御ファイル(.suc)で指定しておく
call graph root [task] : test_task;
call graph root [interrupt] : SysTick_Handler, UsageFault_Handler;
  • mapファイルの 「STACK USAGE」セクションにスタック使用情報が出力される

【参考記事】
スタック使用とスタック使用解析制御ファイル | IAR Systems

VB6ランタイムのインストール

Windowsで古いVB6のアプリを実行しようとすると、「comdlg32.ocx がない」というようなエラーが出る。

VB6ランタイムを下記からダウンロードしてインストールする。(公式はすでにサポートしていない模様)

VirtualBoxのあれこれ

(1) 画面がリサイズされない場合

仮想マシンの「設定 > ディスプレイ > スクリーン > Graphic Controller」を「VMSVGA」から「VBoxVGA」に変更。

(2) Virtual Boxにマウスとキーボード操作を取られた場合

右Ctrlキーを押す。 (デフォルトのホストキー)

  • 右Ctrlキーがない場合は、Ctrl + Alt + Del
  • ホストキーの設定は、「ファイル > 入力 > 仮想マシン > ホストキーの組み合わせ」
(3) 仮想ハードディスクファイルから仮想マシンを作成

仮想マシン > 新規」で「すでにある仮想ハードディスクファイルを使用する」を選択し、*.vdiなどの仮想ハードディスクファイルを指定。

(4) ハードディスクの追加

仮想マシンの「設定 > ストレージ > コントローラー:SATA」で「ハードディスク」を追加。(*.vdiなどの仮想ハードディスクファイルを指定。)

(5) 光学ドライブにISOイメージをマウント

仮想マシンの「設定 > ストレージ」で「空」となっているCD/DVDドライブを選択し、一番右にあるディスクアイコンをクリックし、「光ディスクファイルの選択」からISOイメージを選択。

Windowsのドライブレターの変更

  • 「コンピューターの管理」を起動
  • 「記憶域」>「ディスクの管理」を開く
  • ドライブを右クリックし「ドライブ文字とパスの変更」

ArduinoでGPS

GPSモジュールの出力

GPSモジュールのシリアル出力はNMEAフォーマット。
上記モジュールはデフォルトでは9600ボー。

ライブラリ

TinyGPS++を利用する。

Arduino

ログをPCで取得するならシリアルが2系統必要。
SoftwareSerialでもよいが、今回はSerial1のあるGR-CITRUSを使用。
Serial(USB)をPCとの通信、Serial1(TX:0, RX:1)をGPSモジュールとの通信に使用。

結線

GPSモジュール GR-CITRUS 備考
5V 5V GR-CITRUSから給電する。ボタン電池は不使用。
GND GND
RX 0 Serial1のTX。3.3Vレベルであることに注意(※) 今回は不使用。
TX 1 Serial1のRX。3.3Vレベルであることに注意(※)
1PPS 接続しない 1秒周期のパルス出力。今回は不使用。

※ 5V系Arduinoの場合はレベル変換が必要。


LED・電池

モジュールに給電するとまず橙色LEDが弱く点灯する。しばらく待ってモジュールが衛星を捕捉すると橙色LEDが1秒周期で点滅するようになる。
バックアップ電池(CR2032)を付けておくと衛星情報などが保持されて、再起動時の測位開始にかかる時間を短縮できる。

スケッチ

#include <TinyGPS++.h>
 
TinyGPSPlus gps;
 
void setup()
{
    Serial.begin(115200);
    Serial1.begin(9600); // 秋月のGPSモジュールはデフォルト9600ボー
    
    while (!Serial) { ; }
}
 
void loop()
{
    while (Serial1.available() > 0){
        char c = Serial1.read();
        // Serial.print(c);

        // シリアル受信データを1文字づつ食わせる
        gps.encode(c);
        // 位置情報が更新されたか?
        if (gps.location.isUpdated()){
            // 緯度・経度・標高を取得
            Serial.print("LAT=");  Serial.println(gps.location.lat(), 6);
            Serial.print("LONG="); Serial.println(gps.location.lng(), 6);
            Serial.print("ALT=");  Serial.println(gps.altitude.meters());
        }
    }
}

isValid(), isUpdated(), age()

  • isValid() : データが有効か?
  • isUpdated():データが更新されたか? (変化したとは限らない)
  • age():最後の更新からの経過時間 [msec]

取得できるデータ

// 位置
Serial.println(gps.location.lat(), 6);  // 緯度[度] (double)
Serial.println(gps.location.lng(), 6);  // 経度[度] (double)
Serial.print  (gps.location.rawLat().negative ? "S" : "N"); // 南北 (bool)
Serial.println(gps.location.rawLat().deg);       // 整数部          (uint16_t)
Serial.println(gps.location.rawLat().billionths);// 小数部(1/10億)  (uint32_t)
Serial.print  (gps.location.rawLng().negative ? "W" : "E"); // 東西 (bool)
Serial.println(gps.location.rawLng().deg);       // 整数部          (uint16_t)
Serial.println(gps.location.rawLng().billionths);// 小数部(1/10億)  (uint32_t)
// 日付
Serial.println(gps.date.value());       // 日付(DDMMYY)   (uint32_t)
Serial.println(gps.date.year());        // 年(西暦下2桁)  (uint16_t)
Serial.println(gps.date.month());       // 月(1-12)       (uint8_t)
Serial.println(gps.date.day());         // 日(1-31)       (uint8_t)
// 時刻
Serial.println(gps.time.value());       // 時刻(HHMMSSCC) (uint32_t)
Serial.println(gps.time.hour());        // 時(0-23)       (uint8_t)
Serial.println(gps.time.minute());      // 分(0-59)       (uint8_t)
Serial.println(gps.time.second());      // 秒(0-59)       (uint8_t)
Serial.println(gps.time.centisecond()); // 1/100秒 (0-99) (uint8_t)
// 速度
Serial.println(gps.speed.value());      // 速度[1/100ノット] (int32_t)
Serial.println(gps.speed.knots());      // 速度[ノット]      (double)
Serial.println(gps.speed.mph());        // 速度[マイル/時]   (double)
Serial.println(gps.speed.mps());        // 速度[m/s]         (double)
Serial.println(gps.speed.kmph());       // 速度[km/h]        (double)
// 進路(方位)
Serial.println(gps.course.value());     // 方位[1/100度] (int32_t)
Serial.println(gps.course.deg());       // 方位[度]      (double)
// 標高
Serial.println(gps.altitude.value());       // 標高[cm]       (int32_t)
Serial.println(gps.altitude.meters());      // 標高[m]        (double)
Serial.println(gps.altitude.miles());       // 標高[マイル]   (double)
Serial.println(gps.altitude.kilometers());  // 標高[km]       (double)
Serial.println(gps.altitude.feet());        // 標高[フィート] (double)
// 利用できる衛星の数
Serial.println(gps.satellites.value()); // (uint32_t)
// HDOP(水平精度低下率)
Serial.println(gps.hdop.value());       // (LSB=0.01 int32_t)

応用

NMEAの特定のフィールドのデータを抽出して取得することもできる。
だだし、数値であっても解釈されず文字列 (char*) として返す。

#include <TinyGPSPlus.h>

TinyGPSPlus gps;

// $GNGSA の 15~17個目フィールドを抽出するオブジェクト
// ($GPGSA:GPSのみ, $GNGSA: GPS+GLONASS等)
TinyGPSCustom pdop(gps, "GNGSA", 15);
TinyGPSCustom hdop(gps, "GNGSA", 16);
TinyGPSCustom vdop(gps, "GNGSA", 17);

void setup() 
{
    Serial.begin(115200);
    Serial1.begin(9600);
    while (!Serial) { ; }
}

void loop() 
{
    while (Serial1.available() > 0) gps.encode(Serial1.read());
    
    if (pdop.isUpdated() || hdop.isUpdated() || vdop.isUpdated())
    {
        Serial.print(F(" PDOP=")); Serial.print(pdop.value()); 
        Serial.print(F(" HDOP=")); Serial.print(hdop.value()); 
        Serial.print(F(" VDOP=")); Serial.println(vdop.value());
    }
}

参考記事


【追記】M5Stack用GPSユニットでも動作確認OK

電子工作のための電動ドライバー

電動ドライバーというと電気工事士さんとか工務店さんとかが使うでっかいやつをイメージするかもしれませんが、最近は一見すると手回しドライバーと変わらないような小型のものが出てきています。


電ドラボール

中でも人気なのが、国産老舗メーカー、ベッセルさんが出してる電ドラボールです。人気商品なのでレビュー記事や動画はたくさんありますが、やはり電気工事界隈やDIY界隈のかたが多いようです。この記事では比較的小型で精密なものを製作する電子工作にフォーカスしてレビューします。

さてこの電ドラボール、同社の定番商品であるボールグリップドライバーをそのまま電動にしたようなフォルムで手になじみます。締めるときは着座寸前まで電動で回し、その後手回しで本締めをするかんじです。電動ドライバーというより電動アシストドライバーと考えた方がいいかもです。なので木材に木ネジをゴリゴリ打ち込むような用途には向きません。電ドラボールが威力を発揮するのは、そんなに力は要らないけど長いネジを何本も締めたり外したりするだるい作業です。おもちゃの分解とか組み立てがすごく捗ります。

ちなみに、4倍速い(トルクは弱い) 電ドラボールハイスピードや、回転数とトルクを3段階で切り替えられる電ドラボールプラスも出たらしいんですが、私はそれらは持ってません。

プラスのビット (よく使うのはむしろ1番)

この電ドラボール、ビット1本付きセットとビット5本付きセットがあります。1本付きの場合、付属するビットはプラスの2番です。まあ、プラスの2番は電気工事や家具組み立てでいちばんよく使うビットなんですが、電子工作でよく使うのはむしろプラスの1番です。別途プラスの1番を買うといいでしょう。5本セットだとプラスの2番が2本も入ってます。プロにとってはビットは消耗品なのでしょうが、電子工作で使うぶんにはそうそうビットを使いつぶすことはないでしょう。プラスの3番とかマイナスも私はあまり使いませんね。

手持ちのビットを使う

ビットは一般的な6.35mmの六角軸のものであればワンタッチで挿せます。手持ちのビットがあればそれを使うのも良いでしょう。ただし、ラチェット用のビットで根っこにロック溝がないものはロックされないので簡単にすっぽ抜けます。すっぽ抜けると危険な場面では使わないでください。

六角ビット

個人的にはマイナスドライバーより六角のほうがよく使います。電子工作だと1.5ミリから4ミリくらいを使うことが多いんじゃないでしょうか。色分けされてるやつが便利です。

精密ビット

精密ドライバーのビットはせいぜいプラスのゼロ番までですね。私はゼロゼロ番はまず使いませんし、電動だとすぐにネジ頭をつぶしてしまいそうです。

ソケットビット

電子工作では六角ボルトはあまり使いませんが、ナットを締めることはよくあります。ただし、電子工作でよく使うM3やM2のナットに対応したソケットビットってあまり見かけません。ミニ四駆で使うタミヤのボックスドライバーのビットがM2用ですね。(ただしロック溝なし)

ちなみにソケットの二面幅(対辺)とネジ径との対応は下記資料を参照してください。M2が4mm、M3が5.5mmになります。

その他のビット

トルクスドライバー? なんですかそれは? 林檎信者じゃないので分かりませんね。
というのは冗談ですが、実際めったに使いませんね。

まあ、よく使うビットは人によって違うので、自分がよく使うビットを選んで買いそろえれば良いと思います。よく使うビットをホルダーに挿して引き出しに入れておくと捗ります。ホルダーはビットとセットで売ってる場合もあります。(上記の六角ビット7本組とか)

ドリルビット

電動ドライバーはドリルとしても使いたいですね。電ドラボールはパワーがあまり無いので大きな穴あけや固い素材は無理ですが、ちょっとした穴あけには使えます。私は電子工作では2ミリと3ミリをよく使います。まあ、2ミリ未満の穴あけにはピンバイスを使うでしょうし、きっちり穴を開けたいときはボール盤を使いますよね。

所感

けっきょくのところ、この電ドラボール1本でなんでもかんでもというわけにはいきません。ただ、今まで手回しドライバーでだるい思いをしてきた作業が断然快適になります。