[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 10/24 21:30 / Filesize : 261 KB / Number-of Response : 870
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Excel VBA質問スレ Part8



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)

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以外では聞いたことないってただの個人的経験だけど。

401 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 09:05:00 ]
>>397
VBA分野の話じゃないね、スレ違い

402 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 09:26:22 ]
>>392
2重ループ脱出はForとDoを併用するのが常套手段

For intI = 3 To 65535
  Do Until intJ = 255
    Exit For
  Loop
Next intI

403 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:39:08 ]
Do/Loopを使うと速度が落ちちゃうじゃないか、とか言ってみる。



404 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 20:28:55 ]
>>402
それは無い

405 名前:デフォルトの名無しさん [2008/10/03(金) 22:13:12 ]
ループ抜けの話が出ていたので、質問をさせてください。
例えば、

for i = 1 to 100
if cells(i,1).value like "hoge" then
set cl = cells(i,1)
end if
next

のような形で、該当する最初のセルに処理をした時点でループを抜けるにはどのように記述すれば良いのでしょうか。
上記だと2つ以上の該当があった場合、後のセルがsetされてしまいます。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<261KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef