C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

エクセルの中で For Each〜Next


(過去ログ 3 を表示中)

[トピック内 14 記事 (1 - 14 表示)]  << 0 >>

■3108 / inTopicNo.1)  エクセルの中で For Each〜Next
  
□投稿者/ まじん 二等兵(7回)-(2006/04/14(Fri) 16:07:03)

分類:[VB.NET] 


分類:[VB.NET] 

エクセルの中で For Each がしたくて下記のような構文を書いているのですが
For each〜Next のところで「メンバーが見つかりません」とエラー

Dim xlapp As Excel.Application = CreateObject("excel.application")
xlapp.Application.Visible = True
Dim xlbook As Excel.Workbook = xlapp.Workbooks.Open("\\Intsv\共有\000全社\108技術部\AS課\支払台帳用業者名.xls")
Dim xlwin As Excel.Window = xlapp.Windows("支払台帳用業者名.xls")
xlwin.Visible = True
Dim xlSheets As Excel.Sheets = xlbook.Worksheets
Dim xlSheet As Excel.Worksheet = xlSheets("sheet1")
Dim xlran As Excel.Range = xlSheet.Range("A1", "E5")

Dim c As Excel.Range
For Each c In xlran
c.Value = "A"
Next

どんな構文にすれば 良いんでしょうか?
多分簡単なことだと思うんですが 簡単すぎるのかどこを見ても書いてないんです
また、御教授お願い出来ないでしょうか?

0
引用返信 編集キー/
■3109 / inTopicNo.2)  Re[1]: エクセルの中で For Each〜Next
□投稿者/ まどか 准尉(105回)-(2006/04/14(Fri) 17:41:41)

分類:[VB.NET] 

> For each〜Next のところで「メンバーが見つかりません」とエラー
>
> Dim xlran As Excel.Range = xlSheet.Range("A1", "E5")
>
> Dim c As Excel.Range
> For Each c In xlran
> c.Value = "A"
> Next

Rangeオブジェクトは範囲自体を単位としていますので、含まれるセルを列挙できません。
Cells(Row,Col)プロパティなどで一つ一つ代入するか、
Range.Value = Object型2次元配列で一括代入する方法になるでしょう。

0
引用返信 編集キー/
■3110 / inTopicNo.3)  Re[2]: エクセルの中で For Each〜Next
□投稿者/ まじん 二等兵(8回)-(2006/04/14(Fri) 18:06:28)

分類:[VB.NET] 

No3109に返信(まどかさんの記事)
まどかさん ありがとうございます

> Rangeオブジェクトは範囲自体を単位としていますので、含まれるセルを列挙できません。
> Cells(Row,Col)プロパティなどで一つ一つ代入するか、
> Range.Value = Object型2次元配列で一括代入する方法になるでしょう。

範囲自体が1つの単位になってしまうんですね
ということは 上記のようにするか do〜Loop Untilなどで処理するしかないわけですね
実は仕事場のネットワークのホストコンピューターの中のエクセルのデータを同じくホストコンピューターの.mdbファイルへ送るプログラムを作っていたのですが プログラムで直接データを取り込み送るとすごく時間がかかった(do〜Loopで取り込み)のですが エクセルのVBAにマクロを書込み実行させると(For Each〜Nextで取り込み)10分の1位の時間で処理できました
それで For Eachで処理させた方が早いのかな? と思ったのですが・・・



0
引用返信 編集キー/
■3111 / inTopicNo.4)  Re[3]: エクセルの中で For Each〜Next
□投稿者/ 名無しぃシャープ 曹長(81回)-(2006/04/14(Fri) 19:40:04)

分類:[VB.NET] 

No3110に返信(まじんさんの記事)
> それで For Eachで処理させた方が早いのかな? と思ったのですが・・・

内部的にはただのForステートメントですよ。
速度に差はないです。
自分でインデックスを振るかそうでないかの違いでしかありません。

0
引用返信 編集キー/
■3112 / inTopicNo.5)  Re[4]: エクセルの中で For Each〜Next
□投稿者/ まじん 二等兵(9回)-(2006/04/14(Fri) 20:29:36)

分類:[VB.NET] 

No3111に返信(名無しぃシャープさんの記事)
> ■No3110に返信(まじんさんの記事)

名無しぃシャープ さん どうもありがとう御座います
>>それで For Eachで処理させた方が早いのかな? と思ったのですが・・・
>
> 内部的にはただのForステートメントですよ。
> 速度に差はないです。
> 自分でインデックスを振るかそうでないかの違いでしかありません。
そうですか もっと他のところで改良を考えたほうが良さそうですね

なぜか 新規のエクセルを起動しそこにマクロを書込み実行させ他のbookから
データを読み込み そのデータを.mdbに送らせ そのエクセルを破棄するという
すごく無駄のありそうなプログラムのほうが 直接プログラムでデータを取り込み
送るより同じ仕事をさせてる筈なのに数段早かったんです
ネットワーク上では そうなるんですか 約7万行くらいのデータなんですが
あまりに速度が違うもので・・

0
引用返信 編集キー/
■3113 / inTopicNo.6)  Re[5]: エクセルの中で For Each〜Next
□投稿者/ 中博俊 神(366回)-(2006/04/14(Fri) 21:10:30)
中博俊 さんの Web サイト

分類:[VB.NET] 

ほ、本当にホストなんですか(*_*)

ま、冗談はさておき。


ネットワークを介さないようにしないと遅いと思いますよ。

mdbをローカルに持ってきて、作業して、書き戻すが出来ないのであれば難しいでしょう。

0
引用返信 編集キー/
■3114 / inTopicNo.7)  Re[6]: エクセルの中で For Each〜Next
□投稿者/ まじん 二等兵(10回)-(2006/04/14(Fri) 21:51:13)

分類:[VB.NET] 

No3113に返信(中博俊さんの記事)
中博俊さん どうもありがとう御座います
> ネットワークを介さないようにしないと遅いと思いますよ。
>
> mdbをローカルに持ってきて、作業して、書き戻すが出来ないのであれば難しいでしょう。
やっぱりそうですか
でも 約20台のPCを同じ.mdbにアクセスさせるためローカルに持っていく訳にはいかなくて・・・
エクセルのマクロだと早いのはなぜでしょう


0
引用返信 編集キー/
■3115 / inTopicNo.8)  Re[7]: エクセルの中で For Each〜Next
□投稿者/ まどか 准尉(106回)-(2006/04/15(Sat) 04:00:31)

分類:[VB.NET] 

先に書きましたが、一応、
Dim CellBuf(2, 4) As Object
CellBuf = TargetSheet.Ranges("A1:E3").Value
という方法も試してみては。

マクロのほうが速いのは、Interopなどを介さない、Office内部実装での処理などが理由かも。
そういう逆転現象を聞いたことあるような無いような。。。
まぁネットワークという低レベルIOは避けるに越したことはないと思いますが。

0
引用返信 編集キー/
■3116 / inTopicNo.9)  Re[8]: エクセルの中で For Each〜Next
□投稿者/ 中博俊 神(367回)-(2006/04/15(Sat) 11:40:45)
中博俊 さんの Web サイト

分類:[VB.NET] 

Excelマクロで試した環境は条件的に同一ですか?
違うんじゃないかな。

それより、サーバマシンにプログラムをおければ話は解決すると思いますよ。

0
引用返信 編集キー/
■3117 / inTopicNo.10)  Re[2]: エクセルの中で For Each〜Next
□投稿者/ 魔界の仮面弁士 曹長(90回)-(2006/04/15(Sat) 12:47:15)

分類:[VB.NET] 

> Rangeオブジェクトは範囲自体を単位としていますので、含まれるセルを列挙できません。
実は VBA レベルでは、
 Set X = Sheet1.Range("B2:D4")
 For Each Y In X ' In X.Cells でも可
  i = i + 1
  Y.Value = i
 Next
のような事ができたりします。(^^;


ただ、VB.NET からの呼び出しだと、レイトバインドかアーリバインドかに
よって列挙できない場合もありますし、また、オブジェクトの解放処理に関する
問題もありますので、For Each するよりも、

> Range.Value = Object型2次元配列で一括代入する方法になるでしょう。

のように、二次元配列を一括代入する方法を採用した方が無難でしょう。


> Cells(Row,Col)プロパティなどで一つ一つ代入するか、
ただし、これは NG 。

Cells は引数を持たないプロパティです。つまり
 .Cells(Row, Col)
というのは、
 .Cells._Default(Row, Col)
の呼び出しを意味してしまいます。

これではオブジェクトを解放できませんので、Cells を使う場合は、
 R1 = .Cells
 R2 = R1(Row, Col)
 R2.Value = 〜〜
のようにわけて記述し、あとから、それぞれの変数を
Marshal.ReleaseComObject()で解放する事が求められます。

0
引用返信 編集キー/
■3120 / inTopicNo.11)  Re[3]: エクセルの中で For Each〜Next
□投稿者/ まじん 二等兵(11回)-(2006/04/16(Sun) 08:50:46)

分類:[VB.NET] 

まどかさん、中博俊さん、魔界の仮面弁士さん ありがとう御座います

やはり、For eachは 無理だということですね

Dim val(10, 10)
Dim r = 0
Dim c = 0
Do
r = 0
Do
xlcel = xlSheet.Cells(r + 1, c + 1)
val(r, c) = xlcel.Text
r += 1
Loop Until r = 10
c += 1
Loop Until c = 10

こんな感じで以前はエクセルのデータを取り込んでたのですが能率が悪くて・・

0
引用返信 編集キー/
■3121 / inTopicNo.12)  Re[4]: エクセルの中で For Each〜Next
□投稿者/ まじん 二等兵(12回)-(2006/04/16(Sun) 12:28:58)

分類:[VB.NET] 

2006/04/16(Sun) 12:32:17 編集(投稿者)

Dim va(,) = xlran.Value
Dim v
For Each v In va
MsgBox(va)
Next

こんな感じにすると まるごとその範囲のデータが取り込めました
この時、For Eachの中の vが変数va(,)の何番なのかを知るにはどうすれば
良いんでしょうか? おそらく非常に初歩的な質問かと思うのですが

今までは いつもfor eachの中に i+=1 みたいのを入れて参照してたのですが・・・



0
引用返信 編集キー/
■3122 / inTopicNo.13)  Re[5]: エクセルの中で For Each〜Next
□投稿者/ まどか 准尉(107回)-(2006/04/16(Sun) 21:36:11)

分類:[VB.NET] 

> この時、For Eachの中の vが変数va(,)の何番なのかを知るにはどうすれば

For Row As Integer = 0 To va.GetUpperBound(0)
For Col As Integer = 0 To va.GetUpperBound(1)
va(Row, Col)
Next
Next
でいいのでは?
あと、NullやEmptyのチェックをお忘れなく。必ず""が入っているわkではないので。

0
引用返信 編集キー/
■3128 / inTopicNo.14)  Re[6]: エクセルの中で For Each〜Next
□投稿者/ まじん 二等兵(13回)-(2006/04/17(Mon) 16:48:30)

分類:[VB.NET] 

No3122に返信(まどかさんの記事)
まどかさんどうもありがとうございます

> For Row As Integer = 0 To va.GetUpperBound(0)
> For Col As Integer = 0 To va.GetUpperBound(1)
> va(Row, Col)
> Next
> Next
> でいいのでは?
> あと、NullやEmptyのチェックをお忘れなく。必ず""が入っているわkではないので。

なるほど GetUpperBoundを使うと二次変数の番号も分かりやすいですね ばっちりいけました。
みなさん どうもありがとう御座いました
直接for eachは無理という事も分かりましたので 一応解決とさせて頂きます。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -