Excel VBA質問スレ Part8
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/08/25(月) 23:16:33前スレ http://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)
0277デフォルトの名無しさん
2008/09/18(木) 23:40:24漏れの場合はVBAに関する知識はほとんどネットやヘルプで調べたものだったりするし・・・
VBとかやってるならオブジェクトブラウザとヘルプだけでも何とかなると思う
便利なテクニックとかはネットで拾い集めて行く
最初に手に入れたVBAの本に載ってたサンプルがコンパイル通らなかったから
本は全然信用してないだけだけどなw
でも1冊だけ役に立った本があったな・・・
「Excel VBA逆引き大全」とかだったかな?
0278デフォルトの名無しさん
2008/09/19(金) 01:19:38VBA作成経験なく、ここを答えを求める場として
使うことに申し訳なく思っています。
複数のExcelファイルを指定する。
当該ファイルを新ブックにして保存する。
→その際、シート名が重複しても問題なし
新ブックのファイル名はあらかじめ指定したものを
このようなマクロをつくることは可能でしょうか。
前述のとおり、まったく経験なしなので、
サンプル、たたき台程度で構いませんので、
ご教示いただけたら嬉しいです。
0279デフォルトの名無しさん
2008/09/19(金) 01:57:510280デフォルトの名無しさん
2008/09/19(金) 02:05:09さっぱり意味がわかりません。
0281デフォルトの名無しさん
2008/09/19(金) 02:08:42>VBとかやってるならオブジェクトブラウザとヘルプだけでも何とかなると思う
できる奴の戯言だな
0282デフォルトの名無しさん
2008/09/19(金) 04:03:48簡単だよ。
0283デフォルトの名無しさん
2008/09/19(金) 06:07:09アホ?
0284デフォルトの名無しさん
2008/09/19(金) 06:25:29いや普通できると思うできないのは文盲
0285デフォルトの名無しさん
2008/09/19(金) 06:26:23ゆとり乙
0286デフォルトの名無しさん
2008/09/19(金) 06:37:00入門書レベルの事しか回答出来ないから笑える
0287デフォルトの名無しさん
2008/09/19(金) 06:43:18お前だろそれ
0288デフォルトの名無しさん
2008/09/19(金) 07:01:000289デフォルトの名無しさん
2008/09/19(金) 07:04:320290デフォルトの名無しさん
2008/09/19(金) 07:05:180291デフォルトの名無しさん
2008/09/19(金) 07:06:03>>278
複数ファイルのブック内のシートを結合するマクロなら昔適当に作ったのがあるけど
0292デフォルトの名無しさん
2008/09/19(金) 08:52:57まとめると
複数ファイルのブック内のシートを結合する
シート名は重複している場合がある
だよな?
シート数は全部でどのくらいになるんだ?
あまり多いと1つのブックに収まらないよ
0293デフォルトの名無しさん
2008/09/19(金) 09:10:07すいません、追加・変更があります。
○○システムの情報 ブック*2
□□システムの情報 ブック*2
(全部で5システム)
上記1ブックに1シートのみ
これをシステムごとに1ブックとして新規に保存。
なので、計5ブックができる。
これを一回でやりたいです。
下記の情報をあらかじめ指定(変更可)
- 各システムの情報ブック
- 新ブックの名前
を考えています。
0294292
2008/09/19(金) 10:40:41かなり手抜きだが書いてみた
コピー後のシート名は指定するように作った
マクロを入れるブックに
A列(ファイルバス)| B列(コピー後のシート名)
○○システム
C:\A1.xls| Sheet○○1
C:\B1.xls| Sheet○○2
C:\C1.xls
○×システム
C:\A2.xls| Sheet○×1
C:\B2.xls| Sheet○×2
C:\C2.xls
といった感じにデータ入れて以下のマクロを動かす
(AとBはコピー元Cがコピー先)
0295292
2008/09/19(金) 10:41:55Dim wkAWorkbook As Workbook
Dim wkBWorkbook As Workbook
Dim wkCWorkbook As Workbook
Dim i As Long
For i = 0 To 1
With ThisWorkbook.Worksheets(1)
'コピー元1つ目を開く
Set wkAWorkbook = Workbooks.Open(.Cells(2 + i * 4, 1))
'1つ目を新規ブックにコピー
wkAWorkbook.Worksheets(1).Copy
Set wkCWorkbook = ActiveWorkbook
'コピーしたシートをリネーム
ActiveSheet.Name = .Cells(2 + i * 4, 2)
改行多すぎので次レスに続く
0296292
2008/09/19(金) 10:43:09'コピー元2つ目を開く
Set wkBWorkbook = Workbooks.Open(.Cells(3 + i * 4, 1))
'2つ目を上でコピーしたブックにコピー
wkBWorkbook.Worksheets(1).Copy after:=wkCWorkbook.Sheets(1)
'コピーしたシートをリネーム
ActiveSheet.Name = .Cells(3 + i * 4, 2)
'開いた時に見栄えが悪いので1つ目のシートを選択
wkCWorkbook.Sheets(1).Select
'名前をつけて保存
wkCWorkbook.SaveAs (.Cells(4 + i * 4, 1))
'終了処理
wkAWorkbook.Close
Set wkAWorkbook = Nothing
wkBWorkbook.Close
Set wkBWorkbook = Nothing
wkCWorkbook.Close
Set wkCWorkbook = Nothing
End With
Next i
End Sub
専ブラじゃないのでずれて見づらいかも知れんなw
0297デフォルトの名無しさん
2008/09/19(金) 20:49:060298デフォルトの名無しさん
2008/09/19(金) 21:05:310299デフォルトの名無しさん
2008/09/19(金) 21:08:440300y
2008/09/19(金) 21:23:03「VBAの絵本」(アンク)
アンクの絵本シリーズは、その言語の仕組みや考え方を、豊富なイラストを用いて直感的に
伝える工夫がなされています。他人に薦めた本の中で、「分かりやすかった」という反応がいちばん
多かったのがこの本です。ACCESS VBAの内容も包括しているので、将来的にも役に立つでしょう。
概念の説明が中心で用例は乏しいので、メイン本にはできませんが、「かんたんプログラミング」を
持っているのであればそれで足りると思います。
「Excel VBAのプログラミングのツボとコツがゼッタイにわかる本〜最初からそう教えてくれればいいのに」(秀和システム)
「絵本」よりも実際性があり、個人的には一押しです。解説文と図の取り合わせがとても洗練されており、
文脈の多義性によるストレスや誤読を最小限に抑えようとする、手厚い推敲の跡が感じられます。新しい本なので
まだ他人に薦めたことはありませんが、アマゾンでは好評なようです。
「VBAポケットリファレンス」(技術評論社)
ヘルプがあればリファレンス本はいらない、という声もありますが、個人的には手離せません。
ページをめくるより、ヘルプを開いた方が速いような気もするかもしれませんが、
書式指定子の一覧、よく使うオブジェクトのプロパティ一覧など、よく開くページに
付箋を貼って机に置いておくだけで、パッと見たい時には最速のツールになり、ディスプレイも汚れないので
思考が中断されません。(※ただし、ヘルプを使って調べる習慣は、それはそれで必要です)
「逆引き」本(各社)
>276で既に上がっていますが、豊富な用例がほしい時は逆引き本です。ただ、「やりたいこと」をもとに
用例を探す場合、インターネット検索のほうがより楽な場合が結構あることも覚えておいてください。
「VBA + (やりたいことに関連するキーワード)」で検索すると、似たようなことを既にやっている人の
コードが割と簡単に見つかったりします。
0301y
2008/09/19(金) 21:24:04ぜひ注意してほしい点は、VisualBasicEditorの使い方、特にデバッグの作法を丁寧に解説している章があるかどうかです。
ステップ実行、ローカルまたはウォッチウィンドウでの変数の監視、イミディエイトウィンドウからの介入、これらの意味を
早いうちに知り、使いこなせるかどうかが、その後の上達に明らかに影響します。
0302デフォルトの名無しさん
2008/09/19(金) 21:27:080303y
2008/09/19(金) 21:56:25Excel2007なら、オートフィルタの抽出条件で「上位○位まで」という設定が可能になったので、
それを組み合わせれば、フィルタだけで何とかなるような気がします。
ただ関数だけでやるとなると… いい方法が思いつきません。
0304y
2008/09/19(金) 22:28:11さらに内容も、結構>277とかぶってしまっています。失礼しました。
0306デフォルトの名無しさん
2008/09/19(金) 23:31:050307デフォルトの名無しさん
2008/09/20(土) 00:29:08コンパイルするとファイルサイズが600kbから740kbになる場合とならない場合があり、(ソースはバックアップから同じ様にに変更したのに)大きくなった場合、実行すると強制終了になるという症状も現れた。
自宅の2003では問題なかったがためしに2002に変更。SP3を適用したまでは問題なかったが会社と同じバージョンになるよう、全部の更新を適用したところ同じ症状となった
ためしに最新のKB8951551を削除するとあっさり解決した・・。同じ目にあってる人いますか?
解決にいたるまでめちゃくちゃ苦労したよ・・・。(いやまだ会社のエクセルでは試せてないけど・・・)
0308デフォルトの名無しさん
2008/09/20(土) 01:39:410309デフォルトの名無しさん
2008/09/20(土) 02:37:18他の板で質問したあとに、こちらで質問すべきだったと気付きましたマルチポストですが勘弁してください。
セルA1とB1にそれぞれシリアル値による時間が入っています。
セルの書式設定により時間が表示されています。
ユーザーフォームの中のラベル1にB1からA1を引いた時間を時分秒の形で表示したいのです。
A1は開始時間、B1は終了時間、ラベル1は所用時間と考えてください。
Label1.Caption = Range("B1") - Range("A1").value
とやるとシリアル値っぽいのが出るのですが、時間を表示したいのです。
助けてくださいませ。
0310デフォルトの名無しさん
2008/09/20(土) 03:58:49ホントありがと。
まったくプログラム経験なしだけど、
書いていただいたものをもとに
勉強含め動かしてみたいと思います。
感謝します。
0311デフォルトの名無しさん
2008/09/20(土) 08:40:23DateDiff関数でintervalに"s"を指定して秒単位の差分を取得、
後はそこから時分秒に分割して文字列に結合して完成、って所?
0312デフォルトの名無しさん
2008/09/20(土) 09:24:11一生そのままで朽ち果てろ
0313デフォルトの名無しさん
2008/09/20(土) 10:14:550314y
2008/09/20(土) 13:55:32>311のやり方で可能ですが、他にこういう書き方も。
Label1.Caption = Format(Range("B1") - Range("A1"), "hh:nn:ss")
0315デフォルトの名無しさん
2008/09/20(土) 16:18:39アドバイスどうもありがとうございます。
テストをしてみたのですが、両方とも「’実行時エラー’438:オブジェクトは、このプロパティまたはメソッドをサポートしていません。」
というエラーが出てしまいます。
私は知識不足なので対応がわかりません。
これは、どういうことなのでしょうか?
0317デフォルトの名無しさん
2008/09/20(土) 19:35:440318デフォルトの名無しさん
2008/09/20(土) 20:41:320319y
2008/09/21(日) 00:37:26書式指定子 "m" または "mm" は、時刻の分も表しますが、日付の月も表します。それによる混乱を回避するため、
分のみを表す指定子「n」が実装されている、という話を何かの本で読んだことがあります。
ヘルプには、「"h" または "hh" の直後、あるいは "ss" の直前に "m" を指定した場合、月ではなく分が表示されます」とあります。
逆に言うと、mだけを独立して使うと、分ではなく月を表します。つまり分のみを表示させたい状況では、どうしても「n」を使う必要があります。
そういうわけで、分は最初から「n」を使う習慣をつけておいたほうが、間違いが少ないように思います。
0320デフォルトの名無しさん
2008/09/21(日) 00:47:170321デフォルトの名無しさん
2008/09/21(日) 03:56:03なんでこいつこのスレに粘着してるの?
0322デフォルトの名無しさん
2008/09/21(日) 08:47:58テーブルを作成し、いくつか項目を入力した状態で、
GUIでテーブルの見出し行にある矢印メニューボタンを押した時に表示される
フィルタのメニューの処理を、VBAから行うにはどのようにすればよいでしょうか?
例えば、TODOリストを想像してください。
ボタンを配置して、ボタンを押すと、
テーブルの1つの列の「開始日付」が今日のもので、
「状態」列が「未完」となっているもののみを表示する。
また、他のボタンを押すと、元に戻る(というか全部表示)。
といったようなことをしたいのです。
画像を見てもらったほうが早いので、説明画像も作成しました。
http://sylphys.ddo.jp/upld2nd/pc3/src/1221954091856.jpg
どのようなクラスのオブジェクトにアクセスすればいいかだけでも、手がかりがあればと思います。
0323y
2008/09/21(日) 09:13:13チェックを入れたり外したりする操作を、「マクロの記録」(>>1★6)を使って記録して、
生成されたコードを見れば、どんなオブジェクトにアクセスしているか手がかりが
得られると思います。
0324デフォルトの名無しさん
2008/09/21(日) 09:37:36うざいからだろw
0325デフォルトの名無しさん
2008/09/21(日) 09:42:50ありがとうございます。
基本的なことを聞いてしまった様な気がします。テンプレ嫁よ俺。
「開始日付」を「今日」のみ選択、「状態」を「途中」「予定」「スキップ」のみ選んだ時は、
こんな感じで記録されていました。
ActiveSheet.ListObjects("作業記録").Range.AutoFilter Field:=2, Criteria1:= _
xlFilterToday, Operator:=xlFilterDynamic
ActiveSheet.ListObjects("作業記録").Range.AutoFilter Field:=1, Criteria1:=Array _
("途中", "予定", "スキップ"), Operator:=xlFilterValues
ListObjectsでListObject(テーブル)が得られて、そのRangeにAutoFilterをかますんですね・・・。
0326デフォルトの名無しさん
2008/09/21(日) 15:51:36同一ファイル内で、シート1上の左側にはシート1の内容、右側にはシート2の内容
のように分割して表示することは可能でしょうか?
(ウィンドウを別々に開くのではなく)
もしやり方があるのであれば教えてください。
Excel2003を使用しています。
よろしくお願いします。
0327デフォルトの名無しさん
2008/09/21(日) 17:20:230328デフォルトの名無しさん
2008/09/21(日) 20:07:05-------------------------------------------
【やりたいこと】
(1).ファイル保存ダイアログでファイル名を選択させる。
(2).新規ファイル名を入力することも可能にする。
(3).ファイル保存時に選択可能なファイルタイプ(拡張子)をVBAで指定する。
【直面している問題】
・Office.FileDialog で msoFileDialogSaveAs を指定すると(3)を満たす方法がわからない
・Office.FileDialog で msoFileDialogFilePicker を指定すると(2)を満たす方法がわからない
【環境】
WindowsXp SP3 + Excel2002 SP3
-------------------------------------------
よろしくお願いします。
0329デフォルトの名無しさん
2008/09/21(日) 21:06:15Excel.Application.GetSaveAsFilename
を使えばよかったんですね。
スレ汚し失礼。
0330デフォルトの名無しさん
2008/09/24(水) 00:40:370331デフォルトの名無しさん
2008/09/24(水) 07:22:11似てるけど全くの別物と思っておいた方がいいよ。
0332デフォルトの名無しさん
2008/09/24(水) 13:31:460333デフォルトの名無しさん
2008/09/24(水) 15:45:030334デフォルトの名無しさん
2008/09/24(水) 16:05:39何処に焦点当てるかで変わってくる
VB6とVBAは、構文規則は全く同じ
組込関数はほとんど同じ
組込オブジェクトは全然別物
>>333
そのVBAとVisual Basic for Applicationは意味違うからw
0335デフォルトの名無しさん
2008/09/24(水) 18:37:44と記述するとA2にデータの未入力状態ということで実行エラーが出てしまうのに、
With Worksheets("表")
.Select
.Range("A2").Select
End With
と記述するとエラーが出ずに問題なく実行されるのはなぜなの?
0336y
2008/09/24(水) 21:36:05そのセル範囲が含まれるシートが選択されていなければ、
実行時エラーが発生する仕様になっているためです。
>335の下のコードは、シートを選んでから、セル範囲を選んでいるので、エラーは発生しません。
上のコードも、「表」シートが選んである状態であれば、エラーは発生しません。
0337デフォルトの名無しさん
2008/09/24(水) 21:57:49こうすればいい。
>Worksheets("表").Select
>Worksheets("表").Range("A2").Select
# って、既に歪の人が書いていたか。
0338デフォルトの名無しさん
2008/09/24(水) 23:27:58xp・excel2002で、関数が物足りなくなってきたのでマクロとVBAの勉強始めました。
ネットで検索するとaccessにもVBAとかマクロとか関数も?あるようです?
同僚に挫折したaccessのVBAの本ならあるから1500円で譲るよ。と言われたのですが、
excelとaccessのVBAは同じものですか?全く別物でしょうか??
すみません、宜しくお願いします。
0339デフォルトの名無しさん
2008/09/24(水) 23:33:34AccessVBAの本ではVBの勉強にはなるかもしれないがExcelVBAの勉強にはならないので
1500円も出すくらいならちゃんとした本を買いましょう。
0340デフォルトの名無しさん
2008/09/24(水) 23:37:41VBAそのものは同じだけど操作対象が全く別物なのでお勧めできない
0341デフォルトの名無しさん
2008/09/24(水) 23:44:40レスdくすです。
つまり、同じものだけど違うものだから?エクセルのVBAの本を買うべき。
と言うことですね?ありがとうございました。
危うく、accessの本を読んでexcel挫折するところでしたw
0342デフォルトの名無しさん
2008/09/25(木) 00:42:240343デフォルトの名無しさん
2008/09/25(木) 15:13:33Dim Tbx As TextBox
Num = 0
For Cnt = 1 To 9
Num = Num + 1
Set Tbx = "TextBox" & Num
Tbx.Text = ""
Next
VBAは変数の型を自動変換してくれると考えて、これを実行すると、
「コンパイルエラー:型が一致しません」と出ちゃいます。無理かな。
0344デフォルトの名無しさん
2008/09/25(木) 16:09:13>Dim Tbx As TextBox
>Set Tbx = "TextBox" & Num←何がしたいんだ?
TextBoxは文字列ではないからコンパイル通らなくて当たり前だな
Set Tbx = Worksheets(1).OLEObjects("TextBox" & Num)
なら理解できる
0345デフォルトの名無しさん
2008/09/25(木) 16:39:59サンキュー!!!!!!!!!
0346デフォルトの名無しさん
2008/09/25(木) 16:45:25Dim Cnt, Num As Integer と書くと cntはVariant型だぞ
0347デフォルトの名無しさん
2008/09/25(木) 17:07:39わざわざ有難うございます。いただいたアドバイスをヒントに修正しました。
やりたかったのは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
0348デフォルトの名無しさん
2008/09/25(木) 18:48:290349デフォルトの名無しさん
2008/09/26(金) 09:26:40えっろっびっでぉー
0350デフォルトの名無しさん
2008/09/26(金) 18:02:31excelが対象なのに、VBAだけじゃ意味無いだろw
おとなしくメモ帳に書いとけ。
0351デフォルトの名無しさん
2008/09/27(土) 22:33:470352デフォルトの名無しさん
2008/09/27(土) 22:35:180353デフォルトの名無しさん
2008/09/27(土) 22:53:05VBAにエクセルが付いてくる…マ
>350は素人
0354デフォルトの名無しさん
2008/09/27(土) 23:28:04これ、笑うところ?
あ、マってプログラ"マ"じゃなくて"マ"ヌケってことか
それなら納得
プログラマがこんな本質を違えた愚かな発想するわけないもんなw
0355デフォルトの名無しさん
2008/09/28(日) 00:02:57サクラエディタにでも書けばいいじゃん。
0356デフォルトの名無しさん
2008/09/28(日) 00:09:480357ちら裏
2008/09/28(日) 06:12:413つとも全部違うと思って欲しい。
それぞれ用途がかなり違う。文法も基本的な部分は同じでも、
実際にコードしてみると、かなーり違うことがわかる。
例えばVBA(もしかしてVB.NETも)では識別子に漢字交じり日本語が使える。
DLLなどの外部モジュールを最も簡単に呼び出せるのはVB。
VB.NETでは網羅されて使いやすいCLRが使える。
Excel付属のVBAでは、これらは出来ないか出来ても酷く面倒
しかしExcelのVBAは
精々ユーザー定義関数の定義や、外部ファイル入出力関係の
典型処理の組み込みや、フールプルーフ目的のフォーム作成
といった補助的な利用に留めておくべきで、ExcelをVB
環境の一種として取り扱うのはやめたほうがいい。
(VBを学ぶ環境としては余り適していない)
0358デフォルトの名無しさん
2008/09/28(日) 08:25:19って何かと思っていたら、VBAの次世代版だったのか。
Office2003からVBAと並行して使えるようになっていたのな。
.NET2.0ベースで、VB.NET以外にもC#が使えるのは楽しそうだなあ。
>>356
VBAサポート打ち切ったら、マジ売れなくね?
0359デフォルトの名無しさん
2008/09/28(日) 12:22:40ひどい知ったかなので、初心者は信じないように。
0360デフォルトの名無しさん
2008/09/28(日) 12:56:22失敗の経験も貴重だから、確かにそうだな。
0361デフォルトの名無しさん
2008/09/28(日) 14:37:522008で「切り捨てて」AppleScriptに変更したら非難ごうごうで(当たり前)
次でやっぱりVBAを復活させるってさ
0362デフォルトの名無しさん
2008/09/28(日) 21:06:11意味がわからん
0363高島彩
2008/09/29(月) 15:57:370364HIRO ◆225xxx6ZSE
2008/09/29(月) 16:07:10(U( )
| |∨T∨ 皆さん、>>363をよろしくお願いします。
(__)_)
0365高島彩
2008/09/29(月) 16:12:29/∵∴∵∴\
/∵∴∵∴∵∴\
/∵∴∴,(・)(・)∴| / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|∵∵/ ○ \| < >>364 氏ねよ!!
|∵ /. ミ | 彡 | \_______
|∵.| \___|_/| ___
\| \__ノ / / \
\___/ /∧ \
/ ) | × | _ _
/ ,イ 、 ノ/ |●( ―= ̄ `ヽ, _
/ / | ( 〈 ∵. ・\ 〈__ > ゛ 、_―
| ! ヽ ー=- ̄ ̄=_\_(/ , ´ノ
| | `iー__=―_ ;, / / /
!、リ -=_二__ ̄_=;, / / ,'
/ / / /| |
/ / !、_/ / 〉
/ _/ |_/
ヽ、_ヽ
0366デフォルトの名無しさん
2008/09/29(月) 21:36:04ごく普通にやればいいだけだよ
VBやCでやるのと同じように
つーか、ワークシート使わない方法になると>>1にも書いてある通り
VBAではなくVB分野になるのでスレ違いだな
あとは自分で調べましょう
0367HIRO ◆225xxx6ZSE
2008/09/30(火) 00:14:01(U( ) >>366
| |∨T∨ ありがとうございます。
(__)_)
0368デフォルトの名無しさん
2008/10/01(水) 00:19:39ニコ動で一時期流行った侵略ゲームをExcelで再現してみたのですが、
やはり(?)あまり速度が出ません。
いろいろ頑張ってみたのですが、自分の限界に達したようなので、
速度が向上する方法がありましたらアドバイスをいただけると助かります。
http://uproda11.2ch-library.com/src/11122054.zip.shtml
0369368
2008/10/01(水) 00:36:04OS:Vista
私の環境では、ウィンドウを最大化しておかないと何故かフリーズしやすいです。
フリーズというか、画面は固まりますが裏では動いています。
0370デフォルトの名無しさん
2008/10/01(水) 03:44:42全く試さない上でVBA素人の俺が脊髄反射レス
・基点となるセルからoffsetで上下左右1ずつ隣のセルの値を取得して、
それを評価した方がいいんジャマイカ
・セルのプロパティのアクセスを都度行うのは重いから、
一度マップ範囲を c = Range("x:y") のように配列に入れて、
値から何とかした方がいいんジャマイカ
・ScreenUpdating を最初から False に(ry
嘘ですごめんなさい
0371デフォルトの名無しさん
2008/10/01(水) 07:26:33Randomize
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
0372デフォルトの名無しさん
2008/10/01(水) 07:27:04For 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
0373368
2008/10/01(水) 07:43:19一応貼っときます。
戦闘力はランダムのはずですが、
何故か名古屋が強い気がします・・・
0374デフォルトの名無しさん
2008/10/01(水) 14:08:29フリーズは再現できなかったけどとりあえず軽くしてみた
やったことは
1.色を配列に入れてこねくり回すようにした
2.色が変化しない時は再設定しないようにした
3.気に入らなかったのでElseifをSelect Caseにした
0375374
2008/10/01(水) 14:08:53Sub 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
0376374
2008/10/01(水) 14:10:02Application.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
■ このスレッドは過去ログ倉庫に格納されています