度々お世話になります。
今朝、ようやく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); ←この行でエラーが発生します。
どのような処理をすればいいかわかりません。
教えていただけませんでしょうか。
try
item.SubItems.Add(Fields[4].AsString);
except
end;
として例外を無視する方法はあるかもしれません。
基本的なところなのですが、そのエクセルは列数が5つ以上ありますか?SQLで抽出する際のフィールド名がきちんと振られていますか?
あ さん、お返事ありがとうございます。
item.SubItems.Add(Fields[4].AsString);
上の行を以下のコードに変更して実行しましたが
同様のエラーが発生しました。
try
item.SubItems.Add(Fields[4].AsString);
except
end;
>基本的なところなのですが、そのエクセルは列数が5つ以上ありますか?SQLで抽出する際のフィールド名がきちんと振られていますか?
列数は最大5つです。
ADODataSet1.CommandText := 'SELECT * FROM' + ' ' + '[MAIN$]'; で抽出しているので
フィールド名はありません。
試していませんが・・・
FieldCount プロパティを確認するのは、いかがですか?
if Trim(Fields[0].AsString) <> '' then
を
if (Trim(Fields[0].AsString) <> '') and (FieldCount = 5) then
にするとか。
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;
igyさん、HFUKUSHIさんお返事ありがとうございます。
igyさんのコードを確認させていただきました。
正常に動作できました。
if Fields[4].IsNull = False then
上記の行で同様のエラーが発生しました。
Excelファイルをみると[E,1]のセルは空欄になっているのですが
nullとは違うのでしょうか?
HFUKUSHIさんのコードを確認させていただきました。
igyさん、HFUKUSHIさんお返事ありがとうございます。
文章がおかしかったです。
申し訳ありません。
もう一度。。。
igyさんのコードを確認させていただきました。
正常に動作できました。
HFUKUSHIさんのコードを確認させていただきました。
if Fields[4].IsNull = False then
上記の行で同様のエラーが発生しました。
Excelファイルをみると[E,1]のセルは空欄になっているのですが
nullとは違うのでしょうか?
ごめんなさい。
もう一度確認すると、igyさんのコードではエラーは発生しないのですが
エラーが発生していたExcelの行がListViewに登録されていませんでした。
> エラーが発生していた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);
みたいな感じにするのは、いかがですか?
igyさん、お返事ありがとうございます。
ご案内いただきましたコードを試しました。
無事にイメージ通りにListViewに登録されました。
助かりました。
本当にありがとうございました。
皆様も今後ともよろしくお願いいたします。
解決チェックを忘れました。
編集 削除