tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルExcelの参照の高速化
記事No698
投稿日: 2004/02/08(Sun) 17:57
投稿者BETTY
[OSのVer]:WindowsXP    [VBのVer]:VB.NET
先日はありがとうございました。
また、質問なのですが

現在、フォームを立ち上げる前にEXCELを参照しています
(EXCEL単体で変更しても大丈夫な様に)
参照したCELLの値やSHEET名をCOMBOBOX等に表示させているのですが
立ち上がるまでに時間がかかってしまいます
いろいろと改良をして2秒ほど短縮しましたが、まだ5秒位かかるんです

For a=o To 40
    xlCellName(a)=xlSheet(a+1,3).Value
    ComboBox1.Items.Add(xlCellName(a))
Next

こんな感じでやっているのですが
何か他に方法はありませんか?

DAOと言うのを見つけて入れて見たのですが

ADD.PATHの所でADDに波線、名前が宣言されていません
と出てきてしまい、分からずに使っていません

これを調べてみて! ここを見てみて!
と言う解答で結構ですので、誰か教えて下さい
後は自分で頑張ります?(たぶん)

宜しくお願い致します 

[ツリー表示へ]
タイトルRe: Excelの参照の高速化
記事No701
投稿日: 2004/02/08(Sun) 23:50
投稿者花ちゃん
まず、どの動作に何秒かかっているか取得する方が先かと思うのですが。
部分的なコードを見てもどこが遅いかは他の者には解らないでしょう。
投稿されたコードの部分ではそれほど時間がかかっているとは思えませんが。

[ツリー表示へ]
タイトルRe: Excelの参照の高速化
記事No702
投稿日: 2004/02/09(Mon) 13:36
投稿者魔界の仮面弁士
BETTYさんのコードにある、xlCellName、および xlSheet というのは、それぞれ何型の変数ですか?

> For a=o To 40
>     xlCellName(a)=xlSheet(a+1,3).Value

セルの値を一つ一つ見ていくのは、比較的時間がかかると思います。
(Valueプロパティにアクセスするたびに、COM Interop層を経由する事になるため)

ExcelのRangeオブジェクトは、複数のセル範囲を一度に取得できますので、ループさせずに
    objArray =  〜.Range("C1:C40").Value
などとしてみてください。これなら、Excelとの通信回数が1回だけで済みます。

> ADD.PATHの所でADDに波線、名前が宣言されていません
その『ADD.PATH』というキーワードは、どこに記載されていたものですか?
# もしかして、VB6の App.Path の事かな…。

[ツリー表示へ]
タイトルRe^2: Excelの参照の高速化
記事No703
投稿日: 2004/02/10(Tue) 00:03
投稿者BETTY
[OSのVer]:Windows    [VBのVer]:VB.NET 

返信ありがとうございます
 
> BETTYさんのコードにある、xlCellName、および xlSheet というのは、それぞれ何型の変数ですか
?

漢字が混じっていますのでString型です

> > For a=o To 40
> >     xlCellName(a)=xlSheet(a+1,3).Value
>
> セルの値を一つ一つ見ていくのは、比較的時間がかかると思います。
> (Valueプロパティにアクセスするたびに、COM Interop層を経由する事になるため)
>
> ExcelのRangeオブジェクトは、複数のセル範囲を一度に取得できますので、ループさせずに
>     objArray =  〜.Range("C1:C40").Value
> などとしてみてください。これなら、Excelとの通信回数が1回だけで済みます。

挑戦してみます。
Cellに空白が入っていても大丈夫ですか?
配列変数などでも大丈夫ですか?
strSimei(40,2) これに代入できますか?

> > ADD.PATHの所でADDに波線、名前が宣言されていません
> その『ADD.PATH』というキーワードは、どこに記載されていたものですか?
> # もしかして、VB6の App.Path の事かな…。

入力ミスでしたVB6のApp.Pathでした

[ツリー表示へ]
タイトルRe^3: Excelの参照の高速化
記事No704
投稿日: 2004/02/10(Tue) 02:48
投稿者魔界の仮面弁士
>>> xlCellName(a)=xlSheet(a+1,3).Value
>> BETTYさんのコードにある、xlCellName、および xlSheet というのは、それぞれ何型の変数ですか?
> 漢字が混じっていますのでString型です

え? (^_^;)
『Dim xlSheet(,) As String』という事ですか?

Stringクラスには、Valueというプロパティは無かった筈ですが…。


> 挑戦してみます。
> Cellに空白が入っていても大丈夫ですか?

結論から言えば、空白セルは Nothing が返されます。

……でも、実際に挑戦してから質問しても、遅くは無かったと思いますよ。(^^;
(質問する前に、まずは試して & 調べてみましょう)


> 配列変数などでも大丈夫ですか?

例えば、
  Dim V As Object = WS.Range("A3:B5").Value   '変数「WS」は、ExcelのWorksheetオブジ
ェクトです
とした場合、Vは System.Array となり、
  V(1,1) = A3セルの値
  V(2,1) = A4セルの値
  V(3,1) = A5セルの値
  V(1,2) = B3セルの値
  V(2,2) = B4セルの値
  V(3,2) = B5セルの値
のように格納されます。(配列の下限が1から始まっている事に注意してください)


> strSimei(40,2) これに代入できますか?

  Dim strSimei(40, 2) As Object
  strSimei = WS.Range("A3:B5").Value

のようなコードならばOKです。


> 入力ミスでしたVB6のApp.Pathでした
ヘルプから『App オブジェクトの変更点』というキーワードで捜してみてください。
それと同等の機能を持つ.NET Frameworkのプロパティが掲載されています。

[ツリー表示へ]
タイトルRe^4: Excelの参照の高速化
記事No705
投稿日: 2004/02/10(Tue) 09:09
投稿者BETTY
[OSのVer]:Windows    [VBのVer]:VB.NET 

詳しく説明をして頂き本当にありがとうございます
現在、下記のコードをテストしていますが
 
Dim t1 As Integer
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Dim simei() As Object
t1 = System.Environment.TickCount
xlApp = CreateObject("Excel.Application")
xlBook = xlApp.Workbooks.Open("C\〜\テスト.xls")
xlSheet = xlBook.Worksheets("データ")
xlBook.Application.Visible = True
simei = xlSheet.Range("a1:a40").Value
xlApp.Quit()
xlApp = Nothing
GC.Collect()
t1 = System.Environment.TickCount - t1
TextBox1.Text = t1

simei = xlSheet.Range("a1:a40").Valueのところで
System.InvalidCastException' のハンドルされていない例外が WindowsApplication4.exe で発生しま
した。
追加情報 : 指定されたキャストは有効ではありません。

と出てしまいます

> ……でも、実際に挑戦してから質問しても、遅くは無かったと思いますよ。(^^;
> (質問する前に、まずは試して & 調べてみましょう)

ヘルプでキャストを検索して調べてみましたがよく分かりません
……でも、もう少し頑張ってみます

> 結論から言えば、空白セルは Nothing が返されます。

自動変数のxlSheet横の+を押したら参照した値が表示されました
確かに Nothing になってました
見方も知らなくてすいません
今まで空白セルは If 文を使って文字列の長さが0なら…
って感じで見つけていました

いろいろありがとうございました
もう少し勉強してから出直します

[ツリー表示へ]
タイトルひとつ解決出来ました
記事No706
投稿日: 2004/02/10(Tue) 09:39
投稿者BETTY
[OSのVer]:Windows    [VBのVer]:VB.NET  

> Dim simei() As Objectのところを

Dim simei(,) As Object
配列が1から始まっているので2次元配列にすれば大丈夫でした

> xlBook = xlApp.Workbooks.Open("C\〜\テスト.xls")

C:\ですよね(入力ミスでした)

[ツリー表示へ]
タイトルRe: ひとつ解決出来ました
記事No707
投稿日: 2004/02/10(Tue) 09:55
投稿者花ちゃん
Excrelの起動方法と終了の方法も間違っています。(^_^;)

 Re: Excelの終了時にプロセスが残ったまま.. - 花ちゃん 01/31-20:17 No.678
 のリンクを見て正しい方法にされた方がいいかと思います。

# 質問する前に掲示板のExcel関係の過去ログにも目を通しておきましょう。

[ツリー表示へ]