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)
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されてしまいます。
406 名前:>401 [2008/10/03(金) 23:22:31 ] ( ゚д゚)
407 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 23:40:02 ] >>405 セルをセットした後にExit For
408 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 00:55:23 ] ほとんど基礎もできていませんがアドバイスお願いします 自宅にパソがないので平日会社で試すしか方法がないのですが、何枚かのエクセルファイルを開きセルA6に別の表から拾った値を引っ張ります これがシートならば全シートを選んでVLOOKの式でもA6に入れればいいのでしょうが各ファイルを別々に保存しなければなりません 一度一つのファイルにまとめて入力後またばらしてもいいのですがそれならファイルを開けて手入力する手間とさほど変わりません 多くて40ファイルです どうぞよろしくお願いしますm(_ _)m
409 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 01:25:38 ] >>408 その情報だけだと使えそうな手段は2つくらいしか思いつかない 1.VBAで表をまとめてLOOKUP 2.VBAで該当する値を直接取りにいく >一度一つのファイルにまとめて入力後またばらしてもいいのですが 何がしたいのかよく分からないw >ファイルを開けて手入力する これは目視で値を確認していって該当する値を移すってことでしょうか? >多くて40ファイルです 40ファイル見るだけなのかすべて更新するのかどちらでしょうか・・・
410 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 01:47:52 ] 早速のレスを有難うございます。説明が至らずすみません おそらくあまりに初級なので難しく捕らえていらっしゃるかもしれません 見に行く表にはA列に番号(12桁)B列にも番号(9桁)がありこれが多くても40種の意味です。重複はしていない番号ばかりです そしてA列の番号がファイル名にもなっている1枚シートしかないファイルのセルA4に先程の12桁が入っているがセルA6に今までは手入力で9桁番号を入れていました 目視です。一応FIND窓で捜しはします… 独立させずシートとしてまとめたら一度に処理できるかと考えたのですが、、
411 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 02:00:03 ] すみません余りに眠いのでちょっと離れます なお40種は40行の意味です
412 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 09:52:11 ] >408,410 横レスします。 状況を私なりに解釈し、不足するところをおたずねします。 1 参照元ファイル(以下ブックと呼びます)は最大40個ある (408の下から2行目の記述から) 2 参照元ブックにはそれぞれ40行×2列(A列、B列)のデータがある (410の上から3行目の記述と411の「40種は40行」の記述から) 3 (結果を求める)作業用ブックのA4セルに12桁の番号が入っている (410の上から4行目の記述) 4 作業用ブックのA6セルには今まで9桁番号を手入力していたが → これを自動で表示させたいってこと? 質問 Q1 上の解釈でいいんでしょうか? Q2 40個のブックはそれぞれシートは何枚ですか? 1枚ずつだったら40シートの1ブックにまとめられませんか?
413 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 12:46:49 ] レスを有難うございます まず参照元と作業用の違いを私自身があまりわかってないかもしれません。携帯からのカキコで字数が限られ申し訳ないです(>_<) @A→参照する表は1ブックでそこに多くて40行2列、少ない時は10行2列くらいの表が1シートだけに表記してあります BC→OKです Q2→確かにひとつのブックにまとめればいいのですが、保存が1ブック1シートでないといけないのです(請求書みたいな感じ) なおかつそのブック名もセルA4の番号をつけないといけません 15ブックくらいなら目視&手入力でもいけますが日によって30-40ブックとなると間違いや画面の一杯さで 頭がくらくらしてしまい、楽な方法がないかとお尋ねしてみました まだ言葉足らずかと思いますがどうぞよろしくお願いいたします
414 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 14:25:37 ] 初心者にありがちなこと: やりたいことの自分なりの稚拙な解決方法を思いつくのだが、その具体的なやり方がわからずに ぐだぐだと質問&回答を続ける。 良い質問方法: やりたいことをまず具体的に書く。やりたいことというのは、ユーザレベルでの話し。
415 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 15:03:16 ] すみません本当に初心者なもので…… やりたい事は毎日新たに発生するブックのセルA6に、セルA4に対応した9桁の番号を拾ってきて自動入力し保存するという事です セルA4に対応した番号は他のブックに見に行きます この表現ではどうでしょうか? あまりに簡単な作業かもしれませんが良い方法があればよろしくお願いします
416 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 16:11:49 ] 致命的に説明が下手だな。とはいえ、普通の奴はこんな感じが標準なのかもしれんが。 商品マスタ(Product.xls)と注文ブック(Order.xls)ということにして、仕様を書いてみた。 [前提] 1.Product.xlsのSheet1のA:B列に何らかのデータが入力されている 2.毎日Excel Bookが40ファイル程度できる 3.そのBook名は[12桁の文字列].xls(以降、Order Bookと表記) 4.Order Bookには1シート(以降、Orderシート)しか存在せず、そのシートのA4には[12桁の文字列]が設定されている [やること] 1.毎日発生するOrder BookのOrderシートのA6に、Product.xlsから取得したデータを設定し上書き保存する 2.データの取得方法は、Product.xlsのSheet1!A列の中から、[12桁の文字列]を探し、適合する 行が合った場合は対応するB列の値を持ってくる [異常処理] 1.Order Book名とA4の内容が異なる場合は***する 2.[12桁の文字列]が見つからなかった場合は***する [疑問] >多くて40行2列、少ない時は10行2列 これはどのタイミングでどのような理由で変更されるのか?
417 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 16:16:17 ] それから簡単、簡単言うな。 お前が超絶難しいと思ってるものでも、ソルバ一発で解決できる類の問題もあれば、 単純作業を自動化するだけなのに、プログラム的にはすげー面倒な場合もある。
418 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 17:42:54 ] はぁー言われてみたらその通りです。こういう表現をするんですね? 確かにこのように書け、と言われたらできるのかどうか それで1点、OrderBook名には「請求書M...」みたいにセルA4に日本語が3文字ついていたかもしれません また、10コか40コかはメール受信によって左右されます。メールの添付をどこかのフォルダに保存し何等かのマクロを実行するとよそにそれに対応した9桁の番号が、 検索されるのか作成されるのかするのでそれを本日分として拾ってくるわけです。でセルA6は空白なので入力して完成させる… 自分は記録マクロしかできないのですが、もし自分がVBAに詳しければ@OrderBookのシート1を一つのブックにまとめる AProductシートもそこに挿入BVlookupでセルA6に値入力Cシートをばらして保存 とかが簡単に出来るのかな?のイメージでした;ω; スミマセン
419 名前:412 mailto:sage [2008/10/05(日) 17:49:34 ] >408,410,413,415 もう一回自分なりに解釈したものを書きます。 1 参照元ブック(1シート)は日々内容が変わるけど、A列、B列にデータが記録されている。 (内容が固定されていないということは413の「多くて40行2列、少ない時は10行2列くらいの表が」から推測) 2 結果を求める(作業用)ブックは複数生まれる (413の「保存が1ブック1シートでないといけない」ということと、 「15ブックくらいなら目視&手入力でもいけますが日によって30-40ブックとなると」から推測) 3 作業用ブックは「ひな型」となるものを呼び出してA4セルに12桁の番号を入力し、A6セルには参照元 ブックから自動参照した結果が表示されたところで「12桁の番号」をブック名として名前を付けて保存する 4 上記3を15〜40回繰り返す これでいいのかな? もし、参照元ブックの名前が固定されているんであればVBAじゃなくてもできそうだけど。 作業用ブックのひな型のある範囲に参照元ブックのデータをまるごと外部参照でもってきておいて、 A6セルにVLOOKUP関数を書いたらいいんじゃないかな。 外部参照って言い方が正しいのかわからないけど、ヘルプで 「ほかのブックやアプリケーションへのリンクを設定する」を見てみてください。
420 名前:412,419 mailto:sage [2008/10/05(日) 17:50:56 ] ありゃ、回答を書いているうちに質問者さんからの書き込みがあった。419はなかったことにしてください。
421 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 18:16:27 ] お世話になります 3.の行程上でセルA4には12桁の番号が既に入った状態で届きます。こちらで入力はしません VLOOKもいいのですが作業用ブックの開け閉めが面倒いというか少ない時はいいのですが、多い時にはどれがどれやらわからなくなるのです
422 名前:420 mailto:sage [2008/10/05(日) 18:41:03 ] >421 ↑のことも入れて、もう一回自分なりに解釈したものを書きます。 1 参照元ブック(1シート)は日々内容が変わるけど、A列、B列にデータが記録されている。 (内容が固定されていないということは413の「多くて40行2列、少ない時は10行2列くらいの表が」から推測) 2 結果を求める(作業用)ブックはメールにて複数送られてくる なので、作業用ブックに個々に計算式等を入れるのは無理(あるいは極力回避) 3 作業用ブックのA4セルには既に12桁の番号が入力されていて、 ・現状では 参照元ブックを開いてA列に一致する行のB列の番号(9桁)をA6セルに入力して保存(の繰り返し) ・したいこと マクロブックを開いてマクロを実行したら、複数の作業ブックを手動で開かなくても それぞれのブックのA6セルに自動的に対応する9桁の番号が記録されている ※作業対象のブックを指定する作業は手動か? (作業対象ブックが保存されているフォルダを指定できれば自動化も可能)
423 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 18:52:53 ] 出来の悪いSEと出来の悪いクライアントのgdgdな打ち合わせの例