毎回初歩的な質問で申し訳ありません。
環境:Win2000 VB6.0
起動時にExcelからListVewiにデータを読み込んで変更などして
ボタンを押した時にListVewiの情報がExcelに書き込まれるようなプログラムを作成中です。
書き込むときにはちゃんとListViewの中だけが書き込まれているのですが
読み込まれる時、なぜか1行多く読み込まれてしまいます。
Excelを見てみても何も書かれていません。
何か対処方法を教えていただけないでしょうか?
…このスレッドだけを始めて見た人が原因を調べられる
ような質問をして下さい(^^;)
とりあえず、前回のリンク
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200408/04080071.txt
読み込む方法として配列を使う方法を紹介したけど
読み込みは DAO のまま?それとも配列を使う方法に変更した?
データが無いように見えて何かの設定情報が残ってる可能性が
一番高いけど、2行データ削除しても1行多く読み込まれるの?
それとも2行データ削除したら2行多く読み込まれるの?
それとも削除とかしなくても1行多く読み込まれるの?
申し訳ありません・・・
読み込みはDAOのままです。
書き込む時は罫線も一緒に書き込んでいるんですけど(Excel上で表になるように)
罫線は引かれてないんです。
書き込む時のデータの数(ListView1.ListItems.Count)も合ってますし・・・
1行消しても2行消しても1行多く読み込まれます。
データはもちろん入ってません。
なのでListViewに表示されるのは何も入っていない状態の1行が最後に表示されるようになっています。
DAO の仕様なのか?何かゴミがあるのか?コードが悪いのか?を調べる必要が
ありそうですね。ボクも詳しくないですから自分でテストプログラム作って
デバッグしてみて下さい。
1.新規Bookでデータが何も無い状態で読み込んだ時どうなるか?
2.手作業で(書き込みプログラムを使わないで)1行だけデータを書き込み、
保存して読み込んだときどうなるか?
3.手作業で罫線を引いたとき、データは何も無い状態で読み込んだとき
どうなるか?
4.手作業で罫線を引いた後、データを罫線の範囲を超えて書き込み、
読み込んだ時にどうなるか?。
…このくらい調べれば何か分かってくるんじゃないですか?
上のテストで正しく読み取れれば書き込み処理が問題でしょう。
…ちょっとおまけとして前回紹介したソースで
Private mLastCell As Excel.Range
Set mLastCell = xlSheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell)
で使用されている最終セルを取得できるはずだから
Debug.Print mLastCell.Address
とかも一緒に調べてみると何か分かるかもしれません。
>書き込む時は罫線も一緒に書き込んでいるんですけど(Excel上で表になるように)
>罫線は引かれてないんです。
意味不明(ーー;)罫線を書き込んでるけど引かれてない?
…それは書き込んでるとは言わないのでは???
書き込めてるの?書き込めてないの?どっち??
>書き込む時のデータの数(ListView1.ListItems.Count)も合ってますし・・・
リストのカウントはもちろん1から始まりますが…
ループのカウントを0から始めたりすると当然 ListView1.ListItems.Count - 1
までの処理となります。…当然ですが。
>1.新規Bookでデータが何も無い状態で読み込んだ時どうなるか?
問題ありません。
>2.手作業で(書き込みプログラムを使わないで)1行だけデータを書き込み、
>保存して読み込んだときどうなるか?
問題ありません。
>3.手作業で罫線を引いたとき、データは何も無い状態で読み込んだときどうなるか?
何も入っていないのですがListViewに表示されています。
なのでListViewは空っぽ状態なのに選択ができるようになっています。
>4.手作業で罫線を引いた後、データを罫線の範囲を超えて書き込み、読み込んだ時にどうなるか?。
罫線の範囲を超えているところのデータも読み込まれています。
>意味不明(ーー;)罫線を書き込んでるけど引かれてない?
>…それは書き込んでるとは言わないのでは???
>書き込めてるの?書き込めてないの?どっち??
すみません。
データがある分だけ罫線を引くようにしてあります。
xlSheet.Cells(n, 1).Borders.LineStyle = xlContinuous
nはデータの数分だけです。
>リストのカウントはもちろん1から始まりますが…
>ループのカウントを0から始めたりすると当然 ListView1.ListItems.Count - 1
>までの処理となります。…当然ですが。
ループは1から始まっています。
なので、ListView1.ListItems.Count - 1 とすると
データが全て書き込まれません。
いや、あの…何のためにボクが4つのテスト項目をあげたか
…分かってらっしゃいます?
>>3.手作業で罫線を引いたとき、データは何も無い状態で読み込んだときどうなるか?
>何も入っていないのですがListViewに表示されています。
>なのでListViewは空っぽ状態なのに選択ができるようになっています。
>>4.手作業で罫線を引いた後、データを罫線の範囲を超えて書き込み、読み込んだ時にどうなるか?。
>罫線の範囲を超えているところのデータも読み込まれています。
…では罫線とデータの境界の動きはどうなります?罫線の範囲いっぱいまで
データを手作業で書き込んだ場合、1行多く読み込まれますか?
1行多く読み込まれる場合は、罫線が原因。
問題ない場合は書き込み処理に原因があります。
…そうやって原因を特定していって下さい…と。こうお願いしたい訳です。
>Private mLastCell As Excel.Range
> Set mLastCell = xlSheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell)
>で使用されている最終セルを取得できるはずだから
> Debug.Print mLastCell.Address
これで調べたところ、セル内は空っぽで書き込まれなくてもよいところまで書き込まれているようです。
>Debug.Print mLastCell.Address
書き込みが終わってすぐこのコードを書いています。
なので書き込みがある最後のセルが入ってくるはずですよね?
でも、最初に読み込んだときと同じです。
(最初にExcelを読み込んで(4つのデータがあるとします。)
ListViewのデータを2つ削除して、もう1度Excelに書き込みをしたら
2行減っているはずですが、(Excelには2つのデータが書き込まれればよい)
最初に読み込んだ時と同じ4つのデータが書き込まれています。)
ということは、書き込みの処理がうまくいっていないということですよね?
>書き込みが終わってすぐこのコードを書いています。
>なので書き込みがある最後のセルが入ってくるはずですよね?
厳密に言えばそれもテストしてみないと分からないことです。
入ってきて欲しい所ですが、Excel の理不尽な仕様の可能性も
ありますし、Excel だってただのプログラムです。バグがあっ
ても不思議ではありません。自分でテストプログラムを考えて
確認してみて下さい。
>ということは、書き込みの処理がうまくいっていないということですよね?
そう思うなら書き込みの処理を解析して原因を特定して下さい。
こちらでは判断できません。
レスありがとうございます。
い一度Excelのフォーマットを新規で全て書き直しました。
そしたらうまくいくようになりました。
1つの列でセルの書式設定の表示形式を日付にしていたのですけど
それをExcelではなく、ListViewから書き込む時に
xlSheet.Cells(n, 1).NumberFormat = "yyyy/mm/dd"
にしたらうまくいきました。
どうもお世話になりました。
ありがとうございました・
忘れてました。
解決しました。
ありがとうございます。
ツイート | ![]() |