
※アフィリエイト広告を利用しています。
ある日突然、xlsファイル(Excel 97-2003ブック)だけが開けなくなりました。
ダブルクリックしても、Excelが起動しません。
エラーメッセージすら表示されないため、何が起きているのか見当もつかない、という状態です。
弊社で実際に発生し、考えられる対処を一通り試したうえで、最終的に解決するまでの流れをまとめました。
同じ症状でお困りの方の参考になれば幸いです。
突然、xlsファイルが開けなくなった
症状は次のとおりです。
- xlsファイルをダブルクリックしてもExcelが起動しない
- エラーメッセージは何も表示されない
- xlsxファイルは問題なく開ける
- Excel単体では正常に起動し、新規ブックの作成・保存もできる
つまりExcel全体が壊れているのではなく、「xls形式を読み込む処理」だけが動かない状態です。
イベントビューアーを確認すると、EXCEL.EXE が例外コード 0xc0000005(アクセス違反)で異常終了した記録が残っていました。
Excelは起動しかけているものの、xlsファイルを解析した瞬間に落ちているため、利用者からは「起動しない」ように見えていたわけです。
発生したのは2026年8月のWindows更新以降で、弊社の環境はOffice 2016です。
試した対処 ― いずれも改善せず
まず、一般的に効果が期待できる対処を順に試しました。
- Excelの「開いて修復する」(Excelを起動 →[ファイル]→[開く]→ 対象のxlsファイルを選択 →[開く]ボタン右の「▼」から「開いて修復する」を選択)
- Officeの修復(クイック修復・オンライン修復の両方)
- Officeの再インストール
- Windows Updateで「他のMicrosoft製品の更新プログラムを受け取る」を有効にし、Office関連の更新を適用
- 別のPCにOfficeを新規インストール
結果は、いずれも改善せずでした。
特に大きかったのは、最後の「別PCへの新規インストール」でも同じ症状が出たことです。
これにより、特定のPCの故障や設定の問題ではなく、環境をまたいで起きる問題だと判断できました。
なお、環境によってはOfficeの修復や更新で解決する可能性もあります。
同じ症状の方は、まずこの一通りをお試しいただくとよいかもしれません。
原因とされているもの
この症状については、インターネット上で2026年8月11日に配信されたExcel 2016向けのセキュリティ更新プログラム「KB5002903」が原因ではないかと指摘されています。
Microsoftの公式Q&Aフォーラムにも同じ時期・同じ症状の報告が複数上がっており、この更新プログラムを疑う声が多く見られます。
あわせて、次のような傾向も指摘されています。
- 影響が出ているのはインストーラー(MSI)版のExcel 2016で、Microsoft 365版やクイック実行版では発生していないという報告が多い
- xlsx形式には影響がなく、xls形式(Excel 97-2003ブック)だけが開けない
弊社の環境もMSI版のExcel 2016で、更新履歴を確認したところ、この更新プログラムが適用されていました。
この更新プログラムを削除すると解消したという報告もありますが、セキュリティ更新である以上、削除は修正された脆弱性を抱えたまま使い続けることを意味します。
判断が難しいところですので、実施される場合は影響を十分にご検討ください。
なお、本記事の執筆時点では、Microsoftから原因を認める公式な発表は確認できていません。
あくまで「そう言われている」段階の情報であり、断定できるものではない点にご留意ください。
発想を変える ― Excelを使わずxlsxに変換する
ここで状況を整理します。
動かないのは「xlsを読む処理」だけで、xlsxの読み書きは正常です。
ということは、xlsファイルをxlsx形式に変換してしまえば、以降は普通に開けるはずです。
開けないファイル形式を使い続ける必要はありません。
ただし、通常の変換方法は使えません。
「Excelで開いて名前を付けて保存」は、そもそも開けないから困っているわけで、選択肢になりません。
また、オンラインのファイル変換サービスも便利ですが、業務データを社外のサーバーにアップロードすることになります。
顧客情報や社内資料を含むファイルでは避けたいところです。
そこで弊社では、Excelを一切使わず、PC内だけでxlsを読み取ってxlsxとして書き出す方法をとることにしました。
変換に必要な環境
用意するものは3つだけです。
- Python 3(3.9以上が目安)― 変換プログラムを動かすための実行環境
- xlrd ― 旧形式(xls)を読み取るためのライブラリ
- openpyxl ― 新形式(xlsx)を書き出すためのライブラリ
xlrdはxls専用、openpyxlはxlsx専用で、それぞれ読み込みと書き出しを分担します。
いずれも無償で、Excelも有償ソフトも必要ありません。
ファイルが外部に送信されることもなく、すべてPC内で完結します。
変換の手順
1. Pythonをインストールする
コマンドプロンプトまたはPowerShellで、次のコマンドを実行します。
winget install Python.Python.3.12
公式サイトのインストーラーからでも構いません。
インストール後はコマンドプロンプトを開き直し、py -V でバージョンが表示されることを確認しておきます。
2. ライブラリを2つ導入する
py -3 -m pip install xlrd openpyxl
これで準備は完了です。
ここまで数分で終わります。
3. 変換スクリプトを用意する
次のコードをテキストエディタに貼り付けて保存します。
ファイル名は任意ですが、拡張子は「.py」にしてください。ここでは xls2xlsx.py として説明します。
文字コードは UTF-8 で保存してください。
# -*- coding: utf-8 -*-
"""xls ファイルを xlsx に変換する(1ファイル用)"""
import os
import sys
import xlrd
from openpyxl import Workbook
from openpyxl.styles.numbers import BUILTIN_FORMATS
from openpyxl.utils import get_column_letter
# 日本語版Excelの組み込み表示形式。xlrd がこれらの書式文字列を返さないため補う。
# これを省くと、日付が「42186」のような数値になってしまう。
JP_FORMATS = {
27: '[$-411]ge.m.d', 28: '[$-411]ggge"年"m"月"d"日"', 29: '[$-411]ggge"年"m"月"d"日"',
30: 'm/d/yy', 31: 'yyyy"年"m"月"d"日"', 32: 'h"時"mm"分"', 33: 'h"時"mm"分"ss"秒"',
34: 'yyyy"年"m"月"', 35: 'm"月"d"日"', 36: '[$-411]ge.m.d',
50: '[$-411]ge.m.d', 51: '[$-411]ggge"年"m"月"d"日"', 52: 'yyyy"年"m"月"',
53: 'm"月"d"日"', 54: '[$-411]ggge"年"m"月"d"日"', 55: 'yyyy"年"m"月"',
56: 'm"月"d"日"', 57: '[$-411]ge.m.d', 58: '[$-411]ggge"年"m"月"d"日"',
}
def number_format(book, xf):
"""セルの表示形式を求める。"""
key = xf.format_key
if key < 164 and BUILTIN_FORMATS.get(key):
return BUILTIN_FORMATS[key]
if key in JP_FORMATS:
return JP_FORMATS[key]
fmt = book.format_map.get(key)
return fmt.format_str if (fmt and fmt.format_str) else 'General'
def convert(src):
dst = os.path.splitext(src)[0] + '.xlsx'
book = xlrd.open_workbook(src, formatting_info=True)
wb = Workbook()
wb.remove(wb.active)
for sheet in book.sheets():
ws = wb.create_sheet(title=sheet.name)
# 列幅
for col in range(sheet.ncols):
info = sheet.colinfo_map.get(col)
if info and info.width:
ws.column_dimensions[get_column_letter(col + 1)].width = info.width / 256.0
# セルの値と表示形式
for row in range(sheet.nrows):
for col in range(sheet.ncols):
ctype = sheet.cell_type(row, col)
if ctype == xlrd.XL_CELL_EMPTY:
continue
value = sheet.cell_value(row, col)
cell = ws.cell(row=row + 1, column=col + 1)
if ctype == xlrd.XL_CELL_DATE:
cell.value = xlrd.xldate.xldate_as_datetime(value, book.datemode)
elif ctype == xlrd.XL_CELL_BOOLEAN:
cell.value = bool(value)
else:
cell.value = value
cell.number_format = number_format(book, book.xf_list[sheet.cell_xf_index(row, col)])
# 結合セル
for (r1, r2, c1, c2) in sheet.merged_cells:
ws.merge_cells(start_row=r1 + 1, end_row=r2, start_column=c1 + 1, end_column=c2)
wb.save(dst)
print('変換しました: ' + dst)
if __name__ == '__main__':
convert(sys.argv[1])xlsを1セルずつ読み取り、同じ内容をxlsxとして書き出しているだけの、シンプルな内容です。
4. 変換を実行する
実行する前に必ずお読みください
- 必ず元のxlsファイルのバックアップを取ってから実行してください。
- 変換後のファイルは、変換元のxlsと同じ場所に、同じ名前(拡張子だけ .xlsx)で書き出されます。同じ名前のxlsxが既にある場合は、確認なしで上書きされます。
- 本スクリプトのご利用は自己責任でお願いします。掲載内容を利用したことにより生じた損害について、弊社は責任を負いかねます。
スクリプトを保存したフォルダでコマンドプロンプトを開き、変換したいxlsファイルを指定して実行します。
py -3 xls2xlsx.py "C:\work\sample.xls"
変換しました: C:\work\sample.xlsx と表示されれば完了です。
このスクリプトはコマンドラインから実行する形です。
変換したいファイルを引数で指定する必要があるため、ファイルをダブルクリックしても変換はできません。
5. 変換後に中身を確認する
できあがったxlsxをExcelで開き、値・日付・レイアウトが元のとおりか確認してください。
特に日付の列は、数値になっていないかを必ず見ておきます。
変換で引き継げるもの・引き継げないもの
上のスクリプトで引き継げるのは、次の情報です。
- セルの値、日付(日付型のまま)
- 表示形式(「2015年7月」などの日付書式を含む)
- 列幅、結合セル
- シート名・シート構成
一方、次のものは引き継げません。
- フォント・文字色・塗りつぶし・罫線・セルの配置などの見た目の書式
- 数式そのもの(計算結果の値に置き換わります)
- グラフ・画像・図形
- マクロ(VBA)
- 条件付き書式・入力規則・ピボットテーブル
データを取り出して使い続けることが目的であれば、これで十分です。
罫線や色を含めて見た目もそのまま残したい場合は、書式の情報を1項目ずつ移し替える作り込みが必要になります。
数式やグラフを多用したファイルは、変換後の確認を特に念入りに行ってください。
もうひとつ注意したいのが日付です。
Excelは日付を内部的に「通し番号」で保持しているため、表示形式の情報を正しく引き継がないと、変換後に 42186 のような数値で表示されてしまいます。
日本語版Excel特有の「yyyy年m月」といった書式は変換ライブラリ側が情報を返さないことがあり、ここを作り込まないと日付が数値化します。
実際に弊社でも、最初の変換でこの現象が発生しました。
まとめ
- xlsだけが開けない場合、Excel全体が壊れているとは限らない
- Officeの修復・再インストール・別PCへの新規インストールでも直らないケースがある
- xlsxに変換してしまえば、その後は通常どおり扱える
- 変換はExcelなしで、PC内だけで完結できる(外部へのアップロード不要)
- 実行前に必ずバックアップを取る
- 変換後は必ず中身を確認する。特に数式・グラフ・日付に注意
古いxlsファイルは、業務の中に思いのほか多く残っているものです。
今回のようなトラブルをきっかけに、この機会にxlsx化しておくと、今後の環境変更にも影響を受けにくくなります。
こんなこともできます
今回のスクリプトは1ファイルずつ変換する最小構成ですが、少し手を加えれば次のようなことも可能です。
- 一括変換 ― フォルダを指定して、その中のxlsファイルをまとめて変換する
- ドラッグ&ドロップでの簡単変換 ― バッチファイル(.bat)を用意しておき、そのアイコンにxlsファイルやフォルダを放り込むだけで変換する
弊社ではこの形にして、コマンドを打たずに変換できるようにして運用しています。
古いxlsファイルがまとまって残っている場合は、一括変換のほうが短時間で片付きます。
お困りの場合はご相談ください
「Pythonの導入まで自社では難しい」「大量のxlsファイルをまとめて変換したい」「変換後の内容が正しいか不安」といった場合は、弊社にご相談ください。
変換ツールのご提供、変換作業の代行、リモートでの導入支援まで対応いたします。