毎々お世話になりありがとうございます。
以下の環境でプログラム作成しています初心者です。
フォームにADODataSet、DataSourceを貼り付けて
ADODataSet1.CommandText := 'テスト$';
ADODataSet1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data Source='C:\TMP\TMP.XLS';Extended Properties=Excel 8.0;Persist Security Info=True';
ADODataSet1.Close;
ADODataSet1.Open;
with DataSourceS1.DataSet do
begin
First;
while not Eof do
begin
s:1=DataSourceS1.DataSet.Fields[0].AsString;
s:1=DataSourceS1.DataSet.Fields[1].AsString;
s:1=DataSourceS1.DataSet.Fields[2].AsString;
Next;
end;
end;
とコーディングしました。
しかし、Excelのセルには数字がはいっているのですが
読み取りデータは NULLになってしまします。
何が原因なのでしょうか。
アドバイスを頂けましたらとっても助かります。
よろしくお願いいたします。
Delphi Tokyo Enter 64bit
Windows 10 PRO
詳しくないのですが、
> ADODataSet1.CommandText := 'テスト$';
これは、正しいですか?
igyさんいつもご指導ありがとうございます。
とっても助かっており感謝しております。
ご指摘の
ADODataSet1.CommandText := 'テスト$';
ですが、Excelファイルの対象シート名を明記しています。
これは大丈夫かなと思っています・・・・・
ADODataSet1.CommandText := 'select * from [テスト$]';
としてください
他にも提示のコードそのままでは構文エラーとなるところがあったので、実際に動いたコードを提示します。
以下のコードではDataSourceは必要ありません。
procedure TForm1.Button1Click(Sender: TObject);
var
s1,s2,s3: string;
begin
ADODataSet1.CommandText := 'select * from [テスト$]';
ADODataSet1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data Source="z:\TMP.XLS";Extended Properties=Excel 8.0;Persist Security Info=True';
ADODataSet1.Close;
ADODataSet1.Open;
with ADODataSet1 do
begin
First;
while not Eof do
begin
s1:=Fields[0].AsString;
s2:=Fields[1].AsString;
s3:=Fields[2].AsString;
ShowMessage(s1+s2+s3);
Next;
end;
end;
end;
takanaさん
ご丁寧にコードを記載ありがとうございます。
ご指導通りにしたのですが
やはり、s1変数にはデータは入りませんでした。
どうしよう・・・・・
ファイル名を
z:\TMP.XLS
から、ご自身のファイルに変えましたか?
念のため実際に、実行されたコード全てを記載されてはどうでしょうか?
私が最初に試した提示されたコードでは、
s:1=DataSourceS1.DataSet.Fields[0].AsString;
の部分など、構文エラーがあったため
> ご指導通りにしたのですが
> やはり、s1変数にはデータは入りませんでした。
> どうしよう・・・・・
えっ !? どういうことなのか ? と思ってしまいますよね.
質問された方がテストしているコードではそうなることだと思います.
質問者が最初に掲載したコードは,明からにコンパイルエラーとなるハズですか,
> 読み取りデータは NULLになってしまします。
と書いています.このことから,実際のコードの掲載は期待できないかも知れません.
つまり,質問された方の問題に対して,解決方法を提供するのは困難と言えます.
CommandText を使用したコードではありませんが,
私のサイトに以下の記事を掲載しています.他の方に参考になれば.
※ [注意] 私のサイトには,CommandText を使用したサンプルはありません.
[ 590_ADO でエクセルに接続 ]
http://mrxray.on.coocan.jp/Delphi/plSamples/590_ADO_Excel.htm
> つまり,質問された方の問題に対して,解決方法を提供するのは困難と言えます.
インターネットの向こう側で,質問者が操作しているコードを覗き見ることができる,
エスパーとししての能力を持つプログラマーであれば可能性はあると思います.
私の知る限りでは,この掲示板でレスする方に,そのような方はいないと思います.
本来であれば,折角教えてくれたサンプルですから,それを確認して,
自分のコードに生かすのが手順とは思います.
しかし,今回のように,そのような手順を踏まない方もいます.
igy さんのようなレスにすれば,後は質問者が自分で調べて・・・,
と思ったのですが,予想外でした.
[ Data.Win.ADODB.TCustomADODataSet.CommandText ]
http://docwiki.embarcadero.com/Libraries/Sydney/ja/Data.Win.ADODB.TCustomADODataSet.CommandText
> ADODataSet1.CommandText := 'テスト$';
> ですが、Excelファイルの対象シート名を明記しています。
その場合は TADODataSet.CommandType を cmdTable にします.
ADODataSet1.CommandType := cmdTable;
ADODataSet1.CommandText := '[テスト$]';
Delphiの視点ではなくExcel視点での話ですが
Excelのシート名に「$」を使った場合、Excelのリンク接続子と混同するので
シート名は「'」シングルコーテーションで囲う必要があるのですが
それが影響していないでしょうか?
ADO で Excel のシート名を指定する場合,末尾の $ はセルの範囲です.
$ を省略するとエラーが発生して接続できません.
[テスト$A5:D20] のように使用します.ただし,選択クエリでは使用できません.
$ 以降を省略するとシート全体ですが,対象はデータがある行,例だけです.
[ データ領域と最終セルの位置 ]
http://mrxray.on.coocan.jp/Delphi/plExcelEx/E160_LastRange.htm
> ご指導通りにしたのですが
このご指導通りが何を意味するのか不明です.
そもそも,実際のテストコードが不明です.
ガオ~さんがご自分の世界に浸っているだけだと思いますが・・・
※ 勉強不足で「リンク接続子」に関する知識はありません.
※ takana さんが提示されたコートは正常に動作します.
皆様、いつもお世話になっています。
色々やっていたら、出来ました。
ありがとうございました。
ツイート | ![]() |