[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 12/14 12:55 / Filesize : 253 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Excel VBA質問スレ Part5



1 名前:デフォルトの名無しさん [2007/12/12(水) 17:27:44 ]
ExcelのVBAに関する質問スレです

質問前に 【 >>2-3 】 あたりを良く読むこと

前スレ
pc11.2ch.net/test/read.cgi/tech/1189814602/

520 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 20:51:52 ]
ポインタのポインタかよ

521 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 20:53:43 ]
&*p ← キモチワルイ

522 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 21:06:45 ]
俺もやってみたが何度やってもByRefが少し速いな。
Range型の引数でByValが速いケースってどういうケースだ?

523 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 21:27:27 ]
測定誤差

524 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 21:33:15 ]
うちではRangeの場合、ByRefの方がByValの2倍早かった@Excel 2007

525 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:28:34 ]
試してみたけど全然違った(Excel 2003)
もちろん、Byrefの方がかなり速い

526 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:38:42 ]
エロい方timeGetTimeで測定オナがいしますorz

527 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:41:48 ]
軽くぐぐったら、ocamlには「参照の参照」という概念があるらしい。

528 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:53:34 ]
>>526
timeGetTimeで計ったが参照私が速かった。
言っとくがtimeGetTimeだって1/1000秒の精度はないからな。



529 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:56:30 ]
渡すのは参照の方が早い。実質ポインタ(4byte)だから。
ただその分使用時に一段間接参照のコストがかかるだけ。

530 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:57:51 ]
えええ?

531 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:06:12 ]
そう言えばExcel総合相談所だったか、それともここだったか忘れたが、Worksheet型の引数をByValにしろなんて
意味不明なこと言ってたやつが前にいたな。彼は勘違いしてるんだろうね。

532 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:06:27 ]
基本的にオブジェクト型は参照渡しでいいんです
JAVAと一緒


533 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:07:39 ]
なんか思いっきり勘違いしてる人がいない?

534 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:08:44 ]
>>533
ちゃんとポイントして指摘しろ

535 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:10:19 ]
いや彼にはそのままでいて欲しいからやめとく

536 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:25:40 ]
なら最初から黙っとけよ

537 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:28:20 ]
センセー、何で一段間接参照が入るのに速くなるんでつか?

538 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:32:10 ]
ここVBAのスレだよなぁ?



539 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:37:01 ]
ByValでRangeが渡されると、内部で「Set 仮引数 = 実引数(か、それと同等の処理)」
されてるんじゃないの?
だから、使用時に間接参照のコストなんかかからないんじゃ?

540 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:45:18 ]
>>539
試せばわかる

541 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:47:58 ]
ところで514とか516とか529は試したんだろうか?

542 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:54:37 ]
ん、俺516だけど、今回は計測してないよ。
俺のは、多少遅くとも516のポリシーが良いという主張。
VB.NETも、デフォルトByValになったことだし。

543 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:59:10 ]
>>542
そっか遅いのは認めるわけね。
ByRefが遅いと書いた514はどうだろう?


544 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 00:00:11 ]
ここまで実計測データ無し。
Excelってベンチマークデータの公表禁止だったっけ?

545 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 00:05:23 ]
>>544
別に禁止じゃねーだろ?
ただみんな自分で計測して分かってると思うけどな
計測してないやつが思い込みでおかしなこと言ってるだけ

546 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 00:08:17 ]
>>518でFAなのに、いつまでやるつもりなんだろう・・・

547 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 00:10:57 ]
>>546
だよな。それ以前に>>511で終わってるわな

548 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 01:56:18 ]
VARIANTをC++から見ての想像。
オブジェクトをByValで渡すと、539の言う通り。オブジェクトへの参照(ポインタ)が渡される。
ByRefだとオブジェクトの変数への参照(ポインタ)が渡される。

いずれにせよ、渡されるのはポインタ値の4バイトだが、
ByValだと参照カウントの処理が要る分、コストがかかるように見える。
一方、ByRefでは2重に間接参照をしなければならないコストがあるはずなので、
測定条件によってどっちが速いかは変わってくるはず。



549 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 02:14:31 ]
>>548
で、どんな時に変わるのよ? 変わる”かもしれん”から一概には言えないってか?


550 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 08:23:45 ]
なんや、盛り上がってたんですねぇ。
乗り遅れたけど、実測データ書いとくね。
>>529が考えにより、ByValが有利になるように5回、引数のcにアクセスしてのr計測だからな。

Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Sub foo()
Dim t(2) As Long, i&, j&
Dim rng As Range
Dim c As Range
Set rng = Range("A:C")
t(0) = timeGetTime
For i = 1 To rng.Count
  Set c = rng(i)
   j = TEST1(c)
Next
t(1) = timeGetTime
For i = 1 To rng.Count
  Set c = rng(i)
  j = TEST2(c)
Next
t(2) = timeGetTime
Debug.Print "TEST1", t(1) - t(0); "ミリ秒"
Debug.Print "TEST2", t(2) - t(1); "ミリ秒"
End Sub

551 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 08:24:50 ]
一般的に、ByRefの間接参照はメモリ読み込み1回が余計に掛かる。
しかし、ByValの内部コピーはメモリ読み書きがそれぞれサイズ(/4)回余計に掛かることになる。
従って、どちらが早いかは自明。

552 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 08:25:03 ]
上の続き

Private Function TEST1(c As Range) As Long
Dim i&, j&
For i = 1 To 5
   j = c.Row
Next
TEST1 = j
End Function

Private Function TEST2(ByVal c As Range) As Long
Dim i&, j&
For i = 1 To 5
  j = c.Row
Next
TEST2 = j
End Function

実測値
TEST1 2448 ミリ秒
TEST2 2528 ミリ秒
5回のループじゃなくて25回くらいならほぼ同じになった。もっと回したらやっと逆転した。
だから>>529の言うことがまったくウソということではないが、通常このように何度もアクセスすることはないから参照渡しで問題なし。
ましてや1回のアクセスに値渡しは無駄もいいとこ。1回なら割合としては上の計測よりもっと差がつく。

553 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 08:27:03 ]
モタモタしてるうちに>>551が間に入ったな。

554 名前:デフォルトの名無しさん [2008/01/29(火) 10:10:38 ]
Mougからきました。
勉強になりました。

555 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 10:51:23 ]
www2.moug.net/bbs/exvba/20080126000019.htm
私もここからきますた。
ビヒネスソフト板以外にExcelのスレがあるとは知らんかった。

556 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 11:41:14 ]
どうみても>>514はあの人だよなぁ。
他のオタクの人たちも既にいると見たがどうよ。

557 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 12:42:38 ]
あまり詮索しないように
どうやら思い違いには気がついたらしいからよかったじゃないか

558 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 12:58:04 ]
なんか気持ち悪い流れとコードだったので、自分で試してみた。(Excel 2000)

*ByRefとByValの違い
 それぞれ1000万回呼び出すのを5回繰り返した場合の平均:
  ByRef: 1654.8ms (A)
  ByVal: 3558.2ms (B)

*「一段の間接参照」があるかどうか
 呼び出した関数内で、次のコードを実行する。
  dim s as string
  s = arg.address (C)
 時間がかかるので、100万回の呼び出しに変更し、それを5回繰り返した場合の平均:
  ByRef: 4488ms
  ByVal: 4660ms
 100万回分の関数呼び出しのコスト(A,Bをそれぞれ10で割ったもの)を引くと、
 (C)のコストが算出される。
  ByRef: 4488-165.48 = 4322.52ms (D)
  ByVal: 4660-355.82 = 4304.18ms (E)

結論:
・ByRefの方がByValの2倍以上速い
・「一段の間接参照」なるものの存在は確認できない(D,Eより)





559 名前:550 mailto:sage [2008/01/29(火) 13:07:28 ]
気持ち悪いコードって俺の?
だったらすまんね。

560 名前:558 mailto:sage [2008/01/29(火) 13:11:53 ]
オブジェクトをByValとByRefで渡したときの違いは何か?
プロパティNameを持った空のクラスClass1を作成し、次のコードを実行してみる。

[結果]
Initialized
abc
def

[考察]
ByValでもオブジェクトのコピーが発生するわけではない。
(barから戻ったときにbarで設定したNameが表示されているので)

--Class1
Public Name as String
Private Sub Class_Initialize()
Debug.Print "Initialized"
Name = "abc"
End Sub

--Module1
Sub foo()
  Dim o As Class1
  Set o = New Class1
  bar o
  Debug.Print o.Name
End Sub

Sub bar(ByVal o As Class1)
  Debug.Print o.Name
  Set o = Nothing
End Sub


561 名前:558 mailto:sage [2008/01/29(火) 13:15:54 ]
続き。
ByValをByRefに変えて実行してみる。

[結果]
Initialized
abc
(ここで実行時エラーが発生する)

[考察]
実行時エラーが発生した行は、barから戻ってo.Nameを参照する行。
このことは、bar内でオブジェクトが破棄された、すなわちByRefは参照カウントを増やしていない
ことを意味する。

>>560の結果とあわせると、結論は、
オブジェクトをByRefで渡すと、それ自身が渡され、参照カウントも増えない。
オブジェクトをByValで渡すと、オブジェクトがコピーされるのではなく、参照カウントが増えるだけ。

562 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 13:16:06 ]
>ByValでもオブジェクトのコピーが発生するわけではない。
これはみんな常識として知ってるだろうね。
もちろん考察には感謝する。

563 名前:558 mailto:sage [2008/01/29(火) 13:19:10 ]
>>562のコードの訂正

Sub bar(ByVal o As Class1)
  Debug.Print o.Name
  o.Name = "def"
  Set o = Nothing
End Sub


564 名前:558 mailto:sage [2008/01/29(火) 13:26:55 ]
さて、それでは実際にオブジェクトのコピーを関数に渡したいときにはどうすればいいのだろう?
とふと思った。

Class1に次の関数を実装すれば良い。
が、VBAの機能だけで実現する方法があるかもしれない・・・。

Public Function Clone() As Class1
  Set Clone = New Class1
  Clone.Name = Me.Name
End Function

Sub foo()
Dim o As Class1
Set o = New Class1
bar o.Clone
Debug.Print o.Name
End Sub

Sub bar(ByRef o As Class1)
Debug.Print o.Name
o.Name = "def"
Set o = Nothing
End Sub

[一連の書き込み終了]

565 名前:558 mailto:sage [2008/01/29(火) 13:30:33 ]
蛇足。

オブジェクトをByValで渡す場合は、前述のようにリファレンスカウントが増えるだけであり、
仮引数のconst性(不変性)を保障するものではまったくない。

その意味で、>>516のポリシーは間違っている。

566 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 13:42:59 ]
しかし試しもしないで遅いとか気持ち悪いとか書くやつも相当だよな。
速度の計測なんてすぐできることだろうに。

567 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 13:49:29 ]
>>565
組み込みオブジェクト(というのか?)だと、ByRefで渡したときは自作クラスのインスタンスとは
ちょっと違う挙動をする。

Sub foo()
Dim r As Range
Set r = Range("A1")
bar r
Debug.Print r.Address
End Sub

Sub bar(ByRef r As Range)
Set r = Range("A2")
End Sub

ByValだと$A$1と表示され、ByRefだと$A$2と表示される。
つまり、ByValは「参照のコピー」が渡ってると言える。(ここ、怪しい表現だが)
そういう意味では>>516は正しい。

あーややこしい。

568 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 13:51:25 ]
いいかげんに許してやりなよ。
勘違いは誰でもあるし、反省してると思うよ。



569 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 13:53:00 ]
あー、それが「参照の参照」という奴なのか・・・

570 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 14:00:29 ]
>>555のリンク先ちらっと見たけど、とてもじゃないが読む気になれん

571 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 14:06:08 ]
禿げ胴

572 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 14:18:49 ]
なんだか混乱してきた。
ただ、byrefの方がbyvalより速いというのが事実だということは確かだよな。

573 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 14:23:25 ]
誰かガンダムで表現してくれ

574 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 14:49:38 ]
オブジェクト型はアドレス渡されるだけで
基本はLong型と同じ
byvalでも渡されるのが参照情報だからbyrefみたいに
感じちゃうってこと

575 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 15:02:19 ]
>>567
それbarの中で新しいRangeオブジェクトを作り出してるから、根本的に565が書いたコードと違う

576 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 15:07:53 ]
>>568
反省してるかねぇ。
すっとぼけてるけど、なんとかByValが遅いのは認めたらしい。
ただお行儀がどうのこうのとまだ言ってるよ。
別に参照渡しは行儀悪くねーだろ?

577 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 16:25:15 ]
>>576
そもそも、VBAのデフォルトがbyrefなんだから、神経質ではない普通の人が
function foo(r as range)
と書くと、それはByRefになる。

これがお行儀が悪いということは、
function foo(byval r as range)
と書くのが「お行儀が良い」ということになる。

こんな書き方がデフォルトの奴は診たこと無いぞ。

578 名前:デフォルトの名無しさん [2008/01/29(火) 16:54:08 ]
右上の×(閉じるボタン)を無効にできますか?




579 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 17:09:17 ]
ところで、516のいう「自分で定義したサイズが大きな型」というのが
Typeで定義した型のことなら、それに関しては同意と言おうと思ったら、
そもそもTypeのユーザ定義型は、値渡しできなかった。

580 名前:550 mailto:sage [2008/01/29(火) 17:26:39 ]
>5回のループじゃなくて25回くらいならほぼ同じになった。もっと回したらやっと逆転した。
仕事から帰って再度試したら、もっと回しても逆転まはしてなかった。スマン
測定誤差だったみたいだな。
誰かが書いてたと思うが、結局ByValが速くなるケースってなさそうだな。

581 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 17:43:20 ]
ChangeイベントやSelectio_ChangeイベントがByVal Target As Rangeとなってるのは何故?
エロイ人教えて

582 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 17:57:41 ]
差を比べるならこうする
わかるのは差は大きいが全体でみると微々たる差ということ

Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Sub foo()
Dim t(2) As Long, i&, j&
Dim rng As Range
Dim c As Range
Set rng = Range("A:Q")
t(0) = timeGetTime
For i = 1 To rng.Count
TEST1 c
Next
t(1) = timeGetTime
For i = 1 To rng.Count
TEST2 c
Next
t(2) = timeGetTime
Debug.Print "TEST1", t(1) - t(0); "ミリ秒"
Debug.Print "TEST2", t(2) - t(1); "ミリ秒"
End Sub

Private Sub TEST1(ByRef c As Range)
End Sub

Private Sub TEST2(ByVal c As Range)
End Sub



583 名前:510 [2008/01/29(火) 18:00:36 ]
みなさん、大変参考になりました。
どうやら参照渡しで問題ないということがわかり一安心です。
ありがとうございました。

584 名前:550 mailto:sage [2008/01/29(火) 18:15:46 ]
>>582
俺はcへのアクセス速度も調べたかったんだよ。
>>529が気になったものでね。

>>583
よかったな、まぁがんがれ

585 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 19:40:38 ]
この流れを見て「Byrefなら速いんだ!」となんでもかんでもByrefの迷惑コーダーが量産されそうな

586 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 19:41:25 ]
デフォルトbyrefなんでそ?

587 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 19:46:43 ]
>>585
デフォルトがそうだし、仮に全部ByRef にしたトコで悪影響があるんだろうか?
要するに、関数にオブジェクト変数を渡せば、ByValにしたとこで内容の保護はできんわけだし。


588 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 20:56:04 ]
>>585
それは言えるかも知らんね。ByValが速いケースもあるんだけどな。
オブジェクト型はないかも知らんが、他のケースでは確実にある。



589 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 21:32:15 ]
>>588
だから、そのケースを示せっての。議論のネタにもならんわ。 自分がそう信じたいだけか?


590 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 21:37:50 ]
>>589
おめー死ねよ。
自分で探すことも出来んのか?

591 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 21:54:54 ]
おまえは間違ってる(でも正解を示さない)
↑ググってみて一番上ね

592 名前:デフォルト知らず [2008/01/29(火) 21:59:20 ]
折れ、今まで、全てにおいてByRefにせず、ByValできている。反省w
戻り値を親に返す必要がないから、ByValを当然に使うと考えていた。

戻り値を親に戻す必要があればByRefと、ただ単にプログラムテクニックぐらい。
で、スピードは全く気にしていなかった。

ベンチマークでなく、実用・実践のレベルでのものでも、書き換えた方が早いのだろうか? ex 与件を渡すinteger型変数5つぐらい


593 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 22:14:57 ]
いいから>>589は死ね。
おれはここで散々>>510のケースはByRefが速いって書いてきたからな。
勘違いするなよ。

594 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:53:02 ]
すみません
Cells(hoge, fuga).Value
で値を取り出したときに
元のセルが3だったとすると
値がそのまま3である場合と
3.0になっている場合があるようなんです
常に3であるように取り出すにはどうするのがよいでしょうか?

595 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 03:58:58 ]
>>593
お前が死ね。
二度と来るな。
迷惑だ。

596 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 05:05:50 ]
>>555
モーグは、大村なんとかが嫌いだったので見てなかったんだが、久しぶりに見に行ったら
井川はるきという気持ち悪い奴がのさばってた。

ぐぐったら、こいつ何冊も本出してるな。
掲示板で初心者相手に回答もしてるみたいだし、ほんときもちわりー

597 名前:デフォルトの名無しさん [2008/01/30(水) 07:37:28 ]
オラもモーグから来ますた。
ByRefとByValの話はもう終わり?
何かあるのかと思ったら、既出ネタの応酬とグダグダの展開に正直がっかりです。

598 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 09:35:53 ]
もともと既出ネタなのに、何を期待してたんだ?



599 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 11:02:26 ]
>>596
お前よりは役にたってるよ。
今回の引数の渡し方については、嘘をどうどうと書いたので叩かれてもしょうがないけどな。

600 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 11:13:05 ]
しかし彼の本にオブジェクト型はByValで渡すべしなんて書かれてたりしたら、本を買った人がかわいそうだな。

601 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 11:19:17 ]
>>594
そんなのありえないだろ?
元のセルが3.0という文字列なら別だが、もともと数値の3なら3だ。
どこかのセルにその値を代入すれば、表示形式によっては3だったり3.0だったりすることはあるがね。

602 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 12:31:31 ]
>>599
役にたってるかなんかどうでもいい。

気持ち悪いかどうかって話だ。

603 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 12:49:20 ]
確かにモーグは、今一番キモいコミュニティだな

604 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 13:05:20 ]
漏れが一番Mougでウザイのは、あのしょっちゅうハンドル変えてるやつだな。
EFCを追放された名無しだろうけど。

605 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 13:38:13 ]
>>514
参照の参照が渡されるから気持ち悪いというのを、もっと説明してください。

606 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 14:01:26 ]
>>605
Mougが下がってるから、あそこで聞けば?
もう>>514はここ見てないかもよ。

607 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 14:48:27 ]
「下がってる」の意味が良くわからないのですが、Mougは巡回対象ではないので、
ここで回答がなければあきらめます。

608 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 15:48:05 ]
もともと組み込み屋なのに転職したら最初にVBAやる羽目になってます。
VBはある程度使ってましたが忘れかけ。

質問は
ユーザ定義クラスのインスタンス(の参照?)を渡して関数の先で値を入れてもらいたいのですが、
「型が一致しません」となります。何が原因でしょうか?

【Sheet1のpublicプロシージャ】

Public Sub GetData(idx As Long, ByRef item As clsUserA)
item.Id = Me.Cells(idx + 1, 1)
item.Name = Me.Cells(idx + 1, 2)
item.Remark = Me.Cells(idx + 1, 3)
item.Visible = Me.Cells(idx + 1, 4)
End Sub

【それを呼び出すModule1のプロシージャ】
Sub Test()
Dim tmpClass As clsUserA
Dim i As Long

Set tmpClass = new clsUserA
For i = 0 to 10
Call sheetClassList.GetData(i, tmpClass) '★ここでエラー発生
Next
End Sub

よろしくお願いします・・・。



609 名前:608 mailto:sage [2008/01/30(水) 15:52:10 ]
簡単な名前にしようと思って書き換え忘れorz

Call Sheet1.GetData(i, tmpClass) '★ここでエラー発生



610 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 16:36:51 ]
>>608
clsUserAのプロパティでInstancingをPublicNotCreatebleに設定しろ

611 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 16:56:42 ]
>>610
それは違うエラーが出たので昨日の時点で直しました。

クラスをやめて構造体にしてみたら
パブリックオブジェクトモジュールで定義されてないと云々・・・

何この中途半端な言語・・・。

612 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 17:35:20 ]
本当に解決してほしいのなら、エラーが発生する、検証可能な最低限のコードを「全て」書け

613 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 17:54:48 ]
>>608
ところで、Sheet1クラスに定義したGetData( ) を
Worksheet型で宣言したオブジェクトから呼ぼうとしてるのだとしたら大笑いなんだが、
そこは大丈夫? (要するに sheetClassList の変数の型が分からないんだが)


614 名前:608 mailto:sage [2008/01/30(水) 17:55:22 ]
そのものをうpしてみた。
up01.ayame.jp/up/download/1201683170/attach/%E5%B7%A5%E7%A8%8B%E8%A1%A8.lzh
PASSは prog

開いたときの真ん前にあるCommand1を押すと問題のポイントでエラーになります。
成功すると正面の表が変化するはず。

615 名前:608 mailto:sage [2008/01/30(水) 17:57:44 ]
>>613
シートにプロシージャを定義してあって、
標準モジュールから呼んでます。
もしかして大笑いコース??

616 名前:608 mailto:sage [2008/01/30(水) 18:02:44 ]
さっき配置変更して別のシートから呼んでました。
紛らわしくてすみません。
どっちにしても動きは同じですが。

617 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 19:12:07 ]
>>614
再現手順を書け、アホ

とりあえず
Public Sub GetData(idx As Long, item As clsGantClass)
にしたら、コンパイルエラー(呼び出せない)のは無くなった

618 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 19:13:35 ]
>>608
ちょ、お前な。 ステップ実行で確認するくらいしろよ!
自分の意図してる場所のセルのデータが、ちゃんと取れてるかどうかと、
代入しようとしている構造体のメンバの変数型が合ってるかどうか。話はそれからだ。

ソース見る限りでは、Variantじゃなくて、クラスを指定しても動くと思うよ。
⇒ Public Sub GetData(idx As Long, item As clsGantClass)




619 名前:617 mailto:sage [2008/01/30(水) 19:15:01 ]
すまん、再現手順は書いてあったな。

ただ、ボタンをクリックしてもエラーは発生しないぞ?

620 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 19:16:21 ]
>>610が原因だったが、あれこれやってるうちに、何がなんだかわからなくなったと見た。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<253KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef