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)
58 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 22:36:57 ] >>16 >>54 keyプロパティはないけどidプロパティでシェイプを特定できるから、(id,座標)のような配列や コレクションを用意しておいて座標<->シェイプの関連づけをすれば解決するんじゃないかな。
59 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 03:45:00 ] >>55 TopLeftCell プロパティとか BottomRightCell プロパティを利用するのだと思います
60 名前:デフォルトの名無しさん mailto:sage [2008/09/02(火) 00:34:42 ] Excel.Excel.Excel
61 名前:デフォルトの名無しさん mailto:sage [2008/09/02(火) 00:49:54 ] 顧客名簿を作ったのですが、2000件近くなり電話番号で検索できるようにしたいと思っています で、ユーザーフォームで「電話番号入力」欄を作り、そこに電話番号を入れて「検索」ボタンを押すと、 電話番号が一致した「顧客名」、「住所」を同じユーザーフォームに表示するようにしたいのですが、 どんなコードを使うと良いのかヒントを教えていただけませんか? シートには、 A B C D 顧客名 電話番号 住所1 住所2 1 あいだ 090xxxxxxxxx 東京都 杉並区 2 いとう 080xxxxxxxx 北海道 札幌市 という風に記入しています B1の電話番号「090xxxxxxxx」を「電話番号入力」欄に入れて「検索」ボタンを押すと 「顧客名」 あいだ 「住所1」 東京都 「住所2」 杉並区 という風に表示できるようにしたいのです。 Excelは、2000 OSは、Winddows XP SP3です
62 名前:デフォルトの名無しさん mailto:sage [2008/09/02(火) 00:51:35 ] いちおうユーザーフォームを使って形だけは作って、 「検索」ボタンを押すと該当するデータがない場合にメッセージが出るようにはしたのですが、 そこから先が(というか、ほとんど進んでいないのですが)見当がつきません
63 名前:デフォルトの名無しさん mailto:sage [2008/09/02(火) 02:35:21 ] Findで電話番号を検索して行位置を取得 あとはCellsでデータを取ればいい
64 名前:デフォルトの名無しさん [2008/09/02(火) 18:47:07 ] ChDir ThisWorkbook.Path Chdrive ThisWorkbook.Path とやって作成した奴を 他人のPCで実行させても同じフォルダ内のファイルを探せなくてエラーが出ます。 デスクトップのフォルダで動作させても msgbox ThisWorkbook.Pathでは〜¥Tempとなっています。 ユーザー設定のカレントは空白にしても変わりません。 XPの2003で作成し、会社の2007では動作しましたが他のPCのXP、2003で発生します。 どのように対処すべきですか?
65 名前:デフォルトの名無しさん mailto:sage [2008/09/02(火) 20:52:52 ] 日本語でおk
66 名前:64 mailto:sage [2008/09/02(火) 22:13:35 ] 要は、デスクトップで起動させたブックのThisWorkbook.Pathが なぜ関係ないC:\〜¥〜¥Tempになってしまうのか?ってことです。
67 名前:デフォルトの名無しさん [2008/09/02(火) 23:44:42 ] >>64 OfficeXP・2003からOffice2007にアップグレードすればおk
68 名前:デフォルトの名無しさん [2008/09/03(水) 19:41:38 ] EXCEL2007です。 以下のコードで、実行時エラー1004「アプリケーション定義または オブジェクト定義のエラーです」になります。 何が原因でしょうか。 Private Sub Worksheet_Change(ByVal Target As Range) Dim o16 As Integer Dim o1 As Integer Dim rgbnum As Integer r = Target.Row c = Target.Column 省略 rgbnum = o16 * 16 + o1 Range(Cells(r, c - 1), Cells(r, c - 1)).Value = rgbnum ←ここでエラー End Sub
69 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 21:50:31 ] cがゼロになってるとか
70 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 21:51:17 ] cがゼロじゃなくて、cが1だからCells(r, c - 1)が存在しないとこを参照してるってことね
71 名前:デフォルトの名無しさん [2008/09/03(水) 23:46:30 ] VBAを1週間前から勉強していて、すごーく簡単なプログラムは作れるようになったのですが、 いまいち理解しているのかどうかがわかりません。 勉強の仕方はネットで調べながら・・・なのですが、 みなさんはどのように勉強してましたか? 課題をもらえるとやりやすいのですが、一人でやってると自分が何をしているのか わからなくなります。覚えるコツなどありましたら教えてください。
72 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 23:53:34 ] >>71 興味あるものを作るところから始めたら? 仕事なら、覚えるしかないからかえってそういう事を悩まずにすむけど。
73 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 23:57:43 ] >>71 おれはシューティングゲーム→ギャルゲー→RPGと作って 無駄な時間をすごした。
74 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 03:13:53 ] 俺はVB→ExcelVBAだったから特に勉強とかしてないけど、 VBは最初はいろんな小物ツールとかつくって覚えたなぁ。
75 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 03:29:37 ] ExcelVBAだったらExcelオブジェクトを理解することが重要だけど、 VBA全体を勉強したいならWin32APIやWindowsCOMオブジェクト についても勉強する必要があると思うなぁ。 最初はコードが公開されているサンプルを眺めたり流用して何か 役に立つものを作ったらいいと思う。その内にコードが公開されて いないけど実現したい機能とかも自力で作成できるようになるよ。 Officeだったらコードが公開されていなくてもパスワードクラックの ツールがあるからそれ使ってちょっと高度なコードにも目を通すと いいかも。
76 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 03:57:22 ] 結局ダジャレかよ
77 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 11:53:25 ] >>71 質問掲示板の「回答者」になるのが良いでしょう。 どの掲示板が良いかは自分で判断して下さい。 別に書き込まなくても良いので、色々な方のコードと自分のコードを比較する事が勉強になる。
78 名前:デフォルトの名無しさん [2008/09/04(木) 16:15:58 ] VBAでオブジェクト指向プログラミングできるの?
79 名前:デフォルトの名無しさん [2008/09/04(木) 18:43:38 ] むしろ、VBAはOO言語だろ
80 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 19:18:16 ] まあOO言語としてはかなり不完全だけど 分類的にはOO言語寄りではあるな
81 名前:68 [2008/09/04(木) 19:49:36 ] >>69 ,70 レスありがとうございます。 cはゼロにも1にもなっていないですが・・・。
82 名前:デフォルトの名無しさん [2008/09/04(木) 20:41:23 ] 1つのセルが対象なのにrangeで範囲選択してんの?
83 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 20:45:17 ] いいじゃまいか
84 名前:デフォルトの名無しさん [2008/09/04(木) 21:56:37 ] うーん。出先なんで確認取れないんだけど、 sheets(hoge).range( の形でどうかな? sheet changeイベントで、rangeオブジェクトが保持してるシート名が対象rangeと異なるからエラー出してるとか。 適当だけどw
85 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 22:23:24 ] >>71 体系だった入門書を通読しろよ、糞ゆとりが
86 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 22:44:22 ] cellsに修飾が足りないな、きっと
87 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 23:45:43 ] >>68 cに1が入った場合の処理をしていないから Changeイベントループして最終的に >>70 の言う事になってるだけ
88 名前:デフォルトの名無しさん [2008/09/05(金) 00:09:51 ] toggleMerge("A1:A5") という命令でA1:A5の範囲のセルを結合させたり結合解除させたいのですが、 実行させても何も起こりません。エラーすら起こりません。 ばらして同様のことをやるとちゃんと動きます。何が悪いのでしょうか。 以下そのコード Sub toggling(ByRef obj As Variant) obj = Not obj End Sub Sub toggleMerge(ByVal str$) toggling Range(str).mergeCells End Sub
89 名前:デフォルトの名無しさん [2008/09/05(金) 00:35:04 ] スレ違いとは思うのですが助けてください モジュールで有効な変数宣言しようとすると Dimとか打ってたらエラーダイアログが0.2秒ぐらいで6連続くらい連発して打ち切れない Excel2008なんだけど構文チェックスピード早すぎて打てない どうしたらいいのか教えて頂けないでしょうか
90 名前:デフォルトの名無しさん mailto:sage [2008/09/05(金) 00:46:23 ] >>68 "c"にミスがないのであれば Sheets(hoge).Range((Sheets(hoge).Cells(r, c - 1), Sheets(hoge).Cells(r, c - 1)).Value = rgbnum ↑のようにしてみてはいかがか
91 名前:デフォルトの名無しさん [2008/09/05(金) 00:50:36 ] すみませんが namidame.2ch.net/test/read.cgi/slotj/1216400588/ のスレで確率についてバトルしています 問題はサイコロで1が8回連続して出る確率です バカが多すぎて疲れました 頭の良い皆様、論破してください お願いします
92 名前:デフォルトの名無しさん mailto:sage [2008/09/05(金) 01:15:08 ] >>90 Worksheet_Changeイベントに記述しているから セルに値を入れる前にイベント発生を止める処理を入れるか cが0にならないようにする処理を入れないと Changeイベントが連鎖してエラーになる
93 名前:デフォルトの名無しさん mailto:sage [2008/09/05(金) 01:20:01 ] >>89 めっちゃ早く打つ
94 名前:デフォルトの名無しさん mailto:sage [2008/09/05(金) 01:28:59 ] 質問するのは全然かまわないんだけどさ、質問スレだからな。 でもさ、質問する前に日本語で質問できるようになってから来いよな。 たのむから。
95 名前:デフォルトの名無しさん mailto:sage [2008/09/05(金) 02:00:19 ] >>92 なるほど。ちょっと賢くなりました。
96 名前:68 [2008/09/05(金) 08:57:53 ] みなさん、レスありがとうございます。 cが特定の値の時にしか、 セルに値を入れないようにしたら うまくいきましたm(__)m
97 名前:y mailto:sage [2008/09/05(金) 17:45:41 ] >>88 おやっ、と思うようなコードですね。 たぶん、MergeCellsプロパティの「実体」を、togglingプロシージャに 参照渡しして、そこからプロパティを操作しようと考えたのでしょうか。 偶然かもしれませんが、なかなか珍しい間違い方をしていると思います。 toggling Range(str).MergeCells というコードは、 @MergeCellsプロパティを読み出した結果得られた値について、 Aその値をtogglingプロシージャに渡す、 という2段階の処理として実行されます。単純に 「MergeCellsプロパティを、togglingプロシージャに渡す」 わけではありません。 Range(str).MergeCells で取得できるのは、プロパティの実体ではなく、 実体を読み出した結果であり、"True"もしくは"False"というただの値です。 この時点で、実体との関係は断たれてしまっているので、 その値をtogglingに参照渡しして、それを反転させても、 プロパティそのものを操作することにはなりません。 プロパティを操作する場合は、次のように直接操作するようにしてください。 Sub toggleMerge(ByVal str$) Range(str).MergeCells = Not (Range(str).MergeCells) End Sub
98 名前:y mailto:sage [2008/09/05(金) 18:04:43 ] >>89 何をした瞬間エラーメッセージが出た、というあたりをもう少し詳しく。>93w >>58 ありがとうございます。やっぱりKeyプロパティはないんですね。
99 名前:デフォルトの名無しさん mailto:sage [2008/09/05(金) 20:14:32 ] 何言ってんだこいつ
100 名前:デフォルトの名無しさん [2008/09/05(金) 23:31:49 ] >>97 どうもありがとうございます。 Boolean型のオブジェクトを渡していたからだったのですね。 でもできれば、汎用的にtoggleプロシージャをつかって実装したいです。 Sub toggle(ByRef obj As Variant, ByVal propertyName$) obj.propertyName = Not obj.PropertyName End Sub という感じです。 そこで、新たに質問なのですが、”.”を使わずにプロパティを参照するには どのようにすればいいのでしょうか。 たとえば、Javascriptだとobj["PropertyName"]でプロパティ参照できるのですが、 VBAには類似の呼び出し方法は存在しているのでしょうか。
101 名前:デフォルトの名無しさん [2008/09/05(金) 23:43:02 ] ちょっと早めに知りたいので、 pc11.2ch.net/test/read.cgi/bsoft/1219830884/l50x こちらのほうでも同様の質問をしようと思います。 マルチポストはするな、といわれたくないため、先に宣言しておきます。
102 名前:デフォルトの名無しさん [2008/09/05(金) 23:50:31 ] VBAではインクリメントは a = a+1 と記述するしかないですか? a += 1 a ++ はだめでした。 (下は別言語なので当然ですが・・・。)
103 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 00:39:09 ] >>100 CallByName >>102 諦めろ。
104 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 01:25:11 ] hint : overload
105 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 02:05:01 ] A列のセルに入力があればA列の中で同じ入力がないか検索する というマクロを作ろうと思っているのですが、セルの入力判定の方法を教えていただけないでしょうか? 宜しくお願いします。
106 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 03:17:52 ] もっと具体的に
107 名前:105 mailto:sage [2008/09/06(土) 07:39:52 ] 説明が抽象的になってしまいすいません。 A列からF列までそれぞれの列に情報を入力してリストを作っているのですが、 既に何百行も情報を入力していて、都合上同じ情報を追加で入力してしまう恐れがあり、 現在は毎回入力の前にCtrl+Fの検索で既に入力された情報かどうか調べています。 そこでA列のセルに入力があれば入力されたセルより上の既に入力された全てのセルの文字列と比較して、 既に同じ入力があればエラーメッセージを出すというマクロを作りたい次第です。 マクロを作成するにあたって、「A列に入力があれば」という部分をどう書けばいいかわからなかった為質問させていただきました。 A列に同じ情報が入力されるという事は都合上絶対に有り得ない事なのでA列のセルを比較しようと考えています。 ・A列には1行目から空白なく順番に情報が入力されている。 ・新規に入力する際は現在のリストの最終行の次の行に情報を入力している。 という条件があるので、A列に入力があればというよりA列の最終行の次の行に文字が入力されればという方が正しいかもしれません。 説明が下手で申し訳ありません。 宜しくお願いします。
108 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 09:22:13 ] >>107 Worksheet_SelectionChange
109 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 09:27:52 ] リアルタイムのイベントハンドラかぁ・・・。 VBAって自分でイベントの作成は出来るのかな。あまり詳しくないんで分からないや:( 若干重くなるけど、sheetのchangeイベントで、セルを移動した時に、A列の最終行の内容と同じ物をチェックするとか。 うーん・・・あまり美しくないよね。 自分でイベント作成出来るのか、私も知りたいです。 詳しい人お願いします。
110 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 10:56:04 ] >>103 ありがとうございました。
111 名前:105 mailto:sage [2008/09/06(土) 14:30:52 ] >>108 ,109 アドバイスをくださってありがとうございます。 参考にマクロを組んでみようと思います。
112 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 14:45:53 ] >>107 重複データがあるかないかを調べるだけでよければ VBA使わなくても条件付き書式でできる。
113 名前:デフォルトの名無しさん [2008/09/06(土) 16:14:55 ] Excelの VBA の関数の呼び出し方法が分かりませんので、誰か教えて戴けませんでしょうか? C では // 関数の定義 void abc(void) // メインルーチン void main(void) { // 関数名 abc(); } void abc(void) { --- } 上記の方法で関数を呼び出そうとして、 Sub 名前() abc() End Sub :abc() --- return 上記記載の方法では動きませんでした。 素人な問い合わせで申し訳ありませんが宜しくお願いします。
114 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 16:25:59 ] 関数なんだからなんらか値を返す 仮にintegerの型でパラメータを受取ってintegerの何かを返すとして Sub 名前() Dim a as integer Dim param as integer param=100 ←何かの数字(integerの範囲内) a = abc(param) End Sub Function abc(param as integer) as inetger 〜 abc = **** ←何か処理した結果のintegerの数字 End Function
115 名前:デフォルトの名無しさん [2008/09/06(土) 17:04:48 ] <<114 113 です。早速のお教え有難う御座います。 なんらか値を返す様に変更します。
116 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 17:10:04 ] >>113 のCのコードを何も考えずにVBAにするとこうだぞ。 Sub main() Call abc() End Sub Sub abc() --- End Sub 戻り値の型がvoidの関数はSub、それ以外はFunction。 戻り値を受け取らない場合、Sub/FunctionにかかわらずCallを付ける(Call使わない記法もあるけど)。
117 名前:デフォルトの名無しさん [2008/09/06(土) 17:30:42 ] >>116 113 です。いろいろお教え戴き有難う御座います。 この方法が簡単なので採用させて戴きます。
118 名前:デフォルトの名無しさん [2008/09/06(土) 18:07:40 ] >>114 >>116 113 です。プログラム作成途中ですが、両方とも必要になりましたので、 共に採用させて戴きます。いろいろと、有難う御座いました。
119 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 21:14:05 ] pc11.2ch.net/test/read.cgi/tech/1204552981/878
120 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:37:07 ] 関数は、なんらかの値をかえすべきであるという考えた方が 身に染み付いてるから、SubとVoid関数は非常にきもちわるい。
121 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:38:23 ] 要するに時代遅れですね
122 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:36:46 ] かえり値もたない関数は、デバッグがむずかしくなるから、医療系の俺の会社じゃ よほどのことがないかぎり作らない。むしろ121がしろうと
123 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:52:19 ] >>122 VBAスレで恥ずかしい事いうなよおっさん。
124 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 01:49:03 ] LispとかMLでの話なら>>120 >>122 も分かるが、 VBAで純粋関数型プログラミングは無茶があるだろ、常識的に考えて。
125 名前:89 mailto:sage [2008/09/07(日) 03:31:47 ] むっちゃ早く打つ案に似た解決策で自己解決しました。 必殺コピペです。 グローバルエリアに変数定義しようとしたらDimと打った時点でエラーメッセージが頻発 変数書こうとしても打っている途中でメッセージ頻発して書けない。 どこかにエラーチェックのタイミングプロパティがあると思うがコピペで解決したから諦めようかと思います
126 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 07:55:30 ] そういや、functionしか存在しない言語もあるな。
127 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 10:23:41 ] よくいるんだよね。VBにしかVariant型がないと思ってる自称上級者
128 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 14:27:52 ] ファイルを開かずにアクティブシートを変更するにはどうしたら良いでしょうか。 AccessのTransferSpreadsheetでエクセルの任意シートへデータを出力していますが、 エクセルファイルを開いた時に、値を出力したシートがアクティブになっているようにしたいのです。
129 名前:128 [2008/09/07(日) 14:30:04 ] ついでに読み取り専用属性の操作もできればサイコーです
130 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 14:45:07 ] please tell ass in Japanese... Sheets("hoge").Activate Sheets("hoge").SaveAs "c:\hoge.xlsx", xlWorkbookNormal, , , True
131 名前:128 mailto:sage [2008/09/07(日) 15:15:51 ] えー、ファイルを開かない状態でアクティブシートを変更したいのです。 そのやり方だとインデックスエラーになっちゃうんですけど。
132 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 15:26:27 ] Excelオブジェクト生成 ファイルオープン(非表示) シートをアクティブにする 保存
133 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 15:30:41 ] ここっていちいち一から百まで説明しないといけないから疲れるな 結局ファイルを開かなきゃいけないってことですね。どうもありがとうございました。
134 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 15:39:47 ] 偉そうに言ってますな w
135 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 15:45:40 ] そりゃそうだ。エスパーなんてここにはいない。
136 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 15:46:46 ] ここの奴らほとんど、ろくな知識も無いのに 知ったか振っててうざいんだもん これぐらい言わせなよ
137 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 15:51:18 ] うわぁ・・・低脳すぎて煽るきにもならない
138 名前:128 mailto:sage [2008/09/07(日) 15:52:01 ] あと別におまえらがエスパーである必要はねーけど 言われた事から、相手がなぜそうしたいのか、ではどういう方法が適切かくらい想像しろよ、と思うね おまえら自分の知ってることが唯一の回答であるようにこじつけてるだけだろ。 そういうのをバカの一つ覚えって言うんだよ。 でも回答ありがとう。じゃね。
139 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 15:52:32 ] っていうかxlsファイルを開くのとExcelのGUIを開くのを同じことだと思っている低脳っているんだね
140 名前:>137 mailto:sage [2008/09/07(日) 15:53:30 ] じゃあ書くなよウスノロw
141 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 15:53:47 ] うわぁ・・・ひどい池沼ですね・・・
142 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 15:55:07 ] 日本語で質問できるようになったら書き込みしような。
143 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 15:56:22 ] 高卒とかFランは書き込みできないようなフィルタかけてくれよ
144 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 15:59:21 ] 盛り上がってますね
145 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 16:01:56 ] >>133 最低限1から5くらいまで説明しようぜ。 俺らお前のお母さんじゃないんだからよ。
146 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 16:02:48 ] というより、 出来ないことは出来ないと説明した上で代替案を示すなら ここまで荒れないと思うのだが。 条件に反することを回答するからこうなる
147 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 16:03:39 ] >>132 でできると思うぜ。
148 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 16:10:34 ] >>145 えっ? >128を1から5くらいの説明で理解できるのか? 最近のお母さんてスペック高いんだな!
149 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 16:11:33 ] OBJ.FileOpenは知ってたけどコードがごちゃごちゃするから嫌いなのよ。 他にもっとシンプルなやり方が無いのかな、って思っただけ。
150 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 16:12:30 ] >>147 非表示だけど、ファイル開いてるからNGだろ。 想像力のない俺からすれば、元の質問自体がNGだけどな。
151 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 16:13:04 ] 変な知ったかいいわけ始めたぞ
152 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 16:14:32 ] ファイル開かずにファイルを変更するなんて方法があったら俺が知りたいな
153 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 16:16:31 ] 128ってそんなに難しいか まさかとは思うがプログラム板なのにAccessのVBAを知らん奴がいるのか
154 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 16:20:31 ] 簡単だぞ。質問がヘタなだけ。で質問の答えに対して実装できるスキルもないだけ。
155 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 16:23:38 ] 要するに低脳というわけですね。分かります。
156 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 16:24:49 ] 盛り上がってますなあ
157 名前:128 [2008/09/07(日) 16:38:58 ] 結局お前らAccessVBAが理解できなかっただけ佳代w 低能エクセル厨乙w
158 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 16:49:47 ] スレタイ100回音読してみろ。 それから自分の質問と回答を100回音読しろ。
159 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 16:56:43 ] 下手な釣りだなあ。次の質問どうぞ。
160 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 18:49:05 ] >>128 が見えない
161 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 20:20:00 ] excel vba 極めたいのですけど お勧めの参考書はありますか?元制御系プログラマで プログラミングの基本は充分できています。 技術評論社のポケットリファレンスはどうですか?
162 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 20:25:06 ] 便乗質問・・・。 win32APIを勉強したいのですが、お勧めの本ってありますか? 使用目的はExcel VBAで呼び出す事です。
163 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 20:29:47 ] Excel VBAによるWin32 APIプログラミング入門 (単行本) ぐぐることも出来ないの?
164 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 23:32:31 ] 質問者も回答者もバカが多いな
165 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 00:05:08 ] お前ほどじゃないがな
166 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 03:03:14 ] だな
167 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 03:08:05 ] 157 名前:128[] 投稿日:2008/09/07(日) 16:38:58 結局お前らAccessVBAが理解できなかっただけ佳代w 低能エクセル厨乙w こいつリアルでもこんな感じなんだろうな
168 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 07:45:44 ] >>162 マジレスするとWin32APIの為に本を買うのはもったいない。 MSDNとネット上のAPIサンプル集とかで十分。
169 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 19:00:04 ] detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1112704276 上のようなことの逆は可能ですか? 例えば、セルAに映画のタイトルが縦に並んでて、 セルBにはその映画の詳細が見れるHPアドレスが沢山並んでます。 セルBのそれぞれのアドレスを、セルAに一括でハイパーリンクさせる(埋め込む) 方法が知りたいです。 ご教授、宜しくお願い致します。
170 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 19:41:35 ] pc11.2ch.net/test/read.cgi/bsoft/1219830884/238
171 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 20:08:18 ] >>170 循環参照になってる
172 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 20:09:26 ] 笑!
173 名前:y mailto:sage [2008/09/08(月) 20:21:47 ] >>169 セルB1にあるアドレスを、セルA1にハイパーリンクとして埋め込むのは、 次のようにすればできます。 Sheet1.Hyperlinks.Add Anchor:=Cells(1, "a"), _ Address:=Range(1, "b"), _ TextToDisplay:=Cells(1, "a").Value (マクロの記録を使って、ハイパーリンクを埋め込む動作を記録してみれば簡単です) これをループで括って、「1」となっているところ(これは行番号にあたります)を 変えていけば、お好みの行数分操作できます。
174 名前:y mailto:sage [2008/09/08(月) 20:25:13 ] あ! すみません。 169はマルチポストだったんですね。 気づかずに答えてしまいました。 >>169 ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%9D%E3%82%B9%E3%83%88 一度ここを読んでおいてください。
175 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 20:29:35 ] > Range(1, "b") ?
176 名前:y mailto:sage [2008/09/08(月) 20:29:41 ] さらに自分のレスの間違いに気づきました。 Address:=Range(1,"b") → Address:=Cells(1,"b")
177 名前:169 mailto:sage [2008/09/08(月) 21:03:00 ] >>173 マルチ悪かった。 ツール→マクロ→VBA→標準モジュールに保存した後、 マクロ実行してみたけどできません。 初心者なんでもう少し詳しく教えていただけませんか?
178 名前:169 mailto:sage [2008/09/08(月) 21:54:01 ] 1行だけできましたけど、 行数分操作ができません。 Cells(1, "a"), 1の部分の範囲指定はどうすればいいの?
179 名前:169 mailto:sage [2008/09/08(月) 21:55:21 ] できればセルを範囲指定して、マクロ実行で 一括で変更できると助かります
180 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 22:01:32 ] ググレ
181 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 22:27:39 ] >>180 いろいろ調べてもわからねぇよ 質問スレなんだから聞いてるんだろ。。意地悪しねぇで教えろよ。 その気がないなら返信するな
182 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 22:45:30 ] >>179 =>>169 =>>こないだの池沼 な
183 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 22:46:16 ] >>181 =>>179 =>>169 =>>こないだの池沼
184 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 23:16:26 ] モーグでも行けよ池沼
185 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 23:40:48 ] で、また169が暴れるのか?
186 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 23:43:52 ] >>181 =>>179 =>>169 =>>184 =>>こないだの池沼
187 名前:デフォルトの名無しさん [2008/09/09(火) 01:33:11 ] XMLファイルをVBAで扱いたいんですけど、そういった方面を勉強できるような書籍はないでしょうか。 「XML入門」みたいな本はたくさん見るんですけど、あれって具体的なコーディングについては記述が無いorごく少ないですよね。。。 あってもPHPとかばっかりだし。。。
188 名前:デフォルトの名無しさん mailto:sage [2008/09/09(火) 08:48:08 ] 書籍があってもバカじゃどうしようも無い まともな頭があればVBAでCOM(XMLDOM)使ってXML扱うくらい、 ネットの情報だけで事足りる
189 名前:デフォルトの名無しさん [2008/09/09(火) 10:31:32 ] あるセルからあるセルまでソルバーを使うということをやりたいのですが、 ↓のを作ったのですが、出来ません。どうすればいいですか? SOLVERの参照設定はやりました。 Sub Macro1() Dim x As Integer For x = 1 To 5 Range("Cells(x, 3)").Select SolverOk SetCell:=Cells(x, 5), MaxMinVal:=3, ValueOf:="0", ByChange:=Cells(x, 2) SolverSolve Userfinish:=True Next x End Sub
190 名前:y mailto:sage [2008/09/09(火) 19:35:50 ] >>177 173の後半を、もう少し具体的に書きます。 まずループ用の変数rを宣言し、ここでは例として For 〜 Next間を5回繰り返すループを示しておきます。 Dim r as Long For r = 1 to 5 Sheet1.Hyperlinks.Add Anchor:=Cells(r, "a"), _ Address:=Cells(r, "b"), _ TextToDisplay:=Cells(r, "a").Value Next 繰り返しのたびに、rは1, 2, 3, 4, 5と変化していくので、 上のコードでは1〜5行目に対する操作が行われることになります。 初心者の方なら、「VBA デバッグ」などで検索してみて、この過程を 一つ一つ目で確認する方法を身につけると、上達が早くなります。 For r = Inputbox("開始行?") to InputBox("終了行?") とすれば、処理をしたい行の範囲を簡単に指定できますが、 もっと便利にしたければ、自分でも他の方法を色々調べてみてください。 質問する時は、どんなに間違っていてもいいので、とにかく何か自分なりに 調べて考えたコードを貼って、それに対するアドバイスを求めた方がいいですよ。 181のようなことを書くと、>>1 の★5にあるように、「また丸投げか」と 怒りを買ってしまいます。
191 名前:y mailto:sage [2008/09/09(火) 20:01:47 ] >>189 マクロの記録を使って、ソルバーでやりたい作業をマウスでやってみて、 どんなコードが記録されるか確かめてみてください。(>>1 ★5) 189のコードについては、 @単純な構文ミス Range("Cells(x, 3)").Select → Cells(x, 3).Select A目的セルをどこにしたいのか、可変セルをどこにしたいかが不明 です。特に、Aが分からないとアドバイスができません。
192 名前:y mailto:sage [2008/09/09(火) 20:03:56 ] >189 「>>1 ★6」でした。失礼しました。
193 名前:デフォルトの名無しさん mailto:sage [2008/09/09(火) 20:44:23 ] >>190 ご親切にありがとうございました。 勉強になりました
194 名前:デフォルトの名無しさん mailto:sage [2008/09/09(火) 22:41:34 ] >>191 すみません 目的のセルがCells(x, 5)で、可変セルがCells(x, 2)のつもりでした。 で、@のやつをやったら出来ました。 ありがとうございました。
195 名前:デフォルトの名無しさん [2008/09/09(火) 22:50:31 ] VBA初心者です 何か作ろうと思うのですが…自分では思いつかないので… 何か問題お願いします。
196 名前:デフォルトの名無しさん mailto:sage [2008/09/09(火) 22:57:53 ] >>195 このスレを集計してyの貢献度を調査せよ。
197 名前:195 [2008/09/09(火) 23:04:59 ] >>196 ラジャ
198 名前:デフォルトの名無しさん [2008/09/09(火) 23:34:22 ] 式を教えてください。 A列には文章が入っています。 B列には文章に含まれる単語、C列にはコード番号が入っています。 それぞれ数百〜数千行になります。 A列にはB列の単語のいずれかが含まれる場合には、 単語に対応するC列のコードをD列に表示させたいのですが、 どのような式がよいでしょうか。 VLOOLUPやFINDなどを組み合わせてみても上手くいきません。 お手数ですが、どなたか至急お教え願えますでしょうか。
199 名前:デフォルトの名無しさん [2008/09/10(水) 00:31:40 ] 具体的なセルの中身教えろよ このスットコドッコイ
200 名前:デフォルトの名無しさん [2008/09/10(水) 07:26:43 ] A列…デフォルトの名無しさん、具体的なセルの中身教えろよ、このスットコドッコイ B列…デフォルト、セル、スットコドッコイ C列…E46194、H23t55、342421
201 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 07:44:07 ] ここはExcel VBAのスレです
202 名前:デフォルトの名無しさん [2008/09/11(木) 00:16:48 ] XPでExcel2003です c:\aaa 配下にある全てのファイルとサブフォルダを c:\bbb 配下に全てコピーする事は可能ですか? また、サンプルコード等ありましたらヒントを頂けると助かります 色々と探してはいるのですが、いまいちピンとこないので サンプルがあると助かるのですが、、、、 VBAはまだまだ初心者なので未熟者で恐縮です。
203 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 06:12:54 ] >>202 >>1 ★3 ★4
204 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 19:30:31 ] たまにmougヲチするんだけど、痛い回答者が多いのね。
205 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 19:59:47 ] シートにコンボボックスを貼り付けて AddItemで追加した後にシートを Xボタンを押して閉じようとすると 変更を保存しますかと聞かれるんですが このチェックを外す方法ってあります? OSはXPでExcel2003です。
206 名前:y mailto:sage [2008/09/11(木) 20:15:03 ] >>198 文章中の、特定の単語の有無の判定なら、たぶんInStr関数で何とかなると思います。 調べてみて使えそうなら使ってください。 >199にもありますが、具体的なデータが分からないとアドバイスしずらいです...
207 名前:y mailto:sage [2008/09/11(木) 20:17:20 ] >>195 どんな業界で働いている方か分かりませんが、 実務に役立つ知識が増すようなテーマを選ぶと、 何かと都合がいいのではないでしょうか。 為替、株式市況、地価、青果水産物市況など、 ネット上にはたくさんの生データが公開されています。 それらを自動的に取得し、テーマに沿って演算し、 レポートを出力するマクロを組むだけでも、 相当勉強になると思います。 やるのであれば、日々刻々と変化する数字の方が面白いです。 例えばある人は、東京に10数箇所ある中央卸売市場の毎日の市況データを 取得し、各市場の卸売価格差をグラフに出力するマクロを作っていました。 仲買業者なら、どこの市場で買い付けをすれば一番安いか、 逆に生産者なら、どこの市場に出荷すれば一番高いか、 一目で分かるというものです。ちなみに彼は商社に勤めていますが、 似たようなことをしている人は結構いるでしょう。 Excelは基本的にデータ処理の道具なので、何を試すにしても、 まずは題材になるデータを見つけてこなければなりません。 ならば自分が、分析対象として最も興味を覚えるデータを選ぶのがベターです。 その上で、自分のスキルに応じた試行錯誤をしてみればいいと思います。 仮に「VBA解説書に載っている多機能な家計簿を作るんだ」と決意したとして、 自分で小遣い帳をつけているほどの人ならともかく、付属CDに入っている 仮想データを使って作っていくようなやり方は、モチベーションが湧きづらい ように感じます。
208 名前:デフォルトの名無しさん [2008/09/11(木) 22:02:38 ] あれ今日y絶好調だな
209 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 23:07:26 ] >>206 ×しずらい ○しづらい ◎しにくい
210 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 01:38:18 ] >>195 WindowsVBAつくってよ
211 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 03:36:31 ] yには、人生相談にすら答えてくれそうな勢いを感じる
212 名前:y mailto:sage [2008/09/12(金) 20:05:30 ] >>205 「シートを Xボタンを押して閉じようとすると」とありますが、 シートに×ボタンはないので、たぶん「ブックを」のつもりでしょうか。 「変更を保存しますか」というメッセージは、ブックを保存した直後の状態であれば 表示されません。この状態は、WorkbookオブジェクトのSavedプロパティをTrueに することで、強制的に作り出すことができます。 ブックが閉じられる直前に、その操作が自動で行われるようするためには、 ThisWorkbookオブジェクトのコード領域にBeforeCloseイベントを挿入し、 その中でSavedプロパティを操作します。 Private Sub Workbook_BeforeClose(Cancel As Boolean) ThisWorkbook.Saved = True End Sub
213 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 20:44:06 ] うざいな
214 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 20:51:26 ] >>213 お前がな
215 名前:205 mailto:sage [2008/09/12(金) 22:35:11 ] なるほど。Savedプロパティですか。 ありがとうございました。
216 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 00:10:19 ] 確かにうざいわ
217 名前:y mailto:sage [2008/09/13(土) 02:54:40 ] ・・・
218 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 03:49:12 ] 何コイツ
219 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 06:49:48 ] 煽りなんか気にすんな。
220 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 07:14:09 ] 未だに169が粘着してる
221 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 08:56:37 ] >>217 は、マジでうざいなw
222 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 09:06:33 ] まぁ、2chではあまり見ないキャラであることは確かだな。 嫌ならNGしとけ。
223 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 09:25:58 ] 凄い粘着だな。。。おい。
224 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 10:01:34 ] >>218-223 をNG指定した
225 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 11:55:22 ] マクロなんですけど、行挿入のマクロを作りたいんです。 だけど、挿入する行をセルの値から指定したい場合はどうすればよいですか? 例 B2 = 3 3行目と4行目の間に行挿入をするようB2をつかってさせる。
226 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 13:16:55 ] Dim i As Integer i = Range("B2") Rows(i).Insert
227 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 13:18:30 ] これだけでもいけるな Rows(Range("B2")).Insert
228 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 14:07:04 ] >>226-227 助かります、ありがとうございました。
229 名前:y mailto:sage [2008/09/13(土) 16:13:47 ] ・・・
230 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 22:03:03 ] yそろそろコテにしたら?なりすましが出るくらい名が知れてきたんだからさ
231 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 22:16:44 ] yがコテじゃなかったら何だと言うのだ
232 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 22:33:41 ] トリップつけたら?ってことじゃね?
233 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 23:38:26 ] いい加減、yの話題やめろよ
234 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 00:06:42 ] うざすぎ
235 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 03:08:08 ] エクセルのシートに画像をドラッグした時に、指定場所に指定のサイズに変換したいのですができますか? また、工事管理を行っていて、工期の数日前になると警告文が出るようにできるのでしょうか?
236 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 05:20:37 ] > エクセルのシートに画像をドラッグした時に、指定場所に指定のサイズに変換したいのですができますか? 「シートに画像をドラッグした時に」というイベントが用意されてないから、 「ドラッグした」ら自動で処理するってのは無理 「シートに画像をドラッグしてからボタンを押したら」なら可能だが > また、工事管理を行っていて、工期の数日前になると警告文が出るようにできるのでしょうか? 可能だがExcelでやるべきことじゃないな Excelでやるってことは、Excelとその警告マクロを作ったブックを立ち上げてないと警告文出ないわけだし やるとすれば、「n日前」ではなく、「n日前以降、最初にExcelを立ち上げたとき」という条件になるかな
237 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 16:10:42 ] 前者:できない 後者:できない
238 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 17:37:16 ] EXCEL関数についてお教えください あいうえお(abc) かきくけ(ほげほげ) さしすせそたちつ(nekdk) という行がありまして、()とその中の文字列だけを全部消したいです。 ()は全角です。()内の文字、文字数数がことなるので置換が使えないでいます。。
239 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 18:02:25 ] マッチコレクション
240 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 18:10:17 ] >>238 >>1 ★2
241 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 21:03:02 ] >>238 関数ではないけど ツール→区切り位置で区切り文字を ( にすると ( の前後で別のセルに分かれるからそれではダメかな?
242 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 22:58:50 ] VBAで検索システム的なものを作っています。 行き詰ってしまったので何かアドバイスをいただければと思います。 OSはXPでエクセルのバージョンは2002です。よろしくお願いします。 ブック内に「メイン画面」「情報A」「情報B」という3つのシートがあります。 「メイン画面」のB5セルに会員番号(K_Ban)を入力してマクロを実行すると「情報A」「情報B」から該当の会員番号に関する情報が「メイン画面」の任意のセルに代入されるというものです。 ただし「メイン画面」の形式の都合で、該当する「情報A」のうち、上から3件のみを出力させて4件目以降はカットしています。(下記コード参照) 「情報B」は「種別」という項目があり、「野菜」「肉類」「魚類」…などの分類が30種類ほどあります。 「情報B」についても、各種別毎に3件目以降はカットしたいのですが、行き詰っています。 すなわち、会員番号1について「情報B」は30件あり、野菜25件、肉類5件があるとすると 「メイン画面」には野菜3件、肉類3件分の情報を出力させたいのです。 また、種別については、今後随時変更があるので「種別毎に変数を設定して直接数える」のではないようなコードにしたいと思っています。
243 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 23:00:25 ] Public Sub 検索() Dim K_Ban As String Dim MyRange As Range Dim MyAddress As String Dim cnt As Integer K_Ban = Worksheets("メイン画面").Range("B5") Set MyRange = Worksheets("情報A").Range("A1:A50").Find(K_Ban, LookAt:=xlWhole) MyAddress = MyRange.Address cnt = 8 Do Worksheets("メイン画面").Cells(cnt, 3) = MyRange.Offset(0, 0).Value Worksheets("メイン画面").Cells(cnt, 4) = MyRange.Offset(0, 1).Value Worksheets("メイン画面").Cells(cnt, 5) = MyRange.Offset(0, 2).Value cnt = cnt + 1 If cnt = 11 Then Exit Do End If Set MyRange = Worksheets("情報A").Range("A1:A50").FindNext(MyRange) Loop Until MyRange.Address = MyAddress End Sub
244 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 23:25:44 ] シートの構造書くか、Bookをどこかにアップ
245 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 08:41:27 ] だよな普通
246 名前:y mailto:sage [2008/09/15(月) 11:18:44 ] >>242 |A列. |B列. |C列. |D列. |E列. 01 | 0123456789| .| .| .| 02 | .| .| .| .| 03 | .| .| .| .| 04 | .| .| .| .| 05 | .| .| .| .| シート内のデータ内容を説明するために、以前こんなテンプレを使っている人がいました。 「情報A」「情報B」シートの中身を、文章で説明するより楽だと思ったら使ってください。
247 名前:242 mailto:sage [2008/09/15(月) 13:54:22 ] >>244-246 以下のようなシート構造で、種別→日付で並べ替えてあります。 A B C D 番号 種別 データ1 データ2 1 肉類 豚肉 20080915 1 肉類 牛肉 20080912 1 肉類 鶏肉 20080801 1 魚類 その他 20080401 2 肉類 猪肉 20080905 2 野菜 その他 20080802
248 名前:y mailto:sage [2008/09/15(月) 16:03:53 ] >>247 Sub Sample() Dim K_Ban As Long: K_Ban = Worksheets("メイン画面").Range("B5") Dim r As Long Dim shubetsu As String Dim shubetsuCnt As Integer With ThisWorkbook.Sheets("情報B") .Range(.Cells(1, 1), .Cells(.Rows.Count, 4).End(xlUp)).AutoFilter Field:=1, Criteria1:=K_Ban r = 2 Do While .Cells(r, 1) <> "" If .Rows(r).Hidden = False Then If shubetsu <> .Cells(r, 2) Then shubetsu = .Cells(r, 2) shubetsuCnt = 1 ElseIf shubetsuCnt < 3 Then shubetsuCnt = shubetsuCnt + 1 Else .Rows(r).Hidden = True End If End If r = r + 1 Loop .Range(.Cells(2, 1), .Cells(.Rows.Count, 4).End(xlUp)).SpecialCells(xlCellTypeVisible).Copy _ Destination:=ThisWorkbook.Sheets("メイン画面").Cells(8, 3) '←任意のコピー先セル .AutoFilterMode = False End With End Sub
249 名前:y mailto:sage [2008/09/15(月) 16:04:42 ] 上のコードは、条件に合わない行を非表示にしていき、最終的に表示されている行だけを 「メイン画面」の任意のセルにコピーする、という考え方です。デバッガでステップ実行していけば、 不要な行が非表示になっていく様子がよく分かると思います。不便なところは改良してみてください。 なお、データは「種別→日付で並べ替えてあります」とありますが、見たところ「番号→種別→日付」で並んで いますね。上のコードは、そう並んでいる必要があります。 他のやり方を提案する方もいるかもしれませんので、そちらも参考にしてください。
250 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 18:09:00 ] 先日行挿入について質問したものです。 C3で指定した値の行に行を挿入して、D3,Fj,D3で与えた値を挿入した行のHi、Fi,Iiに値を入れたいのですが、どこが間違っていますでしょうか、ご指摘お願いします。 Sub Main Rows(Range("C3")).Insert Dim i As Integer Dim j As Integer i = Range("C3") Range("D3").Copy Destination:=Range("Hi") j = i-1 Range("Fj").Copy Destination:=Range("Fi") i = Range("E3") Range("D3").Copy Destination:=Range("Ii") END SUB このように作ったのですが、うまくいきません。
251 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 18:39:29 ] >>250 まず、Range("Hi")というセルの指定のやり方はない Rangeを使いたいんなら、Range("H" & i ) ほかには、Cells(i, 8)、もしくは、Cells(i, "H") 解説サイトいっぱいあるから基本的とこから少し勉強したほうがいいよ
252 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 19:29:45 ] エクセルの使い方もロクに知らない俺が 今日これからVBAの勉強を力尽きるまでやってみるぜ。 困ったときはお前らだけが頼りだ。
253 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 06:39:12 ] >>251 ご指摘、解説ありがとうございます。 出来る限り自分でやるようにしてみます。
254 名前:242 mailto:sage [2008/09/16(火) 23:49:49 ] >>248 ありがとうございます。 (もしかしたら上級者の方には普通なのかもしれませんが) 自分には全くない発想でした。勉強になりました。 お示しいただいたコードを元に自分でも勉強したいと思います。
255 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:16:06 ] そう考えること自体は不思議ではないと思うよ。 現によその言語ではそういうことができるものだってある(Perlとか)。 いずれにせよVBAはそういうことをしないということに変わりはないけれど。
256 名前:デフォルトの名無しさん [2008/09/17(水) 01:45:49 ] ねぇねぇみんな。 Microsoft Forms 2.0 TextBoxだと右クリックしてもメニューが出てこないよね。 出てくるようにしたいんだけど、何かいい知恵あるかな?
257 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 17:14:06 ] すいません、質問です。 1004エラーが出ます。(´Д`; worksheet記述を加えてみたり、色々試してみたのですが消えません。 作りたいものとしては、 A列を縦にチェックして異なる文字列が出てきたら罫線(太線)を引く、 というものです。 突っ込み、お願いします。 Sub test() Dim i As Integer Dim st_flag As Byte Dim range1 As Range st_flag = 0 i = 3 Do While Cells(i, 1).Value <> "" If (st_flag = 1) Then If (Cells(i, 1).Value <> Cells(i - 1, 1).Value) Then Range(Cells(i, 1), Cells(i, 6)).Borders(xlEdgeTop).LineStyle = xlMedium End If Else st_flag = 1 ''最初の1セルは比較をしない End If i = i + 1 Loop End Sub
258 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 19:04:30 ] 読むのめんどいからどの行でエラーなのか教えて
259 名前:デフォルトの名無しさん [2008/09/17(水) 19:37:16 ] Range(Cells(i, 1), Cells(i, 6)).Borders(xlEdgeTop).LineStyle = xlMedium ↓ Range(Cells(i, 1), Cells(i, 6)).Borders(xlEdgeTop).Weight = xlMedium
260 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 20:29:58 ] 実行時エラー '1004': Border クラスの LineStyle プロパティを設定できません。 これくらいコピペしようぜ
261 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 20:30:38 ] 時間の許す限りエラーの内容くらい小一時間考えよう
262 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 20:37:01 ] 質問者と回答者よりも講釈師の方がが多いスレ
263 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 21:21:15 ] 板全体に言えるわけだが すれ違い甚だしい質問だとか煽りだとか ここはまだまし
264 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 21:42:26 ] >>262 質問者 回答者 講釈師 貴方はどれに該当しますか?
265 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 21:43:55 ] ヌルポ
266 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 21:51:22 ] ポルヌ
267 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 21:52:59 ] >>262 は煽り専門要員だよ
268 名前:y mailto:sage [2008/09/17(水) 23:26:36 ] >>254 念のため補足しますが、>>248 のコードは決して最善の方法ではありません。 合致する会員番号でふるいをかけ、その中から種別ごとに最大3つまでの アイテムを取り出していく取捨選択の過程を、視覚的に理解するために利用してください。 仕組みが単純なので、コードが短くて済むというのが唯一の利点ですが、 マスタデータの行の表示・非表示を切り替えて実現する「検索システム」というのは、 >255でも指摘をいただいていますが、普通はやらないでしょう。 (数がたくさんになると、けっこう動作が重くなってしまいます) まじめに実装するとすれば、取捨選択の考え方はそのまま生かすとしても、 転記の仕方に改良の余地があります。適当な二次元配列を用意して、 取捨選択したデータを一行ずつ追加していき、最終的に配列ごと任意のセルに 書き込む、というのが一般的なやり方になると思います。 >>256 TextBoxのMouseDownイベントプロシージャ内で、Commandbars("登録されているCommandbar名").ShowPopup を 実行すれば、そのタイミングで表示されます。ユーザー設定のショートカットメニューも表示できます。 ちなみにMouseDownイベント発生時は、Button引数 が 定数xlSecondaryButton と等しければ、右クリックと判断できます。
269 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 01:50:36 ] さすがy
270 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 05:40:38 ] うぜぇ
271 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 09:07:55 ] >>257 っす。 >>258 申し訳ないっす。ブレークポイントで調べてみたらここらしいです。 If (Cells(i, 1).Value <> Cells(i - 1, 1).Value) Then → Range(Cells(i, 1), Cells(i, 6)).Borders(xlEdgeTop).LineStyle = xlMedium End If >>259 うぉ、できました! 罫線の種類とか太さとか、指定する先が間違っていたのですね。 >>260 そこまで親切に表示されませんでした。orz 出てきたのは、 実行時エラー '1004': アプリケーション定義またはオブジェクト定義エラーです。 でした。あ、verはexcel2003です。 >>261 小一時間考えて駄目だったので聞いてみました。orzorz Cのコンソール系しか打ったことが無いので、感覚的につかめなくて。 ともあれ、無事にできたので。 ありがとうございました。m(_ _)m
272 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 14:26:11 ] >>266 !ッガ
273 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 18:15:17 ] >>242 をわざわざVBA使ってまでやってる理由が分からんな… 関数だけで何とでもなりそうだw
274 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 19:42:37 ] >適当な二次元配列を用意して、 >取捨選択したデータを一行ずつ追加していき、最終的に配列ごと任意のセルに >書き込む、というのが一般的なやり方になると思います。 はぁ? 何でお前ごときが一般論を語れるんだよ?
275 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 20:49:36 ] >>274 お前ごときがここにくんな
276 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 22:30:24 ] 今独学でVBAを学んでいます。 皆さんにお聞きしたいのですが、 独学で学ぶにお薦めの本はありますか? 大村あつし著 かんたんプログラミング EXCEL VBA基礎編 と できるシリーズのVBAを読んでいます。
277 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 23:40:24 ] >>276 漏れの場合はVBAに関する知識はほとんどネットやヘルプで調べたものだったりするし・・・ VBとかやってるならオブジェクトブラウザとヘルプだけでも何とかなると思う 便利なテクニックとかはネットで拾い集めて行く 最初に手に入れたVBAの本に載ってたサンプルがコンパイル通らなかったから 本は全然信用してないだけだけどなw でも1冊だけ役に立った本があったな・・・ 「Excel VBA逆引き大全」とかだったかな?
278 名前:デフォルトの名無しさん [2008/09/19(金) 01:19:38 ] すいません。 VBA作成経験なく、ここを答えを求める場として 使うことに申し訳なく思っています。 複数のExcelファイルを指定する。 当該ファイルを新ブックにして保存する。 →その際、シート名が重複しても問題なし 新ブックのファイル名はあらかじめ指定したものを このようなマクロをつくることは可能でしょうか。 前述のとおり、まったく経験なしなので、 サンプル、たたき台程度で構いませんので、 ご教示いただけたら嬉しいです。
279 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 01:57:51 ] 相変わらずyきめぇw
280 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 02:05:09 ] >>278 さっぱり意味がわかりません。
281 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 02:08:42 ] >>277 >VBとかやってるならオブジェクトブラウザとヘルプだけでも何とかなると思う できる奴の戯言だな
282 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 04:03:48 ] >>278 簡単だよ。
283 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 06:07:09 ] >>275 アホ?
284 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 06:25:29 ] >>281 いや普通できると思うできないのは文盲
285 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 06:26:23 ] >>283 ゆとり乙
286 名前:デフォルトの名無しさん [2008/09/19(金) 06:37:00 ] ここの奴ら「簡単」だの「出来て当たり前」だの口ばかり達者で 入門書レベルの事しか回答出来ないから笑える
287 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 06:43:18 ] >>286 お前だろそれ
288 名前:デフォルトの名無しさん [2008/09/19(金) 07:01:00 ] あらあらw
289 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 07:04:32 ] vbogl.tlbのedxさんめちゃくちゃいい人だ。メールしたら速攻返事きたw
290 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 07:05:18 ] 誤爆した
291 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 07:06:03 ] >>278 複数ファイルのブック内のシートを結合するマクロなら昔適当に作ったのがあるけど
292 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 08:52:57 ] >>278 まとめると 複数ファイルのブック内のシートを結合する シート名は重複している場合がある だよな? シート数は全部でどのくらいになるんだ? あまり多いと1つのブックに収まらないよ
293 名前:デフォルトの名無しさん [2008/09/19(金) 09:10:07 ] >>292 すいません、追加・変更があります。 ○○システムの情報 ブック*2 □□システムの情報 ブック*2 (全部で5システム) 上記1ブックに1シートのみ これをシステムごとに1ブックとして新規に保存。 なので、計5ブックができる。 これを一回でやりたいです。 下記の情報をあらかじめ指定(変更可) - 各システムの情報ブック - 新ブックの名前 を考えています。
294 名前:292 mailto:sage [2008/09/19(金) 10:40:41 ] >>293 かなり手抜きだが書いてみた コピー後のシート名は指定するように作った マクロを入れるブックに 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がコピー先)
295 名前:292 mailto:sage [2008/09/19(金) 10:41:55 ] Sub Macro1() Dim 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) 改行多すぎので次レスに続く
296 名前:292 mailto:sage [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
297 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 20:49:06 ] 頭悪そうなコード
298 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 21:05:31 ] 変数名のつけかたって、読んだ参考書や勉強したサイトにけっこう影響されない?
299 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 21:08:44 ] 変数名のセンスが悪いな
300 名前:y mailto:sage [2008/09/19(金) 21:23:03 ] >>276 「VBAの絵本」(アンク) アンクの絵本シリーズは、その言語の仕組みや考え方を、豊富なイラストを用いて直感的に 伝える工夫がなされています。他人に薦めた本の中で、「分かりやすかった」という反応がいちばん 多かったのがこの本です。ACCESS VBAの内容も包括しているので、将来的にも役に立つでしょう。 概念の説明が中心で用例は乏しいので、メイン本にはできませんが、「かんたんプログラミング」を 持っているのであればそれで足りると思います。 「Excel VBAのプログラミングのツボとコツがゼッタイにわかる本〜最初からそう教えてくれればいいのに」(秀和システム) 「絵本」よりも実際性があり、個人的には一押しです。解説文と図の取り合わせがとても洗練されており、 文脈の多義性によるストレスや誤読を最小限に抑えようとする、手厚い推敲の跡が感じられます。新しい本なので まだ他人に薦めたことはありませんが、アマゾンでは好評なようです。 「VBAポケットリファレンス」(技術評論社) ヘルプがあればリファレンス本はいらない、という声もありますが、個人的には手離せません。 ページをめくるより、ヘルプを開いた方が速いような気もするかもしれませんが、 書式指定子の一覧、よく使うオブジェクトのプロパティ一覧など、よく開くページに 付箋を貼って机に置いておくだけで、パッと見たい時には最速のツールになり、ディスプレイも汚れないので 思考が中断されません。(※ただし、ヘルプを使って調べる習慣は、それはそれで必要です) 「逆引き」本(各社) >276で既に上がっていますが、豊富な用例がほしい時は逆引き本です。ただ、「やりたいこと」をもとに 用例を探す場合、インターネット検索のほうがより楽な場合が結構あることも覚えておいてください。 「VBA + (やりたいことに関連するキーワード)」で検索すると、似たようなことを既にやっている人の コードが割と簡単に見つかったりします。
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以外では聞いたことないってただの個人的経験だけど。
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な打ち合わせの例
424 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 19:10:08 ] 確かに文章だけで説明する事がこんなに大変とは! '作業対象のブック指定は手動?'の意味が今一つわかりませんがデスクトップにでも予めフォルダごと保存しておいて、作業をしてもらおうか?という算段です というのも引継ぎでは手入力推奨でしたのでネットワークの中で何かやると怒られるかも?とか考えたり ま、推奨程度ですからきちんとセルA6に番号が拾えていたら結果オーライだと思うのですが…
425 名前:422 mailto:sage [2008/10/05(日) 20:00:20 ] >424 流れとしてこんな感じかな? 画面更新をしないようにすれば画面がチラつきません。 1 作業ブックが収められているフォルダ中のエクセルファイルの一覧取得 2 参照元ブックを開く(ついでに2列×数十行のデータを配列に取得) 3 参照元ブックを閉じる 4 上記1で取得したファイル一覧からひとつずつ処理 (1) カレントブックを開く (2) A4セルの値を取得 (3) 配列を調べて対応する値をA6セルに書き込む (4) カレントブックを閉じる(変更確認ダイアログを非表示にしておくといい) (5) (1)〜(4)の繰り返し 5 終了(画面更新再開) 処理がちゃんと進んでいるか確認するために、マクロを記録したブックに A列:カレントブック名(もしくはフルパス) B列:A4セルの値 C列:A6セルに書き込んだ値 を上から順に書き込んでみるといい。その場合は画面更新を停止しないように。
426 名前:デフォルトの名無しさん [2008/10/05(日) 20:02:14 ] ググったのですが適切な単語が思いつかなかったので質問させてください。 関数を自作しようと思ったのですが、 その関数が代入されるセルのオブジェクトを取得することは可能でしょうか? 入門サイトを一通り見たのですが、そのような記述が見つかりませんでした・・・。 可能であれば関連するキーワードか、簡単な実装方法など教えていただけるとうれしいです。
427 名前:デフォルトの名無しさん [2008/10/05(日) 20:02:53 ] よろしくお願いします。 OS:XP、Excel2003 Module5で、Public Sub AAA() という関数を作成して Module1で使おうとすると「名前が適切ではありません」というエラーが出ます。 Module1に関数を作成して、Module5使うことは出来ています。 これは、モジュール名の順番みたいなものが関係しているのでしょうか?
428 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 20:30:01 ] 質問です。(WinXP,Excel2003) マルチスレッドで処理をしたいのですがうまくいきません。 以下のテストコード(スレッド系関数の宣言は省略)で、セルへの書き込み自体は問題なく出来るのですが、 エクセル終了時や保存時等ににエクセル自体が落ちてしまいます。 どこが問題なのでしょうか?ご教示お願いします。 '----モジュール------ Public Const STILL_ACTIVE As Long = 259 Public Function testThread(ByVal n As Long) As Long Dim i For i = 1 To 10 Sheet1.Cells(1, n) = i DoEvents Next i testThread = 0 End Function '----シート------ Private Sub test_Click() Dim hThd, idThd, dwExCode As Long hThd = CreateThread(0&, 0&, AddressOf testThread, 1, 0&, idThd) Do DoEvents If (GetExitCodeThread(hThd, dwExCode)) Then If (dwExCode <> STILL_ACTIVE) Then Exit Do End If Loop While True CloseHandle hThd End Sub
429 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 21:11:43 ] >>425 は、はぁ、、そんなかんじかと思いますがそれは記録マクロでできる作業なのでしょうか…… あまりな初級な質問ですみません
430 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 21:36:03 ] 作ってくださいとちゃんと言えよ、アホ
431 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 21:37:46 ] >>428 ド素人がVBAでマルチスレッドを使おうとするのが問題
432 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 22:21:52 ] は、はぁ、、例えばコードを書いてもらう事を作るといいますか? 作ってください!お願いします(^人^) でももしかして記録マクロでもできる人はできるのかと思ったり(自分では無理ですが)…… 何か自分の知らない簡単な方法があるような気がしてならなかったり?
433 名前:デフォルトの名無しさん [2008/10/05(日) 22:32:39 ] コード書いてもらう事は、作る事に他ならないが・・・。 作るって、何を作る事だと思う? と言うか、作成依頼はスレ違い。 自分でやって、分からない事を聞くようにしておくれ。
434 名前:425 mailto:sage [2008/10/05(日) 22:39:17 ] >432 このスレのbPの ★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。 ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。 は見てなかったようですね。 自分は明日の夕方以降ならなんとか対応できると思いますが、急ぐんだったら この件のやりとりの部分 を印刷でもして職場でVBAのわかる人に見せてください。 マクロの記録だけではほとんどできません。条件分岐とか繰り返しとかファイル処理とかいろいろ あります。 あるフォルダの中のディレクトリ一覧を取得して印刷する部分だけでも↓みたいになります。 www.excel.studio-kazu.jp/mag2/backnumber/mm20041012.html
435 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 22:39:41 ] 皮肉もわからないとかw
436 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 22:44:42 ] dirなりなんなりでファイルをリストアップして、オープンしてfindしてrange.valueに代入してセーブしてクローズする ってだけの簡単なことなんだけど、細かいところが不明なんで丸々作るめんどくさいのでパス。
437 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 22:46:49 ] >>425 でわかんないなら、もうこのスレ向きの話題じゃなくなった。
438 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 22:47:20 ] マァマー(´・ω・`)
439 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 23:08:07 ] >>434 エクセルの学校の添付を有難うございました 私自身は忘れているとはいえ?ベーシックくらいは少し学んだのですが全く身についていないようですorz 手でやると、1回なら簡単な作業なのに文章にするとこんなにややこしくなるとは!! ちょっとこの週末は時間がなかったのですが確かに自分であれこれ試してみたいと思います 会社では現在は時間が全くありませんがそのうち手薄になれば挑戦してみます!
440 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 23:30:16 ] 昔かじった言語でも、1年経つとほとんど動かせなくなるんだよね。 以前仕事で、とあるScript言語で食ってたんだけど、1年経ったら全部忘れてた。
441 名前:デフォルトの名無しさん [2008/10/05(日) 23:32:35 ] >>426 は自己解決しました。(というかバグが別の場所にあることが分かった) で、もう一つ質問させてください。 自作関数の演算結果を複数のセルに表示したいのですが、 Function func() func = 1 ActiveCell.Offset(1).Value = 2 End Function こうやるとこけてしまいます。 funcの返り値でなくActiveCell.Valueに代入すると循環参照で怒られます。 どうにか解決する方法はないのでしょうか?
442 名前:427 [2008/10/05(日) 23:38:12 ] >>427 お願いします。
443 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 23:54:28 ] >>427 ,>>442 Module5に作成してModule1で呼ぶのも Module1に作成してModule5で呼ぶのも 問題なく出来ている つまり「Module5に作成してModule1で呼ぶ」こと以外に問題があるということだ ちょっとした自分のミスに気付かず、首を捻り続けたりソフトを疑ったりなんてよくあることだ まずは新規ブックを作成して、標準モジュールを5個挿入し Module5にPublic Sub AAA() Module1にAAAの呼び出しプロシージャだけ書いて実行してみろ それでダメならExcelもしくはOfficeはたまたWindowsを再インストールした方がいい これで問題なく実行できるなら、自分のミスに気付いてないだけだ
444 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 01:10:32 ] >>440 プロの人でさえ1年で!? なんとか頑張ってみますと書いたものの、あの業務量を思うと頑張る暇などとてもなくゆーうつ・・・ はぁー、、楽したい。。
445 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 01:44:55 ] >>441 ttp://support.microsoft.com/kb/170787/ja
446 名前:441 mailto:sage [2008/10/06(月) 02:03:42 ] >>445 こんな・・・制限が・・・あった・・・なん・・・て・・・orz VBAなんか大っ嫌いだうわあぁぁん ありがとうございました。本当に助かりました。
447 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 02:41:53 ] 厨ばっか湧いて来やがるのはなぜだ
448 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 05:32:26 ] なんかゴネてる人さあ、、、 まずは、A6にvlookup入れて値コピーで上書きするマクロでも作ったら? ファイル開いたり保存するのは取り敢えず手動としても、目視手作業で 入力してるよりよっぽど楽になると思う。 そこから徐々に、自動でできる部分を増やしてけばいいんじゃねーの? あんたがVBA習得するまで仕事が待っててくれるならいいけどさ、 なんも出来ねーくせに余計なことばか考えて、自分で仕事増やしてるだけじゃね?
449 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 09:12:10 ] >>444 月100時間勉強するのを三ヶ月位続ければ、あとは楽になるよ
450 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 19:17:30 ] 皆様お疲れ様です >>448 それはいい考えだと、本日早速セルA6にA4を見て予め用意した表から拾って来てくれ頼む!を打ち込んだところ……… 後ろにもう一枚嫌なシートがあってなんと式がセルA6にそのまま表示されてしまうていたらく 後ろのシートとなんかリンク?が貼ってあるかのような得体のしれなさでもう素直にFIND窓で目視で探しました 件数も15件くらいでしたし 他の仕事があまりに立て込んでてそのシート間の関係さえ検討できないほどの忙しさなのです もうフラフラです 皆様も季節柄お体気をつけて!
451 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 19:30:13 ] えーと、このスレはVBAでプログラミングする人の為のスレだから、 Excelの使い方はよそで聞いて&愚痴ってくれ。
452 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 20:24:01 ] 記録マクロで挑戦したんですよ〜 一月100時間3ヶ月をいつか夢見て……
453 名前:434 mailto:sage [2008/10/06(月) 20:52:44 ] >408,〜,452 作ってみました。長いので2件に分けます。 ' DEBUG と書かれた行はテストのためにマクロを記録しているブックのアクティブシートに 処理対象ブックのフルパス、12桁の番号、FINDで求めた9桁の番号を表示させるためのもので、 丸々1行消しても動くと思うけど、こちらでは試してません。 例外処理は入れてません。フォルダーのパスとか検索範囲とかもプログラムで直接指定してますが、 マクロを記録しているブックに設定できるようにするとメンテがラクですね。 詳しい方には添削してもらえるとありがたいです。 Option Explicit Dim BK_M As Excel.Workbook, TATE As Long ' DEBUG Dim BK_I As Excel.Workbook, BK_O As Excel.Workbook Dim SEARCH_PATH As String, FILE_NAME As String Sub prog_408() Set BK_M = ActiveWorkbook ' DEBUG ' 参照するだけとなるブックのフルパスやファイル名は適当に変えてください。 Workbooks.Open Filename:="D:\TEST_FOLDER\PRODUCT\PRODUCT.xls" Set BK_I = Workbooks("PRODUCT.xls") TATE = 3 ' DEBUG ' 変更対象となる10〜40個のブックが記録されているフォルダです。 ' このフォルダにはメールで送られてくるという処理対象だけのブックを置いておくこと。 SEARCH_PATH = "D:\TEST_FOLDER\" FILE_NAME = Dir(SEARCH_PATH & "*.xls", vbNormal) Do While FILE_NAME <> Empty ' 繰り返し Call PROC_1 Loop BK_I.Close Set BK_I = Nothing Set BK_M = Nothing ' DEBUG End Sub
454 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 20:53:51 ] 続きです。 Private Sub PROC_1() Dim WK_PATH As String, BANGO_12 As String, BANGO_9 As String Dim c As Excel.Range WK_PATH = SEARCH_PATH & FILE_NAME Workbooks.Open Filename:=WK_PATH Set BK_O = Workbooks(FILE_NAME) With BK_M.Worksheets(1) ' DEBUG .Cells(TATE, 1).Value = WK_PATH ' DEBUG A列に処理対象ブックのフルパスを書き込む BANGO_12 = BK_O.Worksheets(1).Range("A4").Value .Cells(TATE, 2).Value = BANGO_12 ' DEBUG B列に「12桁の番号」を書き込む End With ' DEBUG ' 次行のA2:A41は実際のデータの開始位置と考え得る最大の範囲を指定してください。 Set c = BK_I.Worksheets(1).Range("A2:A41").Find(BANGO_12, LookIn:=xlValues) If c Is Nothing Then BANGO_9 = "" Else BANGO_9 = c.Offset(0, 1).Value ' ←ここで9桁の番号が求められました End If BK_O.Worksheets(1).Range("A6").Value = BANGO_9 ' ←やりたいこと はこの部分です BK_M.Worksheets(1).Cells(TATE, 3).Value = BANGO_9 ' DEBUG C列に「9桁の番号」を書き込む BK_O.Close Set BK_O = Nothing TATE = TATE + 1 ' DEBUG FILE_NAME = Dir() End Sub
455 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 21:37:47 ] y様に頼めば全て解決 はい次の方
456 名前:448 mailto:sage [2008/10/06(月) 21:40:19 ] 今までさんざんシートは1枚だと言ってたのは嘘か。 もうあきれて物も言えん、、、
457 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 10:54:20 ] マンマー(´・ω・`)
458 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 22:39:19 ] 408,410,411,413,415,418,421,424,429,432,439,450,452の人はもういなくなったのかな?
459 名前:デフォルトの名無しさん [2008/10/07(火) 22:54:35 ] 初心者でおじゃまします。 := ←これはどういう時に使うものですか? 本見てもよくわかりませんでした('A`)
460 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 23:59:42 ] >459 詳しい人がいないようなので、未熟ながら小生がヒントを。 上の454のマクロに2カ所使ってありますが、いずれもメソッドのパラメータを指定してますね。 Workbooks.Open Filename:=WK_PATH →Openメソッドでフォルダのパスを指定(Openには読みとりモードも指定できますが、この場合は 記載してないので規定値ということ) Set c = BK_I.Worksheets(1).Range("A2:A41").Find(BANGO_12, LookIn:=xlValues) →Findメソッドで値検索を指定 VBAのエディタの画面でsortメソッドのHELPを見てください。10個以上のパラメータを指定できます。 省略できるものもあるので、どのパラメータをどのように指定するかをメソッドの行の中に(見た目は 改行されていてもひとつながりなら1行とみなす)続けて書くときに必要となるものです。 こういう説明でわかりますか?
461 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 00:02:45 ] 一般に名前付き引数と呼ばれている。
462 名前:460 mailto:sage [2008/10/08(水) 00:12:19 ] 一部訂正 →Openメソッドでフォルダのパスを指定 じゃなくて、 →Openメソッドでファイルのフルパスを指定 だった。
463 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 21:17:17 ] >>453-454 さん お時間を割いて頂きたいへん有難うございました ノートに早速書き写したところなんと2頁にも及ぶなんて!(記録マクロと大違い) 段落が判らないので近い内ネカフェに印刷しに行けたら、と思っています 本当にありがとうございました また、余りの忙しさにお礼が遅れすみませんでした あの後記録マクロに成功し開けたり閉じたり繰り返したりができないものの、VLOOKでショートキーを使い保存までこぎつけました 目視と比べとても楽ちんでした ところがご指摘のとおり後ろにマクロ用?のようなシートがついているせいか?セルの表示が尋常でなく無理矢理値貼付けで乗り切ったのです その後9桁の数字が入力されたブックをマクロに通す作業がありましたので
464 名前:sage [2008/10/08(水) 21:22:35 ] 今度マクロを使って集計表を作ることになったのですが その中でVBAという物を使うということで質問をしに来ました。 内容は集計ボタンを押すと 同フォルダ内に配置されてるエクセルのファイル名を読み取って 事前に用意されている集計表の中に概要をコピーするというものです。 集計対象のエクセルは毎週作成され、「ファイル名称(作成日付)」で作られていき 数ヶ月に一度集計ボタンを実行します。 VBA、というかプログラムは全くのド素人ですが、 どういった文法?で作れば良いかなにかヒントだけでも教えて頂ければと思いこのスレに来ました。 皆さんどうか知恵をお貸し頂けないでしょうか、宜しくお願いします。
465 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 21:36:56 ] 1ブックずつ再度開けて自分のマクロのみ消去するのが面倒くさく、VBAの方を開き自分のショートキーのモジュールを解放しました 間違えて人の(どのブックにも3〜5個はある)は解放してないとは思うのですが、その後マクロの消えたブックになったりならなかったり 挙句いつもきちんと実行(9桁の番号が入ったブック達を通す)できていたマクロがデバッグ とりあえず慌てたものの優先事を片付け、再度初めからメール添付を保存しなおし今度はマクロを使わず手入力し、 手順のマクロを実行すると……………デバッグ 解放がいけなかったのでしょうか 記録マクロがいけなかったのでしょうか 黄色い行には"後ろのシートをアクティブにetc…"となっています。勿論このマクロは私が実行した記録マクロと違いえらい長く書いてある別の仕事の為のマクロです(抽出とまとめ)
466 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 21:41:57 ] >>464 >>1 ★5 ここは右も左も解らない奴が来るところじゃない どういう処理がしたくて、どういうコードを書いたが、どの部分で躓いてるのかを 具体的に質問できるレベルになってから出直すか 急ぎや勉強が嫌なら、金払ってVBAコード書いてくれるところに依頼しろ 車を運転するには免許が居るように、便利な物を利用するにはそれに応じた資格(スキル)が要る その資格無しに利便性を求めるなら、車でもタクシー使ったり運転手雇ったりするように 金使って解決しろ
467 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 21:48:54 ] 指定されたフォルダ中のエクセルファイルの一覧を取得する処理は、 453、454の中に書かれていますよ。 あと、434で紹介されたurlも参考になると思います。 文法云々ということであれば、エクセルVBAの入門書を入手するか、 ウェブの初心者向けサイトを調べてみてください。 それから、このスレのbPをよく読んでください。
468 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 21:54:43 ] 例えばデバッグの黄色い行を削除したりすればうまくいくのでしょうか その場合保存さえしなければ誰かが作成された、いつもは健全に働くモジュールを壊す事にはなりませんよね? いつもエラーなど発生しないのに私が要らないマクロを被せたせいで何かがどうかなったのでしょうか 自分のだけ解放しても他のマクロに影響があるのでしょうか それだけではないのです 今日は昼飯時に453さんの回答に気づきお礼をカキコするつもりが横に置いていた鞄に散歩中の犬がしっこをかけたのです! こんな目に遭う人がいますでしょうか 仕事もテンパリは続き少々のアルコールでは何にもなりません 皆様もこの寒暖の激しさにはお気をつけ下さい
469 名前:453,454 mailto:sage [2008/10/08(水) 22:11:56 ] >465 まだ、私が453〜454に書いたものは実行していないと思いますが、念のため書いておきます。 上記マクロは新規ブックの標準モジュールに書いてください。(ファイル名は任意ですが、 以下の説明ではマクロブックと呼びます) あなたが仕事で扱うブックには絶対に書かないでください。 エクセルを起動したらマクロブックを開き、ツール−マクロ−編集− prog_408 を選びます。 マクロ文中のフォルダ指定とかセル範囲などを実際のものに変更したうえで、いったん保存。 そのうえでprog_408を実行してみてください。 なお、私はWindowsXp、Excel2003で試しています。 ここまで書いたところで、468を見たので追加 465で書いてある「自分のショートキーのモジュールを解放」が気になる。そのモジュールにはあなたの マクロだけしか書いてなかったのかな? 本当に「自分のだけ」のモジュールでしょうか? ひとつのモジュールには複数のマクロが記録されるんですよ。 壊れてしまったものは、現場で対応してもらうしかないと思います。
470 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 22:56:33 ] なんなの、最近の流れ
471 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 23:34:46 ] スレbP−★5を読まない初心者ばっかり。
472 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 00:01:02 ] 469さん、ご丁寧にありがとうございました モジュールが単独だったか複数かという事ですが、珍しくうまくいった為解放する前にモジュールを表示させて自分の記録マクロを印刷しました そこには15行程度の構文が書かれていたのみですので下の方にもあったか?となるとおそらくなかったような…… なお記録する前に保存先を作業中のブックよりもう一つ深い範囲に適用する、を選択したと思います これがいけなかったのかもしれません あぁ楽をするのも大変ですね…… お先にお休みさせて頂きます。ありがとうございました。。
473 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 07:42:16 ] 過去スレですね? 現在PC環境にありませんが是非訪ねてみたいと思います! 晴れた今日も良い一日を!!
474 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 08:47:46 ] >>473 >>1 の★5のことだ・・・ マジでテンプラ読めないやつ増えてるのか?
475 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 09:51:50 ] そりゃ犬もションベンかけるわ
476 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 10:17:49 ] >>465 どのブックにもVBAモジュールがある…だと? あんた、「1ブックにはそれぞれ1シートしかないから、全シートを 一旦まとめて、後でまたバラして保存すれば…」なんて書いてたよな。 それでどういうことになるのかわかってるのか? あんたみたいなのは下手なことに手を出すな。 気づかない内に絶対まわりに迷惑かけてるから。 後始末する側の身にもなれ。
477 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 11:00:15 ] 2chで相談する前にそのブック配布したやつに相談するのが先だろ・・・ 他にVBAとか入ってるなら下手したら変数名とかかぶるし
478 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 11:17:51 ] VBAを勉強する前に、「仕事のやり方」から勉強するべき
479 名前:デフォルトの名無しさん [2008/10/09(木) 18:06:20 ] Excel2000でメニュー(データ>並べ替え)で現在のソート状態が表示されますが この値をVBAで取得する方法があれば教えて下さい。orz
480 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 21:21:37 ] 2chねらならVBEオブジェクトくらい使ったことあるよな
481 名前:デフォルトの名無しさん [2008/10/11(土) 03:49:58 ] フォーム画面/テキストボックスからの入力で、「型が一致しません。」が出てしまう。 【モジュール】 Private Foo As Integer public sub Bar(Baz As Integer) Foo = Baz End Sub ↓ 【フォーム】 Private Sub TextBox1_Change() On Error Goto Err If ( Len(TextBox1.Text) > 0 ) And ( IsNumeric(TextBox1.Text) = True ) Then Call Bar(TextBox1.Text) Else TextBox1.Text = "" End If Err: If Err.Number <> 0 Then MsgBox Err.Description End If End Sub
482 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 07:15:22 ] いったんエラー処理はずしてどの行でエラーか書いてくれよ まあfooかbazに入れてる値がまずいんだろう
483 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 07:46:33 ] 472です。その節はお世話になりました 犬に聖水をかけられた鞄は無事洗濯いたしました ところで9桁の番号を取得した後に'抽出とりまとめ'の長いコードの最初でデバッグが出始めた話でしたが なんと手順を間違えていたらしい事が昨日判明しました そのとりまとめ用の長いコードを実行するにはエクセルを全部閉じておいて、マクロブックを先に開いた後 例の9桁番号を取得したブックたちを開かなければならなかったのが、9桁の事で頭いっぱいでそちらを先に開いていたのです 恐らくこれが原因だったようです。まだ1回しか成功していませんがこの、全部閉じとけよ!はどのコードだったのでしょう? しかもそこで黄色になる訳ではないのですね?? もっと丁寧なデバッグ説明表示ならいいのに……
484 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 07:59:35 ] なお、1枚だけだと思っていたのにシートがもう一枚あるもののマクロの組んであるブックはごく一部だけで全ブックではありません ほんとに単純なシートなので高度なコード?ではないようです デバッグが出てヒィヒィ言っていたマクロブックも長いコードながら実行できない間は手作業でカバーできるものではありました けれど実行できればそれはそれでたいへん楽です! なんとか仕事が手薄な時間を作り出し教えて頂いたコードに挑戦できる日がくるのを夢みて…
485 名前:469 mailto:sage [2008/10/11(土) 10:09:56 ] >483,484 「全部閉じとけよ!はどのコードだったのでしょう?」への回答→そんなコードはない。 まさか、最大42ものブックを開いたところでマクロを実行させるつもりだったのか? [42=マクロブック+(2列×40行のデータのブック)+メールで送られる40ブック] FILE_NAME = Dir(SEARCH_PATH & "*.xls", vbNormal) Do While FILE_NAME <> Empty ' 繰り返し Call PROC_1 Loop と WK_PATH = SEARCH_PATH & FILE_NAME Workbooks.Open Filename:=WK_PATH Set BK_O = Workbooks(FILE_NAME) 〜 BK_O.Close FILE_NAME = Dir() でファイル一覧からひとつずつ開いて転記してクローズしている。 ちなみに、マクロを実行すると変更を保存するかどうかのダイアログが表示されるはず。 その際A4セルの12桁の番号に対応した9桁の番号がA6セルに入っているので確認できる。
486 名前:481 [2008/10/11(土) 12:15:07 ] フォーム画面/テキストボックスからの入力で、「型が一致しません。」が出てしまう。 【モジュール】 Private Foo As Integer public sub Bar(Baz As Integer) Foo = Baz End Sub ↓ 【フォーム】 Private Sub TextBox1_Change() On Error Goto Err If ( Len(TextBox1.Text) > 0 ) And ( IsNumeric(TextBox1.Text) = True ) Then Call Bar(TextBox1.Text) Else TextBox1.Text = "" End If Err: If Err.Number <> 0 Then ● MsgBox Err.Description 'テキストボックスにキーボードから値を入力したとき、ここでエラーが出る。 End If End Sub
487 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 12:45:27 ] ByRef渡しでもVBAの方でうまくやってくれたっけ?
488 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 14:52:03 ] >>486 だからOn Error外せって
489 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 16:23:17 ] >>485 >>483-484 は、まだおまいの作ったコードは実行してないと思う ネカフェで印刷して会社へ持って行って、見ながら手打ちしてからだから、 来年ぐらいじゃないかな
490 名前:479 [2008/10/11(土) 17:48:11 ] キーワードを変えてググってみても見つけられなかった。 VBAからソートプロパティを取得する方法は無いのでしょうか?
491 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 18:52:51 ] >>486 テキストボックスの値を関数に渡す前にVal()で数値に 変換したら。
492 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 19:03:24 ] >>490 > キーワードを変えてググってみても見つけられなかった。 > VBAからソートプロパティを取得する方法は無いのでしょうか? > ソートの設定のこと? これならマクロの記録でできるけど。 Range.Sort Key1:= ・・・・ Order1:= ・・・・
493 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 19:10:50 ] >492 これまでの書き込みから、ソートの「設定」ではなく「設定内容の参照」のようです。 なので、今まで回答がない。詳しい人の目にとまるまで回答はないかも。
494 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 20:58:41 ] >>479 単純にセルの値取得すればいいだけじゃないの??
495 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 23:01:15 ] OS: WindowsXP Excel: 2007 チャートの目盛線のスタイルを「破線」にしたいと思っていますが、 以下のようなコードを実行しても、「長破線」になってしまいます。 ActiveChart.Axes(xlCategory).MajorGridlines.Border.LineStyle = xlDash LineStyleの値として設定できる値(xlDash, xlDashDot, xlDashDotDotなど)を すべて試しましたが、やはり破線にはなりませんでした。 今は、手動で「目盛線の書式設定」→「線のスタイル」→「実線/点線」から、破線に設定しています。 VBAからは、チャートの目盛り線のスタイルを破線にはできないのでしょうか?
496 名前:デフォルトの名無しさん [2008/10/12(日) 00:38:29 ] エクセル2002 ウインドウズxp で質問! @列を選択 AダイアログBoxに文字を入れ検索 B検索にヒットしたセルの左のセルに*を入力 具体例 @’D列・F列を選択 A’ダイアログBOXに検索したい文字 イロハ を入力 B’ イロハニホ が入力されてるセルD1の左C1と アイロノカニ が入力されてるセルF3の左E3に*を入力 この作業のうちAとB(例はA’B’)をマクロで効率化したいと思っています。 詳しい方、コードを教えて下さい m( )m この板を知る前に総合相談所にカキコしてしまったことをご容赦願います。
497 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 05:46:19 ] 置換でいいじゃんd
498 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 07:07:43 ] >>496 先に総合相談所にも謝って来いよ
499 名前:479 [2008/10/12(日) 13:44:23 ] >>493 おっしゃる通り、ソートの設定状態を参照したいのです。 Excelの並べ替えメニューに現在のソート状態が表示されるので、何処かに ソート状態を保持している筈なのです。 これを取得する方法が分かりません。
500 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 16:54:02 ] >499 で、(直前に行われたであろう手動による)ソートの各種設定を参照してナニしようとしてるんですか?
501 名前:デフォルトの名無しさん [2008/10/12(日) 17:29:28 ] >>500 シートAにデータがあり、 シートBがアクティブ時にはシートAの選択データからシートBを編集します シートCがアクティブ時にはシートAの選択データからシートCを編集します シートBやシートCを編集する時のシートAのソート条件が異なるので 編集できるかどうかを判断するためにソート状態を知りたいのです。 実際には、プログラム用ブックと上記のデータ用ブックに分かれていて プログラム用ブック側でデータブックのイベントを拾って汎用的に処理 しています。
502 名前:500 mailto:sage [2008/10/12(日) 19:23:34 ] >501 シートAは手動でソートするんですか? シートAのソートをマクロで実行して、 その際のパラメータをデータブックに記録しておけばどうですか? シートAのソートのパターンをいくつかつくっておいてマクロ実行時選ぶように したらいいのでは?
503 名前:デフォルトの名無しさん [2008/10/12(日) 22:26:40 ] シートA(B&Cも)は別ブック(任意のデータブック)ですので、単独で開いて ソートされる事も想定が必要です。 プログラムブックからデータブックを開いて、データブックに定義されている 内容によりデータブックのアクティブシートを編集しています。 データブック側にはVBAコード等の記述は不要であり、プログラムブック側に VBAコードを記述し、データブックのイベントを拾ってデータブックの編集を 行っています。 データブックは任意のxlsファイルが指定できます。
504 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 23:42:02 ] 誰か早く無理だって言ってやれよ
505 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 00:01:29 ] 無理です
506 名前:503 [2008/10/13(月) 00:02:44 ] 自分も最初は無理だと思っていたのですが、メニューで現在のソート状態が表示 (Excel2000)されている事に気付いたので、取得する方法がある筈と考えた次第 です。 Excel2007を一寸見たら、現在のソート状態は表示されないみたいですね。 諦めかな...
507 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 00:27:16 ] 無理かどうかは知らんけど、Excelが覚えてるからといって、それを取得できる公開I/Fがあるとは限らない。
508 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 00:35:54 ] 二つのセルを比較して降順か昇順かしらべることはできるんじゃないの?
509 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 00:46:52 ] 無理です
510 名前:デフォルトの名無しさん [2008/10/13(月) 01:40:17 ] ExcelVBAの関数のコールグラフを作成してくれるツールってある? ちなみにDoxygen+VBFilterは関数の中は全く解析してくんなかった。
511 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 14:36:23 ] フォルダにある複数の報告書のファイル名を変更したいのですが 方法を知っている方おられませんか? 報告書(Aさん)→済_報告書(Aさん) 報告書(Bさん)→済_報告書(Bさん) 報告書(Cさん)→済_報告書(Cさん) 上記のように ()内の名前が変わってもファイル名を 報告書()→済_報告書() と変更できる方法を探しています。 何か良い方法を知っている方がいれば教えて頂けないでしょうか? お願いします。
512 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 15:12:43 ] ファイル名を fileName As String とすると、 まず fileName LIKE "報告書(*)" で想定した書式であることを確認した後、 fileName = "済_報告書(" & Mid(fileName,5,Len(fileName)-(4+1)) & ")" って感じ?
513 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 16:40:36 ] >>511 スレ違い ファイル名変更ぐらいならRENコマンドでできる。
514 名前:512 mailto:sage [2008/10/13(月) 17:50:21 ] この条件だと、wsh使わないと一寸厳しいとは思う。 というか、何かしら加工した上でSaveAsする時のファイル名の話だと思っていたのだが。 違うの? >>511
515 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 18:51:55 ] >>1
516 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 18:58:06 ] >>511 Name ステートメント
517 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 19:15:55 ] >>514 さん 返信遅くなってすみません レス有難うございます。 >>何かしら加工した上でSaveAsする時のファイル名の話だと思っていたのだが。 はい、ファイルを一度開いて、ある個所にチェックを付けてからファイル名を変更して保存します。 最初は>>516 さんの言うように Nameをつかってみようと思ったのですが()内の名前部分が ネックになって上手くいきませんでした。 >>513 、>>515 さん スレ違いでしたか、すみませんでした。
518 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 20:08:55 ] >>506 xlsファイルフォーマットが公開されているので(英語)、 解析してソート部分の設定を読み出すコード書いたら。
519 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 21:24:53 ] 何がわからないのかわからなかった
520 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 21:42:57 ] なんでわかってもらえないのかがわからない
521 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 22:54:48 ] なんでわかってもらえると思えるのかがわからない
522 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 10:15:24 ] >>506 ヘルプには「シートごとに保存される」 とは書いてあるがどうやって取り出すか書いてないな・・・ ところでそもそも「ソートの設定」で見ようとするのは危なくないか? コピペされたら最後に使われた「ソートの設定」とは違った並びになってる可能性もあると思う ソートのパターンが分かってるなら列ごとにどういうソートがかかってるか解析したほうがいいと思う
523 名前:500,502 mailto:sage [2008/10/14(火) 13:13:28 ] >506 522に1票 >シートBやシートCを編集する時のシートAのソート条件が異なるので >編集できるかどうかを判断するためにソート状態を知りたいのです。 とあるので、シートAのデータを上から順に調べるのが一番確実ではないでしょうか? ソートをプログラムするのは大変だけど、ある規則で並んでいるかどうか調べるだけなら簡単では?
524 名前:506 [2008/10/14(火) 13:22:48 ] 基本的には保存しない前提で考えていたので、コピペは考えていませんでした。 出直します。orz
525 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 16:26:52 ] なんで強制的にソートしちゃいけないのかな Aが一定の条件でソートされてないとBやCの編集ができないのに、 ソートは人まかせってのが不思議 永遠にソートしてくれなかったらどうするんだろう ソートされてるかどうかを何かのフラグとして扱うつもりなら、 それこそそんなの信用できないんじゃないの 気まぐれでソートして見てみただけかも知れないし
526 名前:デフォルトの名無しさん [2008/10/14(火) 16:57:54 ] 私の勘違いだと思うのですが、どうしても分からないのでお尋ねいたします。 文字列のソートの結果と大小比較(<, >)やStrCompの結果が異なるもの があるようです。具体的な例をあげると、 "ad-02-mb.html" "ad-02.html" の2つ。昇順ソートをすると後者が先に、大小比較では前者が小さいと なります。マッチング処理ができなくて困っています。解決方法を お教えください。
527 名前:506 mailto:sage [2008/10/14(火) 17:42:10 ] >>525 説明不足でした BやCの編集が出来ない訳ではなく、グループが分断されてしまうので編集に時間が 多めに要するという事です。 強制的にソートする事も考慮していますが、シートAを選択した時に元の並び順に 戻す必要があります。 別シートにコピーして並べ替えという手もありますが、出来るだけ自由度を持たせ ておきたいとも思っていますので、ユーザ任せでも良いかなという気もしています。
528 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 18:03:14 ] >>526 バージョン差あるかもだけど、option compare は? >>527 ソートされなくても永遠に作業が滞るわけではないのね。ならよかった いつの日か希望どおりにソートしてもらえるといいね
529 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 19:03:09 ] >>526 その「ソート」って何の事よ
530 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 19:35:11 ] >>527 だったら作業用のシート作って、データ全部コピーしてそこで自分の好きなようにソートすりゃええやんか。 そうすれば元データはいじらなくて済むっしょ。んで作業が終わった時に作業用のシートを消せば?
531 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 19:36:19 ] そぅっとしてやってくれ。
532 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 21:16:22 ] 早野乙
533 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 21:58:59 ] >526 自分のPC(WinXp Excel2003)で試したら再現したので並べ替えのヘルプを見たら原因判明です。 ヘルプから引用 一重引用符 (') とハイフン (-) は無視されます。ただし、ハイフン以外は同じ文字列がある場合、 ハイフンを含む文字列が後に配置されます。 引用終わり つまり、並べ替えの時は-が無視されるので、ad-02mb.html と ad-02.html が比較される。 先頭から6文字目は"m"と"."なので、"."のあるad-02.htmlが先になる。大小比較のときは"-"も 比較に利用されるので、bd-02-mb.htmlが先になる。 文字コード(10進表記)では、"-":45 ".":46 "m":109 です。
534 名前:526 mailto:sage [2008/10/15(水) 22:38:35 ] >533 おーっ、感動の回答!ありがとうございます。 自分の頭ばかり疑って、ヘルプを見るのを忘れてました。こんな仕様?があったとは。 で、どーすりゃいいのか考えないと。。。 とにかく、ありがとうございました。
535 名前:533 mailto:sage [2008/10/15(水) 22:54:32 ] >534 レスがあるとうれしいですね。 引用符を無視するのはわかるけど、なんでハイフンも無視するんだろ。 解決方法で悩んでいるようですが、データをハイフンではなくアンダーバー"_"にしたらだめですか? 処理対象のデータにハイフンとアンダーバーが混在してたらダメだろうけど、ハイフンだけだったら 一括置き換えでアンダーバーにしておいて、処理の後にハイフンに戻すとか。
536 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 23:00:23 ] binary
537 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 23:03:15 ] ハイフンは、行末で英単語を分割する際に使われるからだな。
538 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 23:04:22 ] どのような時に、なぜマッチング処理ができないのかを明記せよ
539 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 23:08:50 ] >536 バイナリ・モードの並べ替え(VBAでのsort)ってできるんですか? エクセルとエクセルVBAのヘルプをみたけど、「大文字と小文字を区別」するMatchCaseの記述は あるけど、バイナリのことは書いてありません。(Excel2003)
540 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 23:27:30 ] マッチング処理ってどういう処理をしてるの?
541 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 23:35:57 ] 比較にstrcompを使った独自ソート関数書けよ
542 名前:デフォルトの名無しさん [2008/10/15(水) 23:48:53 ] >>539 Option Compare ステートメント
543 名前:542 mailto:sage [2008/10/15(水) 23:52:53 ] こっちの勘違いにつき、忘れてcくれ(^^;
544 名前:539 mailto:sage [2008/10/15(水) 23:57:27 ] >542 エクセルVBAのヘルプを見てみました。 引用はじめ Option Compare ステートメントが記述されていないモジュールでは、既定の文字列比較方法 である Binary モードが使われます。 引用終わり ということは、何も考えずに(手動、マクロとも)ソートしたときがBinary モードなので、 ハイフン"-"を無視しないようにするのは無理なのでは?
545 名前:539 mailto:sage [2008/10/16(木) 00:03:27 ] >543 リロードしてませんでした。一晩寝ると忘れますので、ご安心を。
546 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 01:57:46 ] で今夜は徹夜ですっと
547 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 03:44:56 ] 購入日 保証年数 2006/10/05 2 2004/08/12 5 2005/04/22 3 という値があって、購入日から保証年数を足して、今日現在(Date)に達していない(つまりは保証切れ)の場合、 ・・・するという場合、 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then 'もし列がA(1)なら ★ If DateDiff("d", 「現在のセルの日付」+右隣のセルの値(年数), Date) < 0 Then '今日との日付差がマイナスなら Target.EntireRow.Font.ColorIndex = 5 'その行のフォント色を青(5)にする Else Target.EntireRow.Font.ColorIndex = 0 'その行のフォント色は黒(0)にする End If End If End Sub 保証切れの場合、色をつけたいのですが、 ★をどのようにすればいいでしょうか?
548 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 05:05:36 ] ある日付から、 n年後 n日後などを求めたい時は dateadd 詳しくはヘルプ読んで あとそのコードだと保証期間内の時に青になるよ datediffのヘルプ読んで
549 名前:526 mailto:sage [2008/10/16(木) 22:42:05 ] なんだかソートとマッチングの問題でいくつか質問をもらったみたいですが、 Windowsの文字列ソートの問題は、結構話題になっていることがわかりました。 Excel 95までは、単純なソートであったものが、Excel 97から単語ソートとMSの言う、 ハイフン、アポストロフィ無視のソートに変わったみたいですね。単語ソートだと、 アンダースコアも更におかしな挙動になります。私は、"-"を""に、"_"を" "にリプレース してマッチングする処理にしました。 ちなみにマッチングとは、キーをDo While oldキー >= Newキー で回して、 =のときにマッチング処理を行うものです。このときのキーの大小判定と、ソートの 並び順が異なるために、おかしくなっていました。 みなさんのおかげで、なんとか完成しました。ありがとうございました。
550 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 22:51:10 ] 説明する気ないのか
551 名前:526 mailto:sage [2008/10/16(木) 22:52:41 ] 間違えたDo While oldキー >= Newキーはブレーク処理でした。マッチングは Do While マスターキー >= トランザクションキーでした。
552 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 23:07:51 ] もう来なくていいよ
553 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 23:09:30 ] そもそもマッチングを勘違いしてると思われる。
554 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 01:13:46 ] マイッチングまちこ てか、正規表現でも使うの?マッチングって事は。
555 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 02:37:01 ] ブレーク処理とかマッチング処理なんて言葉が出てくるのは業務系のコボラーに多いな。 COBOL使えない若い人でも、周囲の先輩達が使うのでそれが一般的な用語だと思ってる事が多い。
556 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 10:56:37 ] ものすごくアフォな質問で申し訳ないんですが教えてください For〜Next文内で10回ごとにそれぞれ決まった作業を1回だけさせたい場合、 For I = 1 To 1000 「基本作業」 a = Right(I, 2) If a = 1 Then 「選択作業1」 ElseIf p = 2 Then 「選択作業2」 ↓ 以下、0まで選択作業計10個 ↓ Else End If Next I こんな感じでいいんでしょうか? 今実行環境が無いのでどなたかアドバイスお願いしますorz
557 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 11:39:21 ] >>556 あくまで自分ならだが For I = 1 To 1000 '「基本作業」 a = I Mod 10 Select Case a Case 1 '「選択作業1」 Case 2, 3 '「選択作業2」 End Select Next I といった感じにする
558 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 11:44:28 ] >>557 ありがとう 家に帰ったらいろいろ試してみます
559 名前:デフォルトの名無しさん [2008/10/17(金) 17:54:59 ] セルの値が1のときセルの色づけ赤,2のときセルの色づけ青 とするマクロをVBAで組んだのですが,一回実行した後, セルの値を1から2を変更しても,実行ボタンをあらためて 押さないと色が青に変わりません。 2を入力すれば直ちにセルの色づけが青に変わるようにする ためにはどのようなコードを入れればよいのでしょうか。 よろしくお願いします。
560 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 18:27:43 ] >>559 ボタン押したら色が変わるようにしたんだろ? だったら当然だな 入力してすぐに変えたければ 1.ボタンはやめてワークシートのChangeイベントで動かす 2.VBAをやめて条件付書式にする どちらかだな ところでテンプレ>>1 の★5読んだか?
561 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 19:06:41 ] >>560 ありがとうございます。 まったくの初心者です。場所を間違えたようです。 失礼しました。
562 名前:547 mailto:sage [2008/10/17(金) 20:36:21 ] > ★ If DateDiff("d", 「現在のセルの日付」+右隣のセルの値(年数), Date) < 0 Then なんですが、 dateaddをして、比較したいのですが、 If Dateadd("y", target.offset(0,1).value, target.value) < Date Then と、やってみてもダメでした、 Private Sub Worksheet_Change If Target.Column = 1 Then に、おいて、特定セルと特定セルの右隣を関数に入れて比較する方法は、 上記であっているのでしょうか?
563 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 21:38:26 ] >>562 ダメだった時はどうダメだったのかを書こうぜ > 特定セルと特定セルの右隣を関数に入れて比較 そこは合ってる で、右隣のセルに入ってるのは日数じゃなく年数でしょ? 後はもっぺんヘルプ読んで
564 名前:デフォルトの名無しさん mailto:sage [2008/10/18(土) 01:46:12 ] >>559 条件付書式だかそんな感じの奴でマクロなしでできる
565 名前:547 mailto:sage [2008/10/18(土) 04:21:40 ] >>563 もう一度考えてみました。 やりたいことと、セルの値 購入日 保証年数 2006/10/05 2 ←保証切れ(青色になって欲しい) 2004/08/12 5 ←保証が切れていない(色は黒色に) Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then If DateAdd("d", Target.Cells.Offset(0, 1).Value * 365, Date) < Date Then ' 今日の日付に、Target.Cellsの右に入っている年数×365日を足して、今日の日付と比較 Target.EntireRow.Font.ColorIndex = 5 '青 Else Target.EntireRow.Font.ColorIndex = 0 '黒 End If End If End Sub 日付を入れると「全部青になってしまいます」 ちなみに If DateAdd("y", Target.Cells.Offset(0, 1).Value, Date) > Date Then と年数バージョンでもやってみましたが、同じ結果orzでした。 全然わかりません、足して日付が今日より前なら「保証切れ=青色」にしたいのですが・・。 日付と日付を比較できていないのでしょうか?単位が違う状態で比較しているのでしょうか?
566 名前:デフォルトの名無しさん mailto:sage [2008/10/18(土) 05:47:32 ] >>565 おいおいw、悩み過ぎてわけわかんなくなったのか?ガンガレ 今日の日付に足したら、何足したって未来になるだろw >>562 のでほぼ合ってるんだよ オレのヘルプには "y" じゃなくて "yyyy" ってのがあるんだが、 おまいのにはないのか?
567 名前:565 mailto:sage [2008/10/18(土) 06:29:37 ] ありがとうございます。 yyyyでしたか・・・、さっそく書き換えるといけました!感動しました。 たしかにadddateで今ヘルプを見ると、 設定値 内容 yyyy yyyy y 年間通算日 yyyy・・・内容書いていませんwww (by Office 2003) でもyは、その年から何日後という意味なんですね、こんなの思いもよらなかったです。 しかし、大問題が発生しました。 xlsファイルを「開いたときに今日の日付を比較しないといけない」ので、 worksheet_changeじゃだめなんです。 workbookが開いたとき、な方法があればいいのですが、 worksheet_activate、selectionchangeでも反応しませんでした。 Private Sub Worksheet_Change(ByVal Target As Range) ここをどのように書き換えれば、読み込み時に再判定してくれるのでしょうか?
568 名前:565 mailto:sage [2008/10/18(土) 06:53:58 ] 何度もすいません、 たぶん、worksheet_activateイベントで良いと思うのですが、 activateになった時に計算させるということは、 自動的に Private Sub Worksheet_Activate(ByVal Target As Range) If Target.Column = 1 Then If DateAdd("yyyy", Target.Cells.Offset(0, 1).Value, Target.Cells.Value) < Date Then Target.EntireRow.Font.ColorIndex = 5 '青 Else Target.EntireRow.Font.ColorIndex = 0 '黒 End If End If End Sub Private Sub部分を変えただけだと 違うシートを選んで、選択し直すと 「コンパイルエラー プロシージャの宣言がイベントまたはプロシージャの宣言と一致していません」 と出ますが、すでに上の言葉が理解できません。 if文以下も変更しなければならないのでしょうか? byヘルプ プロシージャの名前はイベントと同じ名前ですが、パラメータの数と型が一致しません。 イベント プロシージャに新しくパラメータを追加したときなどに、このエラーが発生します。 たとえば、フォームの Form_Load イベント プロシージャを次のように変更すると、このエラーが発生します。 ダメです、わけわかりませんorz
569 名前:デフォルトの名無しさん mailto:sage [2008/10/18(土) 08:23:40 ] >>567-568 > yyyy yyyy ちょwマジでw おちおち「ヘルプ読め」とも言えんじゃないか まあそっちは解決したようで良かった イベント変更の方だが、worksheet_activateは引数を取らないから、 そうなるのは当然だな 引数を消して、targetを自前で指定してやればOK つか、workbook_openイベントもあるんだが つか、今さらだけど、 色変えたいだけなら条件付き書式でもできるがw
570 名前:デフォルトの名無しさん [2008/10/19(日) 02:32:28 ] VBAにEffective C++やEffective Javaみたいなガイドラインってある?
571 名前:568 mailto:sage [2008/10/19(日) 02:58:41 ] >>569 >色変えたいだけなら条件付き書式でもできるがw こ、こんなのあったんですか・・。 春先ぐらいから悩んでいたのが、一撃で吹っ飛びました。 わざわざVBAを使う必要無かったんだ・・・。 ___________ || || ⊂⊃ || ∧ ∧ || ( ⌒ ヽ でも勉強にナターヨ・・・ ∧||∧ ∪ ノ ( ⌒ ヽ 彡 V ∪ ノ フワーリ ∪∪
572 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 03:29:41 ] ほんとに色変えるだけなのかよwまいったw >>559 もそうだし、こういう奴、実は多いのか? 何という時間の無駄
573 名前:デフォルトの名無しさん [2008/10/19(日) 07:09:25 ] 悪いけど笑わせてもらう ァ ∧_∧ ァ,、 ,、'` 。゚( ゚^∀^゚)゚。,、'` '` ( ⊃ ⊂) '`
574 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 07:12:51 ] 関数でできることをマクロでやろうとしたり、案外よくあるよな
575 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 12:16:55 ] だんだんとワークシート関数がウザくなってくるんだよなw
576 名前:デフォルトの名無しさん [2008/10/19(日) 17:15:03 ] 暇だから何か問題だしやが……出して下さい
577 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 20:25:44 ] >576 Excel総合相談所74で質問が出てますよ。(レス番号325です)
578 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 20:49:32 ] プログラミング初心者かつエクセルにも詳しくない奴が、 この手ので延々悩むんよね 心理的ハードルを超えさせる書式の魔力おそるべし
579 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 21:31:47 ] >>576 4色問題お願いします。
580 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 22:29:21 ] >>577 ありがと 解決済みだった >>579 全ての図形が4色で塗り分けられるとかなんとかだよね 図形の形とか定義あるのかな? セルに色塗るなら二色で出来ちゃうし
581 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 22:33:43 ] 二次元配列に書き出したセル範囲のデータををリストないしはコンボボックスに 格納したいんですが、ワークシートに書き出さずに直接入れる方法はありますでしょうか?
582 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 22:43:16 ] >>581 あります 入力規則のリストなら、マクロの記録録ればわかります コントロールオブジェクトのコンボボックスの方はVBAヘルプに載ってます 但しフォームツールのコンボボックスなら多分セル書き出し必須
583 名前:581 mailto:sage [2008/10/19(日) 22:50:06 ] >>582 すみませんコントロールツールボックスの方です シートに書き出せばRowSourceプロパティで簡単なのは存じてますが…
584 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 22:51:02 ] >>580 4色問題ってこんな感じのです。 ttp://yougo.ascii.jp/caltar/4%E8%89%B2%E5%95%8F%E9%A1%8C
585 名前:デフォルトの名無しさん [2008/10/19(日) 22:59:02 ] >>584 ありがとう 1.A1からランダムにIDつけて、同ID隣り合わせを領域と見なす 2.領域ごとに、隣り合わせ同色にならないように色IDを付ける 3.色IDが1から4で収まっているか判定 っていうアプローチでよいかなあ アルゴリズムの問題っぽいがw
586 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 23:36:57 ] セルに依存しない計算は速いのですが結果をセルに 出力するのに時間がかかります。たとえば Dim X(10000, 10) As Double Dim I As Integer Dim J As Integer '計算 For I = 1 To 10000 For J = 1 To 10 X(I, J) = Sqr(I) * Sqr(J) Next J Next I ' 出力 For I = 1 To 10000 For J = 1 To 10 Cells(I, J) = X(I, J) Next J Next I で出力の所要時間を計算時間と同程度にすることができるような 出力の書き方があれば教えてください。
587 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 23:51:32 ] For I = 1 To 10000 For J = 1 To 10 Cells(I, J) = Sqr(I) * Sqr(J) Next J Next I
588 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 23:51:40 ] ちらつき抑制でよいかな? forの前に Application.ScreenUpdating = False を入れると、シートの描画しないから早くなる 少しずつ描画見たいなら、例えばNextの間に Application.ScreenUpdating = Tlue Application.ScreenUpdating = False を追加すると、Iが一つ進むごとに描画される 例えばIが100ごとに実行したいなら J Mod 100 使ったりできる
589 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 23:54:01 ] つーか、配列を0始まりではなく1始まりにしてそのまま書き出したらいいやん
590 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 00:20:55 ] >588 21秒から13秒に8秒も短縮できました。ありがとうございます。 >589 具体的に「そのまま書き出す」ってどうすればいいんですか? よろしくお願いします。
591 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 00:29:07 ] >>590 >>589 じゃないけど、 range(cells(1,1),(cells(10000,10)) = X
592 名前:591 mailto:sage [2008/10/20(月) 00:30:17 ] タイプミス range(cells(1,1),cells(10000,10)) = X
593 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 00:36:38 ] base 1 にするのはお勧めできない。 変数に+1しる。
594 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 00:41:35 ] 592>> やってみました。1秒かからないんですね!ありがとうございました。
595 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 00:42:22 ] base 1 にするのはお勧めできないが 変数に+1するのもお勧めできない X(1 To 10000,1 To 10)にしる
596 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 00:49:07 ] すみません Range(Cells(1, 1), Cells(1000, 10)) = X(1 To 10000,1 To 10) とするとコンパイルエラーがでるんですが・・・。
597 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 00:52:29 ] >>596 違う違うw 1 to 10000 とかを書くのは dim のとこ
598 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 00:56:26 ] Dim X(1 To 10000, 1 To 10) As Double でしたね。失礼しました。 みなさんどうもありがとうございました。
599 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 02:02:50 ] EXCEL XP, 2000, 2003, 2007において、 VBAはクアッドコアに対応しているの? コア4つのVBAはやはり処理が早いんだろうか・・。
600 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 04:35:01 ] >>582 余談だけどフォームの方もできる
601 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 06:43:22 ] すみません 文字列の入ったセルをselectした際に、単にselectにするだけではなく、 編集中の状態にまでもっていきたいのですが、 そのような方法を御存じないでしょうか。 select後、sendkeys"{F2}"で実現できるのですが、 Sendkeysを使用しない方法を探しています。どうか宜しくお願いします。
602 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 08:24:46 ] 数式バーで編集じゃだめなの?
603 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 13:42:57 ] Excel2003でSheet1のセルA1に日付を入れる(08/10/01)とSheet2以降のセルA1に次の日付になるように反映させるにはどうしたらいいですか?
604 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 13:52:14 ] >>603 Sheet2以降のセルA1に、「=Sheet1!A1」と入力。
605 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 13:54:49 ] +1忘れた
606 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 14:05:48 ] >>604 d
607 名前:デフォルトの名無しさん [2008/10/20(月) 16:56:04 ] どこがVBAやねん
608 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 18:13:53 ] 春から悩んでたかも知れないじゃないか
609 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 20:11:15 ] >>599 まず、複数スレッドを作ることが実質的に無理だ。 Excel自体も、2007から再計算を複数スレッドで行えるようになったくらい。
610 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 20:17:31 ] 依存関係ありまくりの計算だからなあ。
611 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 15:00:07 ] オートフィルターがオンになっているシートの選択行について、ソートと処理を 行った後、再度元の並びに戻す方法を模索中です。 1)選択行範囲の最後(列n)に式["=ROW()"]を設定 2)列nの式を値に変更(コピぺ) *ソートと処理を行う 4)列nで昇順にソートした後、列nを削除 この方法だと選択範囲内に不可視のデータが存在すると、[2)]でコピーと貼付け の領域が違うため貼付けエラーになります。 1行ずつ行番号をセットする方法は件数が多いと時間が掛かる為オートフィルター 情報を取得しておき、一旦オートフィルターオフにしてからコピペしています。 他にもっと良い方法をご存知でしたら御教授願います。 選択データを他ワークシートにコピーして処理する方法が一番良い気もしますが データ量が三万件とかだとコピーにも多少時間が掛かるので...
612 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 17:29:28 ] >>611 仮に、"=row()" を入れた範囲を range("G5:G10") として、 G列を非表示にして、 range("G5:G10").value = range("G5:G10").value ってのはダメ?
613 名前:611 mailto:sage [2008/10/21(火) 18:27:03 ] >>612 助かりました、有難うございます。orz だけど、非表示だと何故上手くいくのでしょう?
614 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 18:33:32 ] どこがVBAの問題なのか春先まで悩みそうだ
615 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 19:41:59 ] >>613 わからん。なんかやってみたらできた 仕様なのかバグなのかも知らんw
616 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 21:01:59 ] 非表示だと pastespecial もうまくいくな どうやら仕様くさい
617 名前:VBAの初心者 mailto:sage [2008/10/21(火) 21:24:20 ] 初めまして。自分は知り合いにVBAを教えて貰っているんですが、相手に人はPCが 無くよく分らなくてもし良かったら教えて下さい。 だだ走らせるだけの凄い簡単なプログラムらしいんですが私には走らせ方が分らな くて困ってます。 10 for m=1 to12 20 print m 30 next m 40 stop なんですが凄い初心者なのでエクセル開いた所から分らなくて教えて下さい。
618 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 21:27:30 ] それはVBAじゃない。VBでもない太古のBASICのプログラム。
619 名前:VBAの初心者 mailto:sage [2008/10/21(火) 21:30:01 ] らしいです。VBAを覚えたいなぁ〜って言ったら色々言われて私が全然分からなく なってしまったので、まず見れる簡単なの教えてと頼んだんですが、今のじゃ無理 なんでしょうか;
620 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 21:50:26 ] もしかしたら、その相手の人は(Excel) VBAを知らないという可能性も考えられる。 VBAも含めてナントカBasicってのは山ほどあるけど、どれも全く別物。 敢えて共通点をあげるとしたら名前にBasicが付いていることだけ、というのはさすがに言い過ぎだけど。 そして、お前は何をやりたいのか。Excel VBAで間違いないんだよな?
621 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 22:39:24 ] 釣られすぎ
622 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 23:24:21 ] 縦読みじゃないのね。
623 名前:デフォルトの名無しさん [2008/10/22(水) 07:27:31 ] Interiorってクラス名としてはどうなんですか?
624 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 10:00:18 ] 激しく紛らわしいからやめた方が良いかと
625 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 00:27:13 ] 自作クラスのインスタンス380個ぐらい作ったらメモリ不足になった
626 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 19:16:21 ] そりゃクラスの内容に因るだろうな 個数や上限決めておらず、必要に応じて作る場合とか 1万や2万は当たり前に使ってることあるが ちゃんと配慮してれば全然問題ない
627 名前:デフォルトの名無しさん [2008/10/24(金) 11:20:18 ] 選択アドレスから重複を削除する方法はありますでしょうか? 例えば、選択したアドレスが[$A$2:$A$5,$A$5:$A$10]の場合、そのアドレス 範囲で集計(Subtotal)するとA5が重複して集計されてしまいます。 Excelのステータスバー(右側)には重複を除いた合計値が表示されます。 これと同様の値(特定の1列のみ)をVBAで取得したいのです。
628 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 12:06:03 ] >>627 unionしちゃばOK
629 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 12:09:11 ] >>627 Sub test1() Dim rg1 As Range, rg2 As Range For Each rg1 In Selection.Areas If rg2 Is Nothing Then Set rg2 = rg1 Else Set rg2 = Range(rg2, rg1) End If Next rg1 Debug.Print WorksheetFunction.Sum(rg2) End Sub >>628 Unionは無理じゃない?
630 名前:629 mailto:sage [2008/10/24(金) 12:20:32 ] 今テストしてたんだが離れたセルを選択した時に期待どおりの動きしないな・・・
631 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 12:22:27 ] >>629 ? range("$A$2:$A$5,$A$5:$A$10").cells.count 10 ? union(range("$A$2:$A$5"),range("$A$5:$A$10")).cells.count 9 ? union(range("$A$2:$A$5"),range("$A$5:$A$10")).address $A$2:$A$10 「特定の1列のみ」だそうだからOKかなと
632 名前:629 mailto:sage [2008/10/24(金) 12:29:12 ] RangeをUnionに書き換えたらいけたような気がするw
633 名前:デフォルトの名無しさん [2008/10/24(金) 14:52:48 ] 有難うございます。 Set rg2 = Union(rg2, rg1) に変更したら上手くいきました。 もう1つ教えて下さい。 選択された範囲の行を対象に特定の列(例では8列目)を以下の様に集計して いますが、選択範囲から集計範囲(特定列)への変換にもっと簡単なやり方が ありますでしょうか? Dim vals As Variant, i As Integer, c As Integer, addr As String c = 8 vals = Split(Selection.Address, ",") For i = 0 To UBound(vals) With Range(vals(i)) vals(i) = Range(Cells(.Row, c), Cells(.Row + .Rows.Count - 1, c)).Address End With Next addr = Join(vals, ",") Debug.Print WorksheetFunction.Subtotal(9, Range(addr))
634 名前:633 mailto:sage [2008/10/24(金) 16:24:56 ] 列の特定と同時に重複を削除しないと駄目のようです。 >>629 さんの方法に組み込むと良い様に思います。 Set r1 = Cells(rg1.Row, 8) Set r2 = Cells(rg1.Row + rg1.Rows.Count - 1, 8) If rg2 Is Nothing Then Set rg2 = Range(r1, r2) Else Set rg2 = Union(rg2, Range(r1, r2)) End If
635 名前:デフォルトの名無しさん [2008/10/24(金) 16:33:53 ] 質問です。 エクセルで資料を作ったがMacroで両面コピーの方法が分からないので両面コピーの方法を教えて下さい。
636 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 19:46:01 ] 質問です 訳あって欧文(ウムラウトを含むラテン文字の文章)の書き込まれたExcelシートから 内容を読み出してテキストファイルに起こしたいのですが、 Cells(?,?).valueやCells(?,?).TextからStringsの変数に読み出した時点でウムラウトが飛んで 近しい形状の通常のアルファベットに置き換えられてしまうようです。 結構ぐぐって見たのですが、読み出せなくて困った的な話はいくつか見つけたのですが 対処法について言及しているページが無かったので、皆さんのお知恵をお借りできないかと 思って書き込みさせていただきました。 なにかお知恵などありましたらよろしくお願いいたします<(__)>
637 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 20:14:02 ] >>635 何を何処へコピーするのか
638 名前:デフォルトの名無しさん [2008/10/24(金) 20:26:20 ] 両面コピーって両面印刷の事?プリンタの話になるんじゃないの?
639 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 20:33:08 ] >636 元となるExcelファイルは、Excelのどのバージョンで作られたものですか? あるいは、どこの国用のExcelで作られたものでしょうか? VBAを利用せず、直接シートの必要な範囲をコピーしてエディタへ(ウムラウトは消えずに) ペーストすることはできたのでしょうか? ↓このサイトは見ましたか? www.microsoft.com/japan/office/ork/three/intd02.mspx Office XP リソース キット / 国際環境での導入計画 / 国際環境でのメンテナンス Unicode サポートの活用 「多国語テキストのコピー」の項と、「VBA で Unicode 値を使用する」の項が参考になるかも。
640 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 21:48:44 ] あるサブルーチンをForループで回すと100回くらいなら一瞬で終わるんですが、 500回とかそれ以上になるとなぜか無限ループにでも入ったみたいに計算が終わってくれません。 オーバーフローのエラーメッセージが出ることもないし、実際オーバーフローするほど大きな数を扱っているわけでもない。 原因としてはどんなことが考えられるでしょうか?
641 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 21:53:05 ] サブルーチンのforカウント変数をステータスバーにでも表示してデバッグのヒントにするのだ。 その情報だけだと、メモリかCPU?としか言えない。
642 名前:デフォルトの名無しさん [2008/10/24(金) 21:55:54 ] >>635 sub 裏表印刷() 印刷実行 Msgbox ゛用紙裏面をセットしてください゛ 印刷実行 end sub
643 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 21:56:08 ] >>641 メモリっぽいですね。ちょっと調べてみます。 ありがとうございました。
644 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 22:09:55 ] >>640 DoEvents homepage2.nifty.com/kasayan/vba/doevents.htm
645 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 00:45:40 ] 636です >>639 動作環境を書くのをすっかり失念してました この手の質問には必須なのに…申し訳ありません OSはXP日本語版でExcelは日本語版Office2000に含まれるものです。 現在VBA開発に使用しているxlsファイルは Exciteの機械翻訳で出したものをコピペしてBOOKに張り付けてテストデータとして作成したものです 紹介していただいたリンク先を読むと、VBAではunicodeを標準ではサポートしていないようですね (VBでは文字列関係の内部処理はUnicodeで処理されてるのに…変な気分…) まあ、テストデータで使用している文章がUnicodeではなく単純に欧文ASCIIコードの文字列の可能性もあるので Unicodeをサポートしていればうまく行くとは限らない気もしますが でもちょっと手がかりをもらえたのでもう少し試行錯誤してみようかと思います。
646 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 07:04:27 ] オーバーフローの意味もしらないのかVBA厨房は
647 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 11:29:01 ] アクセスならともかく、エクセルでプリンタ設定いじるって難しいくね
648 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 14:59:26 ] >>633 unionでいいんなら Sub test() Dim rg1 As Range, c As Integer c = 8 Set rg1 = Intersect(Union(Selection, Selection).EntireRow, Columns(c)) Debug.Print WorksheetFunction.Subtotal(9, rg1) End Sub
649 名前:デフォルトの名無しさん [2008/10/25(土) 15:46:42 ] どなたかお教えください マクロでたとえばですが ActiveCell.Replace What:="*", Replacement:="x" のように セル文字列の * の部分だけをxに変換したいのですが アスタリスクはすべて変換してしまいますよね。 A1*A1 という文字列を上記マクロ実行するとA1xA1 という結果になって ほしいのですが。実際は x 担ってしまいます どのようにすればよいのでしょうか。
650 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 16:07:52 ] >>649 ActiveCell.Replace What:="~*", Replacement:="x"
651 名前:デフォルトの名無しさん [2008/10/25(土) 16:09:39 ] >>650 すごいですね。どうもです
652 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 17:06:03 ] 春先から悩んでた人多いな
653 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 18:11:57 ] >>645 参考になるかも ttp://codezine.jp/article/detail/1718
654 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 19:10:31 ] しかし、エスケープシーケンスはもっとわかりやすくしてほしいよな。
655 名前:デフォルトの名無しさん [2008/10/26(日) 03:08:58 ] 教えてください VBAで、明日が三週目の日曜日だった場合A1に○○と表示するってやりたいんでがどうやればいいですか?
656 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 03:24:14 ] >>655 明日の日付はDate関数に+1すれば解る 特定の日付が日曜日か否かはWeekday関数で解る 3週目か否かは日を算術演算すれば解る あとはそれらを条件に条件分岐してA1に値を代入すれば良い この説明で解らなければ>>1 ★5なので、さようなら
657 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 03:44:51 ] >>656 ありがとうございます。 算出演算ってのがよく解らないですががんばってみます。
658 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 06:05:51 ] だからエクセルでやれよ
659 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 13:35:27 ] だよな。数式でできるレベル
660 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 13:40:58 ] 質問です。 Excel2003を使っています。 コマンドボックスをクリックするたびに、セルA1の数に1ずつ足していくマクロを作りたいのですが どなたか教えていただけませんでしょうか。 よろしくお願いします。
661 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 14:10:39 ] ちょっとは自分で調べる努力した?
662 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 15:32:19 ] >>660 コマンドボックスって何ぞや?
663 名前:660 mailto:sage [2008/10/26(日) 15:45:47 ] 聞いておいて遅レスごめんなさい。 コマンドボタンの間違いです。 色々調べてみたのですが、変数の定義の仕方そのものがよく理解できていなくて わからないなりに考えたのが↓です Sub test_Click() Dim h As Long h = Range("A1").Value If h = 0 Then h = 1 Else h = h + 1 End If End Sub もうちょっと頑張ってみます
664 名前:649 [2008/10/26(日) 15:48:36 ] お教え願いますか '=A1 という文字列を =A1 という数式に変換するマクロありますか。 同かよろしくお願いします。
665 名前:649 [2008/10/26(日) 15:50:36 ] 舌足らずでした あるセルに '=A1 という文字が書かれています。 マクロコマンド使って =A1 という数式に置換したいのですが。 どうかよろしくお願いします。
666 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 16:32:40 ] >>663 cells(1,1).value = cells(1,1).value + 1 >>665 Cells(1, 1).Formula = Cells(1, 1).Value
667 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 16:33:34 ] >>663 Range("A1").Value = Range("A1").Value + 1
668 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 16:43:51 ] こんなばかみたいな質問にいちいち答えるなよ
669 名前:660 mailto:sage [2008/10/26(日) 16:47:26 ] >>666 >>667 ありがとうございました。 一から勉強してきます。
670 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 17:06:11 ] 変数の定義ができないとか、 単純な代入式も書けないレベルの奴は入門書買え いちいち他人の手を煩わすな
671 名前:デフォルトの名無しさん [2008/10/26(日) 22:22:34 ] 初めて質問させていただきます。 初心者ではないですが、レベルは低いですσ^^; セルを指定するときに、Range("A1")ではなく[A1]というふうにやってるんですが、 これだとなにか悪影響がありますか? 今のところ困るのは、説明書やhelpの類がすべてRange形式のものばかりなので、 書き方が分からない時がある、ってことくらいです。 単に字数が少なくて済むからという理由で[**]形式にしているんですが、 ちょっと気になってます。 というか、そもそも気にしたほうがいいのか気にしなくてもいいのか・・・
672 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 22:45:34 ] 他の人が見たときに分かりにくいとか 少なくとも俺はわからん
673 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 23:19:11 ] 動作自体には問題ない あとは使う場面やメンテナンス性などを考えて使えば良い 複数人で扱う物には使わない方がいいし、汎用モジュールも然り 個人専用の使い捨てマクロの類なら[A1]形式でも医員で内科医 連続しない複数セルもしくは範囲を扱う場合なんかは便利なので 俺も他人が弄る可能性のないものでは使うこともある 『 [A:A,C:C,E:F].ClearContents 』とか『 [A3,C3:F10,H3:H10] = 0 』とかね 因みにうちでは『r""』のキー打ちで『Range("")』が入力され、カーソルが""の間に移動するので Range("A1")は、『 R " " A 1 』で済む為、[A1]でもRange("A1")でも入力字数は大差ない 俺の場合RangeよりCellsの方がよく使うが、Cellsも同じく入力省略出来るようにしてある
674 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 23:27:30 ] 簡単なマクロ程度をゴールにしてるならどんな形式でも良いけど、 本気で業務に使うプログラムやら、もっと高いゴールを目指すなら、 初心者のうちからcellsで指定する方が良いと思うよ。 rangeと言えば、あくまでrangeオブジェクトである訳で・・・。 何より変数絡めてセルの指定するようになると可読性が著しく下がる・・・。 タッチ数も増えるしで、良い事ない。
675 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 23:28:39 ] 最後の3行が言いたかっただけちゃうかー
676 名前:デフォルトの名無しさん mailto:sage [2008/10/26(日) 23:36:52 ] ?
677 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 00:10:33 ] [A1]なんて書き方知らなかった……。もっと精進するわ。
678 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 02:51:46 ] >>671 結局は evaluate の省略記法だから、excel に渡して評価させる分、 多少処理の無駄があるんじゃないかと思う(たぶん) [A1].value = 0 range("A1").value = 0 それぞれ10万回ループさせると数秒だが差が出る evaluate("A1").value = 0 は、[A1]記法とほぼ同じになる 誤差レベルだけど、回数の多いループ内とか、速度が気になる場合は 避けた方がいいかもね
679 名前:デフォルトの名無しさん [2008/10/27(月) 09:49:00 ] [A1]だと後ろにピリオド打っても入力候補が出てこねぇ。 Cells(1,1)も出てこねー。 Range("A1")だと出てくる。 どれもいったんRange型変数に入れりゃ同じだが。
680 名前:デフォルトの名無しさん [2008/10/27(月) 10:57:11 ] pc11.2ch.net/test/read.cgi/gamedev/1217601153/ Syntax Error.しか知らないキチガイがあらわれました
681 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 11:57:01 ] detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1220150877 大手ECサイトのヨドバシドットコムが、サイトリニューアルから大規模な障害を3日間続けているようです。 このようなケースではリニューアルを担当した業者はヨドバシカメラにどれほどの損害賠償を行うのでしょうか? 【ヨドバシカメラ】 ネットサイトをリニューアルしたら表示遅すぎでおわび [10/23] gimpo.2ch.net/test/read.cgi/owabiplus/1224789237/ ヤマダ.com/ビックカメラ.com/ヨドバシ.comを語ろう gimpo.2ch.net/test/read.cgi/kaden/1222787235/ 【店員の質】ヨドバシカメラ総合17【落ちまくり】 gimpo.2ch.net/test/read.cgi/kaden/1215013408/ 補足 どうやら今回のヨドバシドットコムリニューアルはCMS導入が目的で、 キノトロープスリーイントという会社( www.k-3int.co.jp/ )が請けたようです。 また、リニューアルの10/21から10/25現在までこの状況ですので、ヨドバシカメラの損失額は 億単位で発生していると言われています。 キノトロープってどうよ?PART4 namidame.2ch.net/test/read.cgi/venture/1224762171/
682 名前:633 [2008/10/27(月) 14:06:59 ] >>648 おぉー、素晴らしい限りです! アクティブシート以外に対してIntersectは無理なのでしょうか?
683 名前:682 [2008/10/27(月) 14:21:18 ] 失礼しました。orz columns(c)を修飾したら出来ました。
684 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 16:04:05 ] >>682 書いた後で気づいたんだが、それ union いらないっぽいw ? selection.address $A$1:$A$5,$A$5:$A$10 ? selection.entirerow.address $1:$5,$5:$10 ? intersect(selection.entirerow, columns(8)).address $H$1:$H$10 intersect かけた時点で重複してる行はまとめられるから、 Set rg1 = Intersect(Selection.EntireRow, Columns(c)) だけでいいようだ
685 名前:682 mailto:sage [2008/10/27(月) 16:34:34 ] >>684 究極のリファクタリング有難うございます。orz こういうの教えられると、VBコードでゴリゴリ作るのが馬鹿らしくなってしまう...
686 名前:671 [2008/10/27(月) 22:41:20 ] みなさんいろいろご意見ありがとうございました。 RangeやCells形式も使いこなせるように、もっと勉強していきます^^
687 名前:デフォルトの名無しさん [2008/10/28(火) 10:08:01 ] もう1つ教えて下さい。 選択エリアの全行数は For each r in Selection.Areas rcnt = rcnt + r.Rows.Count Next で求めていますが、一気に知る方法がありますでしょうか?
688 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 18:29:27 ] >>687 一気に知る方法は知らないがそのままだと重複している行もカウントされる 少し前で話題に出たIntersectを組み込んで For Each r In Intersect(Selection.EntireRow, Selection.EntireRow).Areas とかにしたほうがいいんじゃないか?
689 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 21:48:43 ] 初心者って「一気に」とか「1行で」とか好きだよな
690 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:14:07 ] コードが長くなると理解できなくなるんだよw
691 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:47:58 ] 関数型プログラミングなら、一気にやるという書き方でも割と珍しくない感じがする。 もちろん面倒なことをやるなら1文あたりが相応に長くなるんだけど。
692 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 01:54:25 ] 学習が下手な奴ほど早く学習する事が1つだけある それは「人に訊いた方がラクだ」という事だ なんちてw >>687 一般的なやり方じゃないかも知らんが一応これで行けそう 重複行込み rcnt = selection.entirerow.cells.count / activesheet.columns.count 重複行抜き rcnt = intersect(selection.entirerow,columns(1)).count
693 名前:デフォルトの名無しさん [2008/10/29(水) 02:45:55 ] ループの中で =average() の引数を可変的に指定する方法を教えてください 具体例: (1)乱数で10個のデータを生成し,列方向に保存 (2)保存したデータから平均を計算し, 2つ下のセルに出力 (3)上記(1)から(2) を n回繰り返す(とりあえずn=3). 上記(2)がうまく計算できません(下から3行目のコード). --------------- Sub dice_siml01() Cells.Clear Dim i As Integer Dim j As Integer Dim n As Integer Dim nobs As Integer Cells(1, 1) = "試行回数" n = 3 nobs = 10 For j = 1 To n For i = 1 To nobs Cells(i + 1, j + 1).Formula = "=randbetween(1,6)" Next Cells(nobs + 3, j + 1).Formula = "=Average(Range(Cells(2, j+1), Cells(2+nobs-1, j+1)))" Next End Sub --------------- 【注】 randbetween(1,6) エラーの場合 rand()で置き換えてお願いします.
694 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 03:31:17 ] >>693 .formula に入れるのはセルにそのまま打ち込める式 範囲指定のところが "B2:B11" とかの形式になるように、 文字列を生成すればOK
695 名前:デフォルトの名無しさん [2008/10/29(水) 09:46:54 ] >>694 どうもありがと。 できれば、具体的な変換方法もお願いします。
696 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 10:03:37 ] >>695 宿題か何か? デカい誤り指摘してヒントも出したんだから、 そこからもっぺん自分で考えてみような じゃなきゃこんな練習問題やってる意味ないだろ
697 名前:687 mailto:sage [2008/10/29(水) 10:09:55 ] >>688 >>692 有難うございます。 「聞くは一時の恥じ...」 なんちてw セル情報はExcelの基本関数知ってればコード記述で殆ど解決しちゃう けど速度やメンテを考えるとコードは単純な程良い。
698 名前:デフォルトの名無しさん [2008/10/29(水) 10:36:40 ] >>696 これ以上は分からん。
699 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 10:37:47 ] >>697 あ、速度考えるなら intersect とか濫用しない方がいいよ 10万回ループさせると>>692 より>>687 の方が早いんで
700 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 12:16:46 ] >>697 >けど速度やメンテを考えるとコードは単純な程良い。 これは少し間違ってる気がする 速度を考えるなら処理するデータを単純にした上でコードも単純なものにする 例えばセルのプロパティを変数に入れるとか さらにメモリの使い方にも気を配れればいい 書くと短くても動かすと重たい処理なんてたくさんあるし
701 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 16:48:37 ] コードの見た目(行数、文字数とか)が単純なのと、 実際の処理が単純なのは違うよね あと>>699 の自己フォローなんだけど、 selectionの状態に依存するわな、、、w areasが2-3ぐらいなら>>687 の方が早いってことで
702 名前:デフォルトの名無しさん [2008/10/29(水) 21:27:30 ] 置換に関しての質問なのですが、 検索した2つ右のセルの文字の最後に1をつけたい場合どうすればいいでしょうか?
703 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 21:39:33 ] hoge = "あくまで一例" set piyo = cells.find(hoge).offset(0,2) piyo.value = piyo.value & "1"
704 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 21:57:52 ] 【1 OSの種類 .】 WindowsXP 【2 Excelのバージョン 】 Excel2007 【3 VBAが使えるか .】 超初心者です 【4 VBAでの回答の可否】 VBAでお願いします。 行の挿入、削除を教えてください。 A B A B C A B C 1 1001 1001 1 1001 1001 1001 1 1001 1001 1001 2 1003 1003 2 1003 1003 1002 2 1002 3 1004 1004 3 1004 1004 1003 3 1003 1003 1003 4 1005 1005 → 4 1005 1005 1004 → 4 1004 1004 1004 5 1006 1006 5 1006 1006 1006 5 1006 1006 1006 6 1007 1007 6 1007 1007 1007 6 1007 1007 1007 7 1008 1008 7 1008 1008 1008 7 1008 1008 1008 @ AB列の数字は同じものが入っています。 A C列に数値が入ります。 B C列に合わせて、A列、B列を挿入、削除したいです。 C列には1002がありますが、A,B列には1002が無いため、A,B列に行の挿入が行われ、次にC列に1005が無いため、A,B列の1005は 行の削除がされると言う具合です。 業務の効率化を図りたいので、申し訳ございませんがどなたか宜しくお願いいたします。
705 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 22:01:22 ] 丸投げはやめようぜ。 自分で作ってみたけど、分からない所が出てきた。とかなら全然かまわないんだけど。 作成依頼所じゃないんで。
706 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 22:03:28 ] すいません、数値がずれまくりました。 もう一度書き込ませてください。 【1 OSの種類 .】 WindowsXP 【2 Excelのバージョン 】 Excel2007 【3 VBAが使えるか .】 超初心者です 【4 VBAでの回答の可否】 VBAでお願いします。 行の挿入、削除を教えてください。 @ A B A B A B C A B C 1 1001 1001 1 1001 1001 1001 1 1001 1001 1001 2 1003 1003 2 1003 1003 1002 2 1002 3 1004 1004 3 1004 1004 1003 3 1003 1003 1003 4 1005 1005 → 4 1005 1005 1004 → 4 1004 1004 1004 5 1006 1006 5 1006 1006 1006 5 1006 1006 1006 6 1007 1007 6 1007 1007 1007 6 1007 1007 1007 7 1008 1008 7 1008 1008 1008 7 1008 1008 1008 @ AB列の数字は同じものが入っています。 A C列に数値が入ります。 B C列に合わせて、A列、B列を挿入、削除したいです。 C列には1002がありますが、A,B列には1002が無いため、A,B列に行の挿入が行われ、次にC列に1005が無いため、A,B列の1005は 行の削除がされると言う具合です。 業務の効率化を図りたいので、申し訳ございませんがどなたか宜しくお願いいたします。
707 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 22:05:26 ] >>706 >705
708 名前:デフォルトの名無しさん [2008/10/29(水) 22:22:44 ] >>703 さん ありがとうございます!! A列全部で検索かけたい場合どうすればいいでしょうか?
709 名前:704 706 mailto:sage [2008/10/29(水) 22:27:40 ] 申し訳ございませんでした。 EXCEL総合相談所で聞いてきます。 マルチになってしまいますが、ご了承ください。 レベルが上がったらこのスレに来たいと思います。
710 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 12:42:39 ] >>708 2003だとFindのヘルプにちょうどいい例が載ってるんだが2007では載ってないのか?
711 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 12:45:03 ] 他のレスと混同してた・・・
712 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 21:03:32 ] >>708 cells はセル全部 columns(1) は1列目 ヒントはここまで。
713 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 03:25:08 ] >>706 ズリネタとして結構面白かった
714 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:00:44 ] dim rg as range rg=activecell 処理 この処理後に、元のアクティブセルに戻る文が書けません。 どんなだったか、教えて。
715 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:07:50 ] もう一個、よろしく。 処理の中で範囲を指定してコピー、貼付をしている。 application.screenupdating=false を直前に入れても 画面が動くのですが、画面が動かないようにできませんか?
716 名前:y mailto:sage [2008/11/02(日) 18:36:29 ] >>714 rg.Parent.Activate rg.Avtivate ついでに言うと、>714の2行目は構文ミスでエラーになるので修正が必要です。 >>715 CopyメソッドのDestinationプロパティに貼り付け先範囲を指定して、 一度にコピー・貼り付けを行うと、動く枠線が出ないようになります。
717 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:37:54 ] >>716 久しぶりなので、マクロの記録で、終わってましたorz おかげで、思い出すことが出来ました。 サンクス。
718 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:51:29 ] >>716 その2行目も・・・
719 名前:デフォルトの名無しさん [2008/11/02(日) 20:57:01 ] プログラム用のVBAコードを記述した非表示ブックから、データ用の任意のブック を開き、データブックのイベントに対する処理をしています。 Excel2007はウインドウのタイトル右端の×ボタンが「閉じる」に対応している様 です。 Excel2007でも以前のバージョンと同様に「Excelの終了」にする方法を模索中です。 方法をご教授頂けると有難いです。
720 名前:y mailto:sage [2008/11/02(日) 22:45:44 ] >>718 うは ご指摘ありがとうございます。 >>719 ×ボタンでBeforeCloseイベントが発生するので、 同イベントプロシージャ内に Application.Quit を記述します。
721 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 23:00:30 ] range型変数にsetしてないってのは突っ込んじゃいけない所? 最近、微妙な空気が読めなくなってきたよ・・・。
722 名前:719 [2008/11/02(日) 23:24:17 ] >>720 自分もそれでExcelが終了すると思っていたのですが、ブックが閉じるだけです。 SnendKeys(Alt+F4)を試したら終了できました。orz
723 名前:719 [2008/11/03(月) 00:23:33 ] 訂正です。 SendKeys(Alt+F4)でもだめでした。 プログラムブック(A)からデータブック(B)を開いて、Bが変更された場合に 変更を保存するかどうかを確認するダイアログが表示されるので、Alt+F4 を送信するとダイアログが閉じられる事になるのでExcelを終了できません。
724 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 00:25:16 ] >>722 application.quit の前にワークブックの close やってる? 後にしてみたらどうなる?2007はわからんけど、、、
725 名前:722 [2008/11/03(月) 00:44:26 ] >>724 もう少し具体的に教えて下さいませんか。 2007以外は×ボタンでExcel終了が終了するようになっています。 同じブックを2007の互換モードで動かして×ボタンでExcelを終了 したいのです。 この方法が分からないのです。
726 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 01:21:12 ] >>725 あ、ごめん ttp://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_800_060.html この辺の問題のことだったの。 2007以外ではいけてるなら関係ないね。失礼した
727 名前:y mailto:sage [2008/11/03(月) 07:57:50 ] >>725 2007で試さずに>720を答えてました。2007ではQuitだとうまくいかないんですね? 一応、Shift を押しながら×クリックすれば一発で終了するので、それで用が済むなら。 VBAでのやり方は、後で職場の2007で探してみます。
728 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 09:09:42 ] range型ってsetしなくても使えるの?
729 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 10:14:59 ] 範囲指定をしてコピー等をした後、コピーモードををフォルスにした 後のことです。 範囲指定を解除する方法は、どこかのセルをactivateやselectするしか 方法はありませんか。画面のちらつきを少しでも防止したいので、セル指定を したくないのですが、何か方法が無いでしょうか?
730 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 10:51:57 ] 久々にExcelのVBA触って改めて思ったけど、本当にVBAっていうかVBって糞言語だな。 >>725 724は具体的に言ってるでしょ。 ダイアログが出るために終了できないのならダイアログが出ないようにすれば? どうしてダイアログが出るの? ブックが変更されてるのに保存されてないからでしょ? だったら保存したら? こんなのパソコン初めて一週間のオッサンでも最初に覚えることの一つじゃないか。 >>729 全体的に何がいいたいのかよくわからない気がする。
731 名前:デフォルトの名無しさん [2008/11/03(月) 10:54:12 ] どうしてもわからないので 教えていただきたいのですが、 Book1を起動して Book1のマクロで Book2を開くことはできたのですが Book2の内容をコピーして Book1に貼り付けすることができません よろしくお願いします。
732 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 10:59:28 ] >>729 ググってもすぐ見つかるし マクロの記録でもすぐ解るようなことを何故聞く? そのものズバリの解除法が簡単に見つかるのに >>731 Bool2を開くと、戻り値としてBool2のオブジェクトが返る あとは好きなようにコピーなりなんなりすれば良い
733 名前:725 [2008/11/03(月) 11:12:00 ] >>730 保存するかどうかはユーザーが決める事で、プログラム側で決められる のは、×ボタンが押されたらWindows2007以外と同様な動作なんだけど。 説明不足?それとも...
734 名前:725 [2008/11/03(月) 11:17:49 ] >>730 719に記述した通りなんだけど...
735 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 11:25:31 ] >>734 だから? ついでに言えば、お前さんの言っている現象はExcel2007に特有の現象でもなんでもないはずだ。 お前さんが検証もせずそう思い込んでいるだけにすぎない。 全く同じ条件であれば、2003以前のエクセルでも全く同じことが起こるはずだよ。
736 名前:デフォルトの名無しさん [2008/11/03(月) 11:43:21 ] >>735 確かに、Excel2000と2007で同じブックを動作した検証で違いが出た だけですが...
737 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 14:48:40 ] API
738 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 20:06:15 ] もしかして、.saved や displayalerts の値はいじらずに、 組み込みダイアログをそのまま使ってるのかな?>>733 組み込みダイアログ出た後の動作が 2007 とその他で異なる可能性あるし、 ユーザに選ばせるなら自前でやった方が確実かも
739 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 00:23:48 ] >665 たとえば、セル(4, 3)に '=A1+A2が記入してあり その式をセル(5, 1)に書き込む場合 Cells(5, 1) = Mid$(Cells(4, 3), 1) でどうでしょう?
740 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 01:33:08 ] いつの話だよ
741 名前:デフォルトの名無しさん [2008/11/05(水) 10:16:29 ] ? ActiveSheet.UsedRange.Rows.Count これを実行後するとワークシート上のUndo(元に戻す)が無効になっていまいます。 これって、仕様ですか?
742 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 11:06:19 ] >>741 イミディエイトウィンドウでやるとVBA動かしたの時と同じでUndoできなくなる ?1+1とかでも同じ でもウォッチ式として使えば問題ない
743 名前:742 mailto:sage [2008/11/05(水) 11:11:33 ] 今試したらウォッチ式でもだめだった orz
744 名前:741 [2008/11/05(水) 15:12:16 ] セルの選択範囲が変更になったとき、最終行を調べたいのですが ? ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row だと、保護されたシートの時エラーになってしまう。 他にUndoを生かしたまま最終行を求める方法あります?
745 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 16:17:36 ] >>744 ?WorksheetFunction.Max(ActiveSheet.Cells(65536, 1).End(xlUp).Row,ActiveSheet.Cells(65536, 2).End(xlUp).Row,ActiveSheet.Cells(65536, 3).End(xlUp).Row) もしくは Dim lg(2) As Long lg(0) = ActiveSheet.Cells(65536, 1).End(xlUp).Row lg(1) = ActiveSheet.Cells(65536, 2).End(xlUp).Row lg(2) = ActiveSheet.Cells(65536, 3).End(xlUp).Row Debug.Print WorksheetFunction.Max(lg()) でどう?
746 名前:デフォルトの名無しさん [2008/11/05(水) 16:42:43 ] >>745 有難うございます。 ? activesheet.cells(activesheet.cells.rows.count,1).end(xlup).row で出来たのですが、列を特定しないと駄目なのですよね。 自分も気付いたのですが、 保護されているかどうかでUsedRangeとSpecialCellsを使い分けるという方法 もありますね。
747 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 01:26:47 ] 超初心者なのですが、グラフ作成のところで詰まってしまいました。 B2を起点とするデータ B21を起点とするデータ この二つのデータのグラフを作成しようと以下のマクロを作ったのですが、 Set muSouce2 = Range("B21").CurrentRegion のところでエラーがでてしまいました。 この場合どうすればエラーが取れるのでしょうか? Sub Graph1() Dim mySouce As Range Set mySouce = Range("B2").CurrentRegion Charts.Add ActiveChart.SetSourceData Source:=mySouce, PlotBy:=xlColumns ActiveChart.ChartType = xlLine Dim mySouce2 As Range Set mySouce2 = Range("B21").CurrentRegion Charts.Add ActiveChart.SetSourceData Source:=mySouce2, PlotBy:=xlColumns ActiveChart.ChartType = xlLine End Sub
748 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 02:13:25 ] >>747 set mySouce = の時は、データの入ってるワークシートが アクティブになっててその書き方で行けるんだけど、 set mySouce2 = の時は先に作ったグラフシートがアクティブになってるから、 range("B21") がどこにあるのかわからんってさ
749 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 02:51:43 ] >>748 なるほど!!明快な説明ありがとうございます。 つまり、set mySouce2 = の前に、 データが格納されているシートをセレクトすればよかったのですね。 対処だけでなく原因が分かりためになりました!
750 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 10:11:14 ] >>749 そそ、それでOK。加えるなら、せっかく range型変数を2つ用意してるんだから、 最初にまとめて下準備しちゃえば効率がいいよね selectせずに rangeを取得するやり方もあるけど、少しずつ覚えればいい
751 名前:デフォルトの名無しさん [2008/11/06(木) 18:01:30 ] ある値xをアクティブセルの持つ書式に変換した値を取得したいのですが Dim rng as Range Set rng = ActiveCell rng.Value = x この方法だとアクティブセルの値が変更される為変更前の値の保持が必要になります。 もう少しましな方法を教えて頂けるとありがたいです。
752 名前:デフォルトの名無しさん [2008/11/06(木) 18:14:58 ] >>751 Format(x, ActiveCell.NumberFormatLocal) セルの書式によってはバグるかも試練がw
753 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:35:33 ] そうなんです [G/標準]とかでエラーになる為、セル代入を考えたのですが...
754 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:50:58 ] 「セルの書式に合わせた文字列に変換」でいいのね ? worksheetfunction.text(x, iif(activecell.numberformatlocal="G/標準","General",activecell.numberformatlocal)) とかは?
755 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 19:12:31 ] TEXT関数か・・・ならば worksheetfunction.text(x, activecell.numberformat) これでどうかな?
756 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 19:20:37 ] >>755 書式に和暦や曜日が指定されてるとヘンになるよ そういうの無視でいいならいいんだけど
757 名前:デフォルトの名無しさん [2008/11/06(木) 19:35:05 ] しつこいようだけど、頼む。 セルについて指定無しの状態にするすることは可能ですか? set rg = nothing とか試してみたけどだめだったorz
758 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 19:44:51 ] >>757 ほんとしつこいなぁ、、、って誰?w というか、質問の意味がわからない >>756 自己レス 曜日は関係なかった。組み込みの日付書式で和暦を選んだ時にヘンになる
759 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 19:50:15 ] >>757 以前やってみようとした事があったけど見つからなかった 本当に出来るのかどうかも不明 >>758 お前頭悪そうだな
760 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 19:56:56 ] >>759 質問の仕方が悪いのに、慮って答えてやるだけが能じゃないよ
761 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 20:01:11 ] 質問スレで分かってて答えないのは只の無能だと思われてもしょうがない。
762 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 20:10:08 ] >>761 そう思いたい奴は思えばいいよ。回答者としてのスタンスは人それぞれだろ 質問スレでいちいち他の回答者をくさすのが有能とも思わないぞ
763 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 20:46:09 ] 喧嘩は他所でスレ立ててやれよ 目障り
764 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 21:18:48 ] 自己紹介乙
765 名前:デフォルトの名無しさん [2008/11/06(木) 21:53:02 ] >>763 おまえは引っ込んでろ! このカス。
766 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 04:10:27 ] 俺も >>757 の質問がよくわからないし つか、前に質問したなら名前欄にレス番とか入れてくれ
767 名前:569 mailto:sage [2008/11/07(金) 06:17:38 ] フォルダの中を検索して特定のExcelファイル(○○.xls)を見つけたいのだが フォルダを作る側が適当で(ここの部分は立場上どうしようもないです・・・) Aフォルダ Bフォルダ ○○.xls というパターンもあれば Aフォルダ/Cフォルダ/○○.xls Bフォルダ/○○.xls というパターンもあり、○○.xlsが無いことも2個あることも5個あることもある。ただ幸い○○.xlsの名前は固定です。 このフォルダ内から存在する全ての○○.xlsを開いて中身から数字を 取り出す機能を持ったVBAを作ろうとしています。 フォルダのパスはFOを使って配列に入れてそれを 全てのフォルダパターンを使って○○.xlsを探そうとしています。 そこで質問なんですがVBAで再帰的な処理ってできるんでしょうか? 階層固定のフォルダ抽出、Excelファイルは問題ないのですが 階層実固定のフォルダ抽出で詰まっています。 例えば手抜きですが↓みたいな流れでうまく出来そうですかね? Private Sub AAA() 今のパスを配列に格納 if フォルダが有る時 then call AAA end if End AAA
768 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 06:18:18 ] すんません。上のやつ>>569 さんじゃないです・・・。名前に入っちゃいました。
769 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 08:44:46 ] >>767 >そこで質問なんですがVBAで再帰的な処理ってできるんでしょうか? 試した? 試してもいないのに質問しに来てない?
770 名前:751 [2008/11/07(金) 09:34:48 ] >>754 >>755 >>758 ありがとうございます.orz 754さんの方法でグーですね。
771 名前:751 [2008/11/07(金) 09:47:36 ] ついでにもう1つ教えてください。 xの値が「=AAA」とかだったりするとエラーになってしまうのですが、これを判別 するにはどうしたらよいのでしょうか? ? Application.WorksheetFunction.IsError(x) だとエラーにならないのですが...
772 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:00:12 ] どういうエラーでそのxが何か分からないと答えられない セル(Range)なのか数値や文字なのか
773 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:09:03 ] >>767 「Excel VBA 再帰」でぐぐれば見本がゾロゾロ出てくるよ
774 名前:771 [2008/11/07(金) 10:50:19 ] 入力したテキストxでAutoFilterの設定・解除をしています。 (フィールドはアクティブセルの列) この時、xの書式をアクティブセルの書式への変換は >>751 さんに教えて頂き実現できましたが、テキストがエラーかどうかの判定に Set rng = ActiveCell: rng.Value = x if WorksheetFunction.Iserror(rng) とすると、アクティブセルの保存が必要になってしまう為もう少しましな 方法を模索中なのです。
775 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 12:54:09 ] >>769 ちょっと試せない状態だったのでとりあえず聞きました。 >>773 ありがとうございます。ぐぐり方が悪かったのかExcel VBA 再帰で入れたらちゃんと出てきました。 お騒がせしました。
776 名前:デフォルトの名無しさん [2008/11/07(金) 13:14:43 ] 初歩的な質問なんですが、 intの変数にアクティブセルのアドレスを代入していますが、一つ目の変数にしか代入できません。 二つ目の変数に別のアクティブセルを代入するとerror13が現れます。 どなたかご教授願えないでしょうか?
777 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:47:26 ] >>776 アクティブセルは1つしかないはずなのに「別のアクティブセル」って何?
778 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 15:38:15 ] >>776 Error 13は「型が一致しません。」だから 単純にint型に文字列(スペース含む)を代入しようとしてるとか? セルが空なら0が入るし
779 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 18:04:36 ] 膨大な量じゃないならコード貼ってどこでエラーがでたか書いてくれよ
780 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 18:10:46 ] >>774 x = "=AAA" の時に、Criteria1:="=" & x でオートフィルタかけてもエラー出ないよ? いつどこで出るエラーのことを言ってるんだ?具体的にコード貼ってくれないかな
781 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 18:27:19 ] 説明が下手な奴大杉
782 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:31:54 ] 説明もまともに出来ない不出来な頭だから、問題も自分で解決できずにここに質問に来るんだよ もちろん、本当に難易度の高いことをやっていて、行き詰まって来る奴も居ないわけではないが 殆どが能無しどころか脳無し(調べる考えるという知能的行為そのものが出来ない奴)なんだから ここに居座る(質問者としてではなく)ならそのことは覚悟しなくちゃならない
783 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:45:31 ] >>782 よく分からない論理だな。
784 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:12:21 ] わからんではないが、そこまで言い放つことでもない 甘え放題も困るが委縮させ過ぎるのもよくない 意味不明な質問を差し戻したり、時々愚痴るぐらいで丁度いい
785 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 07:17:57 ] ヒマだからスレ読み返してたらわかったw >>757 =>>729 だね。たぶん>>715 も同じ人っぽい screenupdating = false をやっててもちらつくのは、おそらく on / off のタイミングが悪い たびたび on / off すると、on になった一瞬のスキも見逃さずに画面更新するからちらつく off にしたらしっぱなしになる位置でやらないと 範囲指定を解除(セルが select されていない状態に)する方法だけど、 高さ・幅 0のイメージを用意してそれを select すれば、 selection が range でない状態にすることはできる activecell の参照は直前のまま保持されるけど、シート上の囲み枠は出ない でもさ、解除ができても、指定/解除を繰り返せばどのみちチラチラするよ ちらつき防止なら、screenupdating のタイミングを確認するのがいいと思う
786 名前:デフォルトの名無しさん [2008/11/08(土) 17:49:36 ] >>785 ベリー、ベリー、サンクス お見込みのとおり、その3つは折れです。 展望が開けました。 サンクス。
787 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 08:43:30 ] Enumとして宣言さている列挙型のmember名をStringとして取得できますか?
788 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 11:32:30 ] 販売管理ソフトから吐き出されるxlsを、マクロで変換して会計ソフト用のcsvに変換するマクロ作った。 ・マクロが記述されたBook1.xlsのA1に読みたいxlsのファイル名を記述 ・実行ボタンを押す ・書き込まれたファイル名のファイルを開いて、同じファイル名のcsvを書き出す
789 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 11:34:07 ] だれのための、どういう報告なの?
790 名前:788 mailto:sage [2008/11/09(日) 11:36:43 ] 販売管理ソフトから吐き出されるxlsを、マクロで変換して会計ソフト用のcsvに変換するマクロ作った。 ・マクロが記述されたBook1.xlsのA1に読みたいxlsのファイル名を記述 ・実行ボタンを押す ・書き込まれたファイル名のファイルを開いて、同じファイル名のcsvを書き出す そんなマクロなんだけど、毎日販売管理ソフトから吐き出されたxlsファイルをBook1.xlsと同じ階層にコピーして、ファイル名を記述しないといけないのだけど、 xlsファイルをxlsファイルにドラッグアンドドロップとかでファイル名を取得して実行できるようにする方法ってありますかね?
791 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 11:53:23 ] >>787 スレ違い それはVBAではなくVB言語の質問だ >>790 あるけど、それはWindowsの設定の問題だ
792 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:30:57 ] windows弄ったら出来るのかー。 ほんと言うとVisualStudioでEXE形式にできたらいいんだけどね。 VisualStudioからEXCELのコントロールわからんしな;;
793 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:49:50 ] できないだろ 無理にやると普通に開けなくなるだろ バッチファイルかWSHにドロップして 引数を環境変数に設定して xlsファイルを開き 環境変数を見る
794 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:43:56 ] いつもそんなことやってるの?
795 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 19:34:55 ] >>790 普通にアドインを作れば解決するケースに思えるけど。
796 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 21:03:05 ] アドイン??
797 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 21:16:11 ] >>795 教えてくれ
798 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 21:31:57 ] 「Excel アドイン」でググってトップのところに詳しい説明があるから それを読んだ方がいいよ。 VBAのコードが普通に書ける人ならすぐに理解できると思う。
799 名前:788 mailto:sage [2008/11/09(日) 21:34:13 ] >>795 >>798 まさにこれだ!!! ありがとう!!!
800 名前:655 mailto:sage [2008/11/10(月) 00:15:33 ] >>655 If Weekday(Date) = 7 And (Day(Date) + 7) \ 7 = 3 Then Range("A1").Value = "明日は第三週の日曜日" End If 正直な話、説明がさっぱり理解できてませんでしたが、がんばったらできました。
801 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 10:07:40 ] >>786 書いて良かった。誰?とか言ってゴメンなw >>790 処理対象ファイルが自動的に特定できれば一番ラクそうだけど、 人間が見ないと特定できないの? あるフォルダ内でタイムスタンプが今日付けの .xls とかでも無理? 正直、アドインにする利点がピンと来ない、、、
802 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 11:51:04 ] >>801 販売管理ソフトから出力する段階で一旦エクセルが開いてそのxlsを手動で名前をつけて保存するんだ。 たとえは今日なら20081110.xlsって手打ちで名前をつけてね。 それをこのマクロの入ったBook1.xlsから呼び出すんだ。 それを、アドインにしておけば、xlsを吐き出すことなく、読み込むcsvの名前をつけて保存すればよくなるだけだなと思ったら、これはいいアイディアだと思う。
803 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 12:55:12 ] >>802 >販売管理ソフトから出力する段階で一旦エクセルが開いてそのxlsを手動で名前をつけて保存するんだ。 保存する前の段階でBook1.xls開いてマクロ動かせばいいだけじゃね? 一々保存してからマクロ動かさないといけない理由でもあるのか?
804 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 12:58:20 ] >>802 なるほど理解した。けど単にツールバーにマクロ登録でいいような、、、
805 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 13:33:50 ] 今までが無駄過ぎただけだな。
806 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 14:03:48 ] >>803 保存しないとファイル名がないから別のブックからコントロール奪えないと思ってたorz
807 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 14:05:19 ] >>804 それがアドインかと思ってたorz orz
808 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 19:24:04 ] >>804 そのブックは「販売管理ソフト」が吐き出しすものだって言ってるじゃん。
809 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 19:26:46 ] >>808 ツールバーにマクロ登録すると その販売管理ソフトが吐き出したブックをExcelで開いたときにマクロを動かせます。
810 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 19:30:27 ] うーんだからマクロっていうのはだなあ.....ってところから説明しないとダメ?
811 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 19:40:33 ] マクロが記述してあるだけのブックを用意して そのマクロをツールバーに登録するんだよ ネットワーク越しでも大丈夫だし
812 名前:デフォルトの名無しさん [2008/11/10(月) 23:38:11 ] 初心者なので、丸投げでお願いします。 application on timeを使って、 開始したら、 a時に処理1をやって、その20秒後に処理2をやって、その8秒後に処理3を やって、終わる。 というものです。 どうにも、最近、頭が回らなくなって困ってます (~.~)
813 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 23:48:19 ] はい次の話題
814 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 00:02:20 ] 812の追記 処理1は、マクロ1。処理2はマクロ2。処理3はマクロ3と いうことでお願いします。
815 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 01:31:29 ] A1に「08/11/11」と入力されているのをB1に「20081111」と変換させるマクロを作りたいと考えています。 Cで書くと下記みたいな流れになるかなと思うんですが・・・(間違ってるかもしれませんが) abc ="08/11/11"; sscanf(abc,"%d/%d/%d",&a,&,b,&c); printf("20%02d%02d%02d",a,b,c); VBAで書くにはどんな関数使えばいいのでしょう。
816 名前:812 mailto:sage [2008/11/11(火) 01:45:58 ] 自己解決できましたので、 >>812 814はスルーでよろっ。
817 名前:815 mailto:sage [2008/11/11(火) 02:02:40 ] 文字列操作でこうやってみた tmpdate_y = CStr(Left(Sheet1.Range("A" & i).Value, 2)) tmpdate_m = CStr(Mid(Sheet1.Range("A" & i).Value, 4, 2)) tmpdate_d = CStr(Right(Sheet1.Range("A" & i).Value, 2)) tmpdate = "20" & tmpdate_y & tmpdate_m & tmpdate_d スマートじゃねえよなーorz
818 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 02:09:50 ] >>815 いったん日付型にしてから書式変換するとラクだと思う 文字列→日付型への変換は cdate() 日付型→書式付文字列変換は format() 詳しくはヘルプ読んでね
819 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 19:44:30 ] すいません質問です エクセルのマクロで module1内にコード書くのと sheet1内にコード書くのとでは 動作にどんな違いがありますか? sheet1から他のシートを対象としたselectionメソッドが失敗するようなのですが・・・
820 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 19:50:39 ] 訂正)Selection→Select
821 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 20:51:01 ] >>445 で解決しましたすいません
822 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 21:15:30 ] こんばんは 複数のセルの値を一度に比較することってできますか? Sheet1のA1:B5とSheet2のA1:B5のValueが 同じであるかどうか、が分かるだけでokなのですが。
823 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 00:20:52 ] 各シートは配列のようにアクセスできるが
824 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 01:57:12 ] >>822 配列数式でできるよ
825 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 05:52:03 ] Excel2003を使っています。 羅線の太さを調節する方法ってありますか? できるだけ細くしたいのです。
826 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 06:21:13 ] >>825 マクロの記録使って保存すればおk 単純に細くするだけの質問ならスレチ
827 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 12:48:05 ] Excel2000:WindowsXP/Pentium4(1.8GHz)/RAM512 セルA1とA2を結合したシートに対して 下記のコードの実行時間は 1回目:13秒 2回目以降:54秒 (Pasteに変更すると29秒) 1回目と2回目以降の違いの理由は何なのでしょうか? rows(1).select selection.copy selection.offset(1).resize(20000).select selection.insert shift:=xlDown selection.mergecells = false selection.delete shift:=xlUp range("A1").Select どうやったら速度アップできるか知りたいのですが...
828 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 12:52:09 ] 羅線ってなんだ? らせん?
829 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 13:26:01 ] 螺旋 罫線 新羅 確かに間違える人は居るかも
830 名前:827 mailto:sage [2008/11/12(水) 14:59:51 ] やりたい事は シート・アクティブ時にコピー挿入し編集 シート・ディアクティブ時に挿入データを削除(元の状態に戻す) なのです。
831 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 15:02:57 ] > 1回目:13秒 > 2回目以降:54秒 (Pasteに変更すると29秒) 単位、「秒」じゃなくて「_秒」の間違いだよね?
832 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 15:15:35 ] 秒です。
833 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 15:17:38 ] セルを結合していなければ1秒未満です。
834 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 15:20:33 ] いや、結合していても_秒でしょ
835 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 15:34:39 ] 結合云々は関係なく1秒かからんな データは何かあるのか? とりあえず高速化のために Application.ScreenUpdating=False はやってるよな?
836 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 15:54:59 ] 新規ブックでセルをマージし、>>827 のコードを走らせただけです。 ScreenUpdating, EnableEvent, Calculation等もやってみています。 マシン・スペック(5年前)の問題でしょうか?
837 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 16:15:36 ] スペックは漏れのマシンのほうが悪いくらいのはずw 計測方法の問題じゃないか?
838 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 16:54:32 ] すまん、Mobile Pentium4の間違いだったorz
839 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 17:23:09 ] Mobile Celeron(1200MHz)512MB RAM Mobile云々は置いといてこっちは1.2GHzなんだよw OSが2kだからってここまで差は出ないよな? 体感でも1秒以上かかってるのか?
840 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 17:38:52 ] excel2003:WindowsXP/Pentium4(2.8GHz)/RAM512 でセルA1とB1を結合して走らせてみたら 1回目:9秒 2回目:40秒 体感で1秒未満は、セル結合無しの場合だけ
841 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 17:53:33 ] あぁA1とB1を結合かw それなら確かに遅くなるな
842 名前:827 mailto:sage [2008/11/12(水) 18:00:26 ] >>827 のA1とA2はA1とB1の結合に訂正願います orz
843 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 18:03:34 ] 俺の古典的環境だと1回目20秒、2回目1分40秒w 遅過ぎワロタw
844 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 22:23:38 ] >>830 どこまでが編集前でどこからが編集後? 編集は .mergecells = false の前?後?
845 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 09:30:46 ] *)シート(A1とB1結合)アクティブ時の処理 rows(1).select selection.copy selection.offset(1).resize(20000).select selection.insert shift:=xlDown 'コピー挿入した行に名前を付ける(後で削除の為) *)コピー挿入したデータへの編集 *)シートディアクティブ時の処理(アクティブ時点の状態に戻す) '実際にはSelectionでは無く名前で削除 selection.mergecells = false '<- これ無しだと遅くなる為 selection.delete shift:=xlUp range("A1").Select
846 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 09:40:02 ] メモリ1ギガとか積んでいる人だと1回目と2回目の差が無いなんて事ないですか?
847 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 12:31:54 ] >>845 了解 多数の結合セルを含む範囲で挿入/削除を続けてやると、後でやる方の処理が遅くなる感じ メモリ上のシート情報がややこしくなるのかな?1回目をやった後ブックを閉じて開き直すか、 シートコピーでリフレッシュすれば2回目が遅くならないけど、イベント拾うならキツイよね オレなりに試してみた限りでは、 挿入時: .insert を使わず、2行目以降にデータがあった場合は 20000行ずらした位置へ コピーし、狭間へ 1行目を 20000行分コピー 削除時: 最初にシートコピーでバックアップを取っておいて、.cells.copy でコピーし戻す ( .mergecells = false もいらない) ってなやり方が一番早かった。1回目は大差ないけど 2回目が 1回目より早くなる
848 名前:845 mailto:sage [2008/11/13(木) 13:26:06 ] >>847 有難うございます 挿入処理は、 insertを使わない方法(Paste)は、定義されている名前がある場合面倒そうです 削除処理は、 ご指摘のシートコピーを戻す方式を実際の処理に組み込んでテストしてみます
849 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 17:21:48 ] >>848 名前か。それは厄介だ 挿入に insert 使ってコピー書き戻すと名前付き範囲の内容書き変わるし insert だけでも 2回目は遅くなるし 後は、編集時にシートコピーしたシートを使っといて、deactivate されたら シートごと削除とかかなあ。イベントあるからいろいろめんどくなるんだよな、、、
850 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 17:26:26 ] シートのコピーから戻す方式を試したら更に時間が掛かる様になってしまった
851 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 18:16:20 ] >>850 データ量や数式、書式設定その他によってかなり違うだろうね オレのはあくまで>>827 の条件で試しただけだし
852 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 21:52:40 ] >>847 の処理における名前付き範囲は、挿入時に range("namedarea").offset(20000).name = "namedarea" コピーバックの後に .offset(-20000) で、わりと簡単に対応できた 画期的なやり方は見つからんね。構成とか見直すしかないかも、、、
853 名前:851 mailto:sage [2008/11/14(金) 00:13:24 ] とりあえず、A2:Z3000 をテキトーな数式で埋めて試して見たけど、 やっぱ>>847 のが早かった。calculation 切れば数式なしの時とあんま変わんない とにかく insert (特に 2回目)が遅いんで、insert とコピーバックの組み合わせでは 効果ないかも
854 名前:デフォルトの名無しさん [2008/11/14(金) 21:41:28 ] はじめまして、こんばんは。 今日はじめて本屋にて VBA の存在を知りました。 初心者質問ですみません、例えば、、、これができるようになるとなにができるようになるのですか? 詳しいかた教えてください。
855 名前:デフォルトの名無しさん [2008/11/14(金) 22:05:58 ] >>854 例えば野球データベース 選手名を入力すればその選手のプロでの全成績が一覧表示されるとか インベーダーゲーム作ってる人もいるよ とにかくExcelをVBAプログラムで自在に操れるって事
856 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 19:22:40 ] >>854 業務で言うと、データベースをexcelに展開して、 色んなチェックプログラムを掛けて品質保証したりとか。 ワークシートで使える関数を作って会社内に配布したり。 excel上に検索エンジン作ってる人もいるし、まぁ、何でもあり。
857 名前:無職カス [2008/11/16(日) 02:50:07 ] みなさん、こんばんは、 >>854 です。 >>855 >>856 さん 返答ありがとうございます。かなり使える機能ですね。 最近アルバイトをやめました。時間はたっぷりありますのでそこそこ使えるレベルまでもっていきます。 これからVBAを勉強していきます。 多々質問すると思いますが、みなさんよろしくおねがいします。
858 名前:デフォルトの名無しさん [2008/11/16(日) 03:45:10 ] 下に全員の成績表があって、 そこから各部門のトップ5を上の小さい表に抽出したいんだけど、 ランクとは違う気がするし行き詰っています。 どなたかご教授願えますでしょうか?
859 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 05:08:38 ] officexpのマクロと関数の処理順(と思われる事項)で知恵を貸していただきたく書き込みいたします。 セルAの値によってセルBの値が変わるよう関数を設定しているの状況で、 セルBの書式が自身の値によって変わるようにマクロを組もうとしています。 (書式は4種類以上なので条件付き書式は使えません) worksheet_changeで書式変更を自動実行するようにしたのですが、 マクロを実行してみるとAの値を変えてもBの書式が変わりません(Bの値は通常通り変わります) その状況で、まったく関係ないセルCの値を変更するとBの書式が変わったので、 マクロ自体には問題はないようです。 おそらく、A変更→マクロ自動実行→関数でBの値変更、という内部処理があるために マクロによる変化が見られない状況であると思っています。 (違っているなら根本から考え直さないといけないかもしれませんが) このような構成の場合、関数による値の変更が反映された後で 書式変更などのマクロが実行されるようにすることはできないのでしょうか? ご教示お願い申し上げます。
860 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 10:11:55 ] Calculate
861 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 10:51:08 ] >>860 ご回答ありがとうございます。 5分前にcalculate使えばいいと気づいて、自己解決した旨書きにきたら 既にお答えくださっていたのですね。 初歩的な事でお手を煩わせてしまい、申し訳ございませんでした。
862 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 19:13:30 ] >>857 基礎を勉強するには独学でも全然問題ないけど、 プログラム未経験で、かつ仕事に就いてないとなると、 プログラムの基本的な事を理解するまでに半年か1年かはかかると思う。 んで、そこから先は明確な目標が無いと無理。 やれる事が多いんだけど、ぶっちゃけた話、特化したプログラムには敵わない。 例えば>>855 でゲームの話が出てたけど、確かに作る事は出来る。 けど、VBAからAPI呼び出してるに過ぎないし、更に言えば タイムラインって概念がある&ドローツールのFlashなんかには到底及ばない。 ExcelVBAはあくまでExcelの処理系統のプログラムだと俺は考えてる。 Excel上での処理に関してはVBAがぶっちぎり。当然だけどね。 何か目標持った方が良いよ。
863 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 19:15:00 ] >>859 calculate使う理由が分からん・・・。 VBAで処理してるなら、VBAでBの値も弾き出せば良いんじゃないか?
864 名前:独り言(ちら裏) mailto:sage [2008/11/17(月) 01:24:05 ] というか、条件付き書式を複数設定(優先順位付)出来ないExcelの仕様に 問題ありかと... それがExcelのポリシーというのであれば、そういうアプリめいたものを Excelで作ることが間違いだったということになるか...
865 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 10:16:53 ] > 条件付き書式を複数設定(優先順位付)出来ないExcelの仕様に > 問題ありかと... という意見が多いので、2007で設定数が 3 から 無制限 に、 優先順位も設定を書き直さずに変更できるようになった。
866 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 14:02:59 ] ということで、Excel2007以降の購入をお勧め
867 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 15:07:26 ] てゆーか、条件によって変化するセルの書式の種類は3つに留めておく というのが無難かと
868 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:50:10 ] >>864 selection changeイベントで好きなだけ設定しろ。 おまいのVBAは飾りもんか?
869 名前:デフォルトの名無しさん [2008/11/18(火) 17:07:45 ] これのFSO(FileSystemObject)使ってテキストデータの読み込みすると文字化けします。 ttp://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110.html strRECをUTF-8→SJISにエンコードするには、どう記述したらいいですか?