1 名前:デフォルトの名無しさん [2007/12/12(水) 17:27:44 ] ExcelのVBAに関する質問スレです 質問前に 【 >>2-3 】 あたりを良く読むこと 前スレ pc11.2ch.net/test/read.cgi/tech/1189814602/
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 が原因だったが、あれこれやってるうちに、何がなんだかわからなくなったと見た。
621 名前:608 mailto:sage [2008/01/30(水) 19:35:28 ] エラー出ないですか・・・。 sheetClassListはどこか書き換えたんでしょうか? いまだ動きません。 ほかのマシンで動かしてみようかなぁ
622 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 19:42:38 ] Me.Cells(idx + 1, 1)がLongじゃない。 以上。
623 名前:618 mailto:sage [2008/01/30(水) 19:44:43 ] >>621 え? ちょっと待て。何が分からないの? うpしてくれた .xls でいいんだよな? 直さなきゃいけないトコ、普通に分かるだろ。 あと、気になるのは、1度動かすと、sheetClassList.Count の値がぶっ飛ぶ。(ゼロになる)
624 名前:608 mailto:sage [2008/01/30(水) 20:04:14 ] わかりました○| ̄|_ CellはRaw:2から読まないとだめでしたね・・・(0+1=1 "id"読んでました) GetDataの内部の行ではなく、呼び出しの行がエラーになったために、その部分ばかりこだわってました。 ありがとうございました。精進します。
625 名前:618 mailto:sage [2008/01/30(水) 20:18:34 ] >>624 精進してください。 ちなみに、さっきザッと眺めた限りでは、あと変数型さえ直せば動くと思うよ。
626 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 20:21:01 ] おまいら釣られすぎ。 流れ変えようと>>514 が質問を始めたな。 何が組み込み屋だよwww
627 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 20:24:29 ] それならそれで乗ってやりゃ済む話だろ。 どんだけ粘着なんだよ。キモイやつだな。
628 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 20:37:18 ] >>626 流れをぶった切って申し訳ないが無関係なんで・・・。 組み込み屋馬鹿にスンナヽ(`Д´)ノ
629 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 21:51:38 ] それよりzzって相当生意気な香具師だな
630 名前:デフォルトの名無しさん [2008/01/30(水) 22:44:34 ] 質問です。 配列を一気にboolean型のtrueで初期化する方法はありますか? Dim hairetu As booleanです
631 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 23:06:31 ] OSはWindows XP、Excelは2002です。 エクセルに関しては、授業で習った程度の事しか出来ません。 エクセルのVBAでゲーム作成の課題が出て、マインスイーパを作ってみようと思ったんですが。 全てのボタンをトグルボタンで作ろうとすると、凄く重くなります。 更に一個一個のボタンにコードをいちいち打たなければならないので、 もし出来たとしてもやはり使い物にならなくなると思います。 コードをすっきりさせるやり方で、何か良い方法はありませんか? お願いします。
632 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 23:45:53 ] >>630 APIでメモリ操作 >>631 セルをボタンにみたてたら?
633 名前:デフォルトの名無しさん [2008/01/31(木) 00:11:47 ] 632さん ネットで調べたのがよくわかりませんでした。 どーいうことなのですか?
634 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 09:15:10 ] >>632 それも最初考えてみたんですが…。 マインスイーパでいう、ボタンをクリックすると文字が表示されるという動作と、 ボタンに爆弾の印を付けるという動作をさせるやり方が見つからなくて…。 セルの中の値を非表示にして、クリックなどの動作で其れを表示させるというやり方が 可能なのでしょうか?
635 名前:デフォルトの名無しさん [2008/01/31(木) 09:50:20 ] >>634 workbookのsheetchangeでいちいち全セルのvalueを見回るようにするとか どっちにしろ重くなるけど
636 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 10:03:14 ] コントロール配列とかでイベントプロシージャ共有じゃだめなん? サブクラス化して変数持たせないと呼び出し元識別できないっけ?
637 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 14:24:13 ] >>635 >>636 コントロール配列が出来るなら…何とか出来るかもしれません。 どちらも自分には難しそうですが、またちょっと調べて作ってきます。 すいません、有難う御座います。
638 名前:デフォルトの名無しさん [2008/01/31(木) 21:27:29 ] ワークシートにファイルからオブジェクトを挿入し 同時に同じファイルにハイパーリンクを設定するマクロを作っています。 ひとまずマクロの記録をして、それを元に作成しようと考えたのですが、 記録したものを実行すると2行目、3行目でエラーが出てしまいます。 (改変したものでもエラーが出ます) 2行目はオブジェクトを挿入すると"=EMBED("○○","")"という数式?が追加されるので それを削除する工程です。 明日までには処理完了させねばならないのですが、何が問題なのか御教示下さい。 Sub Macro() ActiveSheet.OLEObjects.Add(Filename:="C:\test.pdf", Link:=False, DisplayAsIcon:=False).Select Selection.Formula = "" ActiveSheet.Hyperlinks.Add Anchor:=Selection.ShapeRange.Item(1), Address:="C:\test.pdf" End Sub
639 名前:デフォルトの名無しさん [2008/02/01(金) 11:16:45 ] 複数あるフォームのひとつを変数扱いで表示することは可能でしょうか。 下のサンプルのようなことをやりたいのですが 「オブジェクトはこのメソッドをサポートしてません」と出てしまいしまいます。 (UserForm1は勿論つくってあります) myForm+ピリオドでShowメソッドが出てこないので、ダメなのは解っているのですが。。 Sub sump() Dim myForm As UserForm Set myForm = New UserForm1 myForm.Show End Sub
640 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 11:48:31 ] >>639 UserForm と UserForm1 はベツモノのクラスだよ。Control と Textbox みたいな親子関係。 変数の型を UserForm1 にしてやればおk。
641 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 12:07:20 ] >>640 できました UserForm1型があるなんて知りませんでした。 親(userform)に子(userform1)を代入、みたいに考えてました・・ ありがとうございます。