1 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 23:16:33 ] ExcelのVBAに関する質問スレです 前スレ pc11.2ch.net/test/read.cgi/tech/1212587819/ ★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)
301 名前:y mailto:sage [2008/09/19(金) 21:24:04 ] 他にも良書はたくさんあるので、上にこだわることはありませんが、ひとつだけ、初心者が解説書を選ぶ上で ぜひ注意してほしい点は、VisualBasicEditorの使い方、特にデバッグの作法を丁寧に解説している章があるかどうかです。 ステップ実行、ローカルまたはウォッチウィンドウでの変数の監視、イミディエイトウィンドウからの介入、これらの意味を 早いうちに知り、使いこなせるかどうかが、その後の上達に明らかに影響します。
302 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 21:27:08 ] たいしたデバッガじゃないからヘルプで十分だよ
303 名前:y mailto:sage [2008/09/19(金) 21:56:25 ] >>273 Excel2007なら、オートフィルタの抽出条件で「上位○位まで」という設定が可能になったので、 それを組み合わせれば、フィルタだけで何とかなるような気がします。 ただ関数だけでやるとなると… いい方法が思いつきません。
304 名前:y mailto:sage [2008/09/19(金) 22:28:11 ] すみません。>>300 の「>276で既に上がっていますが」は、「>277」の間違いです。 さらに内容も、結構>277とかぶってしまっています。失礼しました。
305 名前:292 mailto:sage [2008/09/19(金) 23:27:08 ] >>297 頭悪そうなレス >>299 センスが良いネーミングをぜひとも教えてくれ 貶すことしか知らない無能って多いな
306 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 23:31:05 ] あらあらw
307 名前:デフォルトの名無しさん [2008/09/20(土) 00:29:08 ] 先週金曜日あたりから突然会社のExcel2002がおかしくなった。ネットワークが切断されたかなんたらで、ファイルにアクセスできないやらなんたらというのがおきるようになった。 コンパイルするとファイルサイズが600kbから740kbになる場合とならない場合があり、(ソースはバックアップから同じ様にに変更したのに)大きくなった場合、実行すると強制終了になるという症状も現れた。 自宅の2003では問題なかったがためしに2002に変更。SP3を適用したまでは問題なかったが会社と同じバージョンになるよう、全部の更新を適用したところ同じ症状となった ためしに最新のKB8951551を削除するとあっさり解決した・・。同じ目にあってる人いますか? 解決にいたるまでめちゃくちゃ苦労したよ・・・。(いやまだ会社のエクセルでは試せてないけど・・・)
308 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 01:39:41 ] IDでないのにわざわざコテつけて煽るってなにこいつ
309 名前:デフォルトの名無しさん [2008/09/20(土) 02:37:18 ] 初心者です、お世話になります。 他の板で質問したあとに、こちらで質問すべきだったと気付きましたマルチポストですが勘弁してください。 セルA1とB1にそれぞれシリアル値による時間が入っています。 セルの書式設定により時間が表示されています。 ユーザーフォームの中のラベル1にB1からA1を引いた時間を時分秒の形で表示したいのです。 A1は開始時間、B1は終了時間、ラベル1は所用時間と考えてください。 Label1.Caption = Range("B1") - Range("A1").value とやるとシリアル値っぽいのが出るのですが、時間を表示したいのです。 助けてくださいませ。
310 名前:デフォルトの名無しさん [2008/09/20(土) 03:58:49 ] >>292 ホントありがと。 まったくプログラム経験なしだけど、 書いていただいたものをもとに 勉強含め動かしてみたいと思います。 感謝します。
311 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 08:40:23 ] >>309 DateDiff関数でintervalに"s"を指定して秒単位の差分を取得、 後はそこから時分秒に分割して文字列に結合して完成、って所?
312 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 09:24:11 ] >>305 一生そのままで朽ち果てろ
313 名前:デフォルトの名無しさん [2008/09/20(土) 10:14:55 ] ジョン3兄弟
314 名前:y mailto:sage [2008/09/20(土) 13:55:32 ] >>309 >311のやり方で可能ですが、他にこういう書き方も。 Label1.Caption = Format(Range("B1") - Range("A1"), "hh:nn:ss")
315 名前:デフォルトの名無しさん [2008/09/20(土) 16:18:39 ] >>311 >>314 アドバイスどうもありがとうございます。 テストをしてみたのですが、両方とも「’実行時エラー’438:オブジェクトは、このプロパティまたはメソッドをサポートしていません。」 というエラーが出てしまいます。 私は知識不足なので対応がわかりません。 これは、どういうことなのでしょうか?
316 名前:デフォルトの名無しさん [2008/09/20(土) 16:35:45 ] >>311 >>314 失礼しました、できました。 ほんとうにありがとうございました。
317 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 19:35:44 ] hh:mm:ssでなくて?
318 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 20:41:32 ] nnでもいけるんだよね
319 名前:y mailto:sage [2008/09/21(日) 00:37:26 ] そうですね。 書式指定子 "m" または "mm" は、時刻の分も表しますが、日付の月も表します。それによる混乱を回避するため、 分のみを表す指定子「n」が実装されている、という話を何かの本で読んだことがあります。 ヘルプには、「"h" または "hh" の直後、あるいは "ss" の直前に "m" を指定した場合、月ではなく分が表示されます」とあります。 逆に言うと、mだけを独立して使うと、分ではなく月を表します。つまり分のみを表示させたい状況では、どうしても「n」を使う必要があります。 そういうわけで、分は最初から「n」を使う習慣をつけておいたほうが、間違いが少ないように思います。
320 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 00:47:17 ] うざ
321 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 03:56:03 ] >>320 なんでこいつこのスレに粘着してるの?
322 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 08:47:58 ] Excel 2009を使用しております。 テーブルを作成し、いくつか項目を入力した状態で、 GUIでテーブルの見出し行にある矢印メニューボタンを押した時に表示される フィルタのメニューの処理を、VBAから行うにはどのようにすればよいでしょうか? 例えば、TODOリストを想像してください。 ボタンを配置して、ボタンを押すと、 テーブルの1つの列の「開始日付」が今日のもので、 「状態」列が「未完」となっているもののみを表示する。 また、他のボタンを押すと、元に戻る(というか全部表示)。 といったようなことをしたいのです。 画像を見てもらったほうが早いので、説明画像も作成しました。 sylphys.ddo.jp/upld2nd/pc3/src/1221954091856.jpg どのようなクラスのオブジェクトにアクセスすればいいかだけでも、手がかりがあればと思います。
323 名前:y mailto:sage [2008/09/21(日) 09:13:13 ] >>322 チェックを入れたり外したりする操作を、「マクロの記録」(>>1 ★6)を使って記録して、 生成されたコードを見れば、どんなオブジェクトにアクセスしているか手がかりが 得られると思います。
324 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 09:37:36 ] >>321 うざいからだろw
325 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 09:42:50 ] >>323 ありがとうございます。 基本的なことを聞いてしまった様な気がします。テンプレ嫁よ俺。 「開始日付」を「今日」のみ選択、「状態」を「途中」「予定」「スキップ」のみ選んだ時は、 こんな感じで記録されていました。 ActiveSheet.ListObjects("作業記録").Range.AutoFilter Field:=2, Criteria1:= _ xlFilterToday, Operator:=xlFilterDynamic ActiveSheet.ListObjects("作業記録").Range.AutoFilter Field:=1, Criteria1:=Array _ ("途中", "予定", "スキップ"), Operator:=xlFilterValues ListObjectsでListObject(テーブル)が得られて、そのRangeにAutoFilterをかますんですね・・・。
326 名前:デフォルトの名無しさん [2008/09/21(日) 15:51:36 ] 質問なのですが、 同一ファイル内で、シート1上の左側にはシート1の内容、右側にはシート2の内容 のように分割して表示することは可能でしょうか? (ウィンドウを別々に開くのではなく) もしやり方があるのであれば教えてください。 Excel2003を使用しています。 よろしくお願いします。
327 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 17:20:23 ] スレ違い
328 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 20:07:05 ] 質問です。 ------------------------------------------- 【やりたいこと】 (1).ファイル保存ダイアログでファイル名を選択させる。 (2).新規ファイル名を入力することも可能にする。 (3).ファイル保存時に選択可能なファイルタイプ(拡張子)をVBAで指定する。 【直面している問題】 ・Office.FileDialog で msoFileDialogSaveAs を指定すると(3)を満たす方法がわからない ・Office.FileDialog で msoFileDialogFilePicker を指定すると(2)を満たす方法がわからない 【環境】 WindowsXp SP3 + Excel2002 SP3 ------------------------------------------- よろしくお願いします。
329 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 21:06:15 ] >>328 です。事故解決しました。 Excel.Application.GetSaveAsFilename を使えばよかったんですね。 スレ汚し失礼。
330 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 00:40:37 ] ExcelVBAって、.netよりもVB6に近いですか?
331 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 07:22:11 ] うーん。その質問は難しいな。 似てるけど全くの別物と思っておいた方がいいよ。
332 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 13:31:46 ] いやVB6とほとんど同じ
333 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 15:45:03 ] VB6でオブジェクトブラウザ開いてみな VBAがあるでよ
334 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:05:39 ] >>330-332 何処に焦点当てるかで変わってくる VB6とVBAは、構文規則は全く同じ 組込関数はほとんど同じ 組込オブジェクトは全然別物 >>333 そのVBAとVisual Basic for Applicationは意味違うからw
335 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 18:37:44 ] Worksheets("表").Range("A2").Select と記述するとA2にデータの未入力状態ということで実行エラーが出てしまうのに、 With Worksheets("表") .Select .Range("A2").Select End With と記述するとエラーが出ずに問題なく実行されるのはなぜなの?
336 名前:y mailto:sage [2008/09/24(水) 21:36:05 ] あるセル範囲に対してSelectメソッドを実行したとき、 そのセル範囲が含まれるシートが選択されていなければ、 実行時エラーが発生する仕様になっているためです。 >335の下のコードは、シートを選んでから、セル範囲を選んでいるので、エラーは発生しません。 上のコードも、「表」シートが選んである状態であれば、エラーは発生しません。
337 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 21:57:49 ] >Worksheets("表").Range("A2").Select こうすればいい。 >Worksheets("表").Select >Worksheets("表").Range("A2").Select # って、既に歪の人が書いていたか。
338 名前:デフォルトの名無しさん [2008/09/24(水) 23:27:58 ] スレチでしたら誘導願います。 xp・excel2002で、関数が物足りなくなってきたのでマクロとVBAの勉強始めました。 ネットで検索するとaccessにもVBAとかマクロとか関数も?あるようです? 同僚に挫折したaccessのVBAの本ならあるから1500円で譲るよ。と言われたのですが、 excelとaccessのVBAは同じものですか?全く別物でしょうか?? すみません、宜しくお願いします。
339 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 23:33:34 ] >>338 AccessVBAの本ではVBの勉強にはなるかもしれないがExcelVBAの勉強にはならないので 1500円も出すくらいならちゃんとした本を買いましょう。
340 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 23:37:41 ] >>338 VBAそのものは同じだけど操作対象が全く別物なのでお勧めできない
341 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 23:44:40 ] >>339 >>340 レスdくすです。 つまり、同じものだけど違うものだから?エクセルのVBAの本を買うべき。 と言うことですね?ありがとうございました。 危うく、accessの本を読んでexcel挫折するところでしたw
342 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 00:42:24 ] いらないならタダでくれればいいのにセコイ同僚だな
343 名前:デフォルトの名無しさん [2008/09/25(木) 15:13:33 ] Dim Cnt, Num As Integer Dim Tbx As TextBox Num = 0 For Cnt = 1 To 9 Num = Num + 1 Set Tbx = "TextBox" & Num Tbx.Text = "" Next VBAは変数の型を自動変換してくれると考えて、これを実行すると、 「コンパイルエラー:型が一致しません」と出ちゃいます。無理かな。
344 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 16:09:13 ] >>343 >Dim Tbx As TextBox >Set Tbx = "TextBox" & Num←何がしたいんだ? TextBoxは文字列ではないからコンパイル通らなくて当たり前だな Set Tbx = Worksheets(1).OLEObjects("TextBox" & Num) なら理解できる
345 名前:デフォルトの名無しさん [2008/09/25(木) 16:39:59 ] >>344 サンキュー!!!!!!!!!
346 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 16:45:25 ] ちなみに余計なお節介かもしれんけど Dim Cnt, Num As Integer と書くと cntはVariant型だぞ
347 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 17:07:39 ] >>346 わざわざ有難うございます。いただいたアドバイスをヒントに修正しました。 やりたかったのはUserForm1のコントロールTextBox1〜9までの値をクリアすることでした。 Private Sub CommandButton5_Click() ' TextBox1〜9までのTextプロパティの値をクリアする Dim iCnt As Integer, iNum As Integer, oTbx As Control iNum = 0 For iCnt = 1 To 9 iNum = iNum + 1 Set oTbx = UserForm1.Controls("TextBox" & iNum) oTbx.Text = "" Next End Sub
348 名前:デフォルトの名無しさん [2008/09/25(木) 18:48:29 ] ExcelVBAExpressEditionってないの?
349 名前:デフォルトの名無しさん mailto:sage [2008/09/26(金) 09:26:40 ] えっえっえっえっ えっろっびっでぉー
350 名前:デフォルトの名無しさん mailto:sage [2008/09/26(金) 18:02:31 ] >>348 excelが対象なのに、VBAだけじゃ意味無いだろw おとなしくメモ帳に書いとけ。
351 名前:デフォルトの名無しさん [2008/09/27(土) 22:33:47 ] Hになればなるほど、固くなるものってな〜んだ?
352 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:35:18 ] 鉛筆の芯
353 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:53:05 ] エクセルにVBAが付いてくる…一般 VBAにエクセルが付いてくる…マ >350は素人
354 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:28:04 ] > VBAにエクセルが付いてくる…マ これ、笑うところ? あ、マってプログラ"マ"じゃなくて"マ"ヌケってことか それなら納得 プログラマがこんな本質を違えた愚かな発想するわけないもんなw
355 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 00:02:57 ] VBAって、いわゆるスクリプトだろ? サクラエディタにでも書けばいいじゃん。
356 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 00:09:48 ] Excel 2008ではVBAサポートが廃止されました
357 名前:ちら裏 mailto:sage [2008/09/28(日) 06:12:41 ] VBとVBA,VB.NETは共にプログラミング言語文法の名前がVisual BASICというだけで 3つとも全部違うと思って欲しい。 それぞれ用途がかなり違う。文法も基本的な部分は同じでも、 実際にコードしてみると、かなーり違うことがわかる。 例えばVBA(もしかしてVB.NETも)では識別子に漢字交じり日本語が使える。 DLLなどの外部モジュールを最も簡単に呼び出せるのはVB。 VB.NETでは網羅されて使いやすいCLRが使える。 Excel付属のVBAでは、これらは出来ないか出来ても酷く面倒 しかしExcelのVBAは 精々ユーザー定義関数の定義や、外部ファイル入出力関係の 典型処理の組み込みや、フールプルーフ目的のフォーム作成 といった補助的な利用に留めておくべきで、ExcelをVB 環境の一種として取り扱うのはやめたほうがいい。 (VBを学ぶ環境としては余り適していない)
358 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 08:25:19 ] Visual Studio Tools for Applications って何かと思っていたら、VBAの次世代版だったのか。 Office2003からVBAと並行して使えるようになっていたのな。 .NET2.0ベースで、VB.NET以外にもC#が使えるのは楽しそうだなあ。 >>356 VBAサポート打ち切ったら、マジ売れなくね?
359 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 12:22:40 ] >>357 ひどい知ったかなので、初心者は信じないように。
360 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 12:56:22 ] >>359 失敗の経験も貴重だから、確かにそうだな。
361 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 14:37:52 ] >>358 2008で「切り捨てて」AppleScriptに変更したら非難ごうごうで(当たり前) 次でやっぱりVBAを復活させるってさ
362 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 21:06:11 ] >>360 意味がわからん
363 名前:高島彩 [2008/09/29(月) 15:57:37 ] ワークシートつかわないでVBAでRSSの値とるやり方おしえて
364 名前:HIRO ◆225xxx6ZSE [2008/09/29(月) 16:07:10 ] , - ,----、 (U( ) | |∨T∨ 皆さん、>>363 をよろしくお願いします。 (__)_)
365 名前:高島彩 [2008/09/29(月) 16:12:29 ] ____ /∵∴∵∴\ /∵∴∵∴∵∴\ /∵∴∴,(・)(・)∴| / ̄ ̄ ̄ ̄ ̄ ̄ ̄ |∵∵/ ○ \| < >>364 氏ねよ!! |∵ /. ミ | 彡 | \_______ |∵.| \___|_/| ___ \| \__ノ / / \ \___/ /∧ \ / ) | × | _ _ / ,イ 、 ノ/ |●( ―= ̄ `ヽ, _ / / | ( 〈 ∵. ・\ 〈__ > ゛ 、_― | ! ヽ ー=- ̄ ̄=_\_(/ , ´ノ | | `iー__=―_ ;, / / / !、リ -=_二__ ̄_=;, / / ,' / / / /| | / / !、_/ / 〉 / _/ |_/ ヽ、_ヽ
366 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 21:36:04 ] >>363 ごく普通にやればいいだけだよ VBやCでやるのと同じように つーか、ワークシート使わない方法になると>>1 にも書いてある通り VBAではなくVB分野になるのでスレ違いだな あとは自分で調べましょう
367 名前:HIRO ◆225xxx6ZSE [2008/09/30(火) 00:14:01 ] , - ,----、 (U( ) >>366 | |∨T∨ ありがとうございます。 (__)_)
368 名前:デフォルトの名無しさん [2008/10/01(水) 00:19:39 ] www.nicovideo.jp/watch/sm3058430 ニコ動で一時期流行った侵略ゲームをExcelで再現してみたのですが、 やはり(?)あまり速度が出ません。 いろいろ頑張ってみたのですが、自分の限界に達したようなので、 速度が向上する方法がありましたらアドバイスをいただけると助かります。 uproda11.2ch-library.com/src/11122054.zip.shtml
369 名前:368 [2008/10/01(水) 00:36:04 ] バージョン:Excel2007 OS:Vista 私の環境では、ウィンドウを最大化しておかないと何故かフリーズしやすいです。 フリーズというか、画面は固まりますが裏では動いています。
370 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 03:44:42 ] >>368 全く試さない上でVBA素人の俺が脊髄反射レス ・基点となるセルからoffsetで上下左右1ずつ隣のセルの値を取得して、 それを評価した方がいいんジャマイカ ・セルのプロパティのアクセスを都度行うのは重いから、 一度マップ範囲を c = Range("x:y") のように配列に入れて、 値から何とかした方がいいんジャマイカ ・ScreenUpdating を最初から False に(ry 嘘ですごめんなさい
371 名前:デフォルトの名無しさん [2008/10/01(水) 07:26:33 ] Private Sub CommandButton1_Click() Randomize Dim hsXmax As Integer 'マップの横最大値 Dim hsYmax As Integer 'マップの縦最大値 Dim hsMap() As Integer 'マップの戦闘力格納用配列変数 Dim i As Integer '行番号 Dim j As Integer '列番号 Dim hsMaxPow As Integer '最大戦闘力 Dim x As Integer 'For用 hsXmax = Cells(6, 57).Value hsYmax = Cells(5, 57).Value ReDim hsMap(1 To hsYmax, 1 To hsXmax) For x = 1 To 1000 Application.ScreenUpdating = False 'マップに戦闘力を設定。マップの一番外側は必ず白色 For i = 2 To hsYmax - 1 For j = 2 To hsXmax - 1 If Cells(i, j).Interior.Color <> RGB(255, 255, 255) Then '白色以外のセルに戦闘力を設定 hsMap(i, j) = Int((99 * Rnd) + 1) End If Next j Next i
372 名前:デフォルトの名無しさん [2008/10/01(水) 07:27:04 ] '戦闘結果算出 For i = 2 To hsYmax - 1 For j = 2 To hsXmax - 1 If hsMap(i, j) <> 0 Then 'セルに戦闘力が設定されている場合 'そのセルを含め、上下左右のセルの戦闘力の最大値を取得する hsMaxPow = WorksheetFunction.Max(hsMap(i, j), hsMap(i - 1, j), hsMap(i, j - 1), hsMap(i + 1, j), hsMap(i, j + 1)) If hsMap(i - 1, j) = hsMaxPow Then '上のセルが最大だった場合は、上と同じ色にする Cells(i, j).Interior.Color = Cells(i - 1, j).Interior.Color ElseIf hsMap(i, j - 1) = hsMaxPow Then '左のセルが最大だった場合は、左と同じにする Cells(i, j).Interior.Color = Cells(i, j - 1).Interior.Color ElseIf hsMap(i + 1, j) = hsMaxPow Then '下のセルが最大だった場合は、下と同じ色にする Cells(i, j).Interior.Color = Cells(i + 1, j).Interior.Color ElseIf hsMap(i, j + 1) = hsMaxPow Then '右のセルが最大だった場合は、右と同じ色にする Cells(i, j).Interior.Color = Cells(i, j + 1).Interior.Color End If End If Next j Next i Application.ScreenUpdating = True Next x End Sub
373 名前:368 [2008/10/01(水) 07:43:19 ] ↑はソースのコピペです。 一応貼っときます。 戦闘力はランダムのはずですが、 何故か名古屋が強い気がします・・・
374 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 14:08:29 ] >>368 フリーズは再現できなかったけどとりあえず軽くしてみた やったことは 1.色を配列に入れてこねくり回すようにした 2.色が変化しない時は再設定しないようにした 3.気に入らなかったのでElseifをSelect Caseにした
375 名前:374 mailto:sage [2008/10/01(水) 14:08:53 ] Option Explicit Sub CommandButton1_Click() Randomize Dim hsXmax As Integer 'マップの横最大値 Dim hsYmax As Integer 'マップの縦最大値 Dim hsMap() As Integer 'マップの戦闘力格納用配列変数 Dim hsColor() As Long 'マップの色格納用配列変数 Dim hsColor_old() As Long 'マップの色格納用配列変数(比較用) Dim i As Integer '行番号 Dim j As Integer '列番号 Dim hsMaxPow As Integer '最大戦闘力 Dim x As Integer 'For用 Dim hsCells As Object hsXmax = Cells(6, 57).Value hsYmax = Cells(5, 57).Value ReDim hsMap(1 To hsYmax, 1 To hsXmax) ReDim hsColor(1 To hsYmax, 1 To hsXmax) ReDim hsColor_old(1 To hsYmax, 1 To hsXmax) With Range(Cells(1, 1), Cells(hsYmax, hsXmax)) 'シートから色を取得 For i = 2 To hsYmax - 1 For j = 2 To hsXmax - 1 hsColor(i, j) = .Cells(i, j).Interior.Color Next j Next i
376 名前:374 mailto:sage [2008/10/01(水) 14:10:02 ] For x = 1 To 1000 Application.ScreenUpdating = False 'マップに戦闘力を設定 'マップの一番外側は必ず白色 For i = 2 To hsYmax - 1 For j = 2 To hsXmax - 1 If hsColor(i, j) <> vbWhite Then '白色以外のセルに戦闘力を設定 hsMap(i, j) = Int((99 * Rnd) + 1) End If Next j Next i hsColor_old = hsColor '戦闘結果算出 For i = 2 To hsYmax - 1 For j = 2 To hsXmax - 1 If hsMap(i, j) <> 0 Then 'セルに戦闘力が設定されている場合 'そのセルを含め、上下左右のセルの戦闘力の最大値を取得する hsMaxPow = WorksheetFunction.Max(hsMap(i, j), hsMap(i - 1, j), hsMap(i, j - 1), hsMap(i + 1, j), hsMap(i, j + 1)) Select Case hsMaxPow Case hsMap(i - 1, j) '上のセルが最大だった場合は、上と同じ色にする hsColor(i, j) = hsColor(i - 1, j) Case hsMap(i, j - 1) '左のセルが最大だった場合は、左と同じにする hsColor(i, j) = hsColor(i, j - 1) Case hsMap(i + 1, j) '下のセルが最大だった場合は、下と同じ色にする hsColor(i, j) = hsColor(i + 1, j) Case hsMap(i, j + 1) '右のセルが最大だった場合は、右と同じ色にする hsColor(i, j) = hsColor(i, j + 1) End Select End If Next j Next i
377 名前:374 mailto:sage [2008/10/01(水) 14:10:48 ] 'マップ(シート)に色を反映 For i = 2 To hsYmax - 1 For j = 2 To hsXmax - 1 If hsColor(i, j) <> hsColor_old(i, j) Then .Cells(i, j).Interior.Color = hsColor(i, j) End If Next j Next i Application.ScreenUpdating = True Next x End With End Sub
378 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 15:41:37 ] どこかのセルが変更された時に処理(以下、処理A)が走るようにしています。 最初の処理(以下、処理B)でセルを変更しています。 処理Bのときだけ処理Aを走らせないようにしたいのですが、 どうしたらいいでしょうか。
379 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 16:09:13 ] >>378 Application.EnableEvents = False かな?
380 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 16:31:03 ] >>379 まさにそれでした。ありがとうございました。 最初「Application.EnableEvents = False」の一行見たとき意味わかりませんでしたが、 ググッたら使い方でてきて何とかなりました。 ありがとうございました。
381 名前:368 [2008/10/01(水) 22:30:32 ] >>370 >>374 ありがとうございます。 予想以上に速くなりすぎていて驚きました。 色を配列に入れるところまで考えが至りませんでした。 ところで、戦闘力はランダムのはずなのに勝者に偏りがありすぎます。 いくつかのマップで10戦ずつやってみたところ、 愛知県マップ・・・名古屋9勝、西三河1勝、東三河0勝 「目(上中下の3色)」マップ・・・上9勝、中0勝、下1勝 「田(4色)」マップ・・・左上8勝、左下2勝、右上0勝、右下0勝 という結果で、左上に近いほど強いとしか思えません。 謎です・・・
382 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 23:44:27 ] >>381 謎でもなんでもないじゃん。 ・hsMapの値が整数で0-100程度でしかないから最大値を取るセルが複数できやすい。 ・Select Caseで上左の順でチェックしているから上や左が優先されやすい。 つまり、上や左から侵食されやすい傾向があるわけ。 最大値を取るセルが複数ある場合に微妙に優先度を調整するか、 値の変動幅を大きく取って最大値を取るセルが一つになるようにするかってところかな。
383 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 05:20:47 ] Excel2000 で 255文字以上のフルパスの存在チェックで DIRでチェックしようとすると「ファイルが見つかりません。」になるんですが回避するにはどうすれば良いですしょうか? if dir( 255文字以上のパス ) <> "" then
384 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 05:48:56 ] Set fs = CreateObject("Scripting.FileSystemObject") If fs.fileExists(ぱす) = False Then でいけたかも。他にあれば教えてください。
385 名前:368 [2008/10/02(木) 07:45:57 ] >>382 それは私も考えました。 それが原因なら、判定の順序を「下→右→上→左」とすれば、 下や右が強くなるはずです。 順序を変えてやってみましたが、 名古屋8勝、西三河2勝、東三河0勝 上7勝、中3勝、下0勝 左上7勝、左下1勝、右上2勝、右下0勝 と、やはり左上に近いほど強いようです。 まあ、10回程度だと偶然偏りができることも考えられますが・・・
386 名前:374 mailto:sage [2008/10/02(木) 10:40:57 ] >>365 比較する順序ではなく色を入れ替えるタイミングの問題では? Select Case hsMaxPow Case hsMap(i - 1, j) '上のセルが最大だった場合は、上と同じ色にする hsColor(i, j) = hsColor_old(i - 1, j) Case hsMap(i, j - 1) '左のセルが最大だった場合は、左と同じにする hsColor(i, j) = hsColor_old(i, j - 1) Case hsMap(i + 1, j) '下のセルが最大だった場合は、下と同じ色にする hsColor(i, j) = hsColor_old(i + 1, j) Case hsMap(i, j + 1) '右のセルが最大だった場合は、右と同じ色にする hsColor(i, j) = hsColor_old(i, j + 1) End Select と更新前の色を入れてやれば少しは改善するかもしれません
387 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 14:59:02 ] マクロを実行してファイルを閉じ、再び同じウィンドウで マクロ入りのファイルを開いても、マクロが実行できません。 VBAを使っていろいろ処理して終了させます。 処理の中では画面更新の抑制やら色々やってます。 マクロを実行したbookを閉じてから、マクロが入った ファイルを開くと、右クリックで新規ウィンドウ等を やらない限りは必然的に、既に開いているExcelを使って ファイルが開かれると思うのですが、そうなるとマクロが 動かないんです。 セキュリティの問題ではなくマクロが無いファイルのような そんな扱いです。やはり、色々標準の機能を殺しているのが問題で それが終了しても保持され続けているのが問題なのでしょうか??
388 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 15:20:53 ] >>387 セキュリティの設定は何になっているんですか? 低になっていてかつApplication.EnableEventsがFalseだった場合 マクロは自動実行されないはずなので何も起きていないだけでは?
389 名前:デフォルトの名無しさん [2008/10/02(木) 20:31:10 ] 1行目と3行目を選択(1行目を選択してからCtrl+3行目を選択)すると、 Range("1:1,3:3").Select と言うコードが得られますが、 変数を用いて、a行目とb行目を選択する場合には、どのように記述すれば良いのでしょうか。 よろしくお願いします。
390 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 20:41:43 ] >>389 Dim a As Integer, b As Integer Rows(a & ":" & b).Select
391 名前:390 mailto:sage [2008/10/02(木) 20:45:59 ] 動かなかった・・・orz Dim a As Integer, b As Integer a = 1: b = 3 Range(Rows(a).Address & "," & Rows(b).Address).Select
392 名前:デフォルトの名無しさん [2008/10/02(木) 21:42:23 ] お世話になります。 for loopの入れ子でループを抜けたいときは gotoするのが一般的なんでしょうか? gotoってあんまり使うなと言われているので For intI = 3 To 65535 For intJ = 1 To 255 '条件が一致すればここからいっきに2つのループを抜けたい Next intJ Next intI あとループ変数って単純にi,j,kとするか なにかしらわかりいい名前をつけるのかどちらがいいのでしょうか よろしくお願いします。
393 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 21:48:27 ] 多重ループ脱出は数少ないgotoの出番だぞ。 (無論そのための仕組みが存在する言語なら話は別だが) ループ変数はi, j, kとするのが単純かつ分かりやすい。 intIですらやめてくれと言うところだ。
394 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:11:03 ] なるほど そうでしたか ありがとうございました
395 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:40:28 ] >>393 プログラムが大きくなってくると1文字の変数は探しにくい やりたいことにもよるだろうが 1文字で済ませる癖は付けないほうがいいと思う
396 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 23:09:51 ] >>395 それはプロシージャを分割した方がいいんじゃないかな
397 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 23:23:45 ] クラスモジュールと 標準モジュールの違いがいまいちわからん クラスはオブジェクトとして使ったりコンパイルしてDLLとして参照すると 名前でプロシージャーを呼び出せるってことなのか? 標準だと他のモジュールのって呼び出せない?
398 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 23:39:33 ] >>389 union(rows(a),rows(b)).Select
399 名前:368 [2008/10/02(木) 23:51:05 ] >>374 ありがとうございます。 強さが均等になりました。 言われてみれば、あのプログラムでは左上が強くなるのも当然ですね。 実は、初期はちゃんと古いマップから色を持ってきていたのですが、 高速化のためにいろいろやっているうちに、古いマップを省略してしまったようです。
400 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 00:02:25 ] >>395 ループ自体をForで探せばいいじゃない。 あと、ループ変数をi, jとしないなんてVB以外では聞いたことないってただの個人的経験だけど。