- ベストアンサー
VBでExcelファイルをテキストファイルにコンバートしたい
あるソフトからExcelファイルが出力されます。これを編集してテキストファイルにしたいと思います。大体できたのですが、まだ不具合があるのでお教えください。 Excelは、以下のコードで呼び出しています。 Set EX = CreateObject("Excel.Application") With EX.Application .Workbooks.Open (Pathname) .Visible = False .DisplayAlerts = False エクセルのデータをファイルに出力するコード .Workbooks.Close End With Set EX = Nothing (1)Excelのデータの範囲を知りたいのですが、以下のコードで検索すると結構時間がかかります。簡単に範囲を得る方法はないでしょうか?行と列と両方知りたいのですが。 lastcell = .Cells(Rows.Count, 1).End(xlUp).Address または lastRow = .Range("A65536").End(xlUp).Row (2)VBで作っているのですが、VBAで作るより時間がかかります。これは仕方ないでしょうか? 以上、よろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>あるソフトからExcelファイルが出力 <案1> そのあるソフトで、保存する前にデータの範囲に範囲名をつけるとか出来れば その範囲のColumns.countやRows.Countで範囲取得できますよ。 例: A1~D5の範囲を範囲名”hoge”として定義済みと仮定。 Range("hoge").Columns.Count Range("hoge").Rows.Count <案2> 出力されているXLSファイルをCSVファイルとして保存して Open&Line Inputで内容を取得して Col数は、","(コンマ)で区切られた数 Row数は、Line Inputの繰り返し数 で、取得するとかは如何でしょうか。 どちらも、一案なので今回のものに適用可能かどうかはわかりませんが 参考程度に如何でしょうか。
その他の回答 (4)
- TAGOSAKU7
- ベストアンサー率65% (276/422)
質問とは無関係ですが、最近答えたことと同じような話題がのぼっているのが見えたので、ちーと乱入デシ 参照設定とCreateObjectについて発言しました。 よかったら、見てやってくださいまし。 それでは、おじゃーまいたしました。
お礼
どうもありがとうございます。 参照設定しながらCreateObjectでこれまで作ってきました。 違うんですね? もっと勉強してみます。
EXってExcel.Applicationを参照してるんですよね? なら「With EX.Application」じゃなくて「With EX」じゃないでしょうか。 ま、ボクの勘違いかもしれないですけど、その前提で書きますんで適宜直してください。 (1) Dim myRange As Object Set myRange = Ex.Workbooks(1).Worksheets(1).Range("A1").CurrentRegion MsgBox myRange.Rows.Count & " " & myRange.Columns.Count ってのはどうでしょうか? CurrentRegion は空白行と空白列に囲まれた範囲を返すので、お使いの表がそういう仕様ですと使えませんが。 詳しくは CurrentRegion のヘルプを見てください。 (2) どういう意味で「時間が掛かる」というのかがわかりません。 開発時間なのか、処理時間なのか・・・ 「参照設定」でExcelを参照して開発してみてはどうでしょうか? そうすればオブジェクト変数も Dim mySheet As Worksheet という風に宣言できますし、コーディング中もExcelのオブジェクト名の後ろで「.」を押せばインテリジェンス機能が働きます。(アーリー・バインディング) 参照設定尾は実行時間に関しても多少の改善ができます。 参照設定されているものはVBのApplicationが立ち上がる時に読み込まれますので、CreateObjectの行を処理する時にExcelを読み込む「レイト・バインディング」より速く処理ができます。 ただしVBのApplicationが起動する時間がその分遅くなりますが、「実際に処理する時」に待たされませんから器にならないと思います。 Dim myXL As Excel.Application Dim myBook As Excel.WorkBook Dim myRange As Excel.Range Set myXL = New Excel.Application Set myBook = myXL.WorkbooksOpen(Pathname) Set myRange = myBook.Worksheets(1).Range("A1").CurrentRegion とは言え、参照設定は諸刃の剣です。 「VBのApplicationを実行するPC環境によってExcelのバージョンが違う」 「今後、Excelのバージョンが上がる可能性がある」 という場合は参照設定しないほうが良いでしょう。 参照設定は対象物のバージョンを固定した上で参照するからです。 そこで解決策。 開発時は参照設定で開発を行い、リリースする段階で参照設定を解除し、Excelのオブジェクト型で宣言していた変数をすべて「Object型」に変更、インスタンスを作成している行の記述も「CreateObject」に変更する。 という開発はどうでしょうか。
補足
どうもありがとうございます。 (1)については、「With EX.Application」でも「With EX」でも同じ動きでした。 Set myRange = Ex.Workbooks(1).Worksheets(1).Range("A1").CurrentRegion MsgBox myRange.Rows.Count & " " & myRange.Columns.Count では、Rangeで”A1"を指定しているので、11という答えでした。 (2)ですが、もちろん開発時間も速いに越したことはありませんね。 でも、処理時間は深刻です。参照設定でExcel 9.0 Object Libraryを設定しています。設定していてCreateObjectは使い方が変ですか?初歩的に間違っているのでしょうか?
- bin-chan
- ベストアンサー率33% (1403/4213)
SpecialCells(xlLastCell).Select はどうでしょう? A1 B1 C1 A2 A3 とセルを使用していた場合、C3を指します。 ただしA4まで使用していて、4行目を削除した場合でもC4へ飛ぶことがあるので 使用した範囲には注意してください。 (よく質問がある、使用していない範囲がスクロールバーに反映される、というバグ?)
補足
どうもありがとうございます。 折角お教えいただいたのですが、うまく使えませんでした。 サンプルコードを教えていただけませんか?
- todo36
- ベストアンサー率58% (728/1234)
過去スレ
補足
早速ありがとうございます。 (2)に対するお答と受け取っていいでしょうか? 配列にデータを入れてから編集処理をすることで処理時間が速くなるというお答でしょうか?
お礼
どうもありがとうごさいます。 <案1>は、ソフトに修正を入れてもらうのにかなり費用が発生するので難しいです。 <案2>は、発想の転換ですね?感心してしまいました。 参考にさせていただき、いろんな角度でもう少し検討してみます。