エクセルのシステム開発(2)
前回、同名タイトルでExcelのシステムに開発について触れましたが、今回は開発中に奇妙な現象に遭遇してしまったのでご紹介したいと思います。
現象は、「CSVファイルを読込み、Excelシートに反映する」と言うものなのですが、この時に、既存のデータが存在した場合は既存データの次から追加するという単純なものです。
この機能の前に、別の機能で見出しの1行を残しデータを全て削除してCSVファイルの読込みを行ったのですが、読み込んだデータは2行目からではなくシートの途中からセットされていました。
調査したところ、データの削除で使っている「Clear」メソッドとデータの末尾判定で使っている「UsedRange」が原因のようで、消したはずのデータが存在している事になっているためのようでした。
セルのクリアには何種類かのメソッドがありますが、セルのデータや属性など全てを削除したいため「Clear」メソッドを使っていましたが完全に消えていなかったようです。
【セルのクリアメソッド】
(メソッド) | (内容) |
Clear | 全てクリア |
ClearContents | 数式、文字列クリア |
ClearFormats | 書式をクリア |
ClearComments | コメント文をクリア |
ClearOutline | アウトラインをクリア |
試しに「ClearContents」メソッドと、クリアメソッドではありませんが、行そのものを削除するよう「Delete」メソッドも使ってみました。以下のような現象となりました。
(1)行単位でデータを指定しClearメソッド使用
Rows("2:" & UsedRange.Row + UsedRange.Rows.Count - 1).Clear
データは削除されたように見えるが「UsedRange」プロパティの値は変わらない。
このため、「UsedRange」プロパティを使ってデータの存在確認をすると正しく動作しない。
(2)セル単位でデータを指定しClearメソッド使用
Range(Cells(2, 1), Cells(UsedRange.Rows.Count, UsedRange.Columns.Count)).Clear
データは削除されないが、該当シートをアクティブに設定すると(1)と同様の現象となる。
(3)行単位でデータを選択し使用
Rows("2:" & UsedRange.Row + UsedRange.Rows.Count - 1).ClearContents
データが正しく削除され、「UsedRange」プロパティの値も正しく更新される。
(4)セル単位でデータを選択し使用
Range(Cells(2, 1), UsedRange.Rows.Count, UsedRange.Columns.Count)).ClearContents
データは削除されないが、該当シートをアクティブに設定すると正しい動作となる。
(5)行単位でデータを選択し使用
Rows("2:" & UsedRange.Row + UsedRange.Rows.Count - 1).Delete
データが正しく削除され、「UsedRange」プロパティの値も正しく更新される。
(6)セル単位でデータを選択し使用
Range(Cells(2, 1), Cells(UsedRange.Rows.Count, UsedRange.Columns.Count)).Delete
データは削除されないが、該当シートをアクティブに設定すると削除されるが、「UsedRange」プロパティの値は正しく更新されない。
以上、3種類のメソッドで2パターンの確認を行ったのですが、今回はクリアメソッドは使わず、確実なところで(5)の行単位で「Delete」メソッドを使った処理に変更しました。
もう少し時間があれば、ハッキリとした原因まで明らかにしたかったのですが、原因究明は今後引き続き調べていきたいと思います。
それでは宜しくお願いします。
【株式会社 エム・システム】 本 社 :〒124-0023 東京都葛飾区東新小岩8-5-5 5F TEL : 03-5671-2360 / FAX : 03-5671-2361 盛岡事業所 :〒020-0022 岩手県盛岡市大通3-2-8 3F TEL : 019-656-1530 / FAX : 019-656-1531 E-mail : info@msystm.co.jp URL : http://msystm.co.jp/ ブログ : http://d.hatena.ne.jp/msystem/ Facebook : http://www.facebook.com/msysteminc