プロが教える店舗&オフィスのセキュリティ対策術

あるソフトから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で作るより時間がかかります。これは仕方ないでしょうか?

以上、よろしくお願いいたします。

A 回答 (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の繰り返し数
で、取得するとかは如何でしょうか。


どちらも、一案なので今回のものに適用可能かどうかはわかりませんが
参考程度に如何でしょうか。
    • good
    • 0
この回答へのお礼

どうもありがとうごさいます。
<案1>は、ソフトに修正を入れてもらうのにかなり費用が発生するので難しいです。
<案2>は、発想の転換ですね?感心してしまいました。
参考にさせていただき、いろんな角度でもう少し検討してみます。

お礼日時:2003/03/19 21:42

質問とは無関係ですが、最近答えたことと同じような話題がのぼっているのが見えたので、ちーと乱入デシ



参照設定とCreateObjectについて発言しました。

よかったら、見てやってくださいまし。

それでは、おじゃーまいたしました。

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=500315
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
参照設定しながらCreateObjectでこれまで作ってきました。
違うんですね?
もっと勉強してみます。

お礼日時:2003/03/19 07:49

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は使い方が変ですか?初歩的に間違っているのでしょうか?

補足日時:2003/03/18 23:38
    • good
    • 0

SpecialCells(xlLastCell).Select はどうでしょう?



A1 B1 C1
A2
A3
とセルを使用していた場合、C3を指します。
ただしA4まで使用していて、4行目を削除した場合でもC4へ飛ぶことがあるので
使用した範囲には注意してください。
(よく質問がある、使用していない範囲がスクロールバーに反映される、というバグ?)

この回答への補足

どうもありがとうございます。
折角お教えいただいたのですが、うまく使えませんでした。
サンプルコードを教えていただけませんか?

補足日時:2003/03/18 23:27
    • good
    • 0

この回答への補足

早速ありがとうございます。
(2)に対するお答と受け取っていいでしょうか?
配列にデータを入れてから編集処理をすることで処理時間が速くなるというお答でしょうか?

補足日時:2003/03/18 22:55
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!