1 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 15:42:51 ] ExcelのVBAに関する質問スレです 前スレ pc11.2ch.net/test/read.cgi/tech/1219673793/ ★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。 ★2 ExcelのVBA以外の部分に関する質問はNGです。 但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。 ★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。 VBAとは、『Visual Basic for Application』の略で Application ├Workbooks |└Workbook | ├Worksheets | |└Worksheet というApplication以下のオブジェクトを、VB言語で操作するものを指します。 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。 ★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。 ★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。 ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。 ★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
285 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 08:29:17 ] >>283 サブルーチンなり関数なりに分けましょう。
286 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 10:25:34 ] >>284 うん、データはAccessに入れて、ほとんどの操作はExcelのユーザーフォームを使うような感じで ワークシートは大雑把に全体を見るためにあってデータを追跡したり、試算ができたりするようなやつ >>285 最初の頃、ほとんど直観でやってたから今になって無駄を省くために自分のレベルでできそうなところはやってる。 でもクラスモジュールで何ができるのかとかが気になる。
287 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 12:51:23 ] >>286 ユーザインタフェースのプログラムを何とかしたいということ?
288 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 13:11:23 ] >>287 まぁ、そういうことなのかな。 入力チェックとか、動作は同じだけど入るデータが違うとか結構あって。 コピペして改変しながら作ってたけど、完成してみるとコードがぐちゃぐちゃになってしまった。 運用は始めてて、今のところ作業者の不満は出てないけど将来的な拡張や保守のためにもう少し勉強したい。
289 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 14:19:59 ] >>288 UI部分はごちゃごちゃしてても仕方ないんじゃないの。 データさえしっかりしてたらいいよ。
290 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 15:09:44 ] >>288 誰もが一度は通る悩み。 モジュールの独立性をあげ過ぎても使い勝手悪くなるけど。 モジュール結合度とかでググってみるといいよ
291 名前:デフォルトの名無しさん [2008/12/29(月) 18:53:44 ] 100円 500円 250円 ↓ マクロ発動 100円○ 500円 250円 もっとも小さい数字を選んでその数字の横に ○印をつけたいのですが なかなかうまくいきません どういった関数を使えばいいでしょう?
292 名前:291 [2008/12/29(月) 19:08:00 ] xp 2003
293 名前:デフォルトの名無しさん [2008/12/29(月) 21:35:37 ] >>291 さん こんな感じでどうですか? Sub mini() Dim mymin mymin = WorksheetFunction.Min(Range("a1:a3")) '対象データのの範囲 Cells(4, 1) = mymin & "円○" End Sub
294 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 22:24:22 ] 約4000のテキストファイルをそれぞれのワークシートにインポートしたいんだけど、 テキスト名が 1001.txt、1002.txt、1004.txt といった具合に連番じゃないので、下のプログラムだと1003.txtが存在しないので 当然エラーが発生します。都合上、ファイルの名前を連番にすることはできないんです。 理想としては、存在しないファイル番号は無視して次のファイルをインポートするように したいのですが、イイ案が浮かびません。。 このエラーを回避する手段はありますか? 環境はXPの2003です。 Sub Macro1() Dim bng As Integer For bng = 1001 To 9996 ActiveWorkbook.Worksheets.Add With ActiveSheet.QueryTables.Add(Connection:= _ "TEXT;D:\Program Files\ootori\data\" & bng & ".txt", Destination:=Range("A1")) .Name = "1001_1" .FieldNames = True 〜 中略(マクロの自動登録で書かれた部分) 〜 End With Next End Sub
295 名前:294 mailto:sage [2008/12/29(月) 22:31:54 ] マジですいません。。事故解決ですorz ググり直したら簡単に出てきやがった・・・ エラーを回避する便利なプログラムがあったのね
296 名前:デフォルトの名無しさん [2008/12/29(月) 22:34:16 ] 勘違いしてました 訂正です Sub mini() Dim mymin Dim myjuni Dim datasuu myjuni = 1 datasuu = 3 mymin = WorksheetFunction.Min(Range("a1:a3")) '対象データの範囲 For i = 1 To datasuu - 1 If Cells(myjuni, 1) > Cells(i + 1, 1) Then myjuni = i + 1 End If Next i Cells(myjuni, 1) = mymin & "円○" End Sub
297 名前:デフォルトの名無しさん [2008/12/29(月) 22:36:55 ] 296は293の訂正です
298 名前:デフォルトの名無しさん [2008/12/29(月) 22:43:48 ] VBAのステップ実行時に、ウォッチでRangeを見てみました。 すると色々あるわけですが、型情報の意味がさっぱり分かりませんでした。 この情報はどんなルールで何を表現しているのでしょうか? たとえば Variant/Double だと、/の手前はVariantで、これは任意の型だと思うんです。だから/の後ろで、実際には今Doubleが入ってるよ、みたいな感じ? でも、Variant/Object/Range見たいな奴もあるし。。 (これはVariantでObjectでその実態はRangeということかな?) Worksheet/Sheet1なんていうのもあります。 (これはなんだろ??Sheet1ってのは型なんですかねぇ。ユーザがシートをガンガン追加したらSheet4,Sheet5...ってな感じで型が増える?)
299 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 23:19:00 ] ああ俺の作ったやつon error resume nextだらけだ、心配になってくるぜ。
300 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 23:48:10 ] 別に、エラーをインラインで処理するのはおかしくない。 トラップすれば処理できているとは限らないのと一緒。 論理的破綻はどちらでも起こる。
301 名前:296 mailto:sage [2008/12/30(火) 00:08:18 ] >>291 さんへ たびたびすいません こんなのありました large関数 (指定された範囲データから大きい方から任意の数字番目を返す) small関数 (指定された範囲データから小さい方から任意の数字番目を返す)
302 名前:デフォルトの名無しさん [2008/12/30(火) 00:58:44 ] VBAで特定の文字列を検索して、その文字列が見つかったらオートシェイプ(msoShapeFlowchartAlternateProcess(角がRの四角)、透明) をその文字の上に配置して、その文字を囲っているように見せたいと思っています。 そこで、文字列の幅を求め、その文字列が入っているセルの位置と、その文字列の幅から、 オートシェイプを配置すべき座標を計算することを考えています。 フォントは固定幅で考えております。 今、自分が分からないのは、 (1)文字の幅の単位(cmとかインチ?ピクセル??) (2)文字列の長さをcmとかインチで正確に取得する方法 (関数?VC++でもこの手の問題にぶつかったことがあるけどそちらでは上手く取れなかった覚えがあります。VBAは高機能なので正確にゲットできると期待!) (3)オートシェイプの座標系の単位(cmとかインチ?ピクセル??) (4)文字列の長さの単位と、オートシェープの座標系の単位が違うのなら、それを変換してくれる関数あるいは公式 何方か教えていただけますですか? (自分でも継続して調べます。) よろしくお願いします。
303 名前:デフォルトの名無しさん [2008/12/30(火) 04:13:54 ] シェイプの長さは テキストのFont.Size掛ける文字数で シェイプの位置は セルの.Top .Leftで 目的のセルはFindと FindNextで あとは細かい調整で いいみたい
304 名前:デフォルトの名無しさん [2008/12/30(火) 08:28:53 ] VBAでマクロの同時起動って出来ますか?タイマーを2つ並列に走らせたいのですが…
305 名前:デフォルトの名無しさん [2008/12/30(火) 11:28:03 ] >>304 同時起動は多分出来ないけど、WindowsAPI使ってタスク複製するかスレッド使えば出来ると思う。 VBAではやり方は良くわからんのだけど、 "Excel VBAによるWin32 APIプログラミング入門" この辺を見ればよいと思う。 タスク複製だのは結構癖があるからがんばって。 あと、どういうタイマーなのかわからんが、タイマ割り込みみたいに定期的に何かをやらせる場合、並列にすると旨く動かなくなる可能性があるので、きちんと実行時間を計測した方がいいよ。
306 名前:302 mailto:sage [2008/12/30(火) 17:09:11 ] >>303 ありがとうございます!!! 自分でも探したんですけどさっぱりその手の情報がなくて(;_;) 非常に助かりました。本当にありがとうございました!
307 名前:304 [2008/12/30(火) 18:30:26 ] ≫305 ありがとうございます。教えて頂いた書籍を調べてみます。 タイマーと言っても、あるAタイマーが30〜1にカウントダウン中に別のBタイマーを同時に走らせる、みたいな単純なモノです。実現可能でしょうか?
308 名前:291 [2008/12/31(水) 14:49:44 ] >>301 ありがとうごさいます やってみます
309 名前:デフォルトの名無しさん [2008/12/31(水) 22:39:19 ] Select Case…End SelectってC言語のswitch相当だと思うんですけど、breakって無いんですか? Select Case exp Case 0 IF xxx = FALSE THEN Break ←これ!!!! End IF End Select みたいな。
310 名前:デフォルトの名無しさん mailto:sage [2008/12/31(水) 23:29:23 ] 無い
311 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:31:04 ] >>309 そもそもbreakしてどこへ行くつもりだ
312 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:36:55 ] >>310 ありがと >>311 Selectの外に決まってんじゃん。。。
313 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:41:39 ] >>312 それがしたいだけなら、どうにでもなるだろと小一時間…
314 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:41:51 ] 仕方なくGotoだな
315 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:44:16 ] >>314 ちょ、おま、そんな最終手段をっ!
316 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:44:45 ] >>313 どうすんの?
317 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:46:24 ] >>316 Select Case exp Case 0 IF xxx THEN 処理 End IF End Select
318 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:48:24 ] 抜ける方法を聞いてんの。 わざわざ論理を逆にして書けば良いじゃんとか 抜けた後にある処理をサブルーチンにしてあげれば良いじゃんとか そういう構造を縛るしか手が無いんですか?それじゃ言語としてどうだろ あとさぁ なんで if() {
319 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:48:59 ] はあ〜書いちゃった。。 じゃ、問題。何を書きたかったんでしょうか?
320 名前:317 mailto:sage [2009/01/01(木) 00:49:51 ] ちょっと説明不足かな 要するに、breakで外に出るのもスルーするのも同じ事じゃねーのって意味 Ifの条件がFalseの時にbreakしたいんなら、Ifの条件がTrueの時だけ処理すればいい
321 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:53:31 ] 答え発表! ヒューヒュー あとさぁ なんで if() { } else if() { } else if() { } … みたいにELSE句にIFが書けないんだろう 欠陥だろ。。 でした。 >>320 そりゃかけなくは無いだろうけど構造上書きにくい場合もあるじゃん。 なんでキーワードやステートメントを再発明してまで、不便なってんの!マイクロソフト!!って思うじゃん。
322 名前:デフォルトの名無しさん [2009/01/01(木) 00:53:35 ] go away
323 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:57:44 ] >>322 おや?外れたのかな?(^^) 勘がニブいんですねw
324 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 01:04:13 ] >>318 アホなのか・・・
325 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 01:06:26 ] > そりゃかけなくは無いだろうけど構造上書きにくい場合もあるじゃん。 ねーよ。
326 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 01:09:56 ] 抜ける方法を聞いただけでこの荒れようww VB厨はばかだなぁww 書き方を変えれば良いじゃんとか・・それは変えなきゃ対応できない言語ってことだろ。 高級言語でしょ?書き方縛ったらそこでもう言語としてだめでしょ。 アセンブラじゃないんだからさぁ。 IF THEN ELSE IF THEN ELSE IF THEN ENDIF ENDIF ENDIF うわっ。だっさ。最悪。 書き方変えればできますだったらjmpとかjzとかjnzとかjcとかだけでも出来るよww
327 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 01:14:31 ] >>321 If ... Then ElseIf ... Then ElseIf ... Then End If
328 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 01:27:43 ] >>327 あ!ありがとうございます。 あったんだ。
329 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 01:48:45 ] >>328 意外と素直w
330 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 02:10:17 ] あんまり笑わせるなよ。 VB分かってないやつがVB馬鹿にしてたのかよ。orz
331 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 02:11:14 ] 明らかに分かってないのに、構造構造言いたがるのなんて、 情報系の一年生くらいだろ。
332 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 02:21:16 ] >>330-331 ゴメンね(´・ω・`) ついイライラしてたから
333 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 02:30:42 ] 厨とか言っちゃうやつは例外なくアホ
334 名前:デフォルトの名無しさん [2009/01/01(木) 13:53:37 ] 結局、Excel2008ではVBAが使えなくなるのですか? C#への布石ですか?
335 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 17:12:57 ] Excel 2008でVBAが使えないのは事実らしいが、 Excel 2008はMac版。移行先は、C#ではなくAppleScript。 しかも、次のバージョンで復活することが発表済み。 www.microsoft.com/japan/presspass/detail.aspx?newsid=3439
336 名前:デフォルトの名無しさん mailto:age [2009/01/02(金) 08:30:00 ] このスレは、Excel の VBE で作るフォームについての質問はスレ違い? スレ違いでしたら誘導をお願いします。
337 名前:263 mailto:sage [2009/01/02(金) 09:22:34 ] >>336 もしかしてデザインの話か そんな誘導先ないだろ
338 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 09:23:06 ] 名前消し忘れた恥ずかしい
339 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 13:45:39 ] どうせなら、VSTA2.0の情報とかを書けばいいのに >>334-335
340 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 14:03:27 ] あれ本当にOfficeに乗っけるの?
341 名前:デフォルトの名無しさん [2009/01/02(金) 14:17:09 ] >>335 よく事情がわからんが、今必死で覚えてるEXCEL VBAが数年先に使えない、役に立たない言語になる可能性もあるってことですか?
342 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 15:03:36 ] そう言われ続けて何年も経つが、未だに無くなる気配すらないのがVBA。 この先もそれが続くと信じて安穏としているのは間違っているだろうが、 数年でなくなるような存在でもない。
343 名前:デフォルトの名無しさん [2009/01/02(金) 16:48:02 ] Excel VBAによるWin32 APIプログラミング入門 この本って絶版でもう購入不可ですか?
344 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 16:58:06 ] 絶版です
345 名前:336 mailto:sage [2009/01/02(金) 18:06:59 ] >>337 そうですか…了解です。 スレ違いを承知で 1 つだけ質問。 Excel のデザインで使うフォームのコントロールの仕様って VB6 と 同じなんですかね? (コンボボックスでダブルクリックのイベントが起きないので調べたら、 VB6 ではスタイルに 1 を設定しないと起きない、とあったので…。 ちなみに Excel VBA ではスタイルに 0 or 2 しか設定不可。 ダブルクリックのイベント絶対起きないじゃん…。)
346 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 00:31:02 ] ダブルクリックのイベントが発生しない が意味不明 で、絶版かどうかも、役に立つかも、全く見当が付かないが、折れの持っている 「Excel VBA はじめてのプログラミングレッスン1」 技術評論社 H12.8.21初版 に第10章 入力画面を使ってみよう を読んでみたwww ユーザーホームのデザインという用語が使われているが、この本では ダブルクリックをする場面は、VBE上コンボボックスのことで、 excelシート上のコンボボックスではないよ。シート上ではダブルクリックは 使わないものと思っている。
347 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 00:58:20 ] >>346 セルのダブルクリックでセルの値等をコピーする、といったマクロも組むから 別にユーザフォーム専用って訳でもないと思うが
348 名前:336 mailto:sage [2009/01/03(土) 02:30:30 ] >>346 コンボボックスを使いたい場所はユーザーフォーム上で、 ワークシート上ではありません。 というかワークシート上にもコントロールを置けたんですね。 で、試してみると…コンボボックスのプルダウンメニュー表示中のダブルクリックで ダブルクリックのイベントが発生しました。なんで? 目的はユーザーフォーム上にあるコンボボックスでダブルクリックのイベントを 取得することですが、無理そうなので、擬似的にダブルクリックを検知することにしました。 方法は下記です。 (1) マウスダウンのイベントが発生した時の時刻を Timer 関数で取得して モジュール変数に退避する。 (2) マウスダウンのイベント発生都度、退避した時刻と押した時刻を比較する。 (3) (2)の時刻差が 0.5 秒以下の場合にダブルクリックのイベントでしたかった 処理を実行する。 コンボボックスでダブルクリックのイベントを拾った後の使い道は、 (1) True ⇔ False の切り替え(VBE のプロパティ設定画面では出来る!) (2) コンボボックスより詳細なリストが表示できるフォームの呼び出し を考えていました。 上記を応用すれば、トリプルクリックや4回クリックなどにも対応できそうです。 解答してくださった方、ありがとうございました。
349 名前:デフォルトの名無しさん [2009/01/03(土) 03:55:36 ] トリプルクリックにまで対応できるのは素晴らしいけど コンボボックスをシングルクリックで 透明なアイテムが一番上に(コンボ上に)きて、その そのアイテムをシングルクリックってすると じゃ駄目なのかな
350 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 04:52:18 ] www.amazon.co.jp/VBA ユーザーのためのWin32-APIプログラミングガイド-大村-あつし/dp/4871936848/ref=sr_1_1?ie=UTF8&s=books&qid=1230925887&sr=1-1
351 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 04:53:58 ] オレのExcel、コンボボックスにダブルクリックイベント有るけど みんなのには付いてないの? バージョン Excel2003
352 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 06:03:46 ] たぶん コンボボックスのプルダウンメニューの部分のダブルクリックを言っているんだと思う
353 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 13:26:28 ] オリジナリティ溢れるUIほど迷惑なものはない
354 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 16:11:29 ] >トリプルクリックや4回クリックなどにも 何考えてんだ?
355 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 16:20:56 ] V2C には6回クリックまであるぜ
356 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 17:11:00 ] API使えば、ダブルクリックの認識の間隔を取得できるから、 0.5秒決め打ちよりそれを使ったほうがいいと思う。 そういう話をしている場合でないとは思いつつ。
357 名前:デフォルトの名無しさん [2009/01/03(土) 19:44:02 ] 質問です。 セル上で、右クリックをすると、編集ダイアログ?が出てくるのを出ないようにしたいのですが どう設定のマクロを書いたものか、よろしく。 右クリックイベントによってコピーモードにしているのに、余分な作業を するのを防止したいので。
358 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 21:18:27 ] マウスの右ボタンを殺す
359 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 02:39:56 ] BeforeRightClickイベントの第二引数にCancelがあるだろ
360 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 13:15:18 ] サーバサイドでの帳票の生成にVBAを検討していて、 安定性、処理性能、MSのライセンス違反等を懸念してますが、 何か懸念事項やアドバイス等ありますでしょうか?
361 名前:デフォルトの名無しさん [2009/01/04(日) 14:49:46 ] 論理で「Aでないか、Bでないか、Cでない」ならの類なのですが、 列5 列6 列9なら、イベント処理し、「そうでないなら」、exitする の 「そうでないなら」はどう書いたものでしょうか?
362 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:11:17 ] >>361 色々あるだろうけど 普通は if elseif elseif else
363 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:18:49 ] >>357 ワークブックのSheetBeforeRightClickイベントでcancel=trueにしないとだめだよ
364 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:21:38 ] >>361 >>362 だとイベント処理のコードが重複するから If 列5 Or 列6 Or 列9 Then イベント処理 Else Exit EndIf
365 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 23:41:35 ] まあOr使っちゃうのが一般的かつ簡単ではあるが 条件1つずつでネストした方が速い 何故なら、例えば列5に一致するならイベント処理は行うので 列6、列9に一致するか否かは判定する必要が無いのに >>364 では毎回全てを判定した上で論理演算してしまう 複数条件でAnd、Orを使わないのは、コード最適化の常套手段 逆に速度気にせず手を抜きたいなら、カンマ区切りで 複数条件指定できるSelect Case使う方がお手軽だろ Case 列5, 列6, 列9 イベント処理 Case Else Exit 因みに論理演算(>>364 )の処理時間を100とするなら、Ifのネストは70、Select Caseは105くらいだ とは言え最近のPCなら、ループで何十、何百、何千万回とやってコンマ何秒かの差が出る程度だけどな
366 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 23:56:00 ] あれ? VBって or で連結させた場合、順次判定して、hitしたら後の判定スキップじゃなかったっけ。 勘違いだったらごめん。
367 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 00:00:55 ] ショートサーキットはしないよ まあ,とりあえず素直に書いといて最適化は実際に支障が出てから,が基本だけど
368 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 12:09:49 ] >>365 Select Caseが105って一概には言えないだろ? >Case 列5, 列6, 列9 これショートサーキットだから列5がTrueなら列6と列9は評価しないし。 >>366 ショートサーキットするのはVB.NetのOrElseとかAndAlso 今はVB.Netって言わないんdっけ?
369 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 13:14:41 ] >>368 Select Caseが105ってのは、実際にカウンタ変数のMod 10に対する 条件分岐のみのループの処理時間を計った結果 それぞれ500万回*3回の平均から算出した値 そもそもが単一条件の場合でも、Select CaseはIfより遅いからね
370 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 14:13:14 ] セル、グラフ、フォーム等の情報を利用してフォーム形成することはできますか? 例えば 名前 値 ラジオボタン という行が連なるフォームを作る場合、 グラフの凡例数、セルの列数、フォームで入力した数分等、行が作成される感じにしたいのですが。 (フォームの大きさに入りきらない場合はスクロールバーを出す)
371 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 14:19:16 ] ユーザーフォーム上のコントロールを動的に生成したいってことなら出来るよ
372 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 14:22:53 ] >>371 調べ方が足りませんでした。すみません。 VBA 可変 フォームとかぐぐってました。 コントロール 動的 VBAでぐぐったらできそうな感じです。 ありがとうございました。
373 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 18:24:45 ] >>369 IfやELseIfのネストより遅いのは確かだが、Orより遅いわけねーって。 実測してみろよ。 Private Declare Function timeGetTime Lib "winmm.dll" () As Long Sub foo1() Dim i&, t1&, t2& t1 = timeGetTime For i = 1 To 5000000 Select Case i Mod 10 Case 5, 6, 9 Case Else End Select Next t2 = timeGetTime MsgBox t2 - t1 End Sub Sub foo2() Dim i&, j&, t1&, t2& t1 = timeGetTime For i = 1 To 5000000 j = i Mod 10 If j = 5 Or j = 6 Or j = 9 Then Else End If Next t2 = timeGetTime MsgBox t2 - t1 End Sub foo1がショートサーキットだって知らなかったんじゃないの? なんなら実証してみせるが、やり方くらい知ってるよな。
374 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 19:51:47 ] >>373 ・timeGetTimeではなく組込のTimerを使ったこと ・Select Caseでも平等にするためにi Mod 10の結果を変数に取っていること ・結果をMsgBoxではなくDebug.Printで出力したこと 以外は同じコードだよ ちなみに実証方法は知ってる Select Caseがカンマ区切りがショートサーキットなのは知ってるからわざわざ Select Caseでやったことは無いが、デバッグの一手法でもあるからな
375 名前:373 mailto:sage [2009/01/05(月) 21:26:44 ] >>374 i Mod 10の値を処理で使わないんなら>>373 が平等なコード。 仮にfoo1でi Mod 10を変数にとってもfoo1が速いぞ? おめーんとこじゃ遅いのか?
376 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 21:35:16 ] > i Mod 10の値を処理で使わないんなら>>373 が平等なコード。 そうでもない > おめーんとこじゃ遅いのか? うん
377 名前:373 mailto:sage [2009/01/05(月) 21:40:10 ] OrもSelect Caseもお互いに速さでベストをつくせばそうなるじゃん。 おまえは最速のコード書けないんだろ?
378 名前:373 mailto:sage [2009/01/05(月) 21:41:57 ] 後ろは読んでなかったが、おれのとこと逆になるらしいな。 俺のとこはSelect Caseが速い。
379 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:00:24 ] 実際の処理に置いて必ずModで算出した値を使うというわけではない以上 条件分岐のステートメントに入る前の時点で、条件となる値が変数に代入されているという 同じ状況を作ることが平等になる Modを使う場合に限定して、IfとSelect Caseのどちらを使った方が速いかを検証するなら、 君の言うとおりベストを尽くして最速コードを書くべきだけどね
380 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:12:28 ] なんか分かってないなぁ。 Modで算出した値を使わないなら>>373 になるんだよ。 まぁどこまで行っても平行線だからもういいが、他のやつらはどっちが速いんだろ? まぁ速さなんて俺はどっちでもいいけどな。 このような使い方なら普通の美意識を持ってたらSelect Caseだし。
381 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:19:50 ] >>380 foo1が速かった
382 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:24:07 ] >>381 トンクス j = i Mod 10 Select Case j としても? おれのとこはそれでもfoo1が速いが。
383 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:26:51 ] >>382 逆転した
384 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:31:23 ] >>383 ふーん、俺のとこと違うな。 まさかjを変数宣言してないとかじゃないよな?
385 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:33:56 ] >>384 してなかった したら差は縮まったけどまだ foo2が速い