
こんにちは。
StringGridの中身をCSVデータとして保存したいのですが、
その際に、『自分の好きな名前』で『デスクトップ』に保存できるようにしたいと考えています。
ソース1では、CSV形式での保存は行えるのですが、
名前をつけるやり方とデスクトップの指定方法が分かりません。
opendialog,savedialogを使うと思うのですが、
上手く組み合わせることが出来ずに困っています。
ソース2では、理想どおりの結果を出力できるはずなんですが、
実行すると空の結果が出力されます。どこが間違っているか分からず、困り果てています。
・間違っている部分がどこか?
・保存する際に自動で端子に.csvを付与するにはどうすれば良いか?
アドバイス頂けると助かります。
宜しくお願いしします。
-----------ソース1:------------------------------------------
procedure TForm2.GridSaveCSV(SGrid:TStringGrid; fName: String);
var stList :TStringList;
ARow :Integer;
begin
stList:=TStringList.Create;
try
for ARow:=0 to SGrid.RowCount-1 do
stList.Add(SGrid.Rows[ARow].CommaText);
stList.SaveToFile(fName);
finally
stList.Free;
end;
end;
//CSVFileからStringGridへ読込み1
procedure TForm2.GridLoadCSV(SGrid:TStringGrid; fName:string);
var stList: TStringList;
ARow: Integer;
begin
stList:=TStringList.Create;
try
stList.LoadFromFile(fName);
SGrid.RowCount:= stList.Count;
for ARow:=0 to stList.Count-1 do
SGrid.Rows[ARow].CommaText:= stList[ARow];
finally
stList.Free;
end;
end;
procedure TForm2.Button3Click(Sender: TObject);
var
fName: String;
begin
fName := 'csvtest.csv';
GridSaveCSV(StringGrid1,fName);
end;
--------------------------------------------------------------
-----------ソース2:------------------------------------------
procedure TForm2.Button8Click(Sender: TObject);
var
F : TextFile;
Str : String;
CellA,CellB,CellC,CellD,CellE : String;
RowCNT : Integer;
begin
if not SaveDialog1.Execute then exit;
if FileExists(SaveDialog1.FileName) then
//↑ここのFileNameの使い方が良く分かりません><
//保存するときに、自動で.csvが付与されるようにしたいと思っています。
if Application.MessageBox('上書きしますか','注意',MB_YESNO ) = 7
then exit; //_
AssignFile(F,SaveDialog1.FileName);
Rewrite(F);
RowCNT := 0;
try
while not (StringGrid1.Cells[0,RowCnt] = '') do
begin
CellA := StringGrid1.Cells[0,RowCnt];
CellB := StringGrid1.Cells[1,RowCnt];
CellC := StringGrid1.Cells[2,RowCnt];
CellD := StringGrid1.Cells[3,RowCnt];
CellE := StringGrid1.Cells[4,RowCnt];
Str := Format('%s,%s,%s,%s,%s'[CellA,CellB,CellC,CellD,CellE]);
// ↑この辺りが怪しいと思っています。
WriteLn (F,Str);
Inc(RowCNT);
end;
finally CloseFile(F);
end;
end;
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
最初に何の言語かを書きましょう。
見たところDelphiのようですが、なじみのない人は分からないです。>間違っている部分がどこか?
Str := Format('%s,%s,%s,%s,%s'[CellA,CellB,CellC,CellD,CellE]);
このコードの、[CellA,・・・]の前にカンマがありません。正しくは、
Str := Format('%s,%s,%s,%s,%s',[CellA,CellB,CellC,CellD,CellE]);
(コンパイルエラーにならなかったんでしょうか)
>保存する際に自動で端子に.csvを付与するにはどうすれば良いか?
SaveDialogのプロパティを設定してください。
SaveDialog1.FileName := 'csvtest.csv'; // デフォルトのファイル名
SaveDialog1.InitialDir := 'C:\'; // デフォルトのフォルダ
SaveDialog1.Filter := 'CSVファイル(*.csv)|*.csv';
SaveDialog1.FilterIndex := 1;
SaveDialog1.DefaultExt := '.csv';
デスクトップフォルダはちょっと分かりません(Windows APIを使えば分かるようですが)
WindowsXPなら、通常は、
C:\Documents and Settings\(ユーザー名)\デスクトップ
ですが、OSのバージョンによっても変わりますし、Windowsの設定によっても変わりますので。
なお、ソース1とソース2の出力ファイルの内容は、データによっては必ずしも同じにはなりません。
セルの中の文字列にスペースが含まれるときは、ソース1は引用符(")で括られますが、ソース2はそのまま出力されます。
nag0720 さん
言語について、記載をせずすみませんでした。
丁寧に回答を頂き、ありがとうございます!!
ソースの「,」については、私の入力ミスでした。
そのままだとコンパイルエラーですね^^;
実は、他にもう1つの掲示板でも同様の質問をさせて頂いていたのですが、
何も出力されない原因は、
while not (StringGrid1.Cells[0,RowCnt] = '') doの記載で、
GridのデータCells[0,0]が空行('')のためでした。
(基本的なことで、お恥ずかしいです。。)
× while not (StringGrid1.Cells[0,RowCnt] = '') do
○ for RowCnt:=0 to StringGrid1.RowCount-1 do
と書き換え、Inc(RowCNT);を削除することで、想定どおりの結果を出力できました。
・保存する際に自動で端子に.csvを付与するにはどうすれば良いか?
この点は、SaveDialogのプロパティの設定で、
DefaultEXTをcsvに変え、
Fillerプロパティのフィルタ名を「CSVファイル(*.csv)」、
フィルタを「*.csv」に設定するで想定どおりの出力が出来ました!
頂いたアドバイスを使えば、ソース上で識別子を変更できるので、
テキスト形式等の選択もできるように挑戦してみようと思います。
ソース1とソース2の出力ファイルの内容が変わるのは知りませんでした。
どうしてそうなるのか、もう少し勉強してみようと思います。
また、結果的に、ソース2を使用する理由にもなりました。
(こちらの方が、私の想定する結果が出力されるので・・。)
ここ数週間、色々調べながら悩み続けていたので、本当に助かりました。
参考になるアドバイスをありがとうございました!!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) VBA 請求書自動作成 3 2022/04/24 01:58
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) vbaの計算 if elseと範囲について 6 2022/11/26 01:49
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ダブルコーテーション付きでCSV...
-
VBAでcsvファイルもシートもあ...
-
VB.netでShellExecuteがしたい
-
CSVで余計な空行が入る
-
vbaマクロについて 次のような...
-
PYthon Django csv関連
-
【C#】 csvファイルをバイナリ...
-
【ExcelVBA】300万件越えCSVか...
-
ファイル名を変数で書きこむfwr...
-
マクロで使うfor文
-
CSVファイルの比較と結果の取得...
-
タグ初心者
-
<textarea>に入れた数値を定型U...
-
型の値をDataGridViewセルに変換...
-
INPUTタグ disabledの文字色を...
-
バッチ処理 特定の文字以降を...
-
C# ファイルを読み込みlistvie...
-
[Excel VBA] 入力された値に応じて
-
プログラミングについて教えて...
-
VBA テキストボックスを選択状...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでcsvファイルもシートもあ...
-
Excelマクロ 空白セルを無視し...
-
【ExcelVBA】300万件越えCSVか...
-
ダブルコーテーション付きでCSV...
-
ファイル名を変数で書きこむfwr...
-
VBAで複数のCSVからレコードセ...
-
CSVデータの文字列置換
-
複数のファイルをまたぐエクセ...
-
CSVファイルの比較と結果の取得...
-
【C#】 csvファイルをバイナリ...
-
PowerShellからGhostscriptを動...
-
EXCEL→CSV保存時のダブルクォー...
-
VB.NETでオブジェクトの内容を...
-
パイソン文法で ファイルオープ...
-
VB.netでShellExecuteがしたい
-
PowerShellでファイルの連結方法
-
Rubyを使用してcsvファイルを処...
-
rubyを用いたCSVファイルの分割...
-
バッチファイルでcsvファイルに...
-
エクセルの任意のシートをcs...
おすすめ情報