Excel VBAファイル(.bas)の文字化けの対策

更新日:2025/01/22

VBAファイル(.bas)の文字化けを改善するため、以下の方法を提案します:

  1. まず、クライアント側(script.js)でファイル読み込みの処理を修正:

script.js

document.getElementById("vbaFile").addEventListener("change", async (e) => {
  const file = e.target.files[0];
  if (file) {
    try {
      const arrayBuffer = await file.arrayBuffer();
      
      // まずShift-JISでの読み込みを試みる
      try {
        const decoder = new TextDecoder('shift-jis');
        const text = decoder.decode(arrayBuffer);
        document.getElementById("input").value = text;
        return;
      } catch (sjisError) {
        console.log('Shift-JIS decode failed:', sjisError);
      }

      // Shift-JISで失敗した場合、UTF-8で試みる
      try {
        const decoder = new TextDecoder('utf-8');
        const text = decoder.decode(arrayBuffer);
        document.getElementById("input").value = text;
        return;
      } catch (utfError) {
        console.log('UTF-8 decode failed:', utfError);
      }

      // CP932(Microsoft製シフトJIS)で試みる
      try {
        const decoder = new TextDecoder('cp932');
        const text = decoder.decode(arrayBuffer);
        document.getElementById("input").value = text;
        return;
      } catch (cp932Error) {
        console.log('CP932 decode failed:', cp932Error);
      }

    } catch (error) {
      console.error('File reading error:', error);
      alert('ファイルの読み込みに失敗しました。');
    }
  }
});

index.html

HTML側で文字エンコーディングの指定を明確にする:

<input 
  type="file" 
  id="vbaFile" 
  accept=".bas,.txt"
  data-encoding="shift-jis"  <!-- エンコーディング情報を追加 -->
/>

エンコーディング選択オプションを追加:

<div class="file-controls">
  <select id="encodingSelect">
    <option value="shift-jis">Shift-JIS</option>
    <option value="utf-8">UTF-8</option>
    <option value="cp932">CP932</option>
  </select>
  <input type="file" id="vbaFile" accept=".bas,.txt" />
  <button onclick="clearInput()" class="reload-button">
    <i class="fas fa-sync-alt"></i>
  </button>
</div>

script.js

エンコーディング選択に応じたファイル読み込み:

async function readFileWithEncoding(file, encoding) {
  try {
    const arrayBuffer = await file.arrayBuffer();
    const decoder = new TextDecoder(encoding);
    return decoder.decode(arrayBuffer);
  } catch (error) {
    console.error(`Error reading file with ${encoding}:`, error);
    throw error;
  }
}

document.getElementById("vbaFile").addEventListener("change", async (e) => {
  const file = e.target.files[0];
  const selectedEncoding = document.getElementById("encodingSelect").value;
  
  if (file) {
    try {
      const text = await readFileWithEncoding(file, selectedEncoding);
      document.getElementById("input").value = text;
    } catch (error) {
      alert(`ファイルの読み込みに失敗しました。エンコーディングを変更して試してください。`);
    }
  }
});

index.js

サーバー側でもエンコーディング対応を検討:

app.post("/format", async (req, res) => {
  try {
    const { code, promptId, instruction, encoding } = req.body;
    
    // エンコーディング変換が必要な場合の処理
    let processedCode = code;
    if (encoding && encoding !== 'utf-8') {
      try {
        const buffer = Buffer.from(code, encoding);
        processedCode = buffer.toString('utf-8');
      } catch (encError) {
        console.error('Encoding conversion error:', encError);
      }
    }

    // 以降の処理は通常通り
    ...
});

VBAの特性から修正方法を考える

script.js

document.getElementById("vbaFile").addEventListener("change", async (e) => {
    const file = e.target.files[0];
    if (file) {
        try {
            // ArrayBufferとしてファイルを読み込み
            const arrayBuffer = await file.arrayBuffer();
            
            // まずShift-JISでデコードを試みる
            try {
                const decoder = new TextDecoder('shift-jis');
                const text = decoder.decode(arrayBuffer);
                document.getElementById("input").value = text;
                console.log('Shift-JIS decode successful');
                return;
            } catch (sjisError) {
                console.log('Shift-JIS decode failed:', sjisError);
            }

            // CP932(Windows拡張Shift-JIS)でデコードを試みる
            try {
                const decoder = new TextDecoder('cp932');
                const text = decoder.decode(arrayBuffer);
                document.getElementById("input").value = text;
                console.log('CP932 decode successful');
                return;
            } catch (cp932Error) {
                console.log('CP932 decode failed:', cp932Error);
            }

            // 上記が失敗した場合、UTF-8でデコードを試みる
            try {
                const decoder = new TextDecoder('utf-8');
                const text = decoder.decode(arrayBuffer);
                document.getElementById("input").value = text;
                console.log('UTF-8 decode successful');
                return;
            } catch (utfError) {
                console.log('UTF-8 decode failed:', utfError);
            }

        } catch (error) {
            console.error('File reading error:', error);
            alert('ファイルの読み込みに失敗しました。');
        }
    }
});
変更前 (.bas ファイル) Sub Sample() ‘���������� MsgBox “����” End Sub 変更後 (Shift-JIS保存) Sub Sample() ‘サンプルコード MsgBox “完了” End Sub 文字コード 変更

  1. VBAの特性:
  • VBAからエクスポートされるファイルは基本的にShift-JISエンコーディング
  • これは日本語版Officeの標準的な動作
  1. 対処方法のステップ:
1. VBAファイルをエクスポート
2. メモ帳(Notepad)で開く
3. 「名前を付けて保存」を選択
4. エンコーディングを「Shift-JIS」に指定して保存
5. 保存したファイルを使用
// 開発時のデバッグ用コード
document.getElementById("vbaFile").addEventListener("change", async (e) => {
  const file = e.target.files[0];
  if (file) {
    const reader = new FileReader();
    reader.onload = (e) => {
      const content = e.target.result;
      console.log('File encoding check:', {
        containsJapanese: /[\u3000-\u303f\u3040-\u309f\u30a0-\u30ff\uff00-\uff9f\u4e00-\u9faf]/.test(content),
        firstFewChars: content.substring(0, 50)
      });
      document.getElementById("input").value = content;
    };
    reader.readAsText(file, 'shift-jis'); // シフトJISを明示的に指定
  }
});
VBA エクスポート .bas ファイル メモ帳 文字コード変更 Shift-JIS で保存 Web アプリ アップロード 正常に表示
無題 – メモ帳 名前を付けて保存 文字コード: ▼ Shift-JIS 1. 「名前を付けて保存」を選択 2. 文字コードで「Shift-JIS」を選択 3. 保存ボタンをクリック
話題のキーワードから探す