Excelファイル読み込みについて

解決


パン君  2025-05-29 08:52:19  No: 152024  IP: [192.*.*.*]

度々お世話になります。
今朝、ようやくExcelファイルの読み込みが成功しました。
改めましてありがとうございました。
それから、引き続きコーディングをしているのですが
読み込んだExeclファイルにあるセルの値をListViewに入れるコーディングをしています。
通常はExcelの一行目は5列あるのですが、イレギュラーのExcelファイルが4列しかない場合に
以下のエラーが発生しました。
「モジュール'TEST.exe'のアドレス0065A53でアドレス000000に対する読み取り違反がおきました。」

コーディングは以下となります。
**********************************
  ADODataSet1.CommandText := 'SELECT * FROM' + ' ' + '[MAIN$]';
  ADODataSet1.ConnectionString := 'Provider=Microsoft.ACE.OLEDB.12.0;Password="";Data Source=' + 'C:\TEMP\TEST.XLS' + ';Extended Properties=Excel 12.0;Persist Security Info=True';

  ADODataSet1.Close;
  ADODataSet1.Open;

  with DataSource1.DataSet do
  begin
    First;
    while not Eof do
    begin
      if Trim(Fields[0].AsString) <> '' then
      begin
        item  := ListView2.Items.Add;
        item.Caption :=Fields[0].AsString;
        item.SubItems.Add(Fields[1].AsString);
        item.SubItems.Add(Fields[2].AsString);
        item.SubItems.Add(Fields[3].AsString);
        item.SubItems.Add(Fields[4].AsString);
      end;

      Next;
    end;
  end;
**********************************
item.SubItems.Add(Fields[4].AsString); ←この行でエラーが発生します。
どのような処理をすればいいかわかりません。
教えていただけませんでしょうか。

編集 削除
 2025-05-29 10:29:08  No: 152025  IP: [192.*.*.*]

try
  item.SubItems.Add(Fields[4].AsString);
except
end;

として例外を無視する方法はあるかもしれません。

基本的なところなのですが、そのエクセルは列数が5つ以上ありますか?SQLで抽出する際のフィールド名がきちんと振られていますか?

編集 削除
パン君  2025-05-29 10:37:41  No: 152026  IP: [192.*.*.*]

あ さん、お返事ありがとうございます。
item.SubItems.Add(Fields[4].AsString); 
上の行を以下のコードに変更して実行しましたが
同様のエラーが発生しました。
try
  item.SubItems.Add(Fields[4].AsString);
except
end;

>基本的なところなのですが、そのエクセルは列数が5つ以上ありますか?SQLで抽出する際のフィールド名がきちんと振られていますか?
列数は最大5つです。
ADODataSet1.CommandText := 'SELECT * FROM' + ' ' + '[MAIN$]'; で抽出しているので
フィールド名はありません。

編集 削除
igy  2025-05-29 10:57:10  No: 152027  IP: [192.*.*.*]

試していませんが・・・
FieldCount プロパティを確認するのは、いかがですか?

 if Trim(Fields[0].AsString) <> '' then

 if (Trim(Fields[0].AsString) <> '') and (FieldCount  = 5) then
にするとか。

編集 削除
HFUKUSHI  2025-05-29 11:09:58  No: 152028  IP: [192.*.*.*]

TField.IsNullでチェックしてから処理すればいいのではないでしょうか。

Data.DB.TField.IsNull - RAD Studio API Documentation
https://docwiki.embarcadero.com/Libraries/Athens/ja/Data.DB.TField.IsNull

        if Fields[0].IsNull = False then
        begin
          item.Caption := Fields[0].AsString;
        end
        else
        begin
          item.Caption := '';
        end;
        if Fields[1].IsNull = False then
        begin
          item.SubItems.Add(Fields[1].AsString);
        end
        else
        begin
          item.SubItems.Add('');
        end;
        if Fields[2].IsNull = False then
        begin
          item.SubItems.Add(Fields[2].AsString);
        end
        else
        begin
          item.SubItems.Add('');
        end;
        if Fields[3].IsNull = False then
        begin
          item.SubItems.Add(Fields[3].AsString);
        end
        else
        begin
          item.SubItems.Add('');
        end;
        if Fields[4].IsNull = False then
        begin
          item.SubItems.Add(Fields[4].AsString);
        end
        else
        begin
          item.SubItems.Add('');
        end;

編集 削除
パン君  2025-05-29 22:02:53  No: 152029  IP: [192.*.*.*]

igyさん、HFUKUSHIさんお返事ありがとうございます。

igyさんのコードを確認させていただきました。
正常に動作できました。
 if Fields[4].IsNull = False then
上記の行で同様のエラーが発生しました。

Excelファイルをみると[E,1]のセルは空欄になっているのですが
nullとは違うのでしょうか?


HFUKUSHIさんのコードを確認させていただきました。

編集 削除
パン君  2025-05-29 22:04:50  No: 152030  IP: [192.*.*.*]

igyさん、HFUKUSHIさんお返事ありがとうございます。

文章がおかしかったです。
申し訳ありません。
もう一度。。。

igyさんのコードを確認させていただきました。
正常に動作できました。

HFUKUSHIさんのコードを確認させていただきました。
 if Fields[4].IsNull = False then
上記の行で同様のエラーが発生しました。

Excelファイルをみると[E,1]のセルは空欄になっているのですが
nullとは違うのでしょうか? 

編集 削除
パン君  2025-05-29 22:10:08  No: 152031  IP: [192.*.*.*]

ごめんなさい。
もう一度確認すると、igyさんのコードではエラーは発生しないのですが
エラーが発生していたExcelの行がListViewに登録されていませんでした。

編集 削除
igy  2025-05-29 22:53:35  No: 152032  IP: [192.*.*.*]

> エラーが発生していたExcelの行がListViewに登録されていませんでした。

 if Trim(Fields[0].AsString) <> '' then 
は、そのままで、

        item.SubItems.Add(Fields[4].AsString); 
の箇所を
    if FieldCount  < 5 then
        item.SubItems.Add('未格納')
    else
        item.SubItems.Add(Fields[4].AsString);
 みたいな感じにするのは、いかがですか?

編集 削除
パン君  2025-05-29 23:49:19  No: 152033  IP: [192.*.*.*]

igyさん、お返事ありがとうございます。
ご案内いただきましたコードを試しました。
無事にイメージ通りにListViewに登録されました。
助かりました。
本当にありがとうございました。
皆様も今後ともよろしくお願いいたします。

編集 削除
パン君  2025-05-29 23:50:10  No: 152034  IP: [192.*.*.*]

解決チェックを忘れました。

編集 削除