1 名前:デフォルトの名無しさん [2007/12/12(水) 17:27:44 ] ExcelのVBAに関する質問スレです 質問前に 【 >>2-3 】 あたりを良く読むこと 前スレ pc11.2ch.net/test/read.cgi/tech/1189814602/
321 名前:デフォルトの名無しさん [2008/01/10(木) 23:26:15 ] 319さん ちなみにAユーザーフォームからNameに入力して 標準モジュールに定義してある構造体にそれぞれ格納した値をBユーザーフォームに出力したいのです。
322 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 00:19:38 ] 関数の呼び出し方と、関数の定義くらい書いたら? (先頭の、Sub/Function〜の行) 判断する情報が少なすぎる。
323 名前:316 mailto:sage [2008/01/11(金) 09:24:37 ] >>317 ありがとうございました(^▽^)
324 名前:デフォルトの名無しさん [2008/01/11(金) 10:14:12 ] VBAで実行中に「vbcritical」と共に、「400」って 数字が表示されるエラーはなんですか?
325 名前:デフォルトの名無しさん [2008/01/11(金) 14:21:13 ] msgboxやinputboxの外観をもっと可愛くしたい!
326 名前:デフォルトの名無しさん [2008/01/11(金) 14:33:31 ] スマン連投・・・ >>325 はどうでもいいです VBAを含むxlsを「共有」した途端に、そのvbaの挙動が微妙に変わってしまいました。 vbaの内容は、セル範囲をrangeで指定して、最下行にペーストするだけなんですが・・・。 なんか、ちょっとずれる感じなんです。ウィンドウの固定が原因かも。 共有と同時にVBAがロックされるので、原因の確かめようが無い状態(T-T
327 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 15:27:54 ] 質問の仕方すら何かズレてるみたいだし、しょうがないね。 そういう星の下に生まれたんだよ。
328 名前:326 [2008/01/11(金) 16:19:52 ] 共有の関係で、ペースト先の結合がバラバラになった模様・・・orz こればっかりはどうしようもないですかね 保護されたセルに書き込むというのはvbaで何とかなりましたが・・・
329 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 16:48:30 ] >>325 つAssistant
330 名前:デフォルトの名無しさん [2008/01/11(金) 18:07:53 ] >>329 なるほど、カイル君が使えるんですね・・・ ありがとうございます
331 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 19:37:54 ] >>328 このスレはオマイの進捗報告書かと
332 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:39:08 ] winxpでExcel2003を使用しています。 VBA-Editorからの実行は正常で、ワークシート上のコマンドボタンからの実行だと 時々、Excelが強制終了します。 コードは変えていないのに、上記の状況が発生しないときもあります。 バグだと思うのですが、発生しない時もあるので、原因がつかめません。 そんな事ってありますか?
333 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:49:06 ] >>332 あるよ。何か、以前にも出てたと思う。 クラスをインプリメントして、何かややこしいことしようとしてるヒトが居て、 エラーが出たり出なかったりするという話があった。基本的にはそれと同じ系統の問題では?
334 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 01:40:25 ] winxpでExcel2003を使用しています。 以下のコードは、都道府県ごとに1枚のデータシートを作成する処理なんですが、コードが1行づつどんな作業を意味しているのかがわかりません。 1行ごとにどのような処理をしているのかの説明をよろしくお願いします。長文で申し訳ありません。 Sub まとめ() Dim i As Integer 'カウンタ変数iの宣言 Dim n As Integer Dim MyS1 As Worksheet 'ワークシート型オブジェクトMyS1を宣言 Dim MyC As Worksheet Worksheets.Add before:=Worksheets("全国") ActiveSheet.Name = "data" Set MyS1= Worksheets("data") With Worksheets("全国") MyS1. Range(MyS1.Cells(1,1),MyS1.Cells(11,12))=.Range(Cells(1,1),.Cells(11,12)).Value End With i=12 For Each MyC In Worksheets If MyC.Name<> "data" Then n = 12 MyS1.Cells(i,1)=MyC.Name i=i+1 Do While MyC.Cells(n,2).Value<>"" MyS1.Range(MyS1.Cells(i,1),MyS1.Cells(i,12))=MyC.Range(MyC.Cells(n,1),Mc.Cells(n,12)).Value i=i+1 n=n+1 Loop End If
335 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 01:45:30 ] Sub まとめ()←死ね Dim i As Integer 'カウンタ変数iの宣言←死ね Dim n As Integer ←死ね Dim MyS1 As Worksheet 'ワークシート型オブジェクトMyS1を宣言←死ね Dim MyC As Worksheet←死ね ←死ね Worksheets.Add before:=Worksheets("全国")←死ね ActiveSheet.Name = "data"←死ね Set MyS1= Worksheets("data")←死ね With Worksheets("全国")←死ね MyS1. Range(MyS1.Cells(1,1),MyS1.Cells(11,12))=.Range(Cells(1,1),.Cells(11,12)).Value←死ね End With←死ね ←死ね i=12←死ね For Each MyC In Worksheets←死ね If MyC.Name<> "data" Then←死ね n = 12←死ね MyS1.Cells(i,1)=MyC.Name←死ね i=i+1←死ね Do While MyC.Cells(n,2).Value<>""←死ね MyS1.Range(MyS1.Cells(i,1),MyS1.Cells(i,12))=MyC.Range(MyC.Cells(n,1),Mc.Cells(n,12)).Value←死ね i=i+1←死ね n=n+1←死ね Loop←死ね End If←死ね
336 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 04:26:19 ] こんなひどい丸投げを久しぶりに見た・・・
337 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 05:08:47 ] replace "\n" "←死ね\n"
338 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 05:10:22 ] >>334 随分酷いコードだな VBA始めて3日くらいの奴が書いたコードだろ こんな下劣なコードの説明なんてまっぴらだぜ
339 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 14:25:58 ] ある意味、微笑ましいコードだなw VBならでは、とでも言うか。
340 名前:334 mailto:sage [2008/01/13(日) 14:39:48 ] わからないのなら、レスくださらなくて結構です。 わかる方のみでお願いします。
341 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 14:58:48 ] >>340 どうもすみません・・。
342 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 15:17:23 ] 要はググれということだ
343 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 15:18:17 ] >>340 判るんだけどさぁ、それを説明するのはスレ違いだし、そもそも野暮だろ?
344 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 15:56:32 ] >>340 は馬鹿女
345 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 16:01:13 ] 馬鹿かどうかは重要じゃない 大事なのは写真だ
346 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 16:06:19 ] >>340 1行ずつ説明が必要とかいう時点でおかしいと思わないか? Dim i As Integerにも説明が必要なのか?どのレベルでだ? Dimが何を意味して、Integerが何を意味するかまで解説するのか? あるいは内部でIntegerがどのように管理されているかまで必要か? 処理ってのはある程度の塊で説明するのが普通だろ? 「ここはクラスの平均点を計算する」みたいな感じでよ。 文法がわからないのであれば入門書買うなりググるなりすればいい。 ピンポイントなら教えてやれても全部教えろとか金取りたくなるわ。
347 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 16:07:50 ] 写真なんかはどうでもいい。 動画だ。動画をよこせ。
348 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 16:11:57 ] クリーチャーが「あたしはできる女なのよ!」とか自己紹介してる動画とかか?
349 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 21:03:19 ] 質問ですが、組み込みダイアログボックス(例えばApplication.Dialogs(xlDialogPrint).Show)の ウィンドウハンドルを取得するには、どうすればよろしいでしょうか? APIを使って行うと思いますが、Excel本体やユーザーフォームのウィンドウハンドルの取得であれば ググれば出てきたのですが、組み込みダイアログボックスのウィンドウハンドルの取得は 見つけることができなかったので、よろしくお願いします。
350 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 21:15:02 ] Spy.exe
351 名前:デフォルトの名無しさん [2008/01/14(月) 06:14:32 ] >>334 i=12 iに12を設定する For Each MyC In Worksheets MyCごとの処理です If MyC.Name<> "data" Then n = 12 MyC.Nameがdataと違うときは、nに12を設定する MyS1.Cells(i,1)=MyC.Name i=i+1 MyC.NameをMyS1 の(12,1)に設定して、iを13にする Do While MyC.Cells(n,2).Value<>"" MyCの(12,2)が空じゃなければ、以下の処理を繰り返す MyS1.Range(MyS1.Cells(i,1),MyS1.Cells(i,12))=MyC.Range(MyC.Cells(n,1),Mc.Cells(n,12)).Value MyS1の(13,1)から(13,12)に、 MyCの(12,1)から(12,12)を設定する i=i+1 n=n+1 Loop iを14に、nを13にして Do Whileに戻り、 MyCの(13,2)が空じゃなければ、また処理を繰り返す MyS1の(14,1)から(14,12)に、 MyCの(13,1)から(13,12)を設定する その次はMyS1の(15,1)から(15,12)に、 MyCの(14,1)から(14,12)を設定する というふうに、iとnは1ずつ大きくなり、MyCの(n,2)が空になると処理をやめる End If
352 名前:デフォルトの名無しさん [2008/01/14(月) 07:47:13 ] zoomtv.web.fc2.com/?&&1xbr0&0154%?&&1xbr7&0734%?&&1xbr0&0154%@ParadiseCityTV
353 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 08:10:03 ] >>351 やさしいにもほどがあるな
354 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 09:41:33 ] 教えたがりは一種の荒らし
355 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 10:18:46 ] 中途半端なヤツほど、簡単な質問に答えたがる。 結局、自分自身の頭の整理をしてるんだろうな。
356 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 10:53:34 ] >>353-355 君たち気持ち悪いよ。
357 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:21:53 ] このスレ気持ち悪いよ
358 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:31:16 ] このスレ気持ち悪いよ
359 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:48:28 ] このスレ気持ち悪いよ
360 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 13:42:05 ] おいおいどう見ても皮肉のレスだろ 求めてる答えがあれなら質問の意味がないと思うぞ
361 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 14:04:34 ] だれも回答しないから自分で書いたんだろうな
362 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:30:10 ] 質問スレって所で答えては駄目だと。じゃぁ、このスレの存在意義って何さ。
363 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:50:09 ] 教えたがり撲滅
364 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 18:58:48 ] >>362 ごきぶりほいほい
365 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 20:43:59 ] 要は面倒なことはやりたくないだけだろw
366 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 22:43:08 ] >>362 > 質問スレって所で そう、ここは質問スレであって、 自社商品を購入してくれた顧客相手のサポートセンターでも 受講料を支払ってくれた生徒相手のスクールでも無い
367 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 23:14:23 ] 要は面倒なことはやりたくないだけだろ
368 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 23:15:24 ] ここは無知な人間をののしるためのスレに決まってんじゃん
369 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 23:21:18 ] 昔はそれなりにレスが付いていたが、今となっては・・・ね
370 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 00:05:33 ] Excel VBA回答スレが必要だな
371 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 00:41:49 ] 質問です。 OS: xp pro EXCELバージョン :2003 RGB値を使いセルの塗りつぶしを行いたいと思い、 Cells(1, 1).Interior.Color = RGB(227, 229, 223)と記述しました。 しかし実際セルの色を見てみるとまったく違う色が塗られていました。 色を解析するソフトでその色のRGB値を調べてみるとRGB(204,255,204)でした。 もうわけわかりません、アドバイスお願いします。
372 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 00:51:12 ] >>371 RGB(255, 0, 0)なら赤になるか? なるならcells( i, j )にRGB( i, j, 0 )を入れたときに正しいグラデーションになるか? RGB解析ソフトでRGB(255, 0, 0)等が正しく読み取れるか? これくらい試してみてくれないか?
373 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 01:21:22 ] >>372 ありがとうございます、試してみました。 RGB(255, 0, 0)なら赤になるか?→ なりました。 cells( i, j )にRGB( i, j, 0 )を入れたときに正しいグラデーションになるか? → For w_row = 1 To 256 For w_gyo = 1 To 256 ThisWorkbook.Sheets(3).Cells(w_row, w_gyo).Interior.Color = RGB(w_row, w_gyo, 0) Next Next を試したところ正しいグラデーションにはなりませんでした。 参考画像です。ttp://nagamochi.info/src/up0296.jpg ツール→オプション→色で表示したい色を追加すると表示できました。 これ以外には方法はないのでしょうか?
374 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 01:25:01 ] >>371 エクセルは全てパレット管理。 パレットの色しか表せない。パレット以外の色をVBA等で選んでも近いパレットの色を使用させられる。 ↓ すなわちパレットを変更すればいい >ツール→オプション→色で表示したい色を追加すると表示できました。 >これ以外には方法はないのでしょうか? その表示できた方法をマクロの記録で記録してやればいい。
375 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 01:46:21 ] >>374 解決できました、ありがとうございました。
376 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 11:36:29 ] >>351 ありがとうございました!
377 名前:334 mailto:sage [2008/01/15(火) 11:42:32 ] >>351 そんなことを聞いているわけじゃありません、冗談は勘弁してください。
378 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 14:45:05 ] もっと言ったれw
379 名前:デフォルトの名無しさん [2008/01/15(火) 18:52:50 ] >>334 =377 ぷっっ て、ところだけど、何をききたいのか、言ってみたら。 折れが笑ってあげるからw
380 名前:379 mailto:sage [2008/01/15(火) 20:05:12 ] 解決しました
381 名前:デフォルトの名無しさん [2008/01/15(火) 20:49:36 ] >>380 おまい、アンカーもようつけんで、・・・www
382 名前:379 [2008/01/15(火) 20:52:47 ] >>380 は偽者です。
383 名前:379 mailto:sage [2008/01/15(火) 21:08:38 ] >>382 お前も偽物だろうがw
384 名前:379 mailto:sage [2008/01/15(火) 21:32:44 ] 俺は偽物ですよ でも>>380 は本物ですよ
385 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 01:17:42 ] >>379 >>>334 =377 いいえ、等しくありません。
386 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 10:06:13 ] >>373 どうでもいいが、RGB()関数って256を指定してもエラーにならないのか、知らなかった。
387 名前:デフォルトの名無しさん mailto:age [2008/01/16(水) 13:00:24 ] 項目とデータを含んだ2次元配列変数A,B たとえばA(30×2),B(100×2)があり、 Bの100個の項目のなかからAの項目30に該当するものをそのままAのデータに代入したい ということを考えています。ワークシート上で行う場合はlookup関数を使えばよいのですが マクロのままで高速に行う方法はないものでしょうか? ワークシート関数を使ったとしても一度ワークシートにデータを書き出さなければ つかえないのでしょうか?色々調べても分からなかったので どなたか御教示頂けると嬉しいです。
388 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 13:26:11 ] >>387 ん? というか、既に処理を書いてるんだったら、 VBAで処理してからワークシートに吐いた方が、そりゃ若干早いはずだと思うが。
389 名前:デフォルトの名無しさん mailto:age [2008/01/16(水) 13:46:00 ] あ、すみません。Bの項目、データは揃っていますが、Aは項目だけで B100個の項目の一部でAの30個の項目と重複しているものを検索、抽出して Aの該当する項目のデータとして代入しようとしています。 ワークシートの上でやるのなら、lookup関数をつかえば良いのでしょうが ワークシートを一切いじらずに配列の内部処理だけで同様な操作を高速に できないかと悩んでいる次第です。
390 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 14:21:54 ] >>389 Dim i, j As Integer Dim AKey(30), AValue(30), BKey(100), BValue(100) For i = 0 To 29 For j = 0 To 99 if AKey(i) = BKey(j) Then AValue(i) = BValue(j) Next j Next i こういう事かな? この程度の個数ならワークシートでやってもほぼ一瞬だと思うけど。
391 名前:デフォルトの名無しさん [2008/01/16(水) 17:41:03 ] 質問。 セル[A2:C2]に英語・数学・国語の得点が入っている。合計点を計算し、 セル[D2]に入れるマクロを作成しなさい。 また、合計点が270点以上の時には「大変よくできました」、 180〜269点のときには「よくできました」、 180点未満のときには「がんばろう」というメッセージをセル[E2]に表示しなさい。 英語の得点は90点 数学の得点は85点 国語の得点は100点 とする。 よろちくね。
392 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 18:03:29 ] >>391 それは質問とは言わないような・・・。 Sub Macro() Range("D2") = Range("A2") + Range("B2") + Range("C2") Select Case Range("D2") Case Is >= 270 Range("E2") = "大変よくできました" Case Is >= 180 Range("E2") = "よくできました" Case Else Range("E2") = "がんばろう" End Select End Sub
393 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 19:17:08 ] デフォルトプロパティの省略はやめましょう 少なくとも他人にコードを渡すときは
394 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 21:49:52 ] 2007で作ったマクロは何であんなに重くなるんだ。 一旦5.0で保存したら軽くなったんだけどまともに動かなくなるし。 これから2007が標準になっていくのかと思うと憂鬱だ。
395 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 21:59:19 ] うちの会社、未だに2000使ってて、GJ!!! 自宅の自前PCも、2000のまま。サポートし続けろよ>MS
396 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 22:02:13 ] Office 2000 メインストリーム サポート : 2004 年 6 月 30 日終了 延長サポート 期間 : 2004 年 7 月 1 日から 2009 年 7 月 14 日まで (修正プログラム サポートには最新のサービス パックがインストールされている必要があります)
397 名前:デフォルトの名無しさん [2008/01/17(木) 10:00:49 ] >>390 ありがとうございます。 やりたいことはそういうことなのですが、 その書き方だと要素が膨大になった時は明らかに遅くなると思います。 VBA上で高速に行う書き方などご存知ありませんでしょうか?
398 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 10:22:24 ] >>397 アルゴリズム的な話なら、手法はいろいろあるが、「VBA上で高速に行う書き方」ではなく 「VB言語で高速に行う書き方」になるので、例えExcelでやるとしてもスレ違いだよ >>2 ★3★4
399 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 11:14:43 ] >>397 参照される側(ここではB)をCollectionにすればO(n)なるよ。 Dim i As Integer Dim AKey(30), AValue(30) Dim B As New Collection For i = 0 To 29 AValue(i) = B.Item(AKey(i)) Next i
400 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 11:51:13 ] 各都道府県に分けられているデータをdataという名前のシートに集計するプログラムを作成したいです。 簡単に言いますと1つのシートに47個のシートを入れたいです。 よろしくお願いします
401 名前:デフォルトの名無しさん [2008/01/17(木) 12:51:36 ] >>392 さん ありがとうございます。
402 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 20:37:20 ] >>400 >1つのシートに47個のシートを入れたいです。 意味不明 1つのブックに47個の県別シートを作りたいという意味なのか? 逆に県別に47個あるシートから1つのdataって言う名前のシートに集計したいってことなのか? どのセルに何をどういう条件で集計するのかも書いていない。
403 名前:デフォルトの名無しさん [2008/01/17(木) 22:54:26 ] 質問です、VBA構造体配列を初期化したいのですがどうすればいいですか? 調べたのですがよくわかりませんでした。
404 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 23:16:07 ] 初期化用の構造体を作って代入
405 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 00:46:52 ] 初期化用関数作る
406 名前:デフォルトの名無しさん [2008/01/18(金) 01:31:22 ] 403です。 404.405さん以外のやり方を探しているのですがEarseの使い方やZreoMemoryの使い方がわからないです
407 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 02:43:12 ] >Earseの使い方やZreoMemoryの使い方がわからないです そりゃそうでしょう、そんなものありませんから。
408 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 08:27:07 ] >>403 その辺の仕様はVB6と一緒です つまり>>2 ★3★4
409 名前:デフォルトの名無しさん [2008/01/18(金) 11:59:04 ] VBAを実行する前に、このブックが共有されているかどうか 調べて、結果を返す方法は無いでしょうか。
410 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 12:20:06 ] >>409 Workbook.MultiUserEditing で調べられるけど、これはVBAだからダメってこと?
411 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 12:25:45 ] VBA実行してからまたきてね♪
412 名前:デフォルトの名無しさん [2008/01/18(金) 12:31:44 ] ありがとうございます! いえ、multiuserediting の存在を知りませんでした・・
413 名前:397 mailto:sage [2008/01/18(金) 14:55:18 ] >>398 ,>>399 さん、判りました。自分でもまた試してみます。 ありがとうございました。
414 名前:デフォルトの名無しさん [2008/01/18(金) 18:11:23 ] 使えねーな
415 名前:デフォルトの名無しさん [2008/01/18(金) 19:41:23 ] Worksheet_Changeで対応できない書式の変更にリアルタイム反応するためユーザーが入力した書式などをリアルタイム監視するプログラムを作成したところ、終了条件の問題に突き当たり処理に悩んでます。 '----------------------------- Private EndFlg As Boolean Sub Worksheets_Activate EndFlg = False Call 監視処理 End Sub Sub Worksheets_Deactivate EndFlg = True End Sub Sub 監視処理 Do (処理) DoEvents Loop Until EndFlg = True End Sub '------------------------------ このようなものが、ほとんどのワークシートに書いてある状態です。 Loop Until EndFlg = True の直後にメッセージボックスを設け確認したところ、Worksheet_Activateのあるシートに移動するとその場では終了せず、Activateのないシートに移動した瞬間に終了します。 たとえばActivateのあるシートA、BとActivateのないシートCがある場合 A→C、B→Cは正常な終了が確認できるのですが A→B、B→Aは終了メッセージが出ません。 A→B→A…を延々繰り返したあとにCを選択すると、終了メッセージがA⇔Bした回数に比例して複数出るため多重起動であると断定できました。 Activateのないシートをはさまずに開放する方法ありませんでしょうか。
416 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 20:16:17 ] TextBox1の入力に応じてlistboxの内容を決め、 クリックされた項目とTextBox1の入力を考慮して TextBox2の内容を決めるということをやろうとしています。 後述のように書こうとしました。 Private Sub TextBox1_Change() '入力に応じてワークシートからhaniにアドレスを取り出す 以下略 With UserForm1.ListBox1 .ColumnCount = 1 .RowSource = hani.Address End With End Sub Private Sub ListBox1_Click() '先ほどの入力とリストの結果からテキスト2の内容を決める。 UserForm1.TextBox2.Value = 以下略 End Sub このようにするとPrivate Sub TextBox1から Private Sub ListBox1_Click()に受け渡されるのは haniの内容だけで、それ以外の変数を渡そうとしても 上手くいかず困っています。callの構文を使えば良いのでしょうか? 色々調べてみても判らずどなたかアドヴァイス頂けると嬉しいです。
417 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 22:25:58 ] 初歩的ですみません。 VBAで、あるセル範囲にある数式の答えを出力するにはどうすればいいんでしょうか? Range("A1:A5")="b2/2+b5"みたいにすると数式がそのまま出力されるし・・・
418 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 22:31:50 ] >>417 それが初歩的だとわかるぐらいならじゅうぶん中級車さ
419 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 22:32:42 ] >>415 ループが入れ子になってると思う。 監視処理を各シートにを書くんじゃなくて、どこか一枚に Sub 監視処理 Do if !SheetA.EndFlg(0) = False Then (処理) if !SheetA.EndFlg(1) = False Then (処理) ・・・ DoEvents Loop Until 監視終了=True End Sub とか何とか書いて、実行しておけばいいんじゃないかな? >>416 言ってる意味がよく判らないけど、 TextBox1_Change()内で使ってる変数を、ListBox1_Click()内でも使いたい、 と言う事なら、グローバル変数でも使えばいいんじゃないの? >>417 Range("A1:A5") = "=b2/2+b5"
420 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 23:11:24 ] >>415 DoEvents ステートメントは、ウィンドウズメッセージとイベントプロシージャの処理が終わるまで 戻ってこないから、多分、AのDeactivate⇒即座にBのActivateが走ってる状態。 ちょっと構造を見直した方がいいかもね。
421 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 17:14:35 ] OS XP、Excel2003 普段は、VBエディタから 挿入 → 標準モジュール で Module** といったファイルを作成してコードを書いています。 このModule** というファイルを自分の好きな名前にするのにはどうしたら良いのでしょうか?