1 名前:デフォルトの名無しさん [2007/12/12(水) 17:27:44 ] ExcelのVBAに関する質問スレです 質問前に 【 >>2-3 】 あたりを良く読むこと 前スレ pc11.2ch.net/test/read.cgi/tech/1189814602/
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)を代入、みたいに考えてました・・ ありがとうございます。
642 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 12:26:35 ] >>641 フォーム型のクラスを継承するイメージかな。 当然、フォームの(オブジェクト名)を変更すると、クラス名(変数型)も変わるよ。 一旦、オブジェクトを作成してから、userform型に userform1を代入するのは間違いじゃない。 userform1、userform2・・・と型が増えたときに、userform に代入すれば、どれでも操作できる。 Control と Textbox、Label、Combobox・・・ の関係と似たようなもんだよね。
643 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 12:51:24 ] >>642 639=641です userform1型を使うのはできましたが、これだと myform変数にuserform2を代入できないことがわかりました。(型が違うため) このような場合どうしたらよいでしょうか。 >userform1、userform2・・・と型が増えたときに、userform に代入すれば、どれでも操作できる。 このやり方を知りたいのですが。(繰り返しですみません)
644 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 13:00:34 ] 643です たびたびすみません、object型を使ったらできました! これで合ってるでしょうか。
645 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 14:25:37 ] >>644 ↓こういう作りになってれば、少なくともエラーにはならないと思うんだけど・・・?(Excel2000) Dim a As UserForm1, Dim b As UserForm2, Dim c As UserForm Set a = New UserForm1 Set b = New UserForm2 Set c = a Set c = b Object型は、なるべく使わないに越した事はないよ。ダメだという意味じゃないけど。
646 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 15:32:34 ] >>645 やってみましたが、c.Showでエラーになってしまいます。 (メソッドをサポートしません)
647 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 16:08:12 ] >>646 あー、そういう意味か。 申し訳ない、代入した後は、代入した先の変数型の持ってるメンバしか使えないよ。 Control 型に、ラベルやチェックボックスを入れても.Caption を設定できないのと同じこと。 >myForm+ピリオドでShowメソッドが出てこないので、ダメなのは解っているのですが。。 仰るとおり、Userform 型は、.Show() をサポートしていない。 異なるクラスで、共通のメソッドを呼びたいなら、Objectを使うしかないです。 あるいは、インターフェイス用のクラスを作って Implements する方法があるけど、 フォームに使うのは怖いので、特に事情が無い限りはやめた方がいいと思います。
648 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 16:43:27 ] >>647 了解です、今回はobjct変数でやることにします。 (やりたいことはメッセージ代わりのフォームを打ち分けたいだけなので) 何度もお手数をとらせ申し訳ありませんでした。
649 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 23:54:14 ] VBってオブジェクトと初期インスタンスの名称が同じだって所が半端な感じだよね
650 名前:デフォルトの名無しさん [2008/02/03(日) 16:39:17 ] os:xp excel:2003 VBAで指定列からAを検索し、発見したら隣のセルに0を入れるマクロを組みたいのですが、組み方がVBA初心者の為わかりません。 (例) L列に、A、B、C、D、E、Fとランダムに文字が入っていて、 文字Aを検索し、発見したら隣のI列に値0を入れるというマクロです。 Sub Search() Dim A As String Set A = Worksheets("Sheet1").Cells.Find("A") If A Is Nothing Then ActiveCell.Offset(0, 1).Value = 0 End If End Sub と自分で考えてみたのですが、Aがあった時、、、、 とコードが書けないです。 大変困っているので、ご教授頂けないでしょうか? 長文失礼しました!
651 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:19:53 ] 突っ込みどころが多すぎ 全部に突っ込むの面倒なので正解書いておく Sub Search() Dim A As Range Set A = Worksheets("Sheet1").Columns("L").Find("A") If Not A Is Nothing Then A.Offset(0, 1).Value = 0 End If End Sub うわ、プロシージャ宣言やEnd Ifなど、間違いようのない部分以外、全部間違ってるじゃんw
652 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:35:44 ] notつけろの一言だけで済む話を教えたがりはこうやるわけだ
653 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:53:17 ] >>652 not付けました 実行結果は以下の通りです┐(´ー`)┌ --------------------------- Microsoft Visual Basic --------------------------- コンパイル エラー: オブジェクトが必要です。 --------------------------- OK ヘルプ ---------------------------
654 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:44:54 ] For n = 1 to 3 step 1 msgbox ("n nを表示したい場合はmsgbox ("n このあと何するのか分かる人いたら教えて下さい
655 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:57:25 ] msgbox ("n")
656 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 02:52:03 ] msgbox n
657 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 03:34:18 ] ("n")バーカ
658 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 13:38:43 ] >>657 pc11.2ch.net/test/read.cgi/tech/1197881068/276
659 名前:デフォルトの名無しさん [2008/02/05(火) 10:49:33 ] 標準モジュールから、ユーザーフォームのテキストボックスに、 文字を表示させるにはどうすればいいでしょうか 以下では、ダメでした。 Sub test() If Range("A1").Value = 1 Then TextBox1.Value = "ぼぼぼぼぼぼ" End Sub
660 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 11:22:30 ] だから、どうダメだったか位書こうぜ。 つーか、エラーメッセージくらい自力で理解しろよ。