1 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 15:42:51 ] ExcelのVBAに関する質問スレです 前スレ pc11.2ch.net/test/read.cgi/tech/1219673793/ ★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)
44 名前:デフォルトの名無しさん [2008/12/10(水) 20:48:45 ] 左から6文字が空白ならという条件式は次のでいいですか? xp 2003 空白文字も含めて全て全角にしています。 if left$(moziretu,6)=space(6) then
45 名前:44 [2008/12/10(水) 20:50:50 ] 効いていないので効きました。 よろしく
46 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 21:09:53 ] if left$(moziretu,6)=" " then
47 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 21:58:41 ] >>44 mid関数
48 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 23:47:47 ] >>47 左から6文字「目」じゃない
49 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 10:42:48 ] >> それは半角の空白6文字かどうかの判定式。 全角6文字の空白かどうかなら If Left$(moziretu,6)=String$(6," ") then 混在だとちょっと面倒かな?
50 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 11:48:18 ] >>49 全角半角考慮してこんなのはどうかな? LTrim$(Left$(moziretu, 6)) = ""
51 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 13:07:48 ] >>50 なるほどね。 それが一番いいだろうな。
52 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 16:54:36 ] StrComp(Left$(moziretu,6),Space(6),vbTextCompare)
53 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 17:24:22 ] 空白文字も含めて全て全角にしています、って書いてあるし、 数も6個で固定なら>>46 で充分でしょ わざわざ余分な関数使う意味がわからない
54 名前:50 mailto:sage [2008/12/11(木) 18:16:07 ] >>53 >>45 を読めばその一言が信用できないことくらい分かるだろ? 49だけ読んでレスした漏れが言えた事じゃないがw
55 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 20:34:08 ] >>43 ありがとうございました。 バイト数を数える事で対応してみます。
56 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 03:22:22 ] VBAフォームに、VBのFlexGridのようなマス目の入ったものを 表示させてEXCELのシートとやりとりしたいのだが、 そういったコントロールってないの? 今使ってるのがEXCEL2000なんだが。。。
57 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 03:48:02 ] アホ発見
58 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 14:45:20 ] 会社でやってる作業を自動化したくてVBAに興味を持ったんですが、よい参考資料が見つかりません。 VBAのリファレンス本でお勧めを教えて頂ければ助かります。 環境はWin2kでExcel 2003です。Cとか弄ったことがあるのでまるっきり初心者ではないです。
59 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 14:56:02 ] 丸っきりの初心者ではないと言い張るのなら、参考資料など見つからなくても何とかするもんだ。
60 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 16:22:48 ] >>56 owc >>58 msdnのヘルプ
61 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 18:39:41 ] 本といわれてヘルプを紹介するアホはどうにかならんかね。
62 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 18:43:12 ] どうにもならんよ
63 名前:デフォルトの名無しさん [2008/12/13(土) 19:36:14 ] 大きな本屋に行って参考書探すくらいの努力したら?
64 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 20:57:44 ] 経験者なら本なんていらんだろ。 VBAくらい中学生でも使え紆余w
65 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 22:32:27 ] 折れは、このスレだったか昨年知った次の本を薦める。 「技術評論社 Excel VBA ポケットレファレンス」 成りは小さいが、他のどの本よりも役に立った。 今年、確か、2007対応の改訂版が出たと思うが2003等も使えるように整理してあるはず。
66 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 22:55:26 ] ヘルプを見るのは常識として 本なら俺も↑のポケットリファレンスだな。 あとはできる大事典VBAもいい 勉強中なら本のほうがやりやすい所あるし。
67 名前:58 mailto:sage [2008/12/14(日) 15:30:22 ] コメントくださった方、ありがとうございました。 >65,66で紹介して頂いたポケットリファレンスを購入してきました。 ちょっと手に取って調べられる本が欲しかったので、まさにぴったりです。
68 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 16:42:59 ] >ちょっと手に取って調べられる本が欲しかったので、まさにぴったりです。 だったらそれを先に書いておけよ。
69 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 17:19:15 ] それくらい読み取れよアホ
70 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 02:04:11 ] まあ解決したみたいだからいいじゃないか。
71 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 16:37:15 ] 2007は関数の追加や仕様の変更が色々あったおかげで説明が増えて少し読みにくくなったので、 もし2003で使うならブックオフあたりで古いやつを探すといいかも。
72 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 23:15:34 ] スレチでしょうか…?初心者です。質問させて下さい WindowsXP、Excel2000です マクロでゲーム作りに挑戦し、遊べる段階にまで出来上がったのですが… なぜだか遊んでいると、高確率で突然「画面更新」が止まってしまいます。 処理は続いているので、音も鳴りますし、Escボタンでコードの実行を中断すると、画面更新が再開され内容が反映されます。 その時「継続」を選ぶとゲームを続けられるのですが、しばらくするとまた止まってしまいます。 ループ中にScreenupdating = Trueを入れてみましたが、効果はありませんでした。 何が原因なのでしょうか?思い当たる節があれば教えて下さい。 因みに落ちゲーで、セルドット方式です。Sleep関数を多用しています。 長文失礼しました…
73 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 00:01:40 ] 仕様です。 おとなしくFlashの勉強するのが吉。
74 名前:72 mailto:sage [2008/12/16(火) 04:33:53 ] >>73 レスありがとうございます。 仕様ですか…Excelの描写速度が遅いことは知っています。 しかし、ゲームプログラマーの方々もいらっしゃいますし、自分に否があるように思えてなりません。 コードの書き方に問題がある、ということは考えられませんか?コードは現在700行程です。 自信はありませんが、Sleepが問題な気がします。どうでしょうか。
75 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 04:41:10 ] 「否」でなく「非」でした
76 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 06:08:43 ] だったらコードを晒したら? それができないなら自分で勝手に調べて答えを出せばいいよ。
77 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 10:00:26 ] データ型について質問です。 エクセルのセルに勤務時間が入っており、これをvbaで計算しているのですが 時間の時も日付型(DATE)の方が良いのでしょうか? それともSingleやDoubleでしょうか? VBAの勉強も兼ねてやってますので、関数でやれという回答はご容赦下さい・・
78 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 12:24:26 ] >>76 やっぱり、コード見ないとどうしようもないですよね… お騒がせしました
79 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 13:09:50 ] そりゃぁ、Sleepが問題だなんて認識している香具師とまともに会話が成立するとは思えないもんねぇ。
80 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 13:10:45 ] >>77 勉強を兼ねているんだろ。全部やれ。
81 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 13:15:49 ] >>80 試してみてどちらでもできるということは確認済みなんです でも一般的に、どちらがベターなのかなと思いまして
82 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 13:27:29 ] 一般的には、シート関数だな。
83 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 15:03:10 ] >>79 Sleep関数は問題無いんですね?ありがとうございます!安心しました Sleepが使えないとなると凄く面倒になるので… 以前に原因を調べていたところ、Sleep関数の欠点(?)を綴ったページを見つけ、 その内容を見て勝手にSleepが原因だと解釈してしまったみたいです。 自己解決出来るよう、もう少し頑張ってみます
84 名前:デフォルトの名無しさん [2008/12/16(火) 15:42:22 ] エクセルでVBAを使ってじゃんけんゲームを作れと言われたのですがわかりません 教えてください
85 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 15:50:10 ] 宿題丸投げはご遠慮ください。 VBAでなくてもできることの質問は、VBスレ辺りでどうぞ。
86 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 21:46:59 ] VBスレでも宿題はお断りだw
87 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 23:12:04 ] V=チョキ B=グー A=パー としてじゃんけんを楽しんでください。
88 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 07:58:32 ] 意地悪なやつらだな。 逆に考えろよ。VBAなんて宿題かゲームくらいにしか使わないだろ。 おまえらのご自慢のテクニックを披露できるチャンスだぞ。
89 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 09:42:52 ] と学生が申しております 仕事で使うわアホ
90 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 11:06:52 ] >>89 VBAがまともに使えない上に仕事したことないやつが若気の至りってやつで書き込んだんだろう あまり責めてやるなよw
91 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 12:55:10 ] >>89 >>90 どんなことに使ってるの?
92 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 13:49:36 ] ルーチンワークは大体そう 他は資料をデータベースっぽく正規化するために使うことも ・・まぁ、大企業ならこんなことしなくても既にシステムは完成されてるんだけどね
93 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 13:51:22 ] SAPのBWなんかはExcelマクロ
94 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 13:57:12 ] オフコンからデータ(CSVとか)受け取って 帳票(見積書とか)の形に整えて印刷とか
95 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 18:51:26 ] WindowsXP、Excel2002ユーザの質問です。 現在VBAマクロ内で、OSのXP/Vistaの違いを問わず、 インストールされているFirefox 3.0.xの 実行ファイルのフルパスを取得しようとしています。Firefox3が ・標準のフォルダ以外にインストールしている可能性がある ・HTML、HTTP等に関連付けられている ・デフォルトブラウザに指定されている という状態で使われているとき、マクロ上で何をすればスマートにフルパスが得られるでしょうか? 検索すると、既存ファイルを利用する方法、レジストリの関連付けを参照する方法がありますが、 他の方法は無いでしょうか? 参考になる情報をご存知の方、教えてください。
96 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 19:27:43 ] [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\firefox. exe]
97 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 01:52:45 ] 問屋でデータ処理に未知のオフコン使ってて、送られてくる売り上げデータのフォーマットが変態的なんで VBAで整形&正規化してる。なんか>>94 とよく似た境遇だな。おまけに受け渡しはいまだにフロッピーディスク。 社内でデータベース処理してるマシンも松下製の見たことない機種だったなあ。 こっちはなんとPC-9821が専用ケーブルでつながってて、N88-BASICで書かれた端末ソフトが走ってる。 中小企業でコンピューターの知識がないと、メーカーの営業の言うがままにシステム構築して 記憶媒体から何から何まで汎用性ゼロのシステムで囲い込まれてにっちもさっちもいかないことが多い希ガス。
98 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 10:56:24 ] 何年前に作ったシステムだよ?
99 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 11:40:21 ] wikiによるとPC-9821が入ったのは早くても15年位前らしいな パソコンで動くエミュレーターがあるにもかかわらず いまだにバカ端が業務で現役ってところもあるしそんなに珍しくもないんじゃね? まぁスレ違いだしこの辺で流れ斬ろうか・・・
100 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 13:42:45 ] ダム端って言うんだよ
101 名前:sage mailto:sage [2008/12/18(木) 15:09:13 ] いまユーザーフォームを利用してモグラたたきを作っているのですが じかんをカウントダウンさせるプログラムとモグラの動きのプログラムが うまく作用せず、モグラの動きのプログラムが終了すると 再びカウントダウンするようになってしまいます。両方とも独立して動くように したいのですがよい方法はありませんか。
102 名前:sage mailto:sage [2008/12/18(木) 15:11:29 ] ソースです スタートボタンを押すと時間のカウントダウンを開始 Private Sub CommandButton1_Click() starttime1 = 2 starttime2 = 0 startflag = 1 'ゲーム開始用フラグ Do While starttime1 >= 0 keika = Timer + 1 Do While keika > Timer Loop starttime2 = starttime2 - 1 If starttime2 < 0 Then starttime2 = 59 starttime1 = starttime1 - 1 End If If starttime1 < 0 Then MsgBox "TIME UP!" '時間が過ぎたら Exit Do End If Label4 = starttime1 & ":" & starttime2 'ラベルに時間のカウントダウンを表示 DoEvents Loop End Sub
103 名前:sage mailto:sage [2008/12/18(木) 15:18:27 ] ソースの続き Private Sub back1_Click() back1はイメージオブジェクトです If startflag = 1 Then Call moguratataki End If End Sub コマンドボタンを押したら時間のカウントダウンとゲームの開始したいと 思っていますがそれもまだ分からないので調べ中です。 call命令で、もぐらたたきゲームが始まるような感じで作りたいと思っています。
104 名前:sage mailto:sage [2008/12/18(木) 15:22:58 ] ソースの続き2 Sub moguratataki() Randomize kyarass = 15 stsuu = Int((3 * Rnd) + 1) hozon(0) = stsuu hozon(1) = stsuu a = 0 Do While stsuu > 0 stkyara = Int((kyarass * Rnd) + 1) - 1 If krflag(stkyara) <> 1 Then trkyara(a) = stkyara krflag(stkyara) = 1 stsuu = stsuu - 1 a = a + 1 End If Loop
105 名前:sage mailto:sage [2008/12/18(木) 15:25:33 ] ソースの続き3 b = 0 Do While hozon(0) > 0 stbasyo = Int((25 * Rnd) + 1) If anaflag(stbasyo - 1) <> 1 Then If stbasyo < 16 Then anaflag(stbasyo - 1) = 1 yokoti = (stbasyo Mod 5) - 1 If stbasyo = 5 Or stbasyo = 10 Or stbasyo = 15 Then yokoti = 4 End If If stbasyo = 15 Then stbasyo = 14 End If tateti = Int(stbasyo / 5) anax(b) = xti1(yokoti) anay(b) = yti1(tateti) b = b + 1 hozon(0) = hozon(0) - 1
106 名前:sage mailto:sage [2008/12/18(木) 15:26:25 ] ソースの続き4 Else anaflag(stbasyo - 1) = 1 yokoti = (stbasyo Mod 5) - 1 If stbasyo = 20 Or stbasyo = 25 Then yokoti = 4 End If If stbasyo = 25 Then stbasyo = 24 End If tateti = Int((stbasyo - 15) / 5) anax(b) = xti2(yokoti) anay(b) = yti2(tateti) b = b + 1 hozon(0) = hozon(0) - 1 End If End If Loop
107 名前:sage mailto:sage [2008/12/18(木) 15:27:54 ] ソースの続き5 For i = 0 To hozon(1) Step 1 mogura(trkyara(i)).Move anax(i), anay(i) mogura(trkyara(i)).Visible = True Next i For i = 30 To 0 Step -3 For j = 0 To hozon(1) Step 1 mogura(trkyara(j)).Move anax(j), anay(j) + i Next j DoEvents ts = Timer + 0.1 Do Until ts < Timer Loop Next i DoEvents ts = Timer + 0.1 Do Until ts < Timer Loop For i = 0 To 30 Step 3 For j = 0 To hozon(1) Step 1 mogura(trkyara(j)).Move anax(j), anay(j) + i Next j DoEvents ts = Timer + 0.1 Do Until ts < Timer Loop Next i For i = 0 To hozon(1) Step 1 mogura(trkyara(i)).Visible = False Next i end sub
108 名前:sage mailto:sage [2008/12/18(木) 15:30:53 ] わかりにくく読みにくいコードだと思いますが(すいません)よい方法あれば 教えてください。
109 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 15:31:07 ] Application.Ontimeでゴリゴリやるか、時間計測用のActiveX EXEを作ってイベントドリブンにしろ。 っつってもわかんねーかな。
110 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 15:46:55 ] <<109 さん おはやい回答ありがとうございます。 Application.Ontimeを調べてみました。なんとなくできそうな気が しそうですのでこれでやってみようと思います。ありがとうございました!
111 名前:デフォルトの名無しさん [2008/12/18(木) 20:25:38 ] セルのある列全体ににプルダウンの選択式で○、×を選ぶとします。 それをif判定で、試してみたところうまく結果がでませんでした。 プルダウンの選択式だと、"○"として扱われないのでしょうか?
112 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 20:46:33 ] >>111 何のプロパティをチェックしてるの?
113 名前:デフォルトの名無しさん [2008/12/18(木) 20:48:17 ] >>112 cellsでとってvalueを参照しております。 イミディエイトで中身みたら、ちゃんと×や○になってたのに・・・
114 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 21:40:37 ] >>113 実際のif文は?
115 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 21:41:19 ] >>113 そもそも、プルダウンじゃなくすれば判定できるの?
116 名前:デフォルトの名無しさん [2008/12/18(木) 21:48:14 ] >>114 do until なんとか ="" with ほにゃらら if .cells(x, y).value = "○" then 処理 end if loop .valueにはいってる値を確認したところ、×とかちゃんとはいってました セル全体にプルダウンの選択がそれぞれ入ってるからループ文では聞かないのかな
117 名前:デフォルトの名無しさん [2008/12/18(木) 22:26:25 ] sheet1の2-24行、D列に○×のプルダウンがはいっています。 これでやるとエラーがでますifの行に x = 1 i = 2 y = 4 Do Until Cells(i, y).Value = "" If Cells(i, y).Value = "○" Then Sheets(2).colums(x).Delete x = x + 1 i = i + 1 End If Loop
118 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 22:36:44 ] i=i+1はEndIfとLoopの間だと思う。 sheets(2)の列x(初期値1)を削除した後のループで再び削除する時にはxがインクリメントされてるから初期状態の列番号でいう所の3列目が削除されると思うがそれで良いのか、ふと疑問に思った。 どちらもエラーの原因じゃないけど。 というか、俺には「○×のプルダウンが入ってます」の意味が理解できない。 すまんな。
119 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 22:46:18 ] あとcolums→columns、だね それでもif文の行にはエラーは出ない。 力になれなくてすまんな。
120 名前:デフォルトの名無しさん [2008/12/18(木) 22:48:29 ] そうでした^^; たしかにインクリメントしないといけませんね Dim i As Integer Dim y As Integer Dim x As Integer x = 1 i = 2 y = 4 Do Until Cells(i, y).Value = "" If Cells(i, y).Value = "○" Then Sheets(2).colums(x).Delete x = x - 1 End If i = i + 1 x = x + 1 Loop End Sub これでやったらif文にオブジェクトはプロパティかメソッドをサポートしてない ってでてまたエラーになってしまいました
121 名前:デフォルトの名無しさん [2008/12/18(木) 22:53:48 ] ありがとうございます! columnsがまちがっていたようでした 無事いけました ご指摘いただいたcolumnsが間違っていたことが一番の原因だったようです
122 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 23:16:55 ] 失礼します シート1から実行するとしてセルB2には名前という文字が入っております const mojicell as string "B2" のようにしてシートの対応するセルに格納されてる値をとりだすことはできますか? やってみたところ、セルを格納するのはできなかったので・・・何か方法があるのかと思いまして 実際どのように試し方といいますと Sheets(mojicell).cells(...... のように使いました。 SHeets("名前").cells(... に置き換えられるかとおもっていたのですが、 実際はSheets("B2")と 入っておりました。 const で指定したセルが参照する値を格納することはできないのでしょうか?
123 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 23:19:36 ] セル参照だけならrangeオブジェクト使いなさい。 シートまで含むならまずconstの値を工夫しなさい。
124 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 23:21:20 ] >>122 const mojicell as string = "B2" worksheets(range(mojicell).value).cells(...
125 名前:デフォルトの名無しさん [2008/12/18(木) 23:50:23 ] >>124 これだと シート1からこのマクロ実行してシート1にあるセルを参照するならわかりやすいですが シート2からこのマクロを実行してシート1にあるセルを参照するとなると、 できなくなるのでは?
126 名前:デフォルトの名無しさん [2008/12/19(金) 00:50:28 ] >>124 これだとエラーでます・・・
127 名前:デフォルトの名無しさん [2008/12/19(金) 00:59:34 ] A17にテストという文字をセットしておくとします Sub tes2() Const moji As String = "A17" Sheets("テスト").Cells(3, 1).Value Sheets(Range(moji).Value).Cells(3, 1).Value これだと下の文がインデックスが有効範囲にないとエラーでます
128 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 01:03:33 ] >>127 "A17"は、シート名じゃねーだろ
129 名前:デフォルトの名無しさん [2008/12/19(金) 01:06:10 ] >>128 これの意味するところは range("A17").value = テスト という所なのでは? よって sheets("テスト") と>>124 さんがおっしゃってた意味かとおもってたのですが 動作がうまくいかないということは違いますよねorz
130 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 01:16:52 ] >>129 どのシートの"A17"で どこのマクロだよ
131 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 01:18:18 ] >>129 右辺を書け!
132 名前:デフォルトの名無しさん [2008/12/19(金) 01:23:35 ] sheets(1)にあるマクロでsheets(1)のA17セルには、テスト という値が入っております で、このsheets(1)のA17セルの値をconstとして間接的に参照できる形にして sheets("テスト")の3行1列目のセルの値を取得します でも、なぜか print Range(moji).value テスト とは表示されるのに、先ほどの下の文では表示されません
133 名前:デフォルトの名無しさん [2008/12/19(金) 01:26:27 ] Sheets(Range(moji).Value).Cells(3, 1).Value これではインデックス範囲のエラーがでますorz
134 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 01:35:00 ] 実際のファイルを作って、アップしろ
135 名前:デフォルトの名無しさん [2008/12/19(金) 01:42:37 ] Sub tes2() Const moji As String = "A17" Sheets("Range(moji).Value").Cells(3, 1).Value End Sub sheets(1)のA17セルには、テスト という値が格納されている sheets("テスト")のセル(3行1列目)の値には、たとえば 100 といった値が格納されている このマクロをsheet("テスト")にて実行する方法ということです 今のままじゃエラーがでますので
136 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 01:46:07 ] >>135 実際に作ったものをアップしろって
137 名前:デフォルトの名無しさん [2008/12/19(金) 02:16:52 ] まったくわからない・・・
138 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:19:01 ] うpされたものを拾う気はあるのかや?俺には無いよ。めんどくさい。 質問の意味不明度が増してきたのでそろそろ寝てほしいと思う。適当に脳内補完してみたから。 const moji as string = "A17" debug.print worksheets(sheet(1).range(moji)).cells(3,1)
139 名前:デフォルトの名無しさん [2008/12/19(金) 02:22:16 ] >>138 それを実行してみたところ型が一致していません。とでました。
140 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:23:02 ] >>138 >>135 >Sheets("Range(moji).Value").Cells(3, 1).Value この辺の行の意味不明度からして、根本的な間違いがあると思う。
141 名前:デフォルトの名無しさん [2008/12/19(金) 02:24:54 ] シートの名前は 1がSheet1 2がテスト です。 Sheet1のA17セルには、テスト と書かれています。他のすべてのセルは空白です。 テストのcells(3,1)の場所には適当に文字を書き込んでいます。 で、お教え頂いたマクロを実行したところ>>139 のエラーがでました。 const moji as string = "A17" debug.print worksheets(sheets(1).range(moji)).cells(3,1)
142 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:26:16 ] >>141 だから、実際のものをアップしないと話にならねーって
143 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:35:29 ] >>138 デバッグどころかコンパイルも通らない物貼り付けて、えらそうに・・・
144 名前:デフォルトの名無しさん [2008/12/19(金) 02:37:35 ] うーむ、簡単に見えてむずかしいようですね・・・
145 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:41:18 ] >>144 オマエが単純に間違ってんだよ。 現物をアップしろよ
146 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:43:48 ] ごめんよ、テストなんてしてなかったからさ。 だいぶゴツクなっちゃったけど、それでもよければどうぞ。 Sub test() Const moji As String = "A17" Dim sh As Worksheet Dim obj For Each obj In ThisWorkbook.Worksheets If obj.Name = Worksheets(1).Range(moji) Then Set sh = obj Exit For End If Next obj If IsObject(sh) And (Not sh Is Nothing) Then MsgBox sh.Cells(3, 1) End If End Sub
147 名前:デフォルトの名無しさん [2008/12/19(金) 02:44:20 ] sheet1のA1セルに テスト と入力します sheet2のシート名を手動でテストという名前に変更します sheet2のA1セルに 値 と入植します このブックをつくって マクロを sub テスト() const moji as string = "A1" debug.print worksheets(sheets(1).range(moji)).cells(1,1) end sub これでエラーがでてしまうということです。下から2行目のところにエラーが・・・
148 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:45:00 ] >>147 それはもういいんだよ。 現物上げろよバカ
149 名前:デフォルトの名無しさん [2008/12/19(金) 02:45:47 ] >>146 さすがにこれは長いですね・・・
150 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:46:35 ] >>148 現物をあげてダウンロードするまでにかかる時間のほうが長いと思うのですが・・・・
151 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:47:40 ] >>150 こんだけバカなんだから、根本的なところで間違ってんだよ。 どのセルに何の値を入れてるのかさえ、あてにならない。
152 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 02:48:58 ] >>150 概ね>>135 通りのコードを書き込んで、コンパイルもしてないだろうさ
153 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 03:05:44 ] もっとスマートに出来ないものかとぐぐったけどINDIRECTばっかでてくる…orz VBAでの良策ってどんなだろう。 >>149 長いのが気になるだけなら別関数にしてね^^
154 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 03:06:30 ] でもこれじゃconstでセルを指定しずらいというか面倒なのって痛いですね
155 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 03:10:01 ] >>154 オマエがバカなだけ。 Debug.Printもついてない行でエラーになるのはあたりまえ。
156 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 03:11:19 ] >>155 先ほどdebug.printがかかれてたマクロを実行してもエラーがでたのですが・・・
157 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 03:13:36 ] ごめん。それは俺のミス。 以上で終了───
158 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 03:13:43 ] >>156 rangeのデフォルトはValueじゃない。 それとDebug.Printが付いてないやつとは別のコード。 その区別がつかないのは、バカだから。
159 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 03:31:01 ] おぉ。rangeってrangeなのね。そうなのね。 そおしたら随分と無駄なコード書いてきたんだなぁ今まで。反省orz
160 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 07:04:25 ] rangeが指定する値を保存する方法って?
161 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 07:10:54 ] オブジェクト変数にrangeをセット
162 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 13:17:19 ] >>147 質問するとき小文字でコードアップするんじゃねーよ。 実際にVBEからコピペしろ。 回答者でも長いコードをオール小文字とかオール大文字は嫌味なくらいだ。 Sub テスト( ) Const moji As String = "A1" Debug.Print Worksheets(Worksheets("Sheet1").Range(moji).Value).Cells(1,1).Vallue End Sub と.Valueが抜けてるから型が一致しないとなるんだよ。 最後の.Valueはなくても動くが途中のは必須。 >>158 が書いてるのはこういうこと。
163 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 13:22:11 ] >>162 その発言、なんかのギャグ?
164 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 13:25:02 ] >>162 流れから見てその件はもう終わったものかと思っていたが・・・ 勘違いかな?
165 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 14:00:42 ] 日本人はひとつのジョークで3回笑う 1回目はジョークを聞いたとき 2回目はジョークの意味を教えてもらったとき 3回目は家に帰った後、やっとジョークの意味がわかったとき
166 名前:デフォルトの名無しさん [2008/12/19(金) 14:09:44 ] excel2002 SP3を使っています。 以下のようなへたくそなマクロを作りました。 ------------------------ここから------------------------ Private Sub Macro1() Worksheets("IV").Range("B2:B96").Select Selection.Copy Worksheets("IV").Range("C2").Select Selection.Insert Shift:=xlToRight Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Worksheets("IV").Columns("C:C").Select Worksheets("IV").Application.CutCopyMode = False nextTime = Now() + TimeValue("00:01:00") Application.OnTime nextTime, "Macro1" End Sub ------------------------ここまで------------------------ "IV"のシートを表示させているときは問題なく動作するのですが、 他のシートを表示させると以下のエラーとなって動作してくれません。 実行エラー"1004"RangeクラスのSelectメソッドが失敗しました。 何がいけないのか教えていただけますでしょうか。お願いします。
167 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 14:13:32 ] >>166 アクティブにしないとセレクトできないんじゃないの?
168 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 14:24:07 ] >>167 そうなんですか。困ったな。。。 普段は他のシートを表示させているので、 非アクティブでも動作をさせるにはどうしたらいいですか?
169 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 14:40:39 ] Worksheets("IV").Range("B2:B96").Copy Worksheets("IV").Range("C2").Insert Shift:=xlToRight Worksheets("IV").Range("C2").PasteSpecial ... Application.CutCopyMode = False
170 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 14:51:43 ] >>169 おおおおおお!!!!!! ありがとおおおおお!!!! さっそくやってみます。
171 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 14:56:51 ] >>169 できたああああ! ありがとう!!!! 感謝感謝!!!!
172 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 20:04:42 ] 質問させてください。 指定した範囲内にあるデータの種類の数を取得するにはどうしたらいいでしょうか? 汚いながらもVBAで配列に入れながら総当りで調べることはできるのですが ワークシート関数でそのようなものがあれば高速なのでそちらを使いたいと思っています。 例:範囲 A1:C3 A B C 1 山 川 海 2 海 海 川 3 川 都 南 この場合、「山、川、海、都、南」の5種類が出現するので 5を返してくれる関数を知りたいです。 よろしくお願いします。
173 名前:デフォルトの名無しさん [2008/12/19(金) 20:14:52 ] このファイルで別シートからマクロを実行して 特定の列だけ抽出して別のシートに表示したいです。 列を抽出するとき、たとえばA列とC列とE列を削除して表示させたい結果が 下のテーブルです。 このように別のシートからマクロを実行して他の別シートに抽出した結果を表示させるには どのようしすればいいでしょうか? 単にセル結合を考えない抽出ならできるのですが、 セル結合も考慮して、元の分類タイトルがあるまま抽出するにはどういった 手順でやるのが最適でしょうか?よろしくお願いしますm(__)m ファイルは以下のやつをみていただければわかりやすいかとおもいます www.dotup.org/uploda/www.dotup.org5812.xlsx.html
174 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 22:38:02 ] 101で質問したものです。 もぐらたたきが大まかですがだいたいできたので UPします ttp://www.mediafire.com/?bj352f2jaxz ttp://www.mediafire.com/?mn94db0mc4j まだもんだいはありますがよろしければ批評してください
175 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 23:33:05 ] >172 配列数式でも良ければ {=SUM(1/COUNTIF(A1:C3,A1:C3))}
176 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 00:54:59 ] >>172 配列の使い方はどうしてる? for eachで選択範囲をコレクションとして、 .valueが配列に含まれていなかった場合には、配列にぶち込んで、 最後にuboundでカウントすれば高速だと思うんだが。 このロジカルなら一瞬だと思うけど。 配列で総当たりってのがちと気になった。
177 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 01:05:35 ] >>173 シート名を明示してやればOKだね。 タイトル行が空白だったら、空白じゃなくなるまで左に移動してタイトルを取得する。 これを組むのが面倒なら、 結合を全部解除して、全てのセルにタイトルを振ってしまう。 最後に、重複するタイトルの場合に削除なりmergeなりで処理すれば良いと思う。 削除って考えじゃなくて、抽出したい物を残すって考えにしないとタイトルは取得出来ないな。
178 名前:デフォルトの名無しさん [2008/12/20(土) 08:34:25 ] >タイトル行が空白だったら、空白じゃなくなるまで左に移動してタイトルを取得する。 抽出してしまった場合、左にもうタイトルはないのではないでしょうか? あらかじめこれも全ての結合を解除したという前提かな? でも左に移動してタイトルを取得する場合、元からタイトルがない行があった場合 たとえば、メーカーというタイトルが最初からなかったとすると、本来なくていいタイトルに 別のタイトルが埋め込まれますよね? このファイルに対してはいけそうですが、ない場合は大変かな? >結合を全部解除して、全てのセルにタイトルを振ってしまう。 >最後に、重複するタイトルの場合に削除なりmergeなりで処理すれば良いと思う。 これもタイトルがない行があった場合、処理に困るかな・・・ 追加、条件で大変申し訳ないですが、もしタイトルが空白のセルがあった場合はこれじゃ難しいでしょうか?
179 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 12:23:58 ] すみません。CLASSモジュールの書き方がわからないんですが どこかに説明しているサイトないですか?
180 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 12:29:58 ] >>178 元からタイトルが無い列があるなんて知らないし。 てか、excelでレイアウトするなら、VBAで処理しようと考えない事だな。 人間が見やすい見た目と、計算機が処理しやすい(出来る)のは全く違うからね。 帳票として見やすく加工・レイアウトするのは、全ての演算処理が終わってから最後にやるもの。 レイアウトされたものに処理を掛ける事ほど無意味かつ煩雑になる事はないぞよ。 いったん全部のmarge解除して、全てのタイトルをはめ込むしかないでしょ。
181 名前:デフォルトの名無しさん [2008/12/20(土) 19:32:18 ] Excel2003を使ってます。 VBAの勉強をしたいのですが、良い本や教材はありますでしょうか? バカでもわかるようなのでいいです。
182 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 22:48:34 ] VBAで何やりたいの?
183 名前:デフォルトの名無しさん [2008/12/21(日) 00:50:07 ] 質問です。 アクティブになっているシートから別のシートを選択したいのですが、 エラーが出てとまってしまいますが、なぜでしょうか? エラーの内容はシートの保護がかかっている状態で、 そのシートを選択したとき(Activate)と同じエラーです。 エクセル2003で、自宅PCでは動作しますが、会社PC(2003だと思う)ではダメです。 もちろん保護ははずしましています。 考えられる原因はなにがあるでしょうか。 文章がわかりにくかったらすいません。
184 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 02:20:11 ] >>183 >>167
185 名前:166 mailto:sage [2008/12/21(日) 12:41:12 ] >>166 です。先日はありがとうございました。 動作のたびに画面がフラッシュして非常にストレスを感じます。 Insert Shiftが重たいのかなとおもうのでInsert Shiftを使わず、 C列、D列、E列・・・と列の最後尾に貼り付けたいと思うのですができますか? (xlToRightを使うのかな・・・) あとクリップボード経由だとこれまた重たいようなので、 クリップボードを使わずにそのまま貼り付けできればいいのかな (Destinationを使う???)と思っているのですが、どうなのでしょうか? 作成したマクロは以下です。アドバイスください。 よろしくお願いします。 ---------------ここから--------------- Private Sub Macro1() Worksheets("IV").Range("B1:B96").Copy Worksheets("IV").Range("C1").Insert Shift:=xlToRight Worksheets("IV").Range("C1").PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False nextTime = Now() + TimeValue("00:01:00") Application.OnTime nextTime, "Macro1" End Sub ---------------ここまで---------------
186 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 13:44:32 ] >>185 画面がフラッシュするのは仕方ないと思うぞ。Windowsってのはそういうもんだ。 とりあえず右端にコピーする方法 Worksheets("IV").Activate Range("B1:B96").Copy Destination:=Range("IV1").End(xlToLeft).Offset(0, 1)
187 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 13:53:12 ] >>185 細かいことを言うと、それだと処理が1分よりも少し長い間隔で実行される。 nextTimeはSubの先頭でセットした方が誤差が少なくなる。
188 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 14:27:42 ] >>186 >>187 ありがとうございます。値貼り付けにできますか? あとこのマクロは時間処理が少しおかしいです。 しばらく席を離れて画面が黒くなりパソコンが待機状態になったとき (マウスを触るとすぐに画面は表示される状態)などマクロがとまってしまいまいます。 そして再度実行させると、たまっていた処理を一気に吐き出すような感じで、 3連続処理を繰り返すことが多々あります。安定動作にはまだまだ遠いです。
189 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 16:06:47 ] >>172 矩形範囲の種類を数える高速なワークシート関数なんてない。 1列とか1行でソートされてるとかなら簡単だが、矩形範囲ならユーザー定義関数作れ。 Dictionaryオブジェクトの方が簡単だが、>>176 の書いてるCollectionを使うなら Function CountKinds(r As Range) As Long Dim col As Collection Dim element As Variant Dim cnt As Long Set col = New Collection On Error Resume Next For Each element In r.Value If Not IsEmpty(element) Then col.Add Empty, CStr(element) If Err.Number = 0 Then cnt = cnt + 1 Else Err.Clear End If End If Next CountKinds = cnt End Function 一次元配列に移してからソートして数える方法もあるが。
190 名前:183 [2008/12/21(日) 16:15:46 ] >>184 少し意味がわかりませんが。 PCが違うときに同じマクロでもエラーが出るんです・・・。 自宅PC>動く 会社PC>エラー ということです。 シートの保護やファイルの保護などの設定の問題のような気はするんですが。 わかる方いたらお願いします。
191 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 16:34:38 ] >>190 単純に考えて、同じマクロではないのだろう。
192 名前:デフォルトの名無しさん [2008/12/21(日) 16:46:37 ] VBAで組んだマクロの仕様書を作ってくれるソフトって無いですか? VBとかcとかはあるんだけど、VBAのやつは見つからない。
193 名前:183 [2008/12/21(日) 17:33:42 ] >>191 すいません。 厳密に言うと違うんですが。 中身はコードのコピー貼り付けなのでコードは同じです。 (ファイルは別物) ファイル名シート名の書き換えとかはしますけど。 会社のファイルがシート保護されていたので、 ためしに自宅PCでシートの保護をした状態だと、同様のエラーがでました。 なので設定の問題かなと予想してますが。 エラー箇所は毎回切り替えの部分です。 (アクティブシート・ファイルの切り替え)
194 名前:166 mailto:sage [2008/12/21(日) 17:49:37 ] >>187 Copy Destinationですと値貼り付けできないようなので、 PasteSpecial Paste使ってデータをとることにしました。 もう少し研究して使いやすいものを作ってみたいと思います。 (作成したマクロは下です)。ありがとうございました。 ---------------ここから--------------- Private Sub Macro1() nextTime = Now() + TimeValue("00:03:00") Application.OnTime nextTime, "Macro1" Worksheets("IV").Range("B1:B96").Copy Worksheets("IV").Range("IV1").End(xlToLeft).Offset(0, 1).PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False End Sub ---------------ここまで---------------
195 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 18:00:59 ] .valueを転載したいだけなら、forなりfor eachなりでまわして、 sheets(2).cells(1,1).value = sheets(1).cells(1,1).value の考えで代入して行っても良いんでないかな。 まぁ、ある程度の量以上になると遅いけど。
196 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 20:18:24 ] >>195 For Eachで回さんでも、Rangeオブジェクトを使えば値が配列として取り出せるから複数のセルを一気にコピーできる。 Set r = Range("IV1").End(xlToLeft).Offset(0, 1) Range(r, r.Offset(95, 0)).Value = Range("B1:B96").Value
197 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 07:46:08 ] rangeをvariant型の2次元配列に代入するのもいいね。
198 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 11:08:13 ] >>197 >>196 も入れてる。 右辺のRange("B1:B96").Valueが2次元配列。 左辺はResize使った方がすっきりするが。
199 名前:166 [2008/12/22(月) 17:36:11 ] >>195->>198 ありがとうございます。 >>196 さんのVBAを使わせてもらってます。 あと3分間に3回も4回も動作を繰り返す症状があり、 以下のサイトを参考にしてexcelを強制リロード させるようにしたところ安定動作するようになりました。 www.efcit.co.jp/cgi-bin2/exqalounge.cgi?print+200502/05020118.txt お礼まで。
200 名前:デフォルトの名無しさん [2008/12/22(月) 21:47:11 ] Cells(1, 1) = Format("2008 / 12 / 22", "aaa") これを実行すると (月) ってなるんだけど 両側の括弧を消したい場合は文字を操作するしかないですか?
201 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 21:49:23 ] >>200 replaceで括弧取り除くユーザ関数でも作れば?
202 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 21:51:41 ] >>200 ならないよ
203 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 22:04:30 ] >>202 申し訳ない、環境書きます osx excel 2004 この環境特有の処理かな?
204 名前:デフォルトの名無しさん [2008/12/22(月) 22:18:23 ] st = "個" Range("d5").NumberFormatLocal = "0.0""個""" これだと設定を変えられました。stに代入する意味はありませんが st = "個" Range("d5").NumberFormatLocal = "0.0""st""" これだとエラーがでます。文字列なので""をとってみても "0.0"st"" 無理でした。 どうすれば代入した値を扱えるのでしょうか?
205 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 22:46:05 ] >>203 mac版って不便だね Cells(1, 1) = Mid("日月火水木金土", Weekday(2008 / 12 / 22), 1)
206 名前:205 mailto:sage [2008/12/22(月) 23:05:03 ] >>203 すいません こうですね Cells(1, 1) = Mid("日月火水木金土", Weekday("2008/12/22"), 1) 若しくは Cells(1, 2) = WeekdayName(Weekday("2008/12/22"), True)
207 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:05:49 ] IF文でCELLS(5,4).VALUE の値が小数点ならとかいう指定はできますでしょうか? もしくは小数点を含まないといった指定はどうやればできるのでしょうか?
208 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:11:10 ] >>204 st = "個" Range("d5").NumberFormatLocal = "0.0" & st
209 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:15:04 ] >>196 198さんのに関して、横レスですが、是非、教えてください。 >右辺のRange("B1:B96").Valueが2次元配列。 office tanaka で調べても、これは2次元配列ようにありますが、私には 1次元配列に見えるのです。こう書いてもvariant型変数なので2次元配列 となるというように理解するものですか?
210 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:18:10 ] >>208 それでもエラーでましたorz
211 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:29:43 ] >>207 今思いついたのは n = (Cells(5, 4).Value * 10) Mod 10 If n <> 0 Then MsgBox "小数" >値が小数点なら って言うのをエスパーした結果 2.0は小数点無しでいいんだよね
212 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:34:53 ] >>211 2.0も小数点扱いしたいです・・・
213 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:40:40 ] >>212 書式で小数点以下の桁数指定すれば 1は1.0とか 2は2.0とか表示されるんだけど その状態だと全部小数点有りだよね
214 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:46:52 ] 文字列にして"."をFind
215 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:50:59 ] >>210 こうじゃね? st = """個""" Range("D5").NumberFormatLocal = "0.0" & st
216 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 23:58:08 ] >>209 調べてみりゃわかる。 MsgBox UBound(Range("B1:B96").Value, 1) MsgBox UBound(Range("B1:B96").Value, 2) 96と1が返るから2次元配列。
217 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 00:18:33 ] find関数で、もし見つかったら処理するを先に記述するにはどうしたらよいのでしょうか? If Obj Is Nothing Then これだと見つからなかったら先に処理して、それ以外は見つかったことになりますよね その逆の順番にしたいのです
218 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 00:20:50 ] >>209 んな難しく考えんでも、行/列 って2次元じゃん。 2次元配列を視覚的に見えるようにしたのがシートってだけだよ。
219 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 00:22:03 ] >>217 if obj is nothing then else 〜〜 じゃダメなの? if not obj is nothing then にしたいって事?
220 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 00:39:13 ] >>219 はい、そうです Dim Obj As Object Set Obj = Cells(1,1).Find(".") '小数点含むなら If not Obj Is Nothing Then セル1,1に値を入力しました。5と入力したところ objはnothingになりません・・・一体なぜなのでしょうか?
221 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 00:46:03 ] >>220 表示形式が0.0とかじゃないの? LookIn:がxlValuesになってたらNothingにはならない。 値=Cells(1,1)..Value If Int(値) = 値 Then とかで判定した方がいいと思う。
222 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 00:47:32 ] Sub test() Dim a As Range Set a = Cells(1, 1).Find(".") If Not a Is Nothing Then MsgBox a.Address Else MsgBox "nothing" End If End Sub 普通にnothingだけどねえ。
223 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 00:50:45 ] >>222 LookInがxlValuesなんだろ? デフォルト状態ではxlFormulasだが、指定しないと前の状態を引き継ぐからな。
224 名前:220 mailto:sage [2008/12/23(火) 00:53:43 ] どうやら、そのようでした。ご迷惑おかけして申し訳ありませんでした。 無事、解決いたしました。ありがとうございます。
225 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 00:56:00 ] セルの値が文字列かどうかって判定できますでしょうか? 数値か文字列かを判定したいだけなのですが、 この場合、どうしたらよいでしょうか?
226 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 00:56:31 ] 完全一致検索とかも考えられるか。 Findメソッド使うときは最低でもLookInとLookAtは書いた方がいい。
227 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 01:00:41 ] >>225 VarType関数で調べる。 いまいちな人はWorksheetFUnction.IsNumberで調べる。
228 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 01:08:34 ] >>227 If VarType("Cells(x, y).Value") = 8 Then これで文字列ならと指定したのですが、 何故か、セルに手動で入力した5とかの数字も文字列として認識されてしまいます。 これは回避できないのでしょうか?
229 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 01:16:35 ] >>228 釣りか? "Cells(x, y).Value"とダブルクォートでくくったら文字列に決まってるだろ?
230 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 01:20:55 ] 流石に釣りだろ・・・。
231 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 01:37:50 ] セルに値入力をして、たとえば整数を入力します77とか8とか その入力したセルに対してvartypeやtypenameで調べてみると vartype=5 typaname=double と表示されます。 なぜ整数扱いではないのでしょうか?
232 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 01:48:55 ] >>231 EXcelの仕様。 Long型とかInteger型はありえない。
233 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 01:52:44 ] >>232 こんな仕様にした理由は何かあるのでしょうか? 普通に整数ならintegerに小数点ならとりあえずdoubleにとかしてくれたほうが わかりやすい? いや、絶対値とるためにdoubleにしてるのかな でも、typenameやvartypeをそのまま使えないってのは面倒かも
234 名前:デフォルトの名無しさん [2008/12/23(火) 08:12:18 ] 熱海を神奈川に押し付けようと言う魂胆かもしれんがいらんぞ。
235 名前:デフォルトの名無しさん [2008/12/23(火) 08:13:11 ] 間違えた…キニスルナ!
236 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 09:46:16 ] ディズニーランドは東京、でも浦安は千葉。 みたいな感じ? どうでもいいわw
237 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 12:38:37 ] >>233 実数の型にはsingleもあるのにどうしてそれは無視してとりあえずdoubleなの?
238 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 13:30:07 ] singleの方が使用バイト数少ないしね!
239 名前:デフォルトの名無しさん mailto:sage [2008/12/23(火) 21:24:42 ] >>233 0.1 * 10がIntegerにならないぞゴラって声が容易に想像できるから、全部Doubleのほうがいいと思う。 あと、ワークシートでの計算でIntegerとDoubleを区別するよりは 全部Doubleのほうが速いなんてこともありそう。いや想像だけど。 それよりも、一般人が良く使うソフトなのに、基数が10でないことのほうが問題だろ。 さすがにある程度の補正はかかっているけど。
240 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 14:01:15 ] >>239 良く分からんけど Excelが普通なんでしょ
241 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 19:50:07 ] >>239 てか、2進法で計算してるんだから、わざわざ10進法基数にする必要性が無いよ。 余計な事して誤差が問題になるなら、やらんで欲しいな。 変数の型に関しては、使用バイト数が少ない方が当然処理は早いよ。 混在とか関係ない・・・はず。
242 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 20:35:29 ] んなこたーない。実数同士の足し算よりも、整数と実数の変換の方が余程時間が掛かるのが今のCPUだ。 ついでに言えば、Excel2000だか2002だかを境にdoubleからlong doubleに切り替わっている筈。 レーザ測距のデータみたいに、10桁くらいある数の標準偏差を取ろうとすると違いが判る。
243 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 21:58:35 ] >>241 いや、基数10はセルが保持するデータの話。 Doubleではない何かの型であってほしかったということ。
244 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 23:50:41 ] floatよりdoubleの方が速いらしいぜ
245 名前:デフォルトの名無しさん mailto:sage [2008/12/25(木) 00:30:23 ] >>244 マジレスすると、ケースバイケース。
246 名前:デフォルトの名無しさん [2008/12/26(金) 00:36:57 ] 質問です。 windowsXPでExcelは2007。 Dim lastRow As Long '最終行数 Workbooks.Open Filename:="C:\Documents and Settings\デスクトップ\新しいフォルダ\AAA.xls" lastRow = Range("A" & Rows.Count).End(xlUp).Row '最終行の取得 で、lastRowに1しか入りません。 実際は1000と入らなければいけないのですが。 どこが間違っているか、御教示ください。
247 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 01:42:25 ] >>246 xlUpはどう言う意味?
248 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 01:49:04 ] たまたまこのスレ開いた俺が適当に答えてみる Rows.Countって選択してるRowの数返すんじゃないの?
249 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 01:56:21 ] >>246 lastRow = Range("A1048576").End(xlUp).Row
250 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 02:04:26 ] シートを指定していないから 関係無いシートがアクティブになってるんじゃない? 一度シートが1つのBookで試してみ
251 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 02:06:54 ] おそらく、アクティブなシートを勘違いしている。
252 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 02:07:27 ] リロードすればよかった・・・
253 名前:246 [2008/12/26(金) 09:15:59 ] 皆様ありがとうございます。 シートを1つにしてもlastRowには1しか入りませんでした。 最終行の取り方自体は合っているようなので、 シート関係を見直してみます。 ありがとうございます。
254 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 11:39:51 ] >>253 「 Range("A" & Rows.Count)」のターゲットが、「AAA.xls」になっていないと思われる。 おそらくは、マクロのあるシート。
255 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 12:51:43 ] A列にデータが無いとかじゃないよな 普通Bookを開いたら、そのBookがアクティブになるから 問題は無いはず まぁ複数のBookを扱うなら、きちんとBookを指定したほうがいい
256 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 12:58:20 ] >>255 > 普通Bookを開いたら、そのBookがアクティブになるから > 問題は無いはず ねーよ
257 名前:デフォルトの名無しさん [2008/12/26(金) 15:30:49 ] ユーザーフォームでコンボボックスを3つ作成し、それぞれに sample1 sample2 sample3 とオブジェクト名を指定しました。 コード内で変数を用いてそれぞれのコンボボックスにテキストを挿入したいときに、 For i = 1 To 3 j1 = i j2 = "sample" & Cstr(i) j2.Text = j1 Next i という形でコードを組みましたがうまくいきません。 オブジェクト名を変数で定義することはできないのでしょうか? 稚拙な質問で申し訳ありませんが、よろしくお願いします。
258 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 15:42:33 ] >>257 Me.Controls("sample" & Cstr(i)).Text でできないか?
259 名前:デフォルトの名無しさん [2008/12/26(金) 15:49:02 ] >>258さん 解決しました。ありがとうございました。
260 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 21:56:21 ] 知ってる人がいたら教えてほしいのですが、 エクセルVBAのコンボボックス(activX)の 設置数に限界は存在するのでしょうか? とりあえず、3000+αのコンボボックスを1シートに 設定したいのですが・・・・ 裏技的な方法でも良いので教えて頂ければ ありがたいので宜しくお願いします。
261 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 22:13:21 ] >>260 Excelにセルの数だけウィンドウがあるわけではないのは知ってるよな?
262 名前:デフォルトの名無しさん [2008/12/26(金) 22:27:44 ] >とりあえず、3000+αのコンボボックスを1シートに ユーザーも大変だ w
263 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 01:03:57 ] 良く分からないけど 一気にfor nextで3000作ろうとすると1208個でオブジェクトが有りませんだけど 1000作るを3回繰り返すと3000個出来た For a = 1 To 3 For n = 1 To 1000 ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _ DisplayAsIcon:=False, Left:=a * 72, Top:=(n * 18), Width:=72, Height:=18).Name = "ComboBox" & n Next n Next a
264 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 01:51:37 ] 失敗したときのコードを張ってみそ
265 名前:263 mailto:sage [2008/12/27(土) 02:04:11 ] For n = 1 To 3000 ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _ DisplayAsIcon:=False, Left:=0, Top:=(n * 18), Width:=72, Height:=18).Name = "ComboBox" & n Next n >>260 を見て 試してみたら解るだろと思ってやってみただけだから 質問主じゃないよ
266 名前:260 mailto:sage [2008/12/27(土) 02:33:26 ] 263氏の方法でなんとかなりそうです ありがとうございました
267 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 07:25:59 ] いや、出来る出来ないはどうでも良いんだよ。 コンボボックス3000ってのは、何とか別方法で再検討すべきじゃないか?
268 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 09:32:05 ] >>260 コンポボックス3000超って単に入力作業をするためのものですか、それとも 何か・・・ 非常に興味があるので、横レスですが、使用場面のヒントでも・・・
269 名前:260 mailto:sage [2008/12/27(土) 12:40:11 ] >>268 項目数がやたら多いアンケートを想像してもらえれば、そんなに違わないかとおもいます その内容を、特定のルールで別シート上へ集計するのが目的です。 >>267 コンボボックス3000が非常識なのは解ってはいたのですが、 社内の決め事なのでとりあえずは作ってみようという話になってしまいまして・・・ 一旦使ってみた後での検討はします。 こんなところでしょうか
270 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 13:10:26 ] コンピュータには、ダメなものをダメな方向に力押しする性癖がある。 バカな物は作ってはいけない。
271 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 17:51:01 ] >>269 データベースシステム使えよ。マジで。 煽りとかじゃなくて、後々の事考えても、3000項目の入力なんてDBじゃなきゃ無理だよ。 3000の保守は出来ない、と言うかやるにしても金掛かるよ。 どうしてもやるなら、コンボボックス噛ませる必要性も見いだせないし。 シートをRDBとみなして、ダイレクトにセルに書き込むべきかと。
272 名前:268 [2008/12/27(土) 20:20:28 ] 折れの既成概念では、コンボボックスそのものの数が数件から10数件だったwww >>263 さんので、コンボボックスのオートメイクは1208個、個数制限はない(ようだ)と 言うことを知った今、リストボックスとテキストボックスの利点を併せ持つコンボボックス の大量使用によるRDB的エクセル活用法となるかも。これは、創造の世界に踏み込むものかも。
273 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 20:34:24 ] >>272 こらこらw
274 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 20:47:59 ] >>272 DBの知識がどれくらいあるのか分からないし、 スレ違いにもなってしまうから適当なところまでしか話しないけど、 エクセルではトランザクションの概念はビルドインされてない。 エクセルをRDB的に使用する事があるのは、 シートがRDB構造と視覚的に同じである事が理由。 つまり、RDBをダンプして、その結果をシートに表示するのに向いてるって事。 エクセル自体はDBじゃないから、入力に関しては向いてない。(出来なくはない) やはりトランザクションとロックの概念が無いシステムでは怖い。 これはエクセルが劣ってるとかではなく、向き不向きがあるって事なのよ。 エクセルのシートにRDBをダンプすれば、言語が分からなくても、 オートフィルタ機能使ったり、VBAで複雑なクエリが出せる訳。 関数だってクエリと言えるよね。これは凄く魅力的な事だよ。 全部無理とは言わないし、勉強のためにやるのは一向に構わないけど、 老婆心ながら、エクセルをRDBに見立てて業務に使うのだけはやめた方が良いと思う。
275 名前:デフォルトの名無しさん [2008/12/27(土) 23:59:21 ] >>263 ---265氏のプログラム For n = 1 To 3000 ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _ DisplayAsIcon:=False, Left:=0, Top:=(n * 18), Width:=72, Height:=18).Name = "ComboBox" & n Next n ---君のプログラム For a = 1 To 3 For n = 1 To 1000 ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _ DisplayAsIcon:=False, Left:=a * 72, Top:=(n * 18), Width:=72, Height:=18).Name = "ComboBox" & n Next n Next a ---私が265氏と同等と考えるプログラム For a = 0 To 2 For n = 1 To 1000 ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _ DisplayAsIcon:=False, Left:=a * 72, Top:=(n * 18), Width:=72, Height:=18).Name = "ComboBox" & a * 1000 + n Next n Next a
276 名前:デフォルトの名無しさん mailto:sage [2008/12/28(日) 00:09:40 ] >>274 レス、どうもです。RDBはexcelよりも本拠地です。といっても、msdos時代でのものですが。 >>260 さんの 私の>>268 に対する >>269 の返信を見て、 顧客の嗜好調査データとか、アマゾンのこの本を買った人はこんな本を買っていますの 小規模版データを想像してみました。 また、見た目はデータベースソフト、中身はexcelという体の業務用ソフトは結構作られており、 この方の会社の人も類似ソフトを見ての発想(excelであるなしを問わず)と妄想しました。 データ設計例? 100人のレコード、100のフィールドがあるとしてシート毎に異なるキーフィールド相当の位置づけをする。 求めるもの 2値(3値)間にどんな相関関係があるかが視覚的にもわかるように散布図に落とす。 この「求めるもの」=クエリが種々、エクセルで可能ということですね。 どの方法であれ、処理スピードと正確性確保、維持管理の容易さが善し悪しを決めることに なりますよね。
277 名前:デフォルトの名無しさん mailto:sage [2008/12/28(日) 13:15:14 ] >>275 ---私が265氏と同等と考えるプログラム を xp 2003でやってみたら、1列目1000個で完了、2列目が208個で オートメーションエラー発生しました。
278 名前:デフォルトの名無しさん mailto:sage [2008/12/28(日) 13:37:14 ] 自分のパソはメモリーが小さいのでかも。260さんではありません。 試しにやってみたものです。
279 名前:263 mailto:sage [2008/12/28(日) 14:39:49 ] 名前が1208個までしか付けられないのか
280 名前:277 mailto:sage [2008/12/28(日) 16:44:44 ] >>279 私のパソコンでは、 263のでは3000個出来ているが、275の---私が265氏と同等と考えるプログラム では、一気に3000個出来ず、1208個しか出来なかったという意味です。
281 名前:デフォルトの名無しさん mailto:sage [2008/12/28(日) 19:45:07 ] mixiでもチラシの裏でも良いから、どっか行って適当に試してくれ・・・。 誰が得するんだ?誰かが得するなら俺が出て行けば済む話だが。
282 名前:デフォルトの名無しさん mailto:sage [2008/12/28(日) 20:22:28 ] ?
283 名前:デフォルトの名無しさん [2008/12/29(月) 06:36:24 ] ある程度、大きなシステム作ってみて気がついたけど似たようなコードを何度も書いてるんだよな 効率のいいコードを書くために必要な知識とか教えてくれないか。
284 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 08:22:46 ] >>283 そのシステムはExcelで作ったの?
285 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 08:29:17 ] >>283 サブルーチンなり関数なりに分けましょう。
286 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 10:25:34 ] >>284 うん、データはAccessに入れて、ほとんどの操作はExcelのユーザーフォームを使うような感じで ワークシートは大雑把に全体を見るためにあってデータを追跡したり、試算ができたりするようなやつ >>285 最初の頃、ほとんど直観でやってたから今になって無駄を省くために自分のレベルでできそうなところはやってる。 でもクラスモジュールで何ができるのかとかが気になる。
287 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 12:51:23 ] >>286 ユーザインタフェースのプログラムを何とかしたいということ?
288 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 13:11:23 ] >>287 まぁ、そういうことなのかな。 入力チェックとか、動作は同じだけど入るデータが違うとか結構あって。 コピペして改変しながら作ってたけど、完成してみるとコードがぐちゃぐちゃになってしまった。 運用は始めてて、今のところ作業者の不満は出てないけど将来的な拡張や保守のためにもう少し勉強したい。
289 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 14:19:59 ] >>288 UI部分はごちゃごちゃしてても仕方ないんじゃないの。 データさえしっかりしてたらいいよ。
290 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 15:09:44 ] >>288 誰もが一度は通る悩み。 モジュールの独立性をあげ過ぎても使い勝手悪くなるけど。 モジュール結合度とかでググってみるといいよ
291 名前:デフォルトの名無しさん [2008/12/29(月) 18:53:44 ] 100円 500円 250円 ↓ マクロ発動 100円○ 500円 250円 もっとも小さい数字を選んでその数字の横に ○印をつけたいのですが なかなかうまくいきません どういった関数を使えばいいでしょう?
292 名前:291 [2008/12/29(月) 19:08:00 ] xp 2003
293 名前:デフォルトの名無しさん [2008/12/29(月) 21:35:37 ] >>291 さん こんな感じでどうですか? Sub mini() Dim mymin mymin = WorksheetFunction.Min(Range("a1:a3")) '対象データのの範囲 Cells(4, 1) = mymin & "円○" End Sub
294 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 22:24:22 ] 約4000のテキストファイルをそれぞれのワークシートにインポートしたいんだけど、 テキスト名が 1001.txt、1002.txt、1004.txt といった具合に連番じゃないので、下のプログラムだと1003.txtが存在しないので 当然エラーが発生します。都合上、ファイルの名前を連番にすることはできないんです。 理想としては、存在しないファイル番号は無視して次のファイルをインポートするように したいのですが、イイ案が浮かびません。。 このエラーを回避する手段はありますか? 環境はXPの2003です。 Sub Macro1() Dim bng As Integer For bng = 1001 To 9996 ActiveWorkbook.Worksheets.Add With ActiveSheet.QueryTables.Add(Connection:= _ "TEXT;D:\Program Files\ootori\data\" & bng & ".txt", Destination:=Range("A1")) .Name = "1001_1" .FieldNames = True 〜 中略(マクロの自動登録で書かれた部分) 〜 End With Next End Sub
295 名前:294 mailto:sage [2008/12/29(月) 22:31:54 ] マジですいません。。事故解決ですorz ググり直したら簡単に出てきやがった・・・ エラーを回避する便利なプログラムがあったのね
296 名前:デフォルトの名無しさん [2008/12/29(月) 22:34:16 ] 勘違いしてました 訂正です Sub mini() Dim mymin Dim myjuni Dim datasuu myjuni = 1 datasuu = 3 mymin = WorksheetFunction.Min(Range("a1:a3")) '対象データの範囲 For i = 1 To datasuu - 1 If Cells(myjuni, 1) > Cells(i + 1, 1) Then myjuni = i + 1 End If Next i Cells(myjuni, 1) = mymin & "円○" End Sub
297 名前:デフォルトの名無しさん [2008/12/29(月) 22:36:55 ] 296は293の訂正です
298 名前:デフォルトの名無しさん [2008/12/29(月) 22:43:48 ] VBAのステップ実行時に、ウォッチでRangeを見てみました。 すると色々あるわけですが、型情報の意味がさっぱり分かりませんでした。 この情報はどんなルールで何を表現しているのでしょうか? たとえば Variant/Double だと、/の手前はVariantで、これは任意の型だと思うんです。だから/の後ろで、実際には今Doubleが入ってるよ、みたいな感じ? でも、Variant/Object/Range見たいな奴もあるし。。 (これはVariantでObjectでその実態はRangeということかな?) Worksheet/Sheet1なんていうのもあります。 (これはなんだろ??Sheet1ってのは型なんですかねぇ。ユーザがシートをガンガン追加したらSheet4,Sheet5...ってな感じで型が増える?)
299 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 23:19:00 ] ああ俺の作ったやつon error resume nextだらけだ、心配になってくるぜ。
300 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 23:48:10 ] 別に、エラーをインラインで処理するのはおかしくない。 トラップすれば処理できているとは限らないのと一緒。 論理的破綻はどちらでも起こる。
301 名前:296 mailto:sage [2008/12/30(火) 00:08:18 ] >>291 さんへ たびたびすいません こんなのありました large関数 (指定された範囲データから大きい方から任意の数字番目を返す) small関数 (指定された範囲データから小さい方から任意の数字番目を返す)
302 名前:デフォルトの名無しさん [2008/12/30(火) 00:58:44 ] VBAで特定の文字列を検索して、その文字列が見つかったらオートシェイプ(msoShapeFlowchartAlternateProcess(角がRの四角)、透明) をその文字の上に配置して、その文字を囲っているように見せたいと思っています。 そこで、文字列の幅を求め、その文字列が入っているセルの位置と、その文字列の幅から、 オートシェイプを配置すべき座標を計算することを考えています。 フォントは固定幅で考えております。 今、自分が分からないのは、 (1)文字の幅の単位(cmとかインチ?ピクセル??) (2)文字列の長さをcmとかインチで正確に取得する方法 (関数?VC++でもこの手の問題にぶつかったことがあるけどそちらでは上手く取れなかった覚えがあります。VBAは高機能なので正確にゲットできると期待!) (3)オートシェイプの座標系の単位(cmとかインチ?ピクセル??) (4)文字列の長さの単位と、オートシェープの座標系の単位が違うのなら、それを変換してくれる関数あるいは公式 何方か教えていただけますですか? (自分でも継続して調べます。) よろしくお願いします。
303 名前:デフォルトの名無しさん [2008/12/30(火) 04:13:54 ] シェイプの長さは テキストのFont.Size掛ける文字数で シェイプの位置は セルの.Top .Leftで 目的のセルはFindと FindNextで あとは細かい調整で いいみたい
304 名前:デフォルトの名無しさん [2008/12/30(火) 08:28:53 ] VBAでマクロの同時起動って出来ますか?タイマーを2つ並列に走らせたいのですが…
305 名前:デフォルトの名無しさん [2008/12/30(火) 11:28:03 ] >>304 同時起動は多分出来ないけど、WindowsAPI使ってタスク複製するかスレッド使えば出来ると思う。 VBAではやり方は良くわからんのだけど、 "Excel VBAによるWin32 APIプログラミング入門" この辺を見ればよいと思う。 タスク複製だのは結構癖があるからがんばって。 あと、どういうタイマーなのかわからんが、タイマ割り込みみたいに定期的に何かをやらせる場合、並列にすると旨く動かなくなる可能性があるので、きちんと実行時間を計測した方がいいよ。
306 名前:302 mailto:sage [2008/12/30(火) 17:09:11 ] >>303 ありがとうございます!!! 自分でも探したんですけどさっぱりその手の情報がなくて(;_;) 非常に助かりました。本当にありがとうございました!
307 名前:304 [2008/12/30(火) 18:30:26 ] ≫305 ありがとうございます。教えて頂いた書籍を調べてみます。 タイマーと言っても、あるAタイマーが30〜1にカウントダウン中に別のBタイマーを同時に走らせる、みたいな単純なモノです。実現可能でしょうか?
308 名前:291 [2008/12/31(水) 14:49:44 ] >>301 ありがとうごさいます やってみます
309 名前:デフォルトの名無しさん [2008/12/31(水) 22:39:19 ] Select Case…End SelectってC言語のswitch相当だと思うんですけど、breakって無いんですか? Select Case exp Case 0 IF xxx = FALSE THEN Break ←これ!!!! End IF End Select みたいな。
310 名前:デフォルトの名無しさん mailto:sage [2008/12/31(水) 23:29:23 ] 無い
311 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:31:04 ] >>309 そもそもbreakしてどこへ行くつもりだ
312 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:36:55 ] >>310 ありがと >>311 Selectの外に決まってんじゃん。。。
313 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:41:39 ] >>312 それがしたいだけなら、どうにでもなるだろと小一時間…
314 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:41:51 ] 仕方なくGotoだな
315 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:44:16 ] >>314 ちょ、おま、そんな最終手段をっ!
316 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:44:45 ] >>313 どうすんの?
317 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:46:24 ] >>316 Select Case exp Case 0 IF xxx THEN 処理 End IF End Select
318 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:48:24 ] 抜ける方法を聞いてんの。 わざわざ論理を逆にして書けば良いじゃんとか 抜けた後にある処理をサブルーチンにしてあげれば良いじゃんとか そういう構造を縛るしか手が無いんですか?それじゃ言語としてどうだろ あとさぁ なんで if() {
319 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:48:59 ] はあ〜書いちゃった。。 じゃ、問題。何を書きたかったんでしょうか?
320 名前:317 mailto:sage [2009/01/01(木) 00:49:51 ] ちょっと説明不足かな 要するに、breakで外に出るのもスルーするのも同じ事じゃねーのって意味 Ifの条件がFalseの時にbreakしたいんなら、Ifの条件がTrueの時だけ処理すればいい
321 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:53:31 ] 答え発表! ヒューヒュー あとさぁ なんで if() { } else if() { } else if() { } … みたいにELSE句にIFが書けないんだろう 欠陥だろ。。 でした。 >>320 そりゃかけなくは無いだろうけど構造上書きにくい場合もあるじゃん。 なんでキーワードやステートメントを再発明してまで、不便なってんの!マイクロソフト!!って思うじゃん。
322 名前:デフォルトの名無しさん [2009/01/01(木) 00:53:35 ] go away
323 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 00:57:44 ] >>322 おや?外れたのかな?(^^) 勘がニブいんですねw
324 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 01:04:13 ] >>318 アホなのか・・・
325 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 01:06:26 ] > そりゃかけなくは無いだろうけど構造上書きにくい場合もあるじゃん。 ねーよ。
326 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 01:09:56 ] 抜ける方法を聞いただけでこの荒れようww VB厨はばかだなぁww 書き方を変えれば良いじゃんとか・・それは変えなきゃ対応できない言語ってことだろ。 高級言語でしょ?書き方縛ったらそこでもう言語としてだめでしょ。 アセンブラじゃないんだからさぁ。 IF THEN ELSE IF THEN ELSE IF THEN ENDIF ENDIF ENDIF うわっ。だっさ。最悪。 書き方変えればできますだったらjmpとかjzとかjnzとかjcとかだけでも出来るよww
327 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 01:14:31 ] >>321 If ... Then ElseIf ... Then ElseIf ... Then End If
328 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 01:27:43 ] >>327 あ!ありがとうございます。 あったんだ。
329 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 01:48:45 ] >>328 意外と素直w
330 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 02:10:17 ] あんまり笑わせるなよ。 VB分かってないやつがVB馬鹿にしてたのかよ。orz
331 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 02:11:14 ] 明らかに分かってないのに、構造構造言いたがるのなんて、 情報系の一年生くらいだろ。
332 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 02:21:16 ] >>330-331 ゴメンね(´・ω・`) ついイライラしてたから
333 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 02:30:42 ] 厨とか言っちゃうやつは例外なくアホ
334 名前:デフォルトの名無しさん [2009/01/01(木) 13:53:37 ] 結局、Excel2008ではVBAが使えなくなるのですか? C#への布石ですか?
335 名前:デフォルトの名無しさん mailto:sage [2009/01/01(木) 17:12:57 ] Excel 2008でVBAが使えないのは事実らしいが、 Excel 2008はMac版。移行先は、C#ではなくAppleScript。 しかも、次のバージョンで復活することが発表済み。 www.microsoft.com/japan/presspass/detail.aspx?newsid=3439
336 名前:デフォルトの名無しさん mailto:age [2009/01/02(金) 08:30:00 ] このスレは、Excel の VBE で作るフォームについての質問はスレ違い? スレ違いでしたら誘導をお願いします。
337 名前:263 mailto:sage [2009/01/02(金) 09:22:34 ] >>336 もしかしてデザインの話か そんな誘導先ないだろ
338 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 09:23:06 ] 名前消し忘れた恥ずかしい
339 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 13:45:39 ] どうせなら、VSTA2.0の情報とかを書けばいいのに >>334-335
340 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 14:03:27 ] あれ本当にOfficeに乗っけるの?
341 名前:デフォルトの名無しさん [2009/01/02(金) 14:17:09 ] >>335 よく事情がわからんが、今必死で覚えてるEXCEL VBAが数年先に使えない、役に立たない言語になる可能性もあるってことですか?
342 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 15:03:36 ] そう言われ続けて何年も経つが、未だに無くなる気配すらないのがVBA。 この先もそれが続くと信じて安穏としているのは間違っているだろうが、 数年でなくなるような存在でもない。
343 名前:デフォルトの名無しさん [2009/01/02(金) 16:48:02 ] Excel VBAによるWin32 APIプログラミング入門 この本って絶版でもう購入不可ですか?
344 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 16:58:06 ] 絶版です
345 名前:336 mailto:sage [2009/01/02(金) 18:06:59 ] >>337 そうですか…了解です。 スレ違いを承知で 1 つだけ質問。 Excel のデザインで使うフォームのコントロールの仕様って VB6 と 同じなんですかね? (コンボボックスでダブルクリックのイベントが起きないので調べたら、 VB6 ではスタイルに 1 を設定しないと起きない、とあったので…。 ちなみに Excel VBA ではスタイルに 0 or 2 しか設定不可。 ダブルクリックのイベント絶対起きないじゃん…。)
346 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 00:31:02 ] ダブルクリックのイベントが発生しない が意味不明 で、絶版かどうかも、役に立つかも、全く見当が付かないが、折れの持っている 「Excel VBA はじめてのプログラミングレッスン1」 技術評論社 H12.8.21初版 に第10章 入力画面を使ってみよう を読んでみたwww ユーザーホームのデザインという用語が使われているが、この本では ダブルクリックをする場面は、VBE上コンボボックスのことで、 excelシート上のコンボボックスではないよ。シート上ではダブルクリックは 使わないものと思っている。
347 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 00:58:20 ] >>346 セルのダブルクリックでセルの値等をコピーする、といったマクロも組むから 別にユーザフォーム専用って訳でもないと思うが
348 名前:336 mailto:sage [2009/01/03(土) 02:30:30 ] >>346 コンボボックスを使いたい場所はユーザーフォーム上で、 ワークシート上ではありません。 というかワークシート上にもコントロールを置けたんですね。 で、試してみると…コンボボックスのプルダウンメニュー表示中のダブルクリックで ダブルクリックのイベントが発生しました。なんで? 目的はユーザーフォーム上にあるコンボボックスでダブルクリックのイベントを 取得することですが、無理そうなので、擬似的にダブルクリックを検知することにしました。 方法は下記です。 (1) マウスダウンのイベントが発生した時の時刻を Timer 関数で取得して モジュール変数に退避する。 (2) マウスダウンのイベント発生都度、退避した時刻と押した時刻を比較する。 (3) (2)の時刻差が 0.5 秒以下の場合にダブルクリックのイベントでしたかった 処理を実行する。 コンボボックスでダブルクリックのイベントを拾った後の使い道は、 (1) True ⇔ False の切り替え(VBE のプロパティ設定画面では出来る!) (2) コンボボックスより詳細なリストが表示できるフォームの呼び出し を考えていました。 上記を応用すれば、トリプルクリックや4回クリックなどにも対応できそうです。 解答してくださった方、ありがとうございました。
349 名前:デフォルトの名無しさん [2009/01/03(土) 03:55:36 ] トリプルクリックにまで対応できるのは素晴らしいけど コンボボックスをシングルクリックで 透明なアイテムが一番上に(コンボ上に)きて、その そのアイテムをシングルクリックってすると じゃ駄目なのかな
350 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 04:52:18 ] www.amazon.co.jp/VBA ユーザーのためのWin32-APIプログラミングガイド-大村-あつし/dp/4871936848/ref=sr_1_1?ie=UTF8&s=books&qid=1230925887&sr=1-1
351 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 04:53:58 ] オレのExcel、コンボボックスにダブルクリックイベント有るけど みんなのには付いてないの? バージョン Excel2003
352 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 06:03:46 ] たぶん コンボボックスのプルダウンメニューの部分のダブルクリックを言っているんだと思う
353 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 13:26:28 ] オリジナリティ溢れるUIほど迷惑なものはない
354 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 16:11:29 ] >トリプルクリックや4回クリックなどにも 何考えてんだ?
355 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 16:20:56 ] V2C には6回クリックまであるぜ
356 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 17:11:00 ] API使えば、ダブルクリックの認識の間隔を取得できるから、 0.5秒決め打ちよりそれを使ったほうがいいと思う。 そういう話をしている場合でないとは思いつつ。
357 名前:デフォルトの名無しさん [2009/01/03(土) 19:44:02 ] 質問です。 セル上で、右クリックをすると、編集ダイアログ?が出てくるのを出ないようにしたいのですが どう設定のマクロを書いたものか、よろしく。 右クリックイベントによってコピーモードにしているのに、余分な作業を するのを防止したいので。
358 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 21:18:27 ] マウスの右ボタンを殺す
359 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 02:39:56 ] BeforeRightClickイベントの第二引数にCancelがあるだろ
360 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 13:15:18 ] サーバサイドでの帳票の生成にVBAを検討していて、 安定性、処理性能、MSのライセンス違反等を懸念してますが、 何か懸念事項やアドバイス等ありますでしょうか?
361 名前:デフォルトの名無しさん [2009/01/04(日) 14:49:46 ] 論理で「Aでないか、Bでないか、Cでない」ならの類なのですが、 列5 列6 列9なら、イベント処理し、「そうでないなら」、exitする の 「そうでないなら」はどう書いたものでしょうか?
362 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:11:17 ] >>361 色々あるだろうけど 普通は if elseif elseif else
363 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:18:49 ] >>357 ワークブックのSheetBeforeRightClickイベントでcancel=trueにしないとだめだよ
364 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:21:38 ] >>361 >>362 だとイベント処理のコードが重複するから If 列5 Or 列6 Or 列9 Then イベント処理 Else Exit EndIf
365 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 23:41:35 ] まあOr使っちゃうのが一般的かつ簡単ではあるが 条件1つずつでネストした方が速い 何故なら、例えば列5に一致するならイベント処理は行うので 列6、列9に一致するか否かは判定する必要が無いのに >>364 では毎回全てを判定した上で論理演算してしまう 複数条件でAnd、Orを使わないのは、コード最適化の常套手段 逆に速度気にせず手を抜きたいなら、カンマ区切りで 複数条件指定できるSelect Case使う方がお手軽だろ Case 列5, 列6, 列9 イベント処理 Case Else Exit 因みに論理演算(>>364 )の処理時間を100とするなら、Ifのネストは70、Select Caseは105くらいだ とは言え最近のPCなら、ループで何十、何百、何千万回とやってコンマ何秒かの差が出る程度だけどな
366 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 23:56:00 ] あれ? VBって or で連結させた場合、順次判定して、hitしたら後の判定スキップじゃなかったっけ。 勘違いだったらごめん。
367 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 00:00:55 ] ショートサーキットはしないよ まあ,とりあえず素直に書いといて最適化は実際に支障が出てから,が基本だけど
368 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 12:09:49 ] >>365 Select Caseが105って一概には言えないだろ? >Case 列5, 列6, 列9 これショートサーキットだから列5がTrueなら列6と列9は評価しないし。 >>366 ショートサーキットするのはVB.NetのOrElseとかAndAlso 今はVB.Netって言わないんdっけ?
369 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 13:14:41 ] >>368 Select Caseが105ってのは、実際にカウンタ変数のMod 10に対する 条件分岐のみのループの処理時間を計った結果 それぞれ500万回*3回の平均から算出した値 そもそもが単一条件の場合でも、Select CaseはIfより遅いからね
370 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 14:13:14 ] セル、グラフ、フォーム等の情報を利用してフォーム形成することはできますか? 例えば 名前 値 ラジオボタン という行が連なるフォームを作る場合、 グラフの凡例数、セルの列数、フォームで入力した数分等、行が作成される感じにしたいのですが。 (フォームの大きさに入りきらない場合はスクロールバーを出す)
371 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 14:19:16 ] ユーザーフォーム上のコントロールを動的に生成したいってことなら出来るよ
372 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 14:22:53 ] >>371 調べ方が足りませんでした。すみません。 VBA 可変 フォームとかぐぐってました。 コントロール 動的 VBAでぐぐったらできそうな感じです。 ありがとうございました。
373 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 18:24:45 ] >>369 IfやELseIfのネストより遅いのは確かだが、Orより遅いわけねーって。 実測してみろよ。 Private Declare Function timeGetTime Lib "winmm.dll" () As Long Sub foo1() Dim i&, t1&, t2& t1 = timeGetTime For i = 1 To 5000000 Select Case i Mod 10 Case 5, 6, 9 Case Else End Select Next t2 = timeGetTime MsgBox t2 - t1 End Sub Sub foo2() Dim i&, j&, t1&, t2& t1 = timeGetTime For i = 1 To 5000000 j = i Mod 10 If j = 5 Or j = 6 Or j = 9 Then Else End If Next t2 = timeGetTime MsgBox t2 - t1 End Sub foo1がショートサーキットだって知らなかったんじゃないの? なんなら実証してみせるが、やり方くらい知ってるよな。
374 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 19:51:47 ] >>373 ・timeGetTimeではなく組込のTimerを使ったこと ・Select Caseでも平等にするためにi Mod 10の結果を変数に取っていること ・結果をMsgBoxではなくDebug.Printで出力したこと 以外は同じコードだよ ちなみに実証方法は知ってる Select Caseがカンマ区切りがショートサーキットなのは知ってるからわざわざ Select Caseでやったことは無いが、デバッグの一手法でもあるからな
375 名前:373 mailto:sage [2009/01/05(月) 21:26:44 ] >>374 i Mod 10の値を処理で使わないんなら>>373 が平等なコード。 仮にfoo1でi Mod 10を変数にとってもfoo1が速いぞ? おめーんとこじゃ遅いのか?
376 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 21:35:16 ] > i Mod 10の値を処理で使わないんなら>>373 が平等なコード。 そうでもない > おめーんとこじゃ遅いのか? うん
377 名前:373 mailto:sage [2009/01/05(月) 21:40:10 ] OrもSelect Caseもお互いに速さでベストをつくせばそうなるじゃん。 おまえは最速のコード書けないんだろ?
378 名前:373 mailto:sage [2009/01/05(月) 21:41:57 ] 後ろは読んでなかったが、おれのとこと逆になるらしいな。 俺のとこはSelect Caseが速い。
379 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:00:24 ] 実際の処理に置いて必ずModで算出した値を使うというわけではない以上 条件分岐のステートメントに入る前の時点で、条件となる値が変数に代入されているという 同じ状況を作ることが平等になる Modを使う場合に限定して、IfとSelect Caseのどちらを使った方が速いかを検証するなら、 君の言うとおりベストを尽くして最速コードを書くべきだけどね
380 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:12:28 ] なんか分かってないなぁ。 Modで算出した値を使わないなら>>373 になるんだよ。 まぁどこまで行っても平行線だからもういいが、他のやつらはどっちが速いんだろ? まぁ速さなんて俺はどっちでもいいけどな。 このような使い方なら普通の美意識を持ってたらSelect Caseだし。
381 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:19:50 ] >>380 foo1が速かった
382 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:24:07 ] >>381 トンクス j = i Mod 10 Select Case j としても? おれのとこはそれでもfoo1が速いが。
383 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:26:51 ] >>382 逆転した
384 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:31:23 ] >>383 ふーん、俺のとこと違うな。 まさかjを変数宣言してないとかじゃないよな?
385 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:33:56 ] >>384 してなかった したら差は縮まったけどまだ foo2が速い
386 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:35:45 ] >>385 おいおい、しっかりしてくれよ。 jをLong型で宣言したらそうなるか教えてくれ。
387 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:36:45 ] すまん、また後ろ読んでなかった。
388 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:41:46 ] >>386 &で宣言したよ 30位foo2が速い
389 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:42:49 ] まぁModで算出した値を使わないなら>>373 が平等な比較だが、とりあえず変数に代入したら 人によっては違うということは分かった。 ちなみに俺はWindows xp とExcel2007だ。
390 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:44:22 ] ちなみに Excel2002です
391 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:47:06 ] >>390 トンクス。
392 名前:361 [2009/01/05(月) 23:18:31 ] >論理で「Aでないか、Bでないか、Cでない」ならの類なのですが、 >列5 列6 列9なら、イベント処理し、「そうでないなら」、exitする の >「そうでないなら」はどう書いたものでしょうか? 訊き方が悪かったみたいですね。結局、次のこれで、希望する動きをしています。 If Not (Target.Column = 5) And Not (Target.Column = 6) And Not (Target.Column = 9) Then Exit Sub
393 名前:デフォルトの名無しさん [2009/01/06(火) 00:21:36 ] 文章だけだと伝わりづらいと思いますが、質問です。 ハイパーリンク │ 転記情報1 ハイパーリンク │ 転記情報2 EXCELシートの一覧表に上のようにハイパーリンクが張られた一列を作り、 それをWEBブラウザでプレビューできるようにしています。 WEBブラウザ上のリンクをクリックすると、 新しくEXCELシートを呼び出し、 クリックした行の情報(一番上のハイパーリンクをクリックしたなら転記情報1)を 呼び出したシートに転記する処理を作りたいと思っています。 EXCELシートならリンクをクリックすると同時にそのセルがアクティブになるので同行の情報も簡単に転記できそうですが、 WEBブラウザ上でもこれと同じような情報転記は可能でしょうか?
394 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 03:38:21 ] >>392 背中がムズムズする……
395 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 05:39:55 ] >>394 気持ちは解る 条件式にnotと=を併用するヤツってもうね…
396 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 07:33:05 ] <>
397 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 09:47:49 ] >>392 「Aでないか、Bでないか、Cでない」ではなく「Aでもなく、Bでもなく、Cでもない」だろ? 前者だと必ずTrueだからな。 それは置いといて、普通イベント処理ならIntersect使うから列番号では判定しないが、どうしても列番号で判定したいとか基本のお勉強なら Select Case Trget.Column Case 5, 6, 9 '処理1 Case Else Exit Sub End Select ’処理2 処理2がなければ、何もわざわざCase Elseで抜ける必要なし。 というか抜ける記述は普通はしない。
398 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 09:49:54 ] 何、今更?
399 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 09:59:59 ] >>392 書き忘れたがTarget.Columnを三度も取得しちゃいかん。 どうしてもAndとかOrを使うんなら、いったん変数に取得してから判定するんだな。
400 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 10:02:35 ] >>398 昨晩のアフォの>>365 か? 無視してすまんね。
401 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 10:29:05 ] 悔しかったの?
402 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 10:30:29 ] シートに商品名が20,000件程度入力されている状態で テキストボックスに商品名の一部を入力⇒キーワードが含まれるセルのデータを リストボックスに追加 という処理を考えていたのですが 下記の方法で試してみるとかなり時間がかかってしまいます 高速に処理をさせるには根本的な方法の見直しが必要でしょうか? dSelectForm.ListBox1.Clear LastRow = Sheet1.Range("C65536").End(xlUp).Row For i = 2 to LastRow Ans = 0 Ans = WorksheetFunction.Find(inputKey, Sheet1.Cells(i, 3)) If Ans <> 0 Then dSelectForm.ListBox1.AddItem Sheet1.Cells(i, 3) End If Next
403 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 10:59:47 ] 相変わらずの人がいるなw
404 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 11:20:39 ] >>402 ループのお勉強なら基本的には配列の勉強かな? データ範囲を2次元配列に取得して回すとか、AddItemは遅いから1次元配列にため込んでListプロパティで設定するとか。 WorksheetFunction.FindじゃなくInStr使うとか。 たしかExcel2000以降ならFilter関数が簡単。 WorksheetFunction.Transpose(範囲)で1次元配列を取得して、Filter関数にかけてからListプロパティで設定。
405 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 16:29:31 ] イベント処理だし元の質問からも判断してわざわざExitで抜けるようなコードは必要ないと思う。 条件に「合う」場合だけ判定して処理するように書くのが普通だね。 定番はIfだけど質問者のレベルから考えてコンマ何秒の速度差を考える必要はないと思うし 見た目のわかりやすさと保守のしやすさからCaseをすすめとく。 条件が増えたときに簡単に数字が追加できるから。
406 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 01:50:36 ] 2008年1月2日を08.01.02と表記してるセルを計算に使う方法ってありますか? 08.01.02と表記されたセルから08.01.01と表記されたセルを引くと1という答えが算出される処理を作りたいです。
407 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 03:34:54 ] >>406 セルの表示形式で「yy.mm.dd」
408 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 05:57:34 ] >>405 俺は誰かみたいに「何、今更?」なんて言わんが、そのような条件が三つ以上でIfステートメントでOr判定するくらいなら Select Caseステートメントの方が速いし分かりやすいし定番だと思うよ。 あと知らなくていいことだが、Select CaseステートメントでCase Elseとか、If ThenステートメントでElseとかは 何もそこで処理しなくても書いた方が速くなるね。 まぁ俺は書かないけど。
409 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 06:18:38 ] >>406 数式でよけれべ普通に=A1-B1なんてやりゃできる。 もし表示形式が日付形式になるようなら、G/標準とか0にすりゃいい。 2007では計算元の表示形式が日付でも普通に1になるが、たしか2003では数式セルは日付にならなかったっけ? 計算元の表示形式が文字列で、VBAでやりたいのなら MsgBox CDate(Cells(1,1).Value)-CDate(Cells(1,2).Value) MsgBox DateValue(Cells(1,1).Value)-DateValue(Cells(1,2).Value) などとやりゃできないか?
410 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 07:26:12 ] if not hoge is nothing then って構文が気持ち悪いんですけど、何か代替えはありませんか?
411 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 07:53:25 ] そんなこといったらVBAなんて気持ち悪い構文だらけですが何か?
412 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 08:23:23 ] 「代替え」なんて変な言葉を使う人に言われたくありません。 もしかして、「代替」を「だいがえ」って読んじゃう頭の弱い人やそれらに無意識に迎合しちゃう人ですか?
413 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 08:34:53 ] >>410 If ObjPtr(hoge) <> 0 thenでよくね? 俺はこんなことしないけどね。
414 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 10:38:45 ] それならもっとシンプルにできる If ObjPtr(hoge) Then こういう書き方を知らないと意味がわからなくなるけど
415 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 12:12:25 ] >>412 ttp://dictionary.goo.ne.jp/search.php?kind=jn&MT=%C2%E5%C2%D8%A4%A8
416 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 12:25:38 ] not 〜 nothingは俺も気持ち悪いと思う 直訳すると「ないアルよ」みたいな回りくどい二重否定の表現って 英語だと普通に出てくるから設計者は何の疑問も持たなかったんだろうなあ 俺もまだVBAを勉強中だから知らないだけかもしれないけど、 インスタンス化されてることを、いちいち論理を反転しなくても直接判定できるような 構文か関数ってないの?自分で作るしかない?
417 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 16:19:22 ] 別にこの仕様でおかしくもないと思うけどねぇ そもそもがNothingのときに何かをするってことの方が多いんだからさ 有ることと無いこと、両方とも否定文を使わずに判定出来るのが一番かもしれないが どちらかのみと言うなら、無いことを判定する方法を用意すべきだろ
418 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 17:08:30 ] if hoge is not nothingと書けるのが一番良い
419 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 17:21:50 ] 余計変だw
420 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 18:39:23 ] >>415 変な言葉が定着しつつあることはその引用で判るが、それで何が言いたいの? # 頭使うことを知らない人は、自分で考えることを放棄するから困る。
421 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 18:42:58 ] いっそのこと If hoge = Nothing If hoge <> Nothing でいいじゃん。 なんだよ突然Isって。わざわざ演算子を使い分ける妙なこだわりが理解できん。桂正和マニアかよ。
422 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 19:10:25 ] 代替〜(ダイタイ〜) の同音異義語が有る場合などに 代替え〜(ダイガエ〜) と重箱読み使うのは昔からあること 変な言葉でもなければ、最近になって定着しつつあるのではなく以前からあったもの 件の場合は重箱読み使うのが適切と言える状況ではないが、誤用や間違いではない "代替"の意味で"代変え"を使っているなら完全な誤用だけどね そもそも、言葉というのは変化していくもの 最近になって定着しつつあるのだとしても、それを頭ごなしに否定するのは愚かしい 頭使うことを知らない人は、誤用と変化の違いを見極めることなく 自分の中の古い知識だけで物事を断定しがちだが、もっと柔軟な頭と広い視野を持たないと困るよ
423 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 19:32:33 ] AndAlsoやOrElseってVBAには無いんだったっけ?
424 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 19:50:59 ] >>412 いや、”だいがえ”が正しいんじゃないかな。 もしかして”だいがい”って呼んでるの?
425 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 19:54:09 ] CやJavaが長年培ってきた洗練された構文をかなぐり捨ててVBはいったいなにがしたかったのだろう。 なぜ}のかわりにEndと入力しないといけないのか理解に苦しむ。 見やすくない上に3文字も打たないといけない。ばっかじゃないか?
426 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 19:55:49 ] 馬鹿発見。「だいたい」と読むのだよ。つーか、>422に書いてあるだろ。
427 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 19:56:12 ] いやいや、オリジナルのBASICはCより古いぞ。 その古臭い構文をVBも引きずっているというだけ。 だからこそBasicを名乗っているわけだが。
428 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 19:56:28 ] >>425 CやJavaとbasicはどっちが古いと思っているのかね。
429 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 20:00:04 ] オリジナルのベーシックと今のVBはかなり違うじゃん。 古いベーシックから新しいVBになるにあたって CやJavaで解決されている構文を見習えばよかったのだ。
430 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 20:00:56 ] C#でも使ってろ。
431 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 20:05:32 ] >>430 エクセルのマクロでC#って使えるの?
432 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 20:06:30 ] それよりなんでキーワードの先頭は大文字なんだろう 目がチカチカする 小文字ならまだメリハリが出て読みやすいと思う
433 名前:デフォルトの名無しさん [2009/01/07(水) 20:12:55 ] エクセルのセルに入っている文字列の特定の文字の上にオートシェイプを置きたいって質問した人です。 質問させてください。 エクセルの現在のフォントでの文字列の幅を取得するには、 1.HWNDをNULLでデバイスコンテキストを取得する。 2.コンパチブルなDCをつくり、フォントをエクセルのフォントと同じものをセレクト。 3.GetTextExtentPoint32を呼び出して論理単位で文字列幅を得る。 4.(モードがMM_TEXTだと仮定して)ピクセルなので、ポイントに変換する。 (DPIはGetDeviceCapで取得) 5.エクセルのシートのズームが80%なら0.8をかける であっていますか?
434 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 20:22:18 ] >>429 VBが登場した頃は、まだパソコン用の高級言語の人気が CとPascal(これはBegin〜Endって書く言語)で2分していて、 C系の構文が良いという評価が固まっていなかったのだと思う。 >>432 VB登場の少し時代は全部大文字だったから、そこからは進歩したと言えると思う。
435 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 20:27:07 ] 変わったと言うより大幅に拡張されてるね。 根っこの部分はN-BASICの時代から変わってないから 昔覚えた変なテクニックが意外とそのまま使えたりするんだよな。 このあたりN-BASICやN88-BASICの記憶がないとなかなか同意してもらえないと思う。 例えばこんなNextの書き方、VBから始めた人は知らないんじゃないかな。 For i = 1 To 10 For j = 1 To 10 (処理) Next j, i
436 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 20:31:28 ] >>435 あったなぁ・・ そうだ、For文みて思い出したけど、VBは1からカウントするのが好きくね? 配列とか。あれキモイ。 まともな人間なら数字は0からカウントするものだ。 という言葉を思い出した。
437 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 20:36:44 ] fortranなんかは1からだろ 数学も1から C系で0ベースなのはメモリの配置とか低レベルな理由
438 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 20:38:03 ] >>436 配列はN-BASICもVBも0からだろ。
439 名前:433 mailto:sage [2009/01/07(水) 20:39:17 ] あのー。少しは私のことも思い出してあげてください。。(^^;)
440 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 20:40:30 ] >>439 修飾(ボールドとかイタリックとか)も考慮しないとずれるよ
441 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 20:43:21 ] >>440 嗚呼〜。ほんとだ。そうですよね。。 あ、433のやり方で大筋はOKで、かつ、ボールドも考慮みたいな感じでしょうか?
442 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 21:25:06 ] >>407 >>409 表示形式色々変えたんですけど、 Msgboxで表示しても0だし、EXCELのセル上に表記しても#VALUEになります。 なんでなのでしょう。 EXCELのバージョンは2000です。
443 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 21:27:33 ] >>441 細かいことを言えば、Excelは同じセル内でも1文字ごとにフォントを変更できる。 すべてに対応するのはけっこうめんどくさそう。
444 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 21:28:40 ] >>442 元の日付けデータがシリアル値になってないんでねーの?
445 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 21:31:48 ] >>443 そういやそうですね。ちょっとそこらへんも含めて作ってみます。
446 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 21:50:11 ] VBAっていつ無くなるんだっけ?次のバージョンから?
447 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 21:55:32 ] >>444 そもそも08.02.01のような表記をシリアル値にする方法がわからないのですが。 =DATEVALUE("08.02.01") みたいに表記してもVALUEになるだけですし。
448 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 22:01:53 ] >>447 VBA関係ないよな =DATEVALUE(SUBSTITUTE("08.02.01",".","/")) 次に何かわからないことがあったら総合相談所行ったら?
449 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 22:03:37 ] >>446 Mac版の2008ではなくなったけど、その次でまた復活する予定。 Win版はなくならない。
450 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 22:18:53 ] >>449 サンクス 本職はC++だけどVBA使えると経理の女の子から結構重宝されるので助かる
451 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 23:29:12 ] てか、事務職でVBAって何に使うんだよw
452 名前:デフォルトの名無しさん [2009/01/07(水) 23:49:34 ] 1行目が項目名で、2行目から201行目までデータが入っています。 オートフィルター後のA列のデータを取得したい。 どんなマクロになりますか?
453 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 00:20:50 ] うぇー Workbook.Save False すると Wrokbook_Before_Close動かん
454 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 00:29:40 ] >>452 オートフィルタの実行はAutoFilterメソッド 結果を配列として取り出すのはCurrentRegion.SpecialCellsメソッド >>451 単純作業をVBAで自動化してやるとけっこう喜ばれるよ 毎日在庫を確認して発注伝票を印刷してFaxで送信するとか 中小だとアバウトな部分が多くて完全な自動化は難しいから できるところだけやる
455 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 00:35:23 ] >>451 どんだけ想像力ねぇの?
456 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 00:35:29 ] 下記のような感じで、セルに他のセルを参照した値を入力したいのですが、 下記の入力方法だと、絶対参照になってしまいます。 相対参照にする指定方法をご存じないでしょうか? Cells(i + 1, 9).Value = "=" & Cells(i, 9).Address & "+" & Cells(i + 1, 6).Address
457 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 00:43:52 ] >>451 Officeって言うくらいだから・・・
458 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 00:53:51 ] >>456 Cells(i, 9).Address(False, False)
459 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 01:14:30 ] OS:WinXP Ver:Office2000 以下のマクロが意図したとおりに動きません。 aの値によってaddstに入力した値に異なる係数をかけた値を作りたいのですが、 係数をかけたはずのaddをセルに入力してみるとゼロになっています。 参考文献にはCaseの後はコンマで区切って複数条件を入れれるとありますが、 それはできないのでしょうか。。 なおプログラム自体は上記係数を無視する他は問題なく動いています。 Dim a As Integer (中略:aはFor構文で1から18まで増える) Dim addstd As Double Dim add As Double addstd = 0.3 Select Case a Case 3, 4, 8, 11, 13, 18 add = addstd Range("A5").Value = add Case 2, 6, 7, 10, 15, 17 add = addstd / 2 Range("A5").Value = add Case 1, 5, 9, 12, 14, 16 add = addstd / 3 Range("A5").Value = add End Select
460 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 01:22:28 ] >>458 ありがとう
461 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 01:49:40 ] >>459 表示形式
462 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 02:57:09 ] ウォッチやDebug.Printで値を見るくらいは自分でやれよ ほんと、VBA使いって問題起こるとそこで思考停止してしまい 試行錯誤することが出来ない奴が多いよな エラー出たらそこで終わりってなら機械と同じだぜ 処理速度では機械に敵わないんだから機械以下とも言える
463 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 06:24:19 ] 多いって何人だよ
464 名前:459 mailto:sage [2009/01/08(木) 08:48:02 ] ありがとうございます。ググってみました。 もしかすると、これに近い問題でしょうか。 questionbox.jp.msn.com/qa2390763.html また、デバッグ方法もありがとうございました。 VBAというか、プログラミング的なものを初めて2日目なもので、まだよく使い方がわかっていませんでした。 今から会社に行っていろいろ試してみようと思います!
465 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 09:05:06 ] >>459 計算自体はできてるようなので 書式設定の少数点以下の桁数が0になってるんじゃ?
466 名前:デフォルトの名無しさん [2009/01/08(木) 09:52:07 ] 非アクティブシートの選択セルを操作する事は可能ですか?
467 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 10:48:21 ] 無理
468 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 15:28:00 ] VBAを作成してもらいたいのですが もし作成していただけるようでしたらメールをお願いします。 1つの縦列から文字や数字を抽出し、横行書き出す作業を繰り返すマクロの作成をお願いしたいです。
469 名前:468 mailto:s.rika1990@gmail.com [2009/01/08(木) 15:30:04 ] メール入力し忘れてました(´A`)
470 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 19:05:09 ] 幾ら出すの?
471 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 19:42:27 ] カラダで良かったら...
472 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 20:41:14 ] >>468 形式を選択して貼り付け→行列を入れ換える
473 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 23:45:40 ] EXCELのWebブラウザでプレビューの機能を使って作ったブラウザをVBAで閉じるにはどうしたらいいんですか?
474 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 00:43:19 ] Webbrowser.Fuck
475 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 00:44:26 ] OS:XP Version:2003 取得したデータをセルに表示させる処理を作ったのですが 少し処理速度が遅いので、配列を使って処理しようと思っています。 その際、特定データに対してセルの色付けを行っているのですが 配列を使って最後にRangeオブジェクトで貼り付ける場合、どのタイミングで セルに色付けするのがいいんでしょうか? 配列に入れる処理中に色付けをするぐらいしか思い浮かばないのですが どなたか知恵を貸して下さい
476 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 00:50:04 ] > 配列に入れる処理中に色付けをする それでいいじゃん、何か問題有るの?
477 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 03:10:36 ] >>473 穴だらけのコードだけど、とりあえず… 環境依存かもしれない Option Explicit Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Public Const GW_HWNDLAST = 1 Public Const GW_HWNDNEXT = 2 Public Const WM_CLOSE = &H10 Public Const ml = 255 Dim wh1 As Long ' コールバック関数 Public Function EnumWindowsProc(ByVal Handle As Long, ByVal lParam As Object) As Long Dim strClassName As String * ml Dim strCaption As String * ml GetClassName Handle, strClassName, ml ' クラス名取得 GetWindowText Handle, strCaption, ml ' キャプション取得 If Left(strClassName, 7) = "IEFrame" And Mid(strCaption, 4, 22) = "Documents and Settings" Then wh1 = Handle EnumWindowsProc = True End Function Private Sub test1() '「ブラウザでプレビュー」を閉じる wh1 = 0 Dim Ret As Long Ret = EnumWindows(AddressOf EnumWindowsProc, ByVal 0&) If wh1 <> 0 Then Call PostMessage(wh1, WM_CLOSE, 0, 0) End Sub
478 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 09:28:53 ] >>475 とりあえず大雑把なアドバイスをしておく できる限りセルへのアクセスを減らす 決まった色の取得にRGBを何度も呼ばない 定数を使うか初期化の段階でLong型の変数に入れておいてそれを使う 的外れなアドバイスだったらスマソ 具体的にどんな処理をしてるのか分かればもう少し細かく何か言えるかも知れん
479 名前:デフォルトの名無しさん [2009/01/09(金) 16:28:17 ] 名前の定義のリストをシートに作成し、それを変更して一気に登録しています。 そこで困った事が発生しました。 シート名がS1とかだと名前の前後にシングルコーテーションが付きますね。 セルから取り出した値は先頭の1文字が外されます。 仕様だとは思いますが、シングルコーテーションも一緒に取り出す方法等が あるのでしょうか?
480 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 16:45:36 ] >>479 リストを作る時に先頭にシングルコーテーションをもう1つ入れておく もしくはシート名と名前で列を分ける(使う時に編集する) この程度しか思いつかないな・・・
481 名前:452 [2009/01/09(金) 23:15:14 ] 452 :デフォルトの名無しさん:2009/01/07(水) 23:49:34 1行目が項目名で、2行目から201行目までデータが入っています。 オートフィルター後のA列のデータを取得したい。 どんなマクロになりますか? >454 :デフォルトの名無しさん:2009/01/08(木) 00:29:40 > >>452 > オートフィルタの実行はAutoFilterメソッド > 結果を配列として取り出すのはCurrentRegion.SpecialCellsメソッド との答えをいただき、 いろいろとやってみるのですが、全くのお手上げ状態です。 フィルター後の上2件分の例示マクロをお願いします。
482 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 23:25:47 ] >>481 もうちょっと質問を具体的に。 (1)フィルターの条件は? (2)フィルターかけたあとどうしたい?
483 名前:452 [2009/01/10(土) 00:31:08 ] (1) フィルターの条件はデータが1又は0となっているので、1を該当データとしてかけています。 (2) フィルターをかけた後は可視セルを対象に、「A列の各コード(3桁)を取得したい。」 おおよそ、20〜50件程が該当データになります。 取得した後の配列から、その各要素を取り出すことは自分でできると思います。 随分以前ですがやったことはありますので。
484 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 01:11:17 ] >>483 1か0か判定するだけなら、わざわざオートフィルタ使わなくてもForループで順に見てけばいいんでない? 要素数も大して多くないんだし。とりあえず… B列が1の物だけをオートフィルタで抽出 Range("A1").AutoFilter Field:=2, Criteria1:="=1" A列の可視セルの内容をすべて書き出す For Each c In Range("A1").CurrentRegion.Columns(1).SpecialCells(xlCellTypeVisible).Cells Debug.Print c.Value Next
485 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 08:15:13 ] VBAを用いてプリンタに印刷させようと考えています。 それ自体はPrintOutメソッドを使えばできると思っているのですが、その際、プリンタのトレイまで指定することは可能でしょうか。 例えば、このシートを印刷する時はA4のトレイ、このシートを印刷する時は手差しのトレイから、という感じで。
486 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 09:20:27 ] >>485 出来るよ 手動でトレイの選択などが出来る状態なら その辺の制御をするドライバやAPIは入ってるわけだから それをプログラムから叩けば良いだけ でもそれはVBAではなくVBの分野(>>1 参照) 印刷対象がExcelのシートだろうと、プリンタのハード的制御はExcel関係ないのでスレ違い
487 名前:452 mailto:sage [2009/01/10(土) 10:10:00 ] >>484 おかげで、所期目的が達成できました。サンクス。
488 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 11:09:59 ] >>485 >それ自体はPrintOutメソッドを使えばできると思っているのですが、・・・ 484氏の回答を得て、機嫌がいいので (~_~); そうゆう設定は、PrintOutメソッドでは出来ない。 それで、vbaとしての回答は、印刷ダイアログボックスを呼び出して、選択することになる。 Application.Dialogs(xlDialogPrint).Show 但し、excel4マクロ(vbaではない扱いをされている)の世界だとどうだか知らない。 (xpでは見ていないが、97(たぶん?)と)2007ではマクロの記録で、また、 excel4マクロが記述されている。が、これは、触らない方が無難。
489 名前:デフォルトの名無しさん mailto:sage [2009/01/10(土) 11:17:02 ] xp は2003 の誤記です。
490 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 16:30:56 ] ↓のようなWindowオブジェクトの用途がよくわかりません。 Dim window1 As Window workbookでもなくworksheetでもないんですよね?? どなたかご教授お願いします。
491 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 16:53:34 ] 用途が判らなければ、使わなければいいのでは?
492 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 17:04:46 ] >>490 大雑把に説明すると、Windowsというのは画面上に表示された状態の物。 ブックやシートは画面に表示されてなくても、例えばHDDに保存されたファイルの中にも存在する。 ブックを開いたらWindowが作られる、みたいに考えておけばいい。
493 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 17:44:48 ] >>492 ありがとう。 自分が作るプログラムには特に必要はなさそうです。 自分のPCでは Set window1 = Workbooks(1) でwindow1には”PERSONAL.XLS”が入ります。 勉強になりました。
494 名前:デフォルトの名無しさん [2009/01/11(日) 20:05:41 ] A(伝票番号)B(日付)C(店名)D(金額) となっていて、C列の店名ごとに並べ替えてあります。 C列の店名が変わるごとに列A〜Dに太線を入れたいので以下のようにしました。 Sub test() With Range("C1", Range("B65536").End(xlUp)).Offset(, 250) .Formula = "=IF(C2="""","""",IF(C1<>C2,1,""""))" .Value = .Value On Error Resume Next With Intersect(.SpecialCells(xlCellTypeConstants) _ .EntireRow, Range("A:D")).Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlThick End With On Error GoTo 0 .ClearContents End With End Sub これだとデータが1件(1行分)しかない場合線が引けません。 データが1件でも区切り線が引かれるようにするには どのようにすれば良いですか?
495 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 20:24:15 ] >>494 努力だけは認めるが、無駄が多すぎる。 店名が同じかどうか判定するのに、わざわざワークシート関数なんか使わなくてもVBAだけでやればいいだろうに。 Sub test() r = 2 While Cells(r, 3) <> "" If Cells(r, 3) <> Cells(r - 1, 3) Then With Range(Cells(r, 1), Cells(r, 4)).Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlThick End With End If r = r + 1 Wend End Sub
496 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 20:37:40 ] >>495 考えすぎたみたいです。解決しました。 ありがとうございましたm(_ _)m
497 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 20:43:27 ] >>494 オレの知らないテクニック満載で何やってんのか理解できねえ
498 名前:デフォルトの名無しさん mailto:sage [2009/01/11(日) 20:46:09 ] すみませんw
499 名前:デフォルトの名無しさん [2009/01/12(月) 07:19:54 ] 2007の質問ですー 図形の操作がらみが「マクロの記録」に残らないんですが 以前のバージョンのように記録させる方法ないでしょうか?
500 名前:デフォルトの名無しさん mailto:sage [2009/01/12(月) 08:23:04 ] >>499 ない
501 名前:デフォルトの名無しさん [2009/01/12(月) 17:55:50 ] 初歩的な質問で申し訳ありません。教えていただけますでしょうか。 下図@のように、クラスと番号と氏名が入力されているファイルがあります。 下図Aのように、クラスと番号のみが入力されているファイルがあります。 クラスと番号の2つをキーに、図@からAに氏名をとってきたいのですが、 どのようにしたら良いでしょうか。 キーが1つであれば、VLOOKUPで出来るのですが、2つになって困っています。 宜しくお願いします。 図@ 図A クラス 番号 氏名 クラス 番号 1 1 相沢 1 1 1 2 加藤 1 2 1 3 佐藤 2 1 1 4 館山 2 2 2 1 安西 2 3 2 2 木村 2 3 工藤
502 名前:デフォルトの名無しさん mailto:sage [2009/01/12(月) 17:57:54 ] Excel総合相談所 76 pc11.2ch.net/test/read.cgi/bsoft/1228655230/942 942 名前:名無しさん@そうだ選挙にいこう[] 投稿日:2009/01/12(月) 17:51:11 【1 OSの種類 .】 WindowsXP 【2 Excelのバージョン 】 Excel2007 【3 VBAが使えるか .】 いいえ 【4 VBAでの回答の可否】 可 【5 検索キーワード 】 VLOOKUP 値の取り出し 下図@のように、クラスと番号と氏名が入力されているファイルがあります。 下図Aのように、クラスと番号のみが入力されているファイルがあります。 クラスと番号の2つをキーに、図@からAに氏名をとってきたいのですが、 どのようにしたら良いでしょうか。 キーが1つであれば、VLOOKUPで出来るのですが、2つになって困っています。 宜しくお願いします。 図@ 図A クラス 番号 氏名 クラス 番号 1 1 相沢 1 1 1 2 加藤 1 2 1 3 佐藤 2 1 1 4 館山 2 2 2 1 安西 2 3 2 2 木村 2 3 工藤
503 名前:デフォルトの名無しさん mailto:sage [2009/01/12(月) 21:11:53 ] こんなスレにホイホイ質問して良かったのか? 俺はマルチポストでも構わず答えちまう男なんだぜ。 俺なら、どっかのセルにクラスと番号を結合させた物を作る。 cells(i,1).value & "-" & cells(i,2).value をforでまわしてどっかに作る。 図1と図2に同じ処理。 後はfindでsetするなり、好きに料理しろ。
504 名前:デフォルトの名無しさん mailto:sage [2009/01/12(月) 21:50:33 ] 実行中のマクロより呼び出すことで、実行を中断しデバッグ可能な状態にする コマンドはありますか? マクロの自動記録で試しましたが記録されませんでした。
505 名前:デフォルトの名無しさん mailto:sage [2009/01/12(月) 21:58:38 ] >>504 勘違いかも知れんが、Stopとかブレークポイントの事か?
506 名前:デフォルトの名無しさん mailto:sage [2009/01/12(月) 22:28:43 ] >>505 そうです。 ブックを開いてマクロ実行する運用の中で、 一定の条件が成立した時に止めたいのですが、 ブックを開く度にブレークポイントを手動で設定するのは 現実的ではないのでブレークポイントはちょっとNGと思ってます。 イメージとしては以下のような感じです。 if xxxxx then application.stop ← ここで止めたい end if ブレークポイントをマクロより動的に設定できるか、 ブックに保存できる方法でも助かります。
507 名前:デフォルトの名無しさん mailto:sage [2009/01/12(月) 22:30:16 ] >>506 errとerr.number使えばいいんじゃねーの?
508 名前:デフォルトの名無しさん mailto:sage [2009/01/12(月) 22:34:30 ] MsgBoxやInputBox出せばそこで止まるぞ 止まったらEsc押すといい
509 名前:デフォルトの名無しさん mailto:sage [2009/01/12(月) 22:37:15 ] >>508 はダメだった、すまね
510 名前:デフォルトの名無しさん mailto:sage [2009/01/12(月) 22:53:25 ] じゃあSTOPでいいんじゃね? 止まったところでイミディエイトウィンドウで変数の内容を見たり書き換えたり自由にできる。 実行再開はCONT (嘘)
511 名前:デフォルトの名無しさん mailto:sage [2009/01/12(月) 22:58:17 ] SendKeys "{Break}" ごめん嘘
512 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 01:58:50 ] debug.assert false じゃダメなん?
513 名前:505 mailto:sage [2009/01/13(火) 17:18:25 ] >>506 そのままでいいじゃん for i=1 to 5
514 名前:505 mailto:sage [2009/01/13(火) 17:20:27 ] >>506 途中で送信してしまった for i=1 to 5 if i=3 then stop endif next i みたいに。
515 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 20:24:40 ] 単に止めるだけなら for i=1 to 5 if i=3 then stop next i って書く。
516 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 21:12:47 ] 俺は処理が1行でもThenの後ろには書かない もちろん、If ... Then ... else ...もやらない
517 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 21:36:38 ] >>514 >>515 ありがとうございました。 stopで止まりました。
518 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 21:51:33 ] >>516 すいません そのわけを教えてください
519 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 22:15:21 ] クラスモジュールについてドップリ勉強できる書籍はないだろうか?
520 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 22:39:31 ] 勉強するほどのものじゃないんじゃ
521 名前:デフォルトの名無しさん [2009/01/13(火) 22:54:17 ] IPアドレスを 123.456.789.10 からx番目のIPアドレスを求めるような EXCEL関数かVB関数を探してるのですが、 そんな便利なものありませんか?
522 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 23:17:28 ] x番目って何よ?
523 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 23:23:36 ] Split("123.456.789.10", ".")(x)でいいんじゃねーの
524 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 23:25:33 ] >>522 すみません。 123.254.90.10から 1番目は、123.254.90.11 2番目は、123.254.90.12、 … という意味です。 上のIPアドレスの範囲も間違えて、あぁぁぁ、出直してきます。 失礼しました。。。。
525 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 23:28:29 ] 単なる足し算じゃね
526 名前:デフォルトの名無しさん mailto:sage [2009/01/14(水) 00:02:10 ] うーん Sub test() For x = 1 To 10 A = Split("169.254.100.10", ".") A(3) = A(3) + x Debug.Print Join(A, ".") Next End Sub
527 名前:デフォルトの名無しさん mailto:sage [2009/01/14(水) 01:48:01 ] 123.254.90.256とかやりそうな奴だな
528 名前:デフォルトの名無しさん mailto:sage [2009/01/14(水) 20:38:53 ] 123.54.90.999 とかやってくれたら笑えるんだけど
529 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 00:29:42 ] OSはXP EXCELは2003です。 1.EXCEL上に別のEXCELシートを開くハイパーリンクを貼る 2.リンク先のシートが開くと同時に Private Sub Workbook_Open() Workbooks("Book1").Close End Sub みたいな感じで処理を走らせ、リンクで開いたシート自体を閉じる のような処理を入れるとシートが閉じられた後、EXCELがおかしくなります。 アクティブになっているEXCELシート以外のシートがアクティブにできないし、 新たに別のシートも開けなくなります。 ハイパーリンクとリンク先のシートを閉じる処理って同時には行えないんですかね?
530 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 01:01:19 ] >>529 イベント処理中でブックを閉じると実行中のインスタンスが開放されて暴走するんだっけ、 なんかそんなのがあったような気がする。
531 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 03:44:25 ] 開く方に Book1閉じるって書くしかないんじゃね
532 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 04:02:02 ] マクロ専用のブックを1つ用意して、それは閉じないようにするとか
533 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 18:17:44 ] すみません。質問させて下さい。 Excel2002のシートにラベルコントロールを貼付けました。 それをクリックすると、マウスカーソルがコントロールから離れるまで コントロール全体のサイズが若干大きくなってしまいます。 これは仕様でしょうか? もし対処方がありましたら、御教示下さい。
534 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 18:20:29 ] >>533 フォーカス位置を示す点線で囲まれた状態のことを言ってんなら、それは仕様
535 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 18:37:33 ] >>534 回答ありがとうございます。 ラベルのキャプションのテキストのサイズも変化するので、 フォーカスの点線ではないと思われます。 キャプションのテキストは通常状態ですと文字が滲んでおり、 クリックしてラベル全体が大きくなると文字がハッキリすることから、 ラベルをクリックしたときのサイズが正しいような気がします。
536 名前:デフォルトの名無しさん [2009/01/15(木) 19:37:27 ] 質問です。 book1をアクティブにした状態のまま、book2の特定のセルに書き込みをしたいのです。 で、 Windows("book2.xls").Cells(1, 2) = 1 とやったのですが、エラーが出ます。 正しくはどうやればいいのでしょうか?
537 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 22:06:50 ] × ブック.セル = 値 ○ ブック.シート.セル = 値
538 名前:デフォルトの名無しさん [2009/01/16(金) 18:33:12 ] すいません質問です。 VBAを使い年賀状を作成しなければならないのですが まず何からどうしたらよいかさえわかりませんm(_ _)m お願いします。汗
539 名前:デフォルトの名無しさん mailto:sage [2009/01/16(金) 18:40:34 ] まずは作成しなければならない状況に陥らせた人に聞くべきだろう
540 名前:デフォルトの名無しさん mailto:sage [2009/01/16(金) 18:48:41 ] マクロ記録しながらシートで作ればいいよ
541 名前:デフォルトの名無しさん mailto:sage [2009/01/16(金) 19:00:27 ] この時期だと年賀状じゃなくて寒中見舞いだぞ
542 名前:536 [2009/01/16(金) 19:27:50 ] >>537 レスありがとうございます。 さっそくやってみました。 Windows("book1.xls").Sheets("Sheet1").Cells(1, 2) = 1 とやったのですが、やはりエラーが出ます。 なぜなのか、さっぱりわかりません。 しつこいようですが、教えて下さい<(_ _)>
543 名前:デフォルトの名無しさん mailto:sage [2009/01/16(金) 20:03:41 ] ちょっとはぐぐれよ。オブジェクト名やメソッド名がおかしいだろ。 Sub test() Workbooks("book1.xls").Activate Workbooks("book2.xls").Worksheets("Sheet1").Cells(2, 1) = 1 End Sub
544 名前:デフォルトの名無しさん mailto:sage [2009/01/16(金) 23:03:00 ] Excel 2000ですがマクロのステップ数が大きくなると、 ブックのファイルサイズがMB単位で肥大化して困ってますが、 皆さんどうしてますか?
545 名前:デフォルトの名無しさん mailto:sage [2009/01/16(金) 23:17:27 ] そんな現象おきないのでどうもしてないが
546 名前:デフォルトの名無しさん mailto:sage [2009/01/16(金) 23:24:57 ] どんだけ巨大なマクロを作ってるんだか。 ワークシートを操作するマクロを何度も走らせるとファイルが太る可能性はあるが、 それならシートの再構築でダイエットできるかもしれない。
547 名前:デフォルトの名無しさん mailto:sage [2009/01/16(金) 23:27:09 ] 以下の構成で、hogeよりfugaにあるクラスを生成(new)しようとすると、 「ユーザ定義型は定義さていません」エラーとなります。 クラスでないモジュールの場合はそのまま呼び出せてます。 名前空間の問題と思われますが解決方法はありますでしょうか? hoge.xls → fuga.xla(参照設定)
548 名前:デフォルトの名無しさん mailto:sage [2009/01/16(金) 23:31:21 ] >>546 マクロは相当な量です。 再構築は以前試した時は多少は改善しました。 でも、まっさらなブックにマクロのみ貼り付けても、 それ以上は小さくならなかったのでコレが限界かと。
549 名前:デフォルトの名無しさん [2009/01/16(金) 23:32:49 ] >>543 おおおおお、ありがとうございました!!
550 名前:デフォルトの名無しさん mailto:sage [2009/01/16(金) 23:34:08 ] Variant型をできるだけ使わないようにするとか
551 名前:デフォルトの名無しさん mailto:sage [2009/01/17(土) 00:30:00 ] >>547 support.microsoft.com/?scid=kb%3Ben-us%3B555159&x=14&y=9
552 名前:デフォルトの名無しさん mailto:sage [2009/01/17(土) 10:08:15 ] シートをそれぞれ別ブックに保存する方法教えて。 保存名はシートの名前で。
553 名前:デフォルトの名無しさん mailto:sage [2009/01/17(土) 11:38:51 ] それを手動でやる方法すら思いつかないの? 思いつくならそれをマクロの記録で録ることすら 思いつかないの?馬鹿なの?死ぬの?
554 名前:デフォルトの名無しさん mailto:sage [2009/01/17(土) 11:44:17 ] >>552 ワークシートコレクションに対するループの中で (1) シートが1枚のブックを新規作成 (2) そこへシートをコピペ (3) 名前を付けて保存 (4) 新規ブックを閉じる を繰り返す とりあえず>>1 の★5の理由によりまずは自分で作ってみれ。方法は★6で。
555 名前:デフォルトの名無しさん mailto:sage [2009/01/17(土) 13:44:33 ] >>551 ありがとうござました。 しかし各クラスごとに生成用のメソッドが必要とは... これがなければ理想的なんですが。
556 名前:デフォルトの名無しさん mailto:sage [2009/01/17(土) 17:44:47 ] >>555 オブジェクト指向ではコンストラクタとデストラクタもクラスライブラリで用意することになってる。 というか勝手にインスタンス化するのは不可能だろ。どんだけメモリが必要かもわからんのに。
557 名前:デフォルトの名無しさん mailto:sage [2009/01/17(土) 17:49:40 ] >>556 おまい判ってない。 ↓ではコンストラクタでなはく生成用のグローバルなメソッドを クラスの外に定義しろっていってんだよ。 オブジェクト指向以前の問題。 ttp://support.microsoft.com/?scid=kb%3Ben-us%3B555159&x=14&y=9
558 名前:デフォルトの名無しさん mailto:sage [2009/01/17(土) 18:00:01 ] シートの表示倍率の値は取得できます?
559 名前:デフォルトの名無しさん mailto:sage [2009/01/17(土) 18:44:18 ] >>556 Excelのclassのインスタンス化プロパティがPrivateかPublicNotCreatebleしか選べないから 外部から直接インスタンス化できないという仕様なのが問題で、コンストラクタは関係ない。
560 名前:デフォルトの名無しさん mailto:sage [2009/01/17(土) 19:30:45 ] Withっていいな。Withでネストしまくったコード見ると癒される。
561 名前:デフォルトの名無しさん mailto:sage [2009/01/17(土) 20:43:17 ] >>558 出来ますよ
562 名前:デフォルトの名無しさん [2009/01/18(日) 11:40:34 ] すみません、質問です。 エクセル2003のVBAについてです。 フォーム内に、セル(もしくは、エクセルのセルと同様の働きをするもの) の貼りつけることってできるのでしょうか?
563 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 12:15:21 ] >>562 ググれカス q.hatena.ne.jp/1148568634 これで良い?
564 名前:デフォルトの名無しさん [2009/01/18(日) 13:52:10 ] withを使った方が処理の速度は速くなりますか?
565 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 13:54:43 ] はい
566 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 13:59:02 ] EXCEL2003です。 VBAの処理の中でハイパーリンクをセルの書式設定にてロックを解除したセルに貼り、 その後シート全体をセルの選択が出来ない形で保護する つまりハイパーリンクのあるセル以外は押しても反応が無いよう保護する処理を作ったのですが、 ハイパーリンク以外のセルを押すとリンク先の画面が立ち上がってしまいます。 ハイパーリンクのあるセル以外は選択することも出来ないような画面を作りたいのですが、 何故上のような画面が出来てしまうのでしょうか?
567 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 14:34:48 ] > 何故上のような画面が出来てしまうのでしょうか? 保護により選択出来ないセル上で行ったクリック動作は 現在選択状態にあるセル上で行ったものとして扱われる 故に選択できるセルが1セルなら、どこをクリックしようとそのセルをpクリックした扱いになる 君の要望を実現するには、セル上のハイパーリンクではなく、 ボタンコントロールなどを使ってリンク先に飛ぶのが適切だろうな まあガンバレ
568 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 15:07:11 ] うん!僕がんばるよぉぉぉおおお!!
569 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 16:35:58 ] WindowsXP上でEXCEL2003を使用してます。 フォームに入力した内容を編集してシートに反映させるマクロを作成しているのですが、 マクロ実行中はシートをアクティブに出来ないのでマクロを終了させないと シートの変更内容の確認が出来ません。(テスト作業+デバッグの効率が悪い…) マクロ実行中(フォーム表示中)でも、シートのウィンドウをアクティブにしてシート選択が 可能になる方法はあるのでしょうか? よろしくおねがいします
570 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 17:58:08 ] >>569 VBEのウィンドウを最大化しなければいい
571 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 18:31:58 ] >>569 普通に見れるだろ
572 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 19:46:29 ] マクロを手動で実行ではなく、 (例)表列A1、A2に数値を入力したらリアルタイムに(マクロ側に計算式記述。例えば A1*A2)A3に結果を表示させようとする場合どうすればいいでしょう? 解説サイト見てもブック起動時実行ってのばかりしか見つからない…
573 名前:569 mailto:sage [2009/01/18(日) 19:48:39 ] もう少し作成しているマクロを説明すると、 ・マクロはsheet1上に置いたコマンドボックスから開始する(フォームが表示される) ・フォームに入力した内容が反映されるのはsheet2・sheet3 で、 ・フォームが表示されている状態ではExcelのウインドゥをアクティブにすることが出来ない ・なので、マクロで変更されている筈のsheet2・sheet3を開くことが出来ない という状態です。 >>570 VBEのウインドゥについては開いている状態でも閉じている状態でも上記の現象に変わりありません。 >>571 マクロがsheet1を編集しているなら普通に見れるとは思いますが、 編集しているのは背面にある他のシートなので…
574 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 19:48:44 ] >>572 ワークシート関数と同じ感覚? それならSelectionChangeで出来る。 シートごとに設定しないといかんけどね。
575 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 20:11:43 ] >>569 ,573 Modelessで呼べば良いだけでは? >>574 SelectionChangeではなくChangeだろ SelectionChangeは選択セルが変更されたとき Changeはセルの値が変更(入力、削除など)されたとき それと対象セルと処理内容が同じならシート毎に設定する必要も無い ブック単位、あるいは全ブックを対象に一括処理する方法もある
576 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 20:20:07 ] >>575 vbModelessを付けてフォームを開いたところ上手くいきました、 ありがとうございます。
577 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 21:34:00 ] >>574 多分functionとrangeを使ってどうにかこうにか書くのだと思うのですが上手くいかない
578 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 21:36:51 ] >>577 ヒント Workbook_SheetChange Application.EnableEvents = False
579 名前:教えてください [2009/01/20(火) 00:51:55 ] 質問です。初心者です。 複数のブックに散らばっている同じ名前のシートを、1ブックの1シートにまとめたいのですがうまくいきません。 msgbox "5"までは表示されるので、次の行がおかしいのだと思います。 「motosheet.」の記述を消すとマクロ自体は動作するのですが、コピー元のブックではなくてコピー先のブックを参照してしまいます。 なぜか、rangeの親オブジェクトを記述すると「実行時エラー 1004 アプリケーション定義またはオブジェクト定義エラー」となります。 1行前はrangeの親オブジェクトを記述しても問題ないのに・・・ 本当に困っています。よろしくお願いします。
580 名前:教えてください [2009/01/20(火) 00:52:34 ] Private Sub CommandButton2_Click() Application.ScreenUpdating = False Dim motobookspath As Variant Dim motobookpath As Variant Dim 先ブック入力済み最終行番号 As Long Dim データ貼り付け開始行番号 As Long Dim sakirange As Range Dim motorange As Range Dim motobook As Workbook Dim motosheet As Worksheet Dim 入力済み最終行番号 As Long motobookspath = Application.GetOpenFilename(filefilter:="Exclブック,*.xls", MultiSelect:=True) MsgBox "1"
581 名前:教えてください [2009/01/20(火) 00:53:00 ] For Each motobookpath In motobookspath 先ブック入力済み最終行番号 = ThisWorkbook.Worksheets("データ").Range("i1").End(xlDown).Row データ貼り付け開始行番号 = 先ブック入力済み最終行番号 + 1 MsgBox "2" Set sakirange = ThisWorkbook.Worksheets("データ").Cells(データ貼り付け開始行番号, 1) MsgBox "3" Set motobook = Workbooks.Open(Filename:=motobookpath) Set motosheet = motobook.Worksheets("データ") MsgBox "4" 入力済み最終行番号 = motosheet.Range("i1").End(xlDown).Row MsgBox "5" Set motorange = motosheet.Range("a2", Cells(入力済み最終行番号, 19)) motorange.Copy Destination:=sakirange motobook.Close savechanges:=True Next Application.ScreenUpdating = ture End Sub
582 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 01:06:50 ] Set motorange = motosheet.Range("a2", Cells(入力済み最終行番号, 19)) → Set motorange = motosheet.Range("a2", motosheet.Cells(入力済み最終行番号, 19))
583 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 06:51:42 ] 巷ではこういうコードが普通にあんのかね。
584 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 11:38:28 ] 誰もがプログラミングの専門家じゃないからね。 入門書を斜め読みして断片的な知識で「動けばいい」程度のコードを書いてる人のが圧倒的に多いよ。
585 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 19:28:45 ] 超初心者で申し訳ありませんが・・・ エクセルのシートにある数字と文字列をCSVファイルに下記のように出力したいです。 (エクセル) 123,鈴木 1013,田中 (出力) 番号,名前 0123,鈴木 1013,田中 自分で作ってみたところ、下記のように文字列になってしまいます。 (出力) ”番号”,”名前” ”0123”,”鈴木” ”1013”,”田中” となってしまいます。 どのようにすれば良いのでしょうか。 よろしくお願い致します。
586 名前:579 [2009/01/20(火) 21:14:18 ] >>582 うぉー!! ありがとうございます!!!! 2日悩み続けてました。CellsオブジェクトもThisworkbookの子オブジェクトとして認識されて しまっていたのですね。 でも悩みに悩んでいるといろんなことを考えるから、勉強にはなりますよね。 >>583 もっと違った記述方法があるんですかね?教えてください。
587 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 21:48:51 ] >>585 どんなプログラムを作ったの?
588 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 22:07:54 ] >>579 まず変数名に日本語を使うところからダメだわ。
589 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 22:14:47 ] >>588 それは場合によりけりだな
590 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 22:21:17 ] 場合というか,使われ方とか規模とか書く人とかによるな どちらかに決めて使い分けはしない
591 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 00:29:10 ] 俺も変数名に日本語使うの抵抗あるけど 日本語使うとコードが分りやすくなるような気もするから 使おうかなとも思うけど… でも抵抗あるんだよなー
592 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 00:39:52 ] 英語だと既存の関数名、メソッド、プロパティ、その他予約後などと被る時、 ローマ字で書くのは嫌いだから日本語で書いちゃう
593 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 01:02:53 ] >>592 確かに! 日本語で書けば被らないな てことは日本語で書いたほうが合理的だな
594 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 05:44:10 ] ActiveXコントロールのテキストボックスをワークシート上で使う場合、 Heightを文字の大きさの2倍以上にしないと、文字が崩れますが 解決法はありますか?
595 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 07:15:08 ] 日本語は入力が面倒臭いのが難点。
596 名前:デフォルトの名無しさん [2009/01/21(水) 20:02:04 ] Excel2003にて、インターネット上からXMLを取得して利用するツールをつくって いるところなのですが、文字化けを起こします。 Dim get_xml As Object Set get_xml = CreateObject("MSXML2.DOMDocument.3.0") get_xml.async = False get_xml.Load (src_url) 抜粋するとこのようなコードです。 このときに、 ‖ この文字だけが、半角?に変換されてしまいます。get_xml.Load した直後で既に?に変わってしまっているのですが、どうすれば解消するでしょうか? 取得するxmlはUTF-8で、IE等のブラウザから見ると正常に‖と見えます。 よろしくおねがいします。
597 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 20:23:54 ] >>596 >>1 ★3,★4
598 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 22:56:21 ] >>597 失礼しました。。。
599 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 17:46:03 ] 日本語の変数名に関しては、漢字のみの送り仮名無し。って条件ならOKにする事が多いなぁ。 送り仮名が入ると面倒だよね。 あとは、変数名一覧表を作っておく事が絶対条件かも・・・。
600 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 18:10:08 ] >>599 Option Explicitは必須だね。 なまじわかりやすすぎて、同じ意味の別の熟語に無意識に脳内変換しちゃうことがある。
601 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 19:03:30 ] 質問です。宜しくお願いします セルA1には、「8:00」がはいっているとして、 Option Explicit Sub test1() UserForm1.TextBox1 = Range("a1").Value UserForm1.Show End Sub これで、テキストボックスに「0.33333333」じゃなく、 きちんと時刻を表示させるにはどうすればよいですか。
602 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 19:27:06 ] 右辺をRange("A1").TextとかFormat$(range("A1").Value,"h:mm") など。 TextはA列のセル幅が狭いと##とかなるけど。
603 名前:質問です [2009/01/22(木) 20:03:19 ] Sub test() Cells(1, 1).Activate Do Until ActiveCell = "" 入力値 = ActiveCell If 入力値 Like "*[C,CX*,O,OX*,O2,O2X*,Fe]" = True Then If 入力値 Like "*[O,OX*]" = True Then If 入力値 Like "*O" = True Then 処理 = 1 ElseIf 入力値 Like "*X2" = True Then 処理 = 2 End If ElseIf 入力値 Like "*[Fe,Fe*]" = True Then If 入力値 Like "*Fe" = True Then 処理 = 3 ElseIf 入力値 Like "*X2" = True Then 処理 = 4 End If Else If 入力値 Like "*[O2,C]" = True Then 処理 = 5 ElseIf 入力値 Like "*X2" = True Then 処理 = 6 End If End If
604 名前:質問です [2009/01/22(木) 20:04:18 ] ElseIf 入力値 = "*[Au,AuX*,Ag,AgX*,Pt,PtX*,Au1,Au1X*,Ag1,Ag1X*,Pt1,Pt1X*]" = True Then If 入力値 Like "*[Au,AuX*,Ag,AgX*,Pt,PtX*]" = True Then If 入力値 Like "*[Au,Ag,Pt,]" = True Then 処理 = 7 ElseIf 入力値 Like "*X2" = True Then 処理 = 8 End If ElseIf 入力値 Like "*[Au1,Au1X*,Ag1,Ag1X*,Pt1,Pt1X*]" = True Then If 入力値 Like "*[Au1,Ag1,Pt1]" = True Then 処理 = 9 ElseIf 入力値 Like "*X2" = True Then 処理 = 10 End If Else 処理 = 11 End If Else 処理 = 12 End If ActiveCell.Offset(0, 1).Activate ActiveCell = 処理 ActiveCell.Offset(1, -1).Activate Loop End Sub どうも分岐がうまくいかないのですが。
605 名前:質問です [2009/01/22(木) 20:05:07 ] 以下、その処理文字列です。 対象に[*]があることで違う分岐を選んでいそうですが、 ほかのものも予想外の分岐をするのですがなぜでしょうか。 (説明が下手ですいません) J0015-1*2 J0015-2*2 J0235-2PtAuX10 H0053-1PtX2 H0036-2C H0037-1CX2 J0004-1*2-O J0004-1*3-O1X2 J0004-1*3-OX2 H0053-1Pt1X2
606 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 21:16:29 ] NAMAE = Cells(1, 1) KUMI = Cells(2, 1) If NAMAE = "" Then NAMAE = "*" End If If KUMI = "" Then KUMI = "*" End If row1 = 3 Do While Cells(row1, 1).Value = "" Set aaa = Cells(row1, 2).Find(What:=NAMAE, LookAt:=xlPart) Set bbb = Cells(row1, 3).Find(What:=KUMI, LookAt:=xlPart) If Not aaa Is Nothing And Not bbb Is Nothing Then '条件が合ったときの処理 End If row1 = row1 + 1 Loop 変数のNAMAEとKUMIを検索項目にして目当ての行を見付けるプログラムを作ってます。 例えばNAMAEに入力があればKUMIがスペースでもNAMAEが一致する行をすべて検索できるようにしたいのですが、 上のようにすると検索対象の一覧の中で名前(row1, 2)が一致しているのに、組(row1, 3)がスペースの行が検索に引っかかりません。 一覧の中で検索対象セルの入力有無に関わらず、検索に引っ掛けるようにするにはどうしたらいいでしょう? 質問がわかりにくいとは思いますがお願いします。
607 名前:606 mailto:sage [2009/01/22(木) 21:23:56 ] すいませんまちがえました。 上の Do While Cells(row1, 1).Value = "" は Do While Cells(row1, 1).Value <> "" の間違えでした。
608 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 22:23:09 ] 読む気になれない・・・。
609 名前:606 mailto:sage [2009/01/22(木) 23:37:24 ] すいません。 最善の処置かはわかりませんが、自己解決しました。 スレ汚し失礼しました。
610 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 00:05:26 ] 特定のEXCELシートが開いている時にはそのシートを閉じ、 開いていなければ何もしないという処理って可能ですか?
611 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 00:08:50 ] >>610 ブックじゃなくてシート?
612 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 00:28:23 ] >>610 ブックなら可能 やりかたは自分で調べろ
613 名前:610 mailto:sage [2009/01/23(金) 00:29:16 ] >>611 間違えました。 シートではなくブックです。 失礼しました。
614 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 01:04:27 ] >>613 Workbooks( ).Close
615 名前:610 mailto:sage [2009/01/23(金) 01:16:51 ] >>614 それって全部閉じませんか? ブックAでマクロを起動するとブックAはそのままでブックBを閉じる機能なんですが。 そしてブックBが閉じている状態で起動してもエラーがおきないようにしたいです。
616 名前:603 [2009/01/23(金) 01:22:49 ] 長かったので問題の箇所まとめました。 If 入力値 Like "*[C,O,O2,Fe]" = True Or 入力値 Like "*[CX,OX,O2X]*" = True Then この分岐で(入力値) J0235-2PtAuX10 H0053-1PtX2 を拾ってしまうんですが、何が原因でしょうか。
617 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 01:25:39 ] >>615 Workbooks( ブックB ).Close エラー処理、またはエラー処理をしなくても済むような方法は自力で調べて考えろ 調べても考えてもわからなかったら、そこで始めて人に聞け
618 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 01:37:15 ] XP SP3 Excel 2002 SP3 ユーザフォームのShowModalをFalseに設定しています。 ユーザーフォームには、複数のテキストボックス、チェックボックス コマンドボタンを配置しています。 ユーザフォームとワークシート間を移動した時の イベントを教えて下さい。 Activate,Deactivateを試しましたが、該当しないようです。 宜しくお願いします。
619 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 01:47:47 ] >>616 色々な文字列のうち、どれがLikeの条件にヒットするか試してみたけど、法則が見えない ttp://momoiro.s4.x-beat.com/up/img/momoiro08659.png
620 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 01:54:13 ] >>618 該当するイベントは存在しないので、何か別の方法を考えるしかない。 例えばタイマーで一定時間ごとにアクティブなウィンドウを調べるとか、 はっきり言ってかなり面倒な方法しかなかったと思う。
621 名前:618 mailto:sage [2009/01/23(金) 02:06:26 ] >>620 有難う御座います。 やはりそうですか。ほかに力技でも考えてみます。 長いこと調べていたんで、これですっきりしました。
622 名前:デフォルトの名無しさん [2009/01/23(金) 02:11:43 ] >>619 そうですね。いろいろ試しているんですが、きびしいです。 Likeにクセあるんだろうと思いながら使えない気がしてます。 入力値をもっと制限する方法も検討しながらもう少し探ってみます。
623 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:17:18 ] あのさ、偶に勘違いしてる人が居るけど、Like演算子の文字クラスで [AB,CD,EF]とした場合、AB CD EF のどれかに一致するものではなく A B , C D E F のどれかに一致するものという意味になる つまり「 , 」は区切り文字ではなく検索文字のひとつに過ぎない >>619 の記述だと、B1のは「末尾が C , O S F e のどれかで終わるもの」という意味で C1の記述だと「C X , O 2 のどれかが含まれるもの」という意味になる その正しい仕様を理解していれば、○の付いてるものは正しく仕様法則に従っていることが解る AB CD EFのどれかで終わる場合にマッチさせたければ、"*AB"、"*CD"、"*EF"の3条件をOrで重ねるか Like演算子ではなく正規表現で"(AB|CD|EF)$"とするべきだ
624 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:19:54 ] >>622 こうなったらRightとInstrで1個ずつ調べるしかないと思う
625 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:25:34 ] >>619 たとえば、"*[CX,OX,O2X]*"は、 CかXか,かOか2を最低一つ含むという意味では?
626 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:26:37 ] >>623 なるほど、つまり "*[C,O,O2,Fe]" → "*[,2CeFO]" "*[CX,OX,O2X]*" → "*[,2COX]*" ということか。納得いった。 VBAの解説してる某有名サイトは間違ってんだな
627 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:28:49 ] >>617 ありがとうございます。 その.closeでエラー回避する方法あるんですね。 調べてみます。
628 名前:デフォルトの名無しさん [2009/01/23(金) 02:33:57 ] >>625 >>626 そうなのですか。 確かにそれなら納得がいきます。 参考にしたサイトを間違えたかも。 ありがとうございます。 長いコードを書くことが確定した。
629 名前:623 mailto:sage [2009/01/23(金) 02:40:06 ] >>626 ,>>628 OfficeTANAKAかな? まあ解説サイト作ってるからといって全てを熟知してるわけじゃないし レベルも様々だから仕方ないさ まあ、あの人レベルはそんなに低くもなく高くもなくだが もっとレベルの低い人がデタラメばかり書いてる解説サイトもあるから過信は禁物
630 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:51:41 ] >>615 プログラムってのはひとつの発想に固執せず、 いろんな角度から発想を転換してみるのが上達のコツ こういう時はエラーが起きないよう注意するより、 エラーを無視すればいいんだよ on error resume next workbooks("B.xls").close on error goto 0
631 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 04:24:46 ] 出来るなら 一度保存して閉じるけど
632 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 04:26:53 ] そういうことじゃなくて、そもそも目的のブックが開いてない可能性があるのよ。
633 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 04:46:04 ] もし 開いていたら 閉じる
634 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 09:08:26 ] >>602 ありがとうございます
635 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 21:32:21 ] A1とA2セルの書式設定の表示形式をyy.mm.ddにして A1セルに文字列で「09.08.07」と入力して a = Cells(1, 1) Cells(2, 1) = Mid(a, 1, 2) & "/" & Mid(a, 4, 2) & "/" & Mid(a, 7, 2) 上のような処理を実行すると何故かA2セルに「07.09.08」と順番が入れ替わって表記されてしまいます。 何故なんでしょう? EXCELは2000です。
636 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 21:32:44 ] >>610 開いている全てのワークブックの名前をDoで回し取得、 該当ブックが有れば.close
637 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 21:39:01 ] >>635 年/月/日が月/日/年になってしまう時は、コントロールパネルかツール/オプションで地域の設定を見直す
638 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 21:43:34 ] >>636 全ブック回すならFor Eachの方がコードがシンプルになるけど負荷が大きくなる。 エラーを無視するのは行儀は悪いが一番処理は速い。 エラー処理をきちんと書く、例えばエラーメッセージを出すとか実行結果をエラーコードとして返すのが王道だけど 片手間で作る小規模なコードでは大げさすぎる。 どの方法を使うかはケースバイケースだ。
639 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 21:58:53 ] >>637 地域と言語のオプションやEXCELのツール→オプションを見ましたが不自然な場所は内容に見えるのですが。 もう少し詳しくお願いします。
640 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 22:06:36 ] >>639 ExcelじゃなくてWindowsのコントロールパネルの地域と言語のオプションだよ。 どこかのセルに「9/8/7」ってキーボードから入れたらどうなる? 「2009/8/7」になるか「9/8/2007」になるか。
641 名前:630 mailto:sage [2009/01/24(土) 22:09:05 ] >>638 >エラーを無視するのは行儀は悪い エラー処理って大そうに考えてる人多いみたいだけど、 俺はエラー処理ってのはプログラムの効率化を図る手段だと思ってる 実際にErrorステートメントなんか存在しなくても、 厳密なプログラムを書けば99.9%(経験上100%)同じことはできる Errorステートメントってのは、あらゆる場面を想定した厳密なプログラムを 書かなくてもいいように効率化(手抜き)をするためのモンじゃないの?
642 名前:635 mailto:sage [2009/01/24(土) 22:15:04 ] >>640 639の地域と言語のオプションというのはもちろんコントロールパネル内のやつの一項目です。 変なところは無いみたいですし、そもそも購入してからいじった覚えもありません。 現状どのEXCELシートでも9/8/7と入力すると2009/8/7に置き換わって問題ないようにみえます。
643 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 22:19:03 ] >>642 A1セルに09.08.07じゃなくて、9/8/7っていれてみ
644 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 22:22:37 ] 確認するんならA2セルに9/8/7と入れてみるべきじゃないかな 書式の問題かもしれないし
645 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 23:11:33 ] >>643 >>644 A1A2セル共に9/8/7と入れれば09.08.07に自動で置き換わりますので書式には問題は無い様に思えます。 ちなみにA1セルに9/8/7と入力して635の処理を走らせると2009/8/7が20/9//8/に置き換わるだけでした。 それとMid関数を利用してピリオドをスラッシュに置き換えても結果は同じ07.09.08でした。 この処理の目的としては日付欄なのに入力の際にピリオドを直接入力している間違った記述を一括で直したいというのがあるのですが どうしてこんな順番入れ替わりがおこるのかが本気で謎です。
646 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 23:48:18 ] >>645 DateSerialをかますんだ! Dim s As String If TypeName(Range("A1").Value) = "String" Then s = Range("A1").Value Range("A1").Value = DateSerial(Left(s, 2), Mid(s, 4, 2), Right(s, 2)) End If
647 名前:635 mailto:sage [2009/01/25(日) 07:49:29 ] >>646 確認しましたが、それで大丈夫みたいですね。 ありがとうございました。
648 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 17:56:18 ] Open ファイル名 For 開き方 As #ファイル番号 というコマンドの「#」の意味を調べてみたんですが 言及されてなくてわかりません。 この#にはどんな意味があるのでしょうか?
649 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 18:08:33 ] あるブックをアクティブにすると同時にマクロを走らせることって可能ですか?
650 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 18:25:52 ] >>648 「#」は「ナンバーサイン」とも言う。そして、例えば「2番目のvoid」を「void#2」とも書く。 その意味を込めてMS-BASICで採用された仕様だ。
651 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 18:55:24 ] >>649 Workbook_WindowActivate
652 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 19:04:08 ] >>650 ほえー!ずぅっとシャープだとばかり思ってました。 番号を表す「ナンバーサイン」という記号だったんですね。 勉強になりました。ありがとうございます。 >>649 そのブックに、Auto_Open()のモジュール名で記述されたプログラムは ブックを開くと同時に実行されます。
653 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 19:08:00 ] 開くときではなくアクティブにしたときでしょ?
654 名前:652 mailto:sage [2009/01/25(日) 19:12:30 ] 確かに。読み間違えました。 どうもすみません。
655 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 19:40:49 ] >>651 ありがとうございます。 もう一つ質問です。 非アクティブ状態のシートのアクティブセルの参照はどうすればいいでしょうか? 現在ブックBがアクティブ状態で Cells(1, 1) = Workbooks("A.xls").Worksheets(1).ActiveCell.Offset(0, 1) のような処理はオブジェクトはプロパティ・メソッドをサポートしてないと言われました。 ブックAをアクティブにしたくないのですけど、やはりブックAをアクティブにしてからでないと無理ですかね?
656 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 20:29:26 ] そもそも、ちょっと考えてみれば当然のことだが アクティブじゃないシートにはアクティブなセルなど存在しない それにActiveCellはWorksheetオブジェクトのメンバではなくExcelオブジェクトのメンバなので 上位オブジェクトを指定するならExcel.ActiveCellのようになり、Excel以外は指定できない つまり、「(A):非アクティブなシートのアクティブセル」って概念自体が間違いであり 君がやりたいことは「(B):非アクティブなシートが最後にアクティブだったときにアクティブだったセルの取得」 と表現するのが正しい というわけで、存在しないもの(A)は取得できないので、(B)を取得するには 任意のシートにアクティブセルが存在するようにしてやる(任意のシートをアクティブにする)か、 アクティブセルの移動を監視記録するのどちらかだな 表示を止めてアクティブにしたのが見えないようにも出来るが、それでも前者が嫌なら後者しかない
657 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 21:02:48 ] うぜーよ
658 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 22:30:01 ] べつにうざくはないが、よくそこまで親切にレスできるのかと関心する 職場で部下に教えるならまだしも、2ちゃんで赤の他人に教えるだけで
659 名前:デフォルトの名無しさん [2009/01/25(日) 23:23:32 ] EXCEL97です ActiveSheet.PageSetup.LeftHeader = "&18 1月12日 &A" このなかの1月12日の部分をnow()+2かstring型の変数を使いたいのですが方法はありますか
660 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 23:36:15 ] ActiveSheet.PageSetup.LeftHeader = "&18 " & Format(Now() + 2, "m月dd日") & " &A"
661 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 23:51:02 ] >>656 丁寧にありがとうございます。 >アクティブじゃないシートにはアクティブなセルなど存在しない これが確認できれば出来れば十分です。
662 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 16:18:41 ] ActiveとSelectを混同してると見た 俺がちょっと前までそうだったから
663 名前:デフォルトの名無しさん [2009/01/26(月) 19:12:35 ] 質問です。 データをシステムから取り込んだエクセルファイルなんですが、 セル内の数値の先頭に半角スペースがついてしまいます。 たぶんこれが原因で、数値の大小がおかしくなります。 例えば 変数=20.222 if 変数>10.333 then これで =falseとなるんですが何か対処法はないでしょうか。 セルをダブルクリックしてEnterで先頭のスペースは消えて数字扱いとなります。 セルの書式は未選択状態です。 ファイルがで手元にないので詳しいことはすいません。
664 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 19:51:29 ] >>663 変数="20.222 " if value(trim(変数)) > 10.333 then
665 名前:664 mailto:sage [2009/01/26(月) 19:58:01 ] すまん、ワークシート関数と勘違いしました。 val(trim(変数))
666 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 20:58:54 ] >>663 元のデータは変えちゃいけなくて、VBAでなんとかするなら上のレスのとおり。 修正してもいいんならシート全体を選択してコピー→そのまま貼り付けして、 黄色いびっくりマークをクリックして「数値に変換」
667 名前:デフォルトの名無しさん [2009/01/26(月) 20:58:56 ] 質問よろしいでしょうか。 乱数を生成させて、結果によって単純な算術演算を行うプログラムで統計を取っています。 会社のPCで結果が出るまでに2時間はざらなのですが、 会社のCPUがpen4 3Ghz 自宅のCPUがcore i7 940 2.93Ghz 単純なプログラムなので、劇的にはかわらないまでもすこしは早くなるかと思ったんですが、 逆に遅くなりました。 8コア中 1コアしか使用率があがらなかったので、単純にクロック数の問題だと思うのですが、 VBAで8コアフルに稼動させるようなソースは書けるんでしょうか? しかし、前の乱数値の結果が次に影響するような演算なので、 追い越してなにかを処理しておくというのは意味なさそうです。
668 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 21:00:29 ] >>663 csvでも取り込んでいるのかな? csvファイルの仕様がおかしいんで内科医?
669 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 21:04:13 ] >>667 そりゃ無理だ。VBAが今後マルチスレッド化されたとしても、単純なプログラムでは1コアしか使いようがない。 まさかとは思うが、シートの更新を止めてないとか言わないよな。
670 名前:667 [2009/01/26(月) 21:10:32 ] >>669 ですよね;−; シートの更新は止めています。 シートへのアクセスも極力抑えて、演算に必要な数値はすべて配列で確保しています。 実行時間は単純に量の問題です、10億試行とかそういう回数なので…
671 名前:デフォルトの名無しさん [2009/01/26(月) 21:11:18 ] www.nicovideo.jp/watch/sm5947975
672 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 21:14:15 ] >>668 単純なcsvの読み込みなら、たとえ " 123 " みたいにダブルクォートで囲ってあっても 強制的に数値化されてしまうので逆に困るくらい。
673 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 21:17:18 ] >>670 そんなに回数が多いならVBAじゃなくてもっと演算向きの言語にしなよ。 必要ならそいつをVBAで起動すればいいんだし。
674 名前:デフォルトの名無しさん [2009/01/26(月) 21:18:21 ] 664-666 ありがとうございます。 明日試してみます。
675 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 21:23:52 ] >>670 10億回程度のループならそんなに多いとは思わんけどな。 無駄に時間のかかるプログラムって、アルゴリズムやコーディングに問題があることが多いけど、 誰か詳しい人には相談した? それから基本的なこととしては、Variant型の変数は使ってないよな? あとは乱数の発生を別のプロセスにやらせてファイルにどんどん書き出していくとか、 そもそも数値計算にVBAを使うこと自体が疑問なので、全体をコンパイラで書き直すとか。
676 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 21:26:21 ] 675の言うことには耳を貸さないのが吉
677 名前:667 [2009/01/26(月) 21:43:17 ] いろいろアドバイスありがとうございます。 すいません統計などと洒落たことを言ってしまいましたが、 プログラム自体はパチスロ機のシミュレータです。 自分ひとりでつかうならいいんですが、 プログラム知識0の人へのインターフェイスや出力、視覚化も兼ねているので…。 そして残念なことに、このシミュレータの作成は片手間でやらないといけないので、 うまいこと作り直す時間も知識もありません…。 同じ課でたまたまプログラムの知識があった私が任されています… ので同じ課にはわかる人はいません…。 もちろん実機担当に質問はできますが、手一杯だとは思います…。 アルゴリズムはやりようがあると思いますがなるべく実機に近くなるようにしています。 実機はもちろん人の操作によって一連の流れになるので、 アルゴリズムも単純な上から下です。 実行時間は現状でそれなりに満足しています。 10億試行は最終的段階なので、普段は5分とかそういうレベルです。 ただ、環境(CPU)による違いがなかったので質問した次第です。 気遣いありがとうございました。
678 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 22:31:23 ] 会社のCPUがpen4 3Ghz 自宅のCPUがcore i7 940 2.93Ghz で逆に遅くなるってのは悲しいな 結局クロックが全てか てか 実機担当って職業プログラマーが居る、その会社は何だろう 気になる
679 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 22:41:48 ] パチンコ機屋じゃないの?
680 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 23:30:39 ] >>678 うちは北森コアのPen4 3.4CGHzとi7 965(3.2GHz)を使ってるが 1スレッド処理でもi7の方が速いぞ そもそもCPIもバス帯域もメモリコントロールも拡張命令も勝っているi7が 0.07GHz程度の実周波数の差程度でPen4に負けるのはおかしい 会社のPCがベースクロック3GHzの石を使ってOCしてるとかじゃなければ 君が自宅で使ってるi7のPCは、構成に問題有りで何処かに極端なボトルネックが 発生していると思われる
681 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 23:32:56 ] 質問です。 EXCELシートにハイパーリンク貼って、そのシートをブラウザでプレビューすると ブラウザにもハイパーリンクが表示されるけど そのブラウザ上のリンクをクリックした時に Private Sub Workbook_SheetFollowHyperlink を起動することってやっぱ無理かな?
682 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 23:38:43 ] >>680 自宅PCは省電力でクロックダウンしているんじゃないか?
683 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 23:59:12 ] >>681 自分でHTMLとVBScript or JavaScriptでそういうコードを書けばできなくもないだろう。 つまり、VBAでは無理だ。
684 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 00:37:43 ] 何かにCPUパワーを喰われてるとか 「遅くなった」のが実は0.01秒程度の差だったとか もし自作ならドライバがちゃんと入ってないとか
685 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 04:47:10 ] CommandButtonでClickイベントが呼ばれたときに、そのボタンのキャプションを取得したいのですが、 よい方法はありませんでしょうか? ネットのフォーラムなどの情報では、 ActiveSheet.Buttons(Application.Caller) や ActiveSheet.DrawingObjects(Application.Caller) などでオブジェクトを取得できるとあるのですが、 プロパティがない、などと言われます。 代替手段はないものでしょうか? 環境:Excel2007
686 名前:685 mailto:sage [2009/01/27(火) 04:54:33 ] すいません。そもそも _ClickイベントやMouseDownなどではApplication.Callerは使えないですね。 どうしたらよいのだろうか
687 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 05:11:01 ] >>686 押したボタンのクリックイベントに適当に書くのが普通じゃない?
688 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 05:23:04 ] >>685 コマンドボタンには2種類あるでしょ。 挿入を選ぶとコントロール(部品)の一覧が出てきて 上段が「フォーム コントロール」、下段が「ActiveX コントロール」ってなってるやつ。 下段の方のボタン使ってる?
689 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 05:38:13 ] >>685 「マクロの登録」で登録されたマクロはコマンドボタンのクリックで呼び出される Sub test() MsgBox ActiveSheet.Buttons(Application.Caller).Caption End Sub
690 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 05:43:14 ] >>688 マクロが登録できるのはフォームコントロールの方だぞ
691 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 06:11:34 ] >>686 そもそもCommandbutton1のClickイベントで呼ばれるのはCommandbutton1_clickなんだから、 Private sub commandbutton1_click Msgbox commadbutton1.caption End sub で、いいんじゃねーの? クラスモジュール使って擬似コントロール配列にしてるとしても、どうにでもなんじゃん アホなの?
692 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 07:45:56 ] >>690 両方出来るぞ
693 名前:685 mailto:sage [2009/01/27(火) 10:53:06 ] 教えて! Watch Excel VBA Application.caller エラー2023について oshiete1.watch.impress.co.jp/qa4024188.html ここの方法でいけましたが、もう少しスマートな方法がないかな?と。 >>687 >>691 10個あったら、10個分イベントと名前の組をかかないといけないですよね。 冗長性があります。 >>689 ActiveXの方では無理っぽいです・・・ >>688 ActiveXの方を使っています。 やりたいことはボタンのキャプションを取得することなので、 できるのであればフォームコントロールの方でもよいのですが・・・
694 名前:685 mailto:sage [2009/01/27(火) 10:57:08 ] URL間違えました。こちらでした。 moug|即効テクニック | コマンドボタンのクリックイベント内でボタン名を取得するには www.moug.net/tech/exvba/0150059.htm
695 名前:デフォルトの名無しさん [2009/01/27(火) 16:07:22 ] シート保護はprotectで非保護はunprotectでいいですか?出先なので簡単な質問ですが。
696 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 16:13:46 ] >>695 いんじゃね
697 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 16:19:40 ] ありが十匹!!
698 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 20:14:57 ] >>693 一つのプロシージャに1行ずつ書き足すのが冗長性があると言ってるってことは、 擬似コントロール配列を使ってクラスモジュールで処理してるとしか考えられない訳だから、 取りあえず今使ってるソース出せ そしたら改良してやるから
699 名前:デフォルトの名無しさん [2009/01/29(木) 09:07:22 ] すみません初心者ですが質問です。 Msgboxに「月度を入力してください」と表示 →インプットboxに月(1〜12までの数字)を入力する画面を出して尚且つ、 1〜12以外の数字または文字を入力したら、「1〜12の数字を入力してください」 というエラーメッセージが出る→最後にまたMsgboxが出てきて「○月度ですね」と 表示するにはどう組めばいいでしょうか。 ○には入力した月数を出したいのですがよろしくお願い致します。
700 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 09:08:34 ] >>699 VB初心者スレへどうぞ。
701 名前:デフォルトの名無しさん [2009/01/29(木) 11:00:04 ] >700 すみません、VBAの初心者スレは探しましたが無いみたいです。 どなたかお願い致します。
702 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 12:15:27 ] >>699 流れは大体できてるように見えるのだが・・・ 「インプットboxに入れられたものを数値にして1〜12だったら抜ける」ってことを Do〜Loopを使って組めばいいだけ
703 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 14:29:53 ] 超初心者です。 何個か開いたファイルの中から、特定のファイルを探す。 という単純な事がしたいのですが ファイル名が例えば「経理ファイル200812.xls」のように、 月によってYYYYMMの部分が変わってしまいます。 開いたファイルの中から、ファイル名に「経理ファイル」が付いているファイルをアクティブにしたい場合 どのようにすればよいでしょうか。 ワイルドカードが使えないかと思ってやってみているのですが よろしくお願いします。
704 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 15:01:32 ] dim b as workbook for each b in workbooks if b.name like "経理ファイル*" then b.activate end if next
705 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 15:53:30 ] >>704 できました!! ありがとうございました。
706 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 18:39:44 ] 質問です h = 1 Do Until Cells(h, 6).Value = "" If Cells(h, 3).Value = Cells(h + 1, 3) Then Cells(h, 6).Value = Cells(h, 6).Value + Cells(h + 1, 6).Value Rows(h + 1).Delete End If h = h + 1 Loop 2行のときは1行にできるのですが、3行以上のときも1行にしたい場合どのようにすればよいでしょうか
707 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 18:57:21 ] >>706 最初に見つけた位置のhを保存しといてそこに入れていく
708 名前:707 mailto:sage [2009/01/29(木) 19:00:08 ] 違ったな 「Deleteしたときはhをインクリメントしない」かな?
709 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 19:45:32 ] End Ifの前にh = h - 1で解決しました ありがとうございます
710 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 23:41:33 ] >>701 頭だけでなく眼が悪いんでしょうか。 VBA ( V B A ) のスレではなく、VB ( V B ) のスレへどうぞ。
711 名前:デフォルトの名無しさん mailto:sage [2009/01/29(木) 23:59:42 ] OS XP EXCEL2003 dteProductDay=format(date,゙yyyy/m/d゙) cells(1,1)=dteProductDay というように、システムの日付を整形してセルに表示させたいのですが、 フォーマット通りに表示されず1/29/2009となります。何が悪いのでしょうか。
712 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 00:09:19 ] >>711 書式を変えるか、または文字列で
713 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 02:12:09 ] >>711 的外れかも知れないが 表示するセル自体の書式を適切に設定しないとそうなる。 そのフォーマットだと、変数に代入された値は2009/1/29となるので エクセルはこれを日付と認識し内部的に日付のシリアル値として値を保持するのでは。 たとえばdteProductDay=format(date,゙yyyy m d゙) とするとセルには「2009 1 29」と表示される。
714 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 12:23:35 ] OS-XP Office2003 Shiftキーを押しながらドラッグでセルの移動ができますが、 Shiftキーを押さなくても常にセルを移動することはできますか。 もしくはExcel上でのみ、Windowsの固定キー機能のように Shiftキーを押しっぱなしにすることはできないでしょうか。 キーボードでなら、たとえば上に移動したい場合 ActiveCellを取得して、真上のセルと置換していけばできそうなんですが。
715 名前:711 mailto:sage [2009/01/30(金) 20:50:12 ] >>712-713 ありがとん cells(1,1)= "'" & dteProductDayでうまくいきました。
716 名前:7777 mailto:sage [2009/01/30(金) 22:31:30 ] エクセルでシート1で例えばF団体をA列の1で書いてそれを シート3のD列の3に自動記入させるマクロは分かるんだけど シート1でF団体がA列の1以外になっても自動記入できるマクロある? あるなら教えて
717 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 23:07:32 ] 日本語で質問できない人お断り
718 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 23:08:56 ] >>716 Private Sub Worksheet_Change(ByVal Target As Range) ~~~~~~~ どこに書き込まれたかはTargetという変数に入ってる
719 名前:7777 mailto:sage [2009/01/30(金) 23:13:26 ] 718さん 意味がわかりません
720 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 23:18:17 ] 日本語読めない人お断り
721 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 23:31:13 ] Worksheets("シート3").Range("D3") = Worksheets("シート1").Range("A1") みたいにセル名が固定ならわかるけど、コピー元のセルが不定の場合はどうするかって質問でしょ?
722 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 23:53:13 ] F団体ってなんだろ…新しい宗教か?
723 名前:7777 mailto:sage [2009/01/31(土) 08:51:59 ] >>721 うん!!そのとおりです
724 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 09:19:07 ] >>723 A1とA2の両方に値がある場合はどちらを採用するの?
725 名前:7777 mailto:sage [2009/01/31(土) 09:52:09 ] >>724 1月23日 団体名 内容 F団体 このときF団体がAの2列に書いてるけど Aの2列にD団体を記入して Aが3列になってもシート3のまとめシートには自動記入できるかなぁって
726 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 10:06:03 ] >>725 1対1対応ならなんの問題もないでしょう? それから行と列を区別して書いてたほうが他人に伝わりやすいですよ。 ABCは列 123は行
727 名前:7777 mailto:sage [2009/01/31(土) 10:42:31 ] A列からD列の10行までの範囲がコピー範囲のときは どうマクロ組むの?
728 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 11:15:45 ] >>727 マクロ記録してみたら?
729 名前:7777 mailto:sage [2009/01/31(土) 11:34:10 ] できました! ありがとうございました。
730 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 11:39:37 ] 俺が質問を理解できないうちに解決か
731 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 13:05:52 ] >>730 VBAを使うやつは問題をミクロにとらえ過ぎている。 もっとマクロなレベルで考えるんだ。 コピー元とコピー先の対応がどうなっているかだけ理解したらできるかできないか判断できるだろ?
732 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 15:18:32 ] EXCELを使うのは本来はすんごく高度なスキル(=異常な思考様式)が必要 そうでもない人、もしくはそういう発想をするのがヤな人がVBAを使うのだが、 VBAは最高級のBASICの一つで、これだけでも結構重量物 (VB.NETはこれは超ベテランが使う言語で、これからいきなり始めるのだ けはやめたほうがいい) VBAの入門に向いているのはExcelよりかAccessだね。Excelだと動作 は遅いはExcelと基本的に合わないわでロクなことないね。
733 名前:7777 mailto:sage [2009/01/31(土) 15:24:34 ] いやできてないんだけど マクロ記録とは?
734 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 16:13:28 ] もういいから帰ってくれ!
735 名前:7777 mailto:sage [2009/01/31(土) 17:09:51 ] ひどすぎ
736 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 17:10:34 ] >>725 マクロの前に日本語を勉強した方が… でも一応想像してみた シート1 年月日 団体名 内容 1/23 F団体 陳情 1/26 D団体 年始挨拶 1/27 A団体 予算ヒア みたいに日付ごとの日報が書いてあって 団体ごとに各シートに抽出したいんじゃないのか? でもこれだったらわざわざ聞いてこないよな。
737 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 17:50:16 ] 確かにそれだったらその辺のOL捕まえた方が手っ取り早いな。
738 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 19:48:09 ] 長文ですがお許しを 最近クラスモジュールを勉強しているんですがプロパティの設定で Letがうまくいきません。 WindowsXPSP3、Excel2003 クラスモジュール内容 Private m_TestValue As String Public Property Get TestValue() TestValue = m_TestValue End Property Public Property Let TestValue(ByVal New_Value As String) m_TestValue = New_Value End Property で標準モジュールに Public Sub Test() Dim Test As Class1 Set Test = New Class1 Test.TestValue = "testtest" MsgBox Test.TestValue End Sub として実行するとプロパティプロシージャの定義が一致していないというコンパイルエラーが出ます。 これはなぜでしょうか?
739 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 20:07:43 ] Public Property Get TestValue() As String もしくは Public Property Let TestValue(ByVal New_Value As Variant) Getの戻り値の型と、Letの最後の引数の型 つまり、ひとつのプロパティの型は一致させてください
740 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 21:01:13 ] なるほど!Property Getの戻り値も型を指定する必要があるんですね。 m_TestValue変数の型を指定していてそれを返しているから てっきりそれだけでいいと思ってた。 ありがとうございました。
741 名前:デフォルトの名無しさん mailto:sage [2009/02/02(月) 00:36:34 ] ブックAにブックBへのハイパーリンクを張って、ブックBの Private Sub Workbook_Open() 内で色々と処理をしているのですが、 ブックA内のハイパーリンクをクリックした時にブックBを表示させずにその後の処理を実行する方法はありませんか?
742 名前:デフォルトの名無しさん [2009/02/02(月) 00:57:32 ] 初心者です。教えてください。 今フォームを使ってデータの抽出をするプログラムを作っています。 データは階層構造になっています。 仮に3階層あるとして、フォームにその3階層をプルダウンで指定してやると条件に一致したデータが表示されるようにしたいのです。 その際、上位階層をプルダウンで指定すると、その上位階層が包含する下位階層のみが プルダウンで表示されるようにしたいのですが、どうしたらいいのでしょうか。 フィルタオプションを使用しようと思うのですが、可能でしょうか? 困っています。教えてください。
743 名前:デフォルトの名無しさん [2009/02/02(月) 01:47:00 ] こんばんは。すみません、エクセルの質問させてください。 ブックAのシート1のA1にブックBのシート1のA1からA5を、足した結果をだしたい場合、どの様に入力すればよいですか? どうかおしえてください。お願いします。
744 名前:デフォルトの名無しさん mailto:sage [2009/02/02(月) 04:53:09 ] >>741 ハイパーリンクでは、ブックを非表示で開くことは出来ない ハイパーリンクをボタンとかに変えて、ブックAのVBAからブックBを非表示で開きましょう 因みにVBAからブックを非表示で開く方法は、幾らでも情報有るから自分で調べましょう>>1 ★5 >>742 入力規則のリストの連動ならまだしも、Excel用ではなく汎用ActiveXのコンボボックスの連動は Excelに関係ない話なのでスレ違いです>>1 ★3〜★4 とりあえずVB6用の方法がほとんどそのまま使えるし、サンプルも転がってる >>743 WorksheetFunction.Sum 中に入る式は、普通にシート上で入力する式と同じだから解るよな? まあ解らなくてもスレ違いだから自分で調べろってことになるが
745 名前:741 mailto:sage [2009/02/02(月) 21:58:13 ] >>744 741です。 お答えありがとうございます。 うーん、やはりハイパーリンクでは無理でしたか。 私の作った処理をもう少し詳しく言うと ハイパーリンクをクリックするとそのセルがアクティブになることを利用して ブックBのPrivate Sub Workbook_Open() の中で Workbooks("B.xls").Worksheets(1).Cells(1, 1) = ActiveCell.Offset(0, 1) みたいな感じでハイパーリンクの隣のセルの情報を転記するという処理を行っていたのですが。 例えばA1とA2のセルの上にセルと同じ大きさのボタンを作り、両方のボタンに同じマクロを登録して A1の上に作ったボタンをクリックするとB1の情報を転記し、A2の上に作ったボタンをクリックするとB2の情報を転記する という処理って作れますか? ハイパーリンクみたいにクリックするとその下のセルがセレクトされるみたいな処理が作れればいいんですけど。
746 名前:デフォルトの名無しさん mailto:sage [2009/02/03(火) 00:52:18 ] >>745 作れるよ ボタンに限らずオブジェクトには配置されてるセルアドレスを返すプロパティがあるから それが何かくらいは自分で調べようね
747 名前:デフォルトの名無しさん mailto:sage [2009/02/03(火) 07:39:03 ] >>742 Private Sub Select change AddItem
748 名前:741 mailto:sage [2009/02/03(火) 23:43:31 ] セルを左クリックするとマクロが起動する処理って作れませんかね? Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) というのを使うと目当てのセルをクリックしただけでマクロを起動できるようになったんですけど エンターを何回か押していたらその目当てのセルまでアクティブが移動してしまって望まないタイミングでマクロが起動されてしまいます。 そうではなくあくまでクリックした時にマクロが起動できるようにしたいんですけど、いい方法ありませんか?
749 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 00:04:20 ] >>748 WorkSheetにはクリックイベントがないから、 セルに同じサイズのボタンを貼り付けるぐらいしかないんじゃ
750 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 00:38:21 ] ワークブックにWorkbook_SheetBeforeDoubleClickてイベントに有るし Workbook_SheetBeforeRightClickっていうのも有るし、シート名を取得して実行すれば良いのでは?
751 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 01:35:00 ] >>750 普通「クリック」と言えば左シングルクリックのことだろう。 右クリックやダブルクリックイベントでどうしろと。
752 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 02:43:54 ] それ言い出すと、>>749 も セルをクリックで処理したいって言ってるのに ボタンクリックでどうしろと ってことになるな。 俺は>>749 も>>750 も代用法のひとつとして有用な情報だと思うけどね。 >>749 も書いてるが「セル」の「左(シングル)クリック」イベントは無いから、 対象が「セル」であること(ボタンなどを配置しなくても済むこと)を優先するなら>>750 「左シングルクリック」で操作できること(ダブルクリックしなくて済むこと)を優先するなら>>749 ってことでいいじゃん。 俺の場合、目当てのセルが複数ならダブルクリックイベントで、ひとつならボタンで妥協するかな。
753 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 02:55:30 ] ボタンでやってみたけど、色を透明にしておいてもクリックするとなぜか灰色になって 下のセルが見えなくなっちゃうんだな。XPと2003の環境で。 代用案として出すなら、イメージコントロールを貼り付けて透明なGIFを貼った方がよさそう。
754 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 16:22:39 ] ボタンの代わりか・・・ つラベル
755 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 20:43:07 ] なぜ“左”クソツクなのか。右でいいやん。
756 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 20:48:34 ] 作った本人が使うんならいいけど、人が使う物なら標準と異なるUIは避けるべきかと
757 名前:741 mailto:sage [2009/02/04(水) 20:59:06 ] 741です。 皆さん色々とありがとうございました。 とりあえずボタンでやってみようと思いますが、 745でも言ってるように複数張ったボタンの内一つを押した後それに応じたセルを指定する方法が いまだにわからない状態です。 とりあえずもうちょい調べてみます。
758 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 21:05:26 ] >>757 VBAにはコントロール配列が存在しないから、 ボタンをたくさん貼ればボタンの数だけ独立したイベントハンドラが作られる。 だから、ボタンごとに各セルの処理をずらずらっと並べて書けばいい。 冗長だし面倒だけど。 さもなくば、ボタンの座標とセルの座標を比較して、重なった位置のセルを探し出すとか。
759 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 21:30:54 ] 疑似コントロール配列使おうよ クラスの作り方工夫すれば、疑似コントロール配列にした上で 処理は同じだが対象は違うというようにも出来るし、 そもそもボタンがどのセル上に配置されてるかは取得できるし
760 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 21:53:42 ] 質問です Sheets("sheet1").Select Dim MyRange As Range Set MyRange = Columns("A").Find(What:=Sheets("Sheet2").Range("A1")) いくらやっても検索値がnothingになってしまいます どこを変えればうまく検索できますか
761 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 22:03:34 ] Sheets("Sheet2").Range("A1")に入っている値が Sheets("sheet1")のA列に存在しないとnothingになるけど
762 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 22:28:03 ] >>760 別にどこも間違ってないから、原因として考えられるのは、本当に探してるデータが存在しないか、検索条件が違ってるか、だな。 それでもうまくいかない時は、Findメソッドの検索条件を省略せずにきちんと書いてみる。一例を書くとこんな感じ。 Set MyRange = Columns("A").Find(What:=Sheets("Sheet2").Range("A1"), LookIn:=xlFormulas, LookAt:= xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, MatchByte:=False, SearchFormat:=False)
763 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:33:13 ] Flash持ってるなら、Flashの透明ボタン張るのが一番良いと思う。
764 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:03:24 ] 質問です。 Dim v(1 To 10) As Long とするのと Dim a(1& To 10&) As Long とするのはどっちがいいですか?
765 名前:764 mailto:sage [2009/02/05(木) 00:05:42 ] すいません。 vとaとなりましたが、どっちもvです。
766 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:08:28 ] Columns("A")もまずいな。 シートモジュールに書いてるかも知らんしな。 ちゃんとシートくらいは指定汁.
767 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:09:34 ] >>764 この場合、配列のサイズはコンパイラが解釈するので型指定は意味がないと思う
768 名前:764 mailto:sage [2009/02/05(木) 00:23:21 ] >>767 そうなんですか。ありがとうございます。
769 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 11:43:29 ] OS XP / EXCEL2003 です。 仮に「A」というファイルがあったとして「A」のVBAから、 別のファイル「B」の「ActiveX コントールのコンボボックス」の値を参照することは可能でしょうか?
770 名前:デフォルトの名無しさん [2009/02/05(木) 15:25:43 ] sheet1を選択している状態で以下のマクロを実行しても sheet2のAAAという文字列がBBBに置換されません sheet2ではなく、sheet1のAAAが置換されます Worksheets("Sheet2").Select Cells.Replace What:="AAA", Replacement:="BBB", MatchByte:=False
771 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 15:31:17 ] >>770 1行ごと(処理ごと)にいちいち対象となるシートを書かないとActiveSheetが処理される。 Worksheets("Sheet2").Cells.Replace What:="AAA", Replacement:="BBB", MatchByte:=False または、 Worksheets("Sheet2").Select Selection.Cells.Replace What:="AAA", Replacement:="BBB", MatchByte:=False みたいな感じにしなきゃいけない。 確認してないからオブジェクトのエラーが出るかもしれないけど、基本的な考え方としてはこんなところ。
772 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 15:33:20 ] >>769 可能です
773 名前:769 mailto:sage [2009/02/05(木) 18:35:27 ] >>772 ご返答ありがとうございます。 もし良かったら何か例文を載せて頂けないでしょうか。
774 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 19:10:09 ] フォーム上に配置したWEBブラウザコントロールを印刷したいのですがうまくいきません。 印刷はフォームのPrintFormメソッドを使っています。 コマンドボタン・ラベル・テキストボックス・コンボボックス等は印刷されるのですが WEBブラウザが配置されているところは空白になってしまいます。 検索してみたところAPIを使用する方法を見つけたのですが理解することができませんでした。 APIはブラウザ表示内容を画像として取得する方法だったのですが それをイメージコントロールに貼り付けるという流れになるのでしょうか? よろしくお願いします。
775 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 03:46:41 ] >>773 >>1 ★5の通り、ここはヒントだけで自分でコード書ける人用のスレなので例文は書きません とりあえずヒントとしてBのブックオブジェクトさえ作ってしまえば、あとはBから取得するのと変わらないと言っておく >>774 >>1 ★3,4 Excelと直接関係ない汎用コントロールの話はスレ違いです
776 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 10:08:58 ] あのさー、何度も言ってるけど>>1 はスレの合意じゃないから。 誰かが勝手に書いて、次スレ立てるときにコピペしてるだけ。 気に入らない発言はスルーしろよ。
777 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 10:34:26 ] >>770 だから標準モジュールじゃなくシートモジュールに書いてるんだろ? SHeet2のシートモジュールに書いてればCellsの親はSheet2なんだよ。 いちいちSelectしないコーディングを心がけてりゃそういう間違いはおかさない。 Worksheets("Sheet2").Select Cells.Replace What:="AAA", Replacement:="BBB", MatchByte:=False こんなことしないで Worksheets("Sheet2").Cells.Replace What:="AAA", Replacement:="BBB", MatchByte:=False と書けば標準モジュールでもシートモジュールでもユーザーフォームのモジュールでも ThisWorkBookのモジュールでも無関係に処理できる。 >>760 も同じ間違いだ・
778 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 10:37:42 ] ちょっとミスった。 >>777 の3行目は Sheet1のシートモジュールに書いてればCellsの親はSheet1なんだよ。 に訂正。 >>771 も嘘書いちゃいかん。 ActiveSheetが処理されるとは限らないんだよ。
779 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 10:42:36 ] >>776 気に入らない発言はスルーしろよ。
780 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 10:42:54 ] フォルダ「A」に 「A」「1」「2」「3」というファイル名のExcelワークシートが4つあります ファイル「A」のcell(P1:DY1850)の数式をコピーし「1」「2」「3」のcell(P1:DY1850)に自動的に貼り付けていきたいのですが どのようにすればいいのでしょうか? よろしくおねがいします
781 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 10:43:52 ] >>779 これ言っとかないと、>>1 を理由にスレ違い認定したがる奴が増えるかもしれんからな。
782 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 10:48:13 ] >>780 まずマクロの記録をやってみろ
783 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 11:41:22 ] ★使ってるのは多分一人。 気に入らないなら無視すれ。
784 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 12:32:05 ] >>1 のテンプレが無かった頃から、同じ様な内容の指摘は多々あったので 指摘が>>1 ★n形式か、毎回文章で書かれるかの違いでしかないんだけどね 反抗期の子って、対象が形(テンプレ)になると妙に反発心燃やしたりするけど そもそもテンプレったって、書いてあることを端的に見れば 「バージョン情報書け(★1)」「他分野の話を持ち込むな(★2〜4)」「丸投げするな(★5)」「マクロの記録くらい試せ(★6)」 だけ これに反発してる子って、バージョン情報不要だと思ってるの? COMやOCXやWin32APIの話から、VB言語で組める全てのアルゴリズムの話までオールOK? そして丸投げも大歓迎で、マクロの記録なんて試すくらいなら、俺が親切丁寧にコード書いちゃるってか? 実のところはそんなこと無いだろ? 結局形有る物に反発したい年頃なだけで、根底は>>1 の内容に賛同してるんだろ? 上記3つともOKなら、「>>1 は絶対のルールじゃない」とか「気に入らないなら無視しろ」とか みみっちいこと書くのではなく、それこそ「気に入らない"スレ違い指摘"は無視」して、ちゃっちゃと答えちゃえば スレ違い指摘の意味すら無くせるので一番効果的なはずなのに、それをしないのが何よりの証拠 と、暇なので長々と書いてみたが、「気に入らないなら無視すれ。」 言ってる本人が出来なかったら恥ずかしいからなw
785 名前:769 mailto:sage [2009/02/06(金) 13:13:03 ] >>775 ご返答ありがとうざいます。 ブックオブジェクトを作るとのことだったので、 a.xlsに下記のように記述し実行してみたのですがエラーになってしまいました。 アドバイスを頂けないでしょうか。 Workbooks.Open Filename:="c:\b.xls" Workbooks("b.xls").Activate MsgBox Application.Workbooks("b.xls").ComboBox1.Value ←ここでエラーになります。
786 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 13:15:27 ] >>784 落ち着けよ
787 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 13:17:16 ] >>784 つまり、俺様はスレ違い認定する権利があってそれをするのだが、お前はそれに口出すな、ってことですね。
788 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 13:20:36 ] >>786 とりあえず落ち着け
789 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 13:31:10 ] >>785 コントロールの前にシートを指定していないせいだ
790 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 13:34:51 ] >>784 が★使ってスレ違い認定する奴だってことは分かった。
791 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 13:47:00 ] >>787 別に口出ししてもいいよ ただ、本当に>>1 が気に入らないなら、スレ違い指摘してる奴に ムキになって食い付くより、そんなの無視して答えちゃえばいいじゃんと 口出すなと言ってるのは>>776 他 >>790 もちろん俺も使ってるよ というか、改めて言うまでもなく解るように書いたんだがw
792 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 13:50:41 ] どっちがムキになってんだかw
793 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 13:55:11 ] 反論できないときは、相手を卑下して優位に立ったつもりになり 精神的安定を図るのが吉です
794 名前:769 mailto:sage [2009/02/06(金) 13:59:58 ] >>789 ↓でできました!!ありがとうございます。!!! MsgBox Application.Workbooks("b.xls").Sheets("Sheet1").ComboBox1.Value
795 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 14:13:36 ] これも>>1 に反発するなら、ブックだシートだとヒント出してる俺等を無視して、 丸投げ上等でスパっとコード書いちゃえばいいのに、何故それをしないんだろう? 結局は何かに反抗してみたい年頃なだけで、心底>>1 を否定してるわけではないんだよな
796 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 14:26:17 ] どうやって教えるかは決まってないし、人それぞれだから。 別にいきなり答えを書いちゃってもいいし、 それだと同じ人が何度も質問してきてウザく感じたりスレが荒れたりする可能性があるから、 できるだけ自分で考えるように誘導してやった方がいいと考える人もいる。 進行中の質問に別の回答者が割り込んで、いきなり答えだけを書いても何も問題はない。
797 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 14:54:01 ] 質問者だって、いきなり答えだけ書けよって思ってるかもしれないし まじめにVBAの勉強をしてるかもしれない
798 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 20:38:01 ] >>795 いや、俺は否定してるけど何か?
799 名前:Excel2003,XP home sp2 mailto:sage [2009/02/06(金) 20:42:54 ] 質問です 隠しシートに読み込んだCSVファイルの中身を出力しようとしているんですが元のシートのほうに出力されてしまいます。 シート参照のが仕方マズイのでしょうかヒントをください
800 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 20:50:52 ] ・どうやって読み込んだのか書け ・「元シート」とは何だ? ・「シートの参照」とは具体的に?
801 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 20:51:26 ] 追加 ・どこに出力しようとしてるのか書け
802 名前:Excel2003,XP home sp2 mailto:sage [2009/02/06(金) 20:51:33 ] ↑のコードtoku.xdisc.net/cgi/up/ttt/nm9199.txt
803 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 20:54:38 ] worksheets("隠しシート名").range(hogehoge
804 名前:Excel2003,XP home sp2 mailto:sage [2009/02/06(金) 20:56:24 ] >>803 やってみますありがとうございます
805 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 22:36:38 ] みんな落ちつけ。 落ち着いてExcelにFlash張りつけろ。
806 名前:デフォルトの名無しさん [2009/02/07(土) 00:03:53 ] >>805 Flashってなぁに?? 聞いたことあるけど、、実際どおいうことができちゃうの?
807 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 00:05:04 ] ググレカス
808 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 00:30:12 ] >>807 カスは>>799 まんま>>777 ちょっとぐらいは過去レス嫁と小一時間(ry
809 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 00:53:38 ] お前は過去スレに類似情報があると知ってるから読めと言ってるが、 大抵は類似情報なんかないのである。
810 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 01:21:59 ] >>809 大抵のまともな人間はまず自力で何とかしようとするモンだ それでも行き詰った場合に質問をするのがまともな人間の行動 だからお前みたいなヤツは、まともじゃない平均以下の存在価値の無い人間
811 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 01:26:40 ] >>810 質問する奴がいなくなっちゃうね。 このスレもういらないや。
812 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 01:27:56 ] おい、ここ2chだぞ。
813 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 01:29:47 ] いや落ち着け >>808 はツンデレだけどちゃんと教えてあげてる優しい人 そして 質問した>>799 は学習して次は現スレくらいは読むだろう
814 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 01:34:41 ] 流れがさっぱりわからん
815 名前:807 mailto:sage [2009/02/07(土) 01:37:17 ] >>808 は? >>807 は>>806 に言ったんだが、何か勘違いしてないか。
816 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 01:44:11 ] 過去レスなんか読まないのが今は普通なんだよ、オジサン
817 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 01:54:39 ] >>816 おばはんですが何か?
818 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 10:19:16 ] ♪けんかはやめてー
819 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 12:27:12 ] ↑喧嘩、早めてぇ
820 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 21:36:24 ] 何これ
821 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 12:26:13 ] コレクションのKey値を取得するにはどうすればいいんでしょうか? 具体的には、For Each In でコレクション内を回って、Key値がある値だった場合だけ、処理を実行させる というコードを作りたいのですが
822 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 15:42:15 ] >>821 Collectionでやりたいなら ' Module1 Dim col As New Collection Dim itm As Class1 Set itm = New Class1: itm.Key = "A": itm.Text = "123": col.Add itm, itm.Key Set itm = New Class1: itm.Key = "B": itm.Text = "456": col.Add itm, itm.Key Set itm = New Class1: itm.Key = "C": itm.Text = "789": col.Add itm, itm.Key For Each itm In col If itm.Key = "B" Then MsgBox itm.Text End If Next itm ' EOF ' Class1 Public Text As String Public Key As String ' EOF
823 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 20:42:26 ] 特定のBookを開いている時に エンターキーを押すごとにマクロを起動させることってできませんか?
824 名前:823 mailto:sage [2009/02/08(日) 20:43:22 ] 書き忘れましたが、EXCELは2003です。
825 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 20:54:06 ] >>822 おおクラスモジュールとかオブジェクト指向とかってやつですか・・・ やはりそういうのも覚えていかないと駄目ですね ただ今回は隠しシートを使って済ませることにしました 回答ありがとうございました
826 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 23:38:45 ] OSはXP Excel2000 VB6.0です ユーザフォームでツールボックスから「ピクチャボックスコントロール」と いう物を貼り付けたいのですが、ツールボックスに入っておらず、 方法がわかりません。 コントロールを追加しようとしたのですがそれらしいのが見当たらず。 ググってもピクチャボックスが選択できる事が前提のようなので 探すことができませんでした。 どうすれば表示されるのか教えていただけませんか?
827 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 08:45:49 ] >VB6.0です きっと誤爆だな
828 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 09:02:10 ] いやExcelのVBAから、VB6のインストール時に導入される ピクチャボックスを使いたいってことなのでは? しかしVB6使ってる人なら、こんなの簡単に解るはずなんだがな 因みにVB6持って無くて、ランタイムだけ入れてるとかは無しね それじゃダメだから
829 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 12:12:54 ] >>823 キーボードやマウスを使ったイベントはAPI使わないと無理
830 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 20:41:23 ] 実行しているsub名を取得する事は出来ますでしょうか。 sub aaa() msgbox bbb '←aaaと表示したい end sub よろしくお願いします。
831 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 20:56:33 ] >>830 >>1 ★3,4
832 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 00:30:35 ] >>830 実行しているsub名を取得することはできないけど、次のようなことをするのは可能。 sub aaa() msgbox "placeholder" end sub というコードを sub aaa() msgbox "aaa" end sub というコードに書き換えるようなこと。 ところで、何でそれ知りたいの?
833 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 00:39:59 ] subの最初に適当な変数にsub名を入れとけばいいじゃん
834 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 00:46:13 ] >>833 たしかに。 そういうの思い付く人と思い付かない人って 何が違うだろね
835 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 00:51:12 ] そういう事か? msgboxは質問時の方便で常時表示させたいんじゃないのか 今何の関数に飛んでますとか
836 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 00:57:13 ] 質問者のレス待てよ
837 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 01:30:14 ] EXCEL2003です。 特定のフォルダの中に、テスト.xls、テスト1.xls、テスト1000.xls、という3つのEXCELがあるとして killを使ってテスト.xls以外のブックをすべて削除する処理を作りたいと思っています。 kazu = "*" Kill "\\フォルダ\テスト" & kazu & ".xls" だとフォルダ内の3つはすべて消してしまうんですよね。 「テスト」の後に何もつかないブックだけを消さずに残すにはどうしたらいいでしょう?
838 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 02:03:56 ] "テスト1*.xls"
839 名前:デフォルトの名無しさん [2009/02/10(火) 04:24:49 ] かなりど素人なのですがEXCELでA列に文字を入力する際、A列の最終行数を ランダムにしたいのですがどうすればいいでしょうか? わかる方よろしくお願しますm(__)m
840 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 04:29:13 ] >>839 こんな感じかな A列のランダムな位置に文字を入れる 乱数 = Int(Rnd(1) * 65536) + 1 セル = "A" & 乱数 Range(セル) = "文字"
841 名前:デフォルトの名無しさん [2009/02/10(火) 04:31:48 ] ありがとうございます●〜*
842 名前:デフォルトの名無しさん [2009/02/10(火) 04:40:29 ] >>840 できました〜。 ホント感謝です(^−^)
843 名前:デフォルトの名無しさん [2009/02/10(火) 20:09:04 ] 質問です。 excel2000VBAでADOを使用して郵便番号データベースを参照したりいろいろしようと思い、とりあえず例のような条件(県は兵庫県、市と区は〜長田区・住所は読み仮名がイから始まるもの全て表示)で抽出したときの候補をずらずらと出したいと考えて組んでみましたが For Each dbFld In dbRes.Fieldのあたりで「型が一致しません」というエラーが出てしまいます。 Sub CMD_New_Click() Dim dbRes As ADODB.Recordset Dim dbFld As ADODB.Fields Dim dbCon As ADODB.Connection Dim strSQL As String Dim i As Integer Set dbCon = New ADODB.Connection dbCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.Path & "/KEN_ALL.mdb;" strSQL = "SELECT KEN_KANJI,SHI_KANJI,CHO_KANJI,CHO_KANA FROM YUBIN WHERE KEN_KANJI='兵庫県' AND SHI_KANJI LIKE '%長田区' AND CHO_KANA LIKE 'イ%';" Set dbRes = New ADODB.Recordset dbRes.Open strSQL, dbCon, adOpenKeyset, adLockReadOnly If dbRes.EOF <> True Then Set dbFld = dbRes.Fields For Each dbFld In dbRes.Fields Sheet1.Cells(1, i) = Trim(dbFld("KEN_KANJI").Value) Sheet1.Cells(1, i) = Trim(dbFld("SHI_KANJI").Value) Sheet1.Cells(1, i) = Trim(dbFld("CHO_KANA").Value) i = i + 1 Next dbFld Else MsgField1.Caption = "見つかりません" End If End Sub どのように直すとよいのでしょうか?よろしくお願いします
844 名前:843 [2009/02/10(火) 20:12:44 ] 補足です。 For Each を使わずに走らせると、正常に動作する(兵庫県神戸市長田区イカニケイサイガナイバアイ) と表示されるため、SQL文やデータベースを開くことに失敗している可能性は低いです
845 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 20:18:39 ] >>844 まずForの直前でDebug.Print TypeName(dbRes.Field)ってやって、 Fieldメソッドがコレクションを返してるかどうか確認汁。
846 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 20:21:47 ] ごめん。今のなし。 よく見たらこの2行が矛盾してる。 Set dbFld = dbRes.Fields For Each dbFld In dbRes.Fields setの行を削除してみ。
847 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 20:40:56 ] エラーの原因は、 ×Dim dbFld As ADODB.Fields ○Dim dbFld As ADODB.Field じゃね? Set dbFld = dbRes.Fieldsは無しで。 しかし、 Do Until dbRes.EOF ... dbRes.MoveNext Loop で回す部分が無いし、 出力先が全部Sheet1.Cells(1, i) ってのもおかしかろ?
848 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 22:06:52 ] Option Base 1って邪道ですか? 先々で弊害とか出ます?
849 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 22:19:30 ] >>848 昔はちょっとでもメモリを節約するために、用途に合わせて配列の範囲を削ってた。 VBAなら配列の範囲は自由に決められるからあんまり意味はないと思う。 盲腸みたいなもんだな。
850 名前:830 mailto:sage [2009/02/10(火) 22:23:28 ] すみません。スレ違いと指摘を受け、昨日はレスできませんでした。レスありがとうございます。 皆さんが仰る通り、現在はsub名をコピペして、文字列として組み込んでおります。 なぜこの様な事をしているかと言いますと、 論理チェックのプログラム集合体を作成しています。(500個くらい) 現在、チェックのリストに振ってあるナンバーをsub名としております。 論理エラーがプログラムで検出された場合、sub名=チェックナンバー とエラーの内容を吐き出し、 チェックナンバーを主キーとして、リストからエラーメッセージを取得しています。 チェックナンバーをコピペして出力するのは問題無く出来ているのですが、 sub名を取得出来れば、コピペのミスが減ると思い、質問させていただきました。
851 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 22:44:46 ] >>850 ExcelのVBAではモジュール名を取得する方法はない。 すでに書かれているように、スクリプトを使ってSubの直後にグローバル変数をセットするように ソースを書き換えるのが、一番間違いが起こりにくいと思う。
852 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 22:47:18 ] エラーナンバー体系と、チェック関数体系は分けたほうがいいと思うんだけど。 エラー内容とチェック関数が1:nやn:1の関係になったりしてない? 仮に1:1の関係だというのなら、チェック関数内に文字列を直接書いといた方がいいとも思う。 (関数名=エラーコードからエラー文字列が正しく対応しているかどうかのチェックが面倒なので) それはともかく、コピペに勝る方法はまずないのだから、今回有効な手段としては、 後からチェックするコードを書くくらいかな。
853 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 22:49:51 ] AccessのVBAなら自分自身の名前が取れるらしいので、Excelに依存しない作業ならAccessを使うという手もある。
854 名前:830 mailto:sage [2009/02/10(火) 23:15:07 ] レスありがとうございます。 ExcelVBAで出来ないと言う事が分かったので、大きな収穫でした。 ダミーデータでエラーを出力した結果に対して目視チェックをする際、 1:1でエラーメッセージが取得出来ているかに重きを置く方向で調整したいと思います。 本当にありがとうございました。
855 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 23:16:14 ] vba extensibility support.microsoft.com/kb/410621/ja 使い方しらないけど、なんとなく近そうな道具
856 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 23:36:01 ] >>855 それ、行番号さえ指定すればプロシージャ名は取得できるけど、 自分自身が何行目に書いてあるかってのは結局わからないのよ。
857 名前:843 [2009/02/10(火) 23:36:52 ] >>845 >>846 >>847 動きました!いろいろアドバイス頂き、本当にありがとうございました >>847 ああ・・・エラーの理由がわからないのでできるだけシンプルにしたかったのと 改行制限に引っかかったのでいろいろ削ってたのでこうなってしまいました。 すいませんでした
858 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 23:59:30 ] >>855 マクロでコードを書き換えるとか、コードをマクロでチェックする系のレスは全部それ使うんだよ。
859 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 00:13:55 ] ビミョーに方向違いの質問ですがすいません まだおもちゃ程度にしかVBAいじれないんですが On Error〜がらみは古いかもと思って避けてたんですよ でもワークシート関数使うときにシート上で使うときはエラー処理が面倒なのに VBA上だとOn Error〜で簡単にできるのに最近気付いてですね こんな使い方はどこかに落とし穴があるんじゃあと気になるのと ここで回答者されてる皆様のOn Error〜への視線ってどんなものかと思いまして 漠然とした質問すいません
860 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 00:30:21 ] VBAで飯食わせてもらうくらいちゃんとしたもの使うならちゃんとエラー処理して、 エラー内容をユーザーにフィードバックする。 ちょっとしたマクロ程度ならOn Errorで十分。てか面倒。
861 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 00:40:07 ] On Errorは滅多に使わん。 関数を呼ぶ前にちゃんと変数の値をチェックするとか、最初からエラーが出ないように作ってるから。
862 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 00:44:27 ] >>860 えーと飯食わせてもらう作業のなかで利用しつつあるって感じなんですが ちょっとしたマクロ程度でもあるし「使うな」って程でもないならちょっと安心です ありがとうございます
863 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 00:48:34 ] VBA自体を商品にするんじゃなくて、 業務効率化のためのマクロ使用なら とにかく目的が達成できればいいんだから早く作れるほうがよい。
864 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 00:54:33 ] >>861 あっやっぱりプロの方はそうですか・・・ ちょっと前まではVBAなしでワークシート上でやってたんですが その時も確かにエラーが出ないように工夫はしてたんです でも例えばFor〜Nextで回す時とか「結果がエラーになるときは飛ばす」って ワークシート上でやってた時を思うとすごく斬新に思えてですね もし初心者の私に気付いてない「ありがちな間違い」があればと思ってここにきました
865 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 01:00:25 ] >>863 ですよねー 今のところ私のどんくささのせいでマクロ作るのも時間かかるし作らなくても時間かかるし(涙)
866 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 01:00:51 ] 事前にチェックするのと、事後にエラー処理するのと、どっちがいいかと言えばケースバイケースだけど、 VBAに限って言えばエラー処理が貧弱だから事前にチェックする方が結果的にコードがすっきり書けることが多い。
867 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 09:02:47 ] on error resume next はたまに使います。 いや、完全にデバッグしてから納品するのが当然なのは分かってる・・・。 分かってはいるんだが、ごく希に納品後にデバッグも止む無し、ってケースが・・・。 とりあえず動けば良い。とにかく早く、今日中に!! みたいな場合には。
868 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 10:56:14 ] ネットワーク先が生きてるかどうかってエラーなしで判断できたっけ?
869 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 11:29:33 ] 「生きてる」の定義が問題だが、まぁスレ違いだわな
870 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 13:05:13 ] >>868 ネットワークを介した共有フォルダorファイル? ネットのURLの有効性? TMネットワーク?
871 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 13:36:15 ] 画面描画しないとかカーソルを砂時計にするコマンドを使用している場合には on errorは便利だよ。 カーソル砂時計になりっぱなしとか避けられるから。
872 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 14:31:26 ] >>864 騙されるな。 本当にエラーが出ないほどチェックしてから関数を呼び出すなら、 チェックの部分が無防備なわけないだろ。
873 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 14:32:30 ] >>867 インラインで処理するのと、何でもエラーを読み飛ばすのとは違うだろ。
874 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 14:41:12 ] チェックするコードと処理するコードはアトミックじゃないから、普通はどんなチェックを行っても 原理的にはエラーが発生する可能性はある。 if dir("hogehoge") <> "" then 'ここでもうファイルが無い可能性がある end if
875 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 15:03:16 ] on errorで飛ばすんじゃなくて、簡単に予測出来るエラーの場合は条件分岐させて当然。 それでも出るのがエラーなのだよ。
876 名前:859 mailto:sage [2009/02/11(水) 20:39:36 ] 859ですレス頂いた皆さんありがとうございます 人様に売るものでもないんでマクロに産毛が生えたくらいのものしかつくってないんですが ワークシート上で関数で処理するときはエラーになる時はそのセルを参照するときも意識してないといけないですよね VBAでワークシート関数使ってから入力するならOn Errorですっ飛ばせば逆に綺麗に計算できるなと思ったんです エラーになるかどうかの計算をさせる部分が省略できるから返って負荷軽減にはいいかもと勝手に思ってですね あくまでワークシート関数使うときに限る話なんで皆さんのように複雑なプログラム組んでるときには 当て嵌まらないケースが多いんだと思います それでもここまで読んでいて参考になりました
877 名前:デフォルトの名無しさん [2009/02/12(木) 00:25:55 ] 「firefoxで或るURLを開く」をvbaはどう書くの
878 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 01:13:31 ] シェルに渡せ
879 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 13:33:52 ] >>875 >>874 ?
880 名前:デフォルトの名無しさん [2009/02/12(木) 17:23:16 ] firefoxで「或るURL」を開くは、まさにその URLのシェルへの渡し方がわからないので、聞いているんだが。
881 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 18:07:32 ] >>880 firefoxの使い方とか、スレ違いだろ。 普通に。 コマンドラインからやるようにやればいいだろ。 "C:\Program Files\Mozilla Firefox\firefox.exe" www.yahoo.co.jp とか。
882 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 18:31:56 ] たぶん、こういうことだろ? REM 「firefoxで或るURLを開く」
883 名前:880 mailto:sage [2009/02/12(木) 19:53:36 ] >>881 もちろん、VBAの書き方の問題として、"""あたりのことが、気になっていたもので。 大変、参考になりました。所期の目的を達成することが出来ます。サンクス。 いままで、IEでやっていたのをfirefoxでやるにあたって、より難しいとの思い込みが 邪魔してましたw
884 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 20:33:35 ] お前は一体何を言ってるんだ・・・
885 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 20:44:56 ] すみませんアホな質問だと思いますがお願いします 標準モジュールで Public Check As Boolean Public Sub hoge() Check = False Load Form1: Form1.Show として、 ユーザーフォームで Private Button1_Click() If TextBox1.Text = "" Then TextBox1.SetFocus Else Check = True ←※ Me.Hide End If End Sub というコードなんですけど、 デバッグで※の所をちゃんと通っているのに、 標準モジュールに戻ってくると値がFalseになってるんですが これは何故でしょうか?
886 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 21:12:24 ] すみませんやっぱりアホでした 標準モジュールでDimで2重に宣言してました・・・ スレ汚しスミマセン
887 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 01:06:50 ] >>884 自分で考えるより他人に聞いたほうが早いと、、、
888 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 18:21:30 ] 質問の文章を書いてると考えがまとまるんだよな。 脳が疑問点を俯瞰するというか。
889 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 19:33:48 ] その場合 書き込みボタン押す前に やめて欲しい
890 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 20:00:55 ] ボタンを押した瞬間にひらめくんだよ、これが。 脳のどこかが切り替わるんだろうな。 例えば誰かに質問するために電話をかけて、 つながった瞬間解決するとか、誰でも経験あると思うんだけどなあ。
891 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 20:58:22 ] とかいうつまんないやり取りは、くだらん質問よりうざい
892 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 21:05:19 ] >>891 うぜー
893 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 21:25:13 ] てな感じ
894 名前:デフォルトの名無しさん [2009/02/14(土) 06:55:41 ] 携帯からすみません。 一定時間経過したが、何も操作が無かったら、エクセル自体を閉じるコードを考えてます。 これって可能です? ちなみに、エクセル2003です。 VBAは、ある程度使えます。
895 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 08:55:09 ] >>894 Excelに標準で用意されてる関数だけでは無理 APIを使えば可能
896 名前:デフォルトの名無しさん [2009/02/14(土) 11:06:14 ] APIですか〜 それは、手に余ってしまいます。 素直に、作業ブックを閉じるようにします。 ありがとうございました!
897 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 18:09:38 ] 本で勉強中なのですが for nextの例で下記コードをためしにやってみたところ 変数が定義されていないとエラーがでます。 例と変わらずに打ち込んでいるのになぜエラーが出るのか教えてもらえないでしょうか? Sub ループ() For Cnt = 1 To 10 MsgBox ("こんにちは") Next Cnt End Sub Cntがカウンタ変数って事でよさそうなんですが。
898 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 18:14:23 ] そのまんまじゃんか。 Cntが宣言されてないんでしょ。 option explicit外すか、dim cntで宣言すれば良いんじゃない?
899 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 18:14:57 ] ためしに Dim Cnt As Integer を追加してみたところうまく動作しました。 何度みなおしても本には>>897 のコードだけで動くように書いてあるのですが。。 ちなみにEXCEL VBAのコツが面白いほどよくわかるって本です。
900 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 18:17:39 ] >>898 ありがとうございます。 option explicitってオプションで「変数の宣言を強制する」って奴と関係してるものですかね? ちょっと調べてみますが、この設定のせいだったんですね。 別の本だと「変数の宣言を〜」って設定を推奨してたので チェックしてました。
901 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 18:19:30 ] option explicit無しがデフォルト設定じゃなかったっけ?
902 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 19:17:07 ] 変数の宣言は強制しておけ。 ついでに、きちんと型の概念を持っておくと良いよ。 ただのお遊びマクロで終わるか、仕事で使えるプログラムになるかはそこが大きい。 型を理解してない奴は、ほぼ100%お遊びマクロ。
903 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 19:21:32 ] javascriptもお遊びですね
904 名前:名無しという名無し [2009/02/14(土) 19:21:39 ] 質問なんですけど ExcelってXLSのことなんですか? だとしたらここで質問したいんですけど 間違ってたらいってください 今、Excel viewer2003で XLSのファイルを見ようとしてるんですけど 「コマンドラインオプションの構文エラーです Command /?を入力するとヘルプが表示できます」 とか出てきて訳わかんないんですけど詳しい人がいたら教えてください。 お願いします。 (一応、ググって見ましたが、僕の見る限りなかったと思います)
905 名前:名無しという名無し [2009/02/14(土) 19:24:16 ] すみません上のやつ 書くとこミスりました すいませんがスルーでお願いします 本当にすいませんでした
906 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 21:22:21 ] すいません。質問なんですが、 Sub test() Range("Q2").Select Do Until ActiveCell.Offset(0, -1).Range("A1") = "" ActiveCell.FormulaR1C1 = "=SUM(RC[-15]:RC[-1])" ActiveCell.Offset(1, 0).Range("A1").Select Loop End Sub このコードの、Do Until の条件式は、「アクティブセルの一つ左のセルが空白である」っていう意味であってるんでしょうか? だとすると、「Offset(0,-1).」の後の「Range("A1")」にはどんな意味があるのでしょうか? 同様に5行目の「ActiveCell.Offset(1, 0).」の後の「Range("A1")」の意味がよく分かりません。 この「Range("A1")」が無いと正しく動作しないのでしょうか?
907 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 21:26:41 ] 何で自分で調べないの?
908 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 21:29:02 ] 調べたんですけど分からなかったです。スマンコ
909 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 21:55:56 ] >>908 Offset()もRange()もRange型オブジェクトを返す。両者の違いは、 Offset()はマイナスを指定できる。相対指定しかできない。1つのセルしか指定できない。 Range()はマイナス(左、または上)を指定できない。相対指定も絶対指定も可能。複数セルからなる領域を指すことが可能。 両者を組み合わせればあらゆる矩形領域を相対的に示すことが出来る。 この場合に限って言えば、Range("A1")は単なる無駄。 わざわざ無駄な式を書くには理由があるはず。あとで別の例題で書き換えて使うんでねーの?
910 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 22:23:26 ] 調べてない奴の台詞。> 調べたんですけど分からなかったです。
911 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 22:29:07 ] >>909 なるほど! 調べたけど分からなかったことが分かりました! ありがとうございます!
912 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 22:50:20 ] ┐(´ー`)┌
913 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 22:59:06 ] グラフ範囲 =Sheet1!$O$3:$T$3,Sheet1!$O$5:$T$269 をマクロで実行するためにはどうすればいいですか? myC = Range("L2") ActiveChart.SetSourceData Source:=Sheets("Sheet1") .Range("$O$3:$T$3", "$O$5:$T$ & myC") , PlotBy:= _ xlColumns で動きません。 よろしくお願いします。
914 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 23:12:30 ] マルチすんな
915 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 01:10:16 ] 定数戦隊 vbRed vbBlue vbGreen vbYellow vbPink 敵か味方か、謎の戦士 vbBlack
916 名前:デフォルトの名無しさん [2009/02/15(日) 22:38:43 ] エクセルで、全シートに同様の処理を反映させたいのですが Worksheets.Select For 行番号 = 2 To 10 .Cells(行番号, 列合計).Value = _ .Cells(行番号, 列数量).Value * Cells(行番号, 列単価).Value Next 行番号 と書くと「.cellsが不正」と言われます。 どのあたりがおかしいのでしょうか。
917 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 23:04:53 ] with で囲んでないのに、何でピリオドから始まってるの?
918 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 13:53:54 ] 質問させてください 以下の様な入力があった際に A列は(A,1)だけ文字色を黒に、それ以下はすべて指定色に変更 B列は(B,1)が文字色黒、(B,2)(B,3)が指定色 (B,4)が文字色黒、(B,5)(B,6)(B,7)が指定色 になるようにしたいのですが、どのように実装すれば良いのでしょうか A B C ore kimi warota ore kimi warota ore kimi warota ore dare warota ore dare warota ore dare warota ore dare warota
919 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 14:20:01 ] >>918 マクロの記録してから質問しろ
920 名前:デフォルトの名無しさん mailto:sage [2009/02/16(月) 14:40:30 ] なんか色々アレしてたら突破口が出来ました スレ汚し失礼しました。 JavaとかCを軽くやっただけだったので 喜んで引き受けたんですが スコープは分かりにくいし、なんか予約語?っぽいのがもうわかんなくて。。。 ま、すいませんでした、自力でなんとかしまウィッシュ '2行目から終端までループしましょう For i = 2 To LAST_ROW 'テーマが全項目と同じか調べる '次の行のテーマを変数に入れときます THEME_NEW = Worksheets("Sheet1").Range("A" & i).Value '前の行と現在参照している行が異なる場合 If THEME_NEW <> THEME_OLD Then Worksheets("Sheet1").Range("A" & i).Font.colorIndex = 3 Else Worksheets("Sheet1").Range("A" & i).Font.colorIndex = 1 End If THEME_OLD = THEME_NEW Next