ExcelのVBAに関する質問スレです
前スレ
http://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)
>>1 乙
前スレ1000立てもせずに埋めやがって
氏ねばいいのに
4 :
デフォルトの名無しさん :2008/12/04(木) 20:11:57
EXCEL VBAで実現可能で おまいらが一番すごいと思うものって何? 参考までに教えてほしい
Shift =シフト alt =アルト Delete =デリート VBA =ブバ
アルトw
無理やりカタカナ表記するなら、オゥトが近いけどな。
近くないし、半可通のスレ違い得意語りはどうでもいいから
オルトとか言うオチじゃないよね?
スレ違いでごめん・・・。 excel VBAからSAS参照できるんだけど、どこまで使えるのかがリファレンス見てもさっぱり・・・。 他言語とのマッシュアップでお勧めの本ってありますか? もしくは他スレへ誘導してくれるとありがたいです。
11 :
デフォルトの名無しさん :2008/12/05(金) 10:45:00
WebBrowserの使い方 教えてください
SendKeys "あア" が「ああ」になるけど、半角カタカナは送れんの?
試してみた。ちゃんとVBEのカーソル位置に「あア」と入力された。 Sub a() SendKeys "あア" End Sub
excel2007でダメだった あ「あ」←未確定状態
2003でも2007でも問題ないぞ。 うちがATOKだからか?
Excel2002 + Microsoft IME Standard 2002 ver.8.1、VBE上で
>>15 を実行
IME 結果
OFF :あア
ひらがな :あ「あ」
全角カナ :あ「ア」
全角英数:あ
半角カナ :あ「ア」
半角英数:あ
※「」内は未確定状態
XP SP3 + Excel 2007 + Microsoft Office IME 2007 VBE上では あ だけ IME OFF→ひらがな に変化 メモ帳に あ「あ」 IME English ?? に IMEに依存する模様
VBA初心者になんかお題をください。
>>20 VBAで数独。人に解かせる(GUI)のでもプログラムに解かせるのでもよし。
問題生成もできたらなおよし。
100マス計算生成マクロ。 経過秒数、正答率表示機能付き。
アドイン化が猿でもわかるサイトor本ってある?
VBAを起動し「コードの表示」をクリック(フォームをWクリック)すると「メモリが不足しています。」と表示され、 コードの書き込みが一切できません。 新規で開いたエクセルファイルで、まっさらな状態でも 「メモリが不足しています。」と表示されます。 対処法はありますでしょうか? Mac OS 9.2.2 Microsoft Office 2001 バージョン9.0(2615)です。あと何か必要な情報はありますか?
26 :
24 :2008/12/09(火) 12:07:46
>>25 べらぼうに割り当てを増やしてもだめなんだよ。
>>26 オマエのいってる「べらぼう」がなんだか知らないけど、
メモリがたりないんだろ?
28 :
24 :2008/12/09(火) 14:43:36
>>27 そういう基本的なことじゃないらしいというところまではわかっているんですけどね。
オマエ呼ばわりするオタクがいるところにきたオレがバカだった。
要するにVBEが使い物にならないんだな 再インスコくらいは試してるよな? 2chで質問する前にこんな基本的なこともしてないならマジでバカだな
FOMの本で勉強中なんですが 配列について教えてください。 Sub 配列変数() Dim Nanakusa(6) As String dim As Integer Nanakusa(0) = "せり" Nanakusa(1) = "なずな" Nanakusa(2) = "ごぎょう" Nanakusa(3) = "はこべ" Nanakusa(4) = "ほとけのざ" Nanakusa(5) = "すずな" Nanakusa(6) = "すずしろ" For i = 0 To 6 Cells(8 + i, 3).Value = Nanakusa(i) Next i End Sub このサンプルコードなんですが、下から3行目の Cells(8 + i, 3).Value = Nanakusa(i) この部分は セルC8から下方向にインデックスiの配列変数Nanakusaの値を入力。 と書いてあるのですが (8 + i, 3) ←ここがよくわかりません。 CellsだとR1C1?形式みたいので列も行も数字で指定するってのはわかったのですが どこで"下方向"ってのを指定してるのか また、( 8,3 + i) ←列と行を指定してから変数iを入れる感じの、これのほうがしっくり来る気がするのですが どういうことなんでしょうか?
(row,col)ってことです。
便乗質問。
>>32 のサンプルでわからない部分があるのですが
dim As Integer
これはどういう意味ですか?
電卓のテンキーと電話のテンキーみたいなもの
変数の宣言が判らないレベル?
37 :
デフォルトの名無しさん :2008/12/10(水) 08:18:23
すみません。 A1セルに「業務1」という値がある場合、A2セルに「担当1」、 A1セルに「業務2」という値がある場合、A2セルに「担当2」 B1セルに「業務1」という値がある場合、B2セルに「担当1」... というようなものを、現在If関数でやっています。 追加追加で来ていたので、ネストがかなり深いです。 だんだん条件が増えてきたので、何とかマクロで作成できないものかと考えています。 メンテを楽にする条件で、変数と代入で可能でしょうか。 VBAが初めてなので、ちょこちょこ調べながらなのですが、 方向性がつかめなくて・・・
テンプレ読めないやつ多いな・・・
>>37 1行目に業務を入れて2行目にその担当を出したい
今はIFでやってるから業務が増えてくると大変なのでどうにかしたい
ってところか?
LOOKUPとかじゃだめなのか?
デフォルトの型をバリアントから変更する方法でもあるのかと思ったけど試したらエラーになったから Dim i As Integerの書き間違い? コピペすれば間違いようがないと思うんだけど、もしかしてパソコン使わずに本だけで勉強してんのかな。
>>37 VBAやったことない人なら、lookup なり作業列なり使って、
考え方から整理し直した方がどう考えてもラク
今の考え方のままだと、VBAでも if でネストしまくったわかりにくいコードになりそう
改行とインデントがある分読みやすいだけみたいな
すみません・・・ VLOOKUPであっさり出来ました・・・orz VBAもちょこちょこ勉強していきます。 スレ汚しすみませんでした
WindowsXP&Excel2003で質問です。 印刷された時に、セルに入力されているデータが長すぎて、 全文表示されなかったりしますが、 そういう状態かどうか調べるにはどうしたらいいでしょうか?
>>42 文字数や文字バイト数(unicodeだと全部2バイトだから変換しる。)で情報量を調べておいて、、
予め余裕持って設計しましょう。
80バイト毎にheightをX倍してやるとかね。
印刷すると崩れるのは仕方の無い事。
崩したくないならば、excelじゃなくて優秀なドローツールを使うか、ラスタライズしてから印刷するとか。
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
効いていないので効きました。 よろしく
if left$(moziretu,6)=" " then
>> それは半角の空白6文字かどうかの判定式。 全角6文字の空白かどうかなら If Left$(moziretu,6)=String$(6," ") then 混在だとちょっと面倒かな?
>>49 全角半角考慮してこんなのはどうかな?
LTrim$(Left$(moziretu, 6)) = ""
StrComp(Left$(moziretu,6),Space(6),vbTextCompare)
空白文字も含めて全て全角にしています、って書いてあるし、
数も6個で固定なら
>>46 で充分でしょ
わざわざ余分な関数使う意味がわからない
54 :
50 :2008/12/11(木) 18:16:07
>>53 >>45 を読めばその一言が信用できないことくらい分かるだろ?
49だけ読んでレスした漏れが言えた事じゃないがw
>>43 ありがとうございました。
バイト数を数える事で対応してみます。
VBAフォームに、VBのFlexGridのようなマス目の入ったものを 表示させてEXCELのシートとやりとりしたいのだが、 そういったコントロールってないの? 今使ってるのがEXCEL2000なんだが。。。
アホ発見
会社でやってる作業を自動化したくてVBAに興味を持ったんですが、よい参考資料が見つかりません。 VBAのリファレンス本でお勧めを教えて頂ければ助かります。 環境はWin2kでExcel 2003です。Cとか弄ったことがあるのでまるっきり初心者ではないです。
丸っきりの初心者ではないと言い張るのなら、参考資料など見つからなくても何とかするもんだ。
本といわれてヘルプを紹介するアホはどうにかならんかね。
どうにもならんよ
63 :
デフォルトの名無しさん :2008/12/13(土) 19:36:14
大きな本屋に行って参考書探すくらいの努力したら?
経験者なら本なんていらんだろ。 VBAくらい中学生でも使え紆余w
折れは、このスレだったか昨年知った次の本を薦める。 「技術評論社 Excel VBA ポケットレファレンス」 成りは小さいが、他のどの本よりも役に立った。 今年、確か、2007対応の改訂版が出たと思うが2003等も使えるように整理してあるはず。
ヘルプを見るのは常識として 本なら俺も↑のポケットリファレンスだな。 あとはできる大事典VBAもいい 勉強中なら本のほうがやりやすい所あるし。
67 :
58 :2008/12/14(日) 15:30:22
コメントくださった方、ありがとうございました。 >65,66で紹介して頂いたポケットリファレンスを購入してきました。 ちょっと手に取って調べられる本が欲しかったので、まさにぴったりです。
>ちょっと手に取って調べられる本が欲しかったので、まさにぴったりです。 だったらそれを先に書いておけよ。
それくらい読み取れよアホ
まあ解決したみたいだからいいじゃないか。
2007は関数の追加や仕様の変更が色々あったおかげで説明が増えて少し読みにくくなったので、 もし2003で使うならブックオフあたりで古いやつを探すといいかも。
スレチでしょうか…?初心者です。質問させて下さい WindowsXP、Excel2000です マクロでゲーム作りに挑戦し、遊べる段階にまで出来上がったのですが… なぜだか遊んでいると、高確率で突然「画面更新」が止まってしまいます。 処理は続いているので、音も鳴りますし、Escボタンでコードの実行を中断すると、画面更新が再開され内容が反映されます。 その時「継続」を選ぶとゲームを続けられるのですが、しばらくするとまた止まってしまいます。 ループ中にScreenupdating = Trueを入れてみましたが、効果はありませんでした。 何が原因なのでしょうか?思い当たる節があれば教えて下さい。 因みに落ちゲーで、セルドット方式です。Sleep関数を多用しています。 長文失礼しました…
仕様です。 おとなしくFlashの勉強するのが吉。
74 :
72 :2008/12/16(火) 04:33:53
>>73 レスありがとうございます。
仕様ですか…Excelの描写速度が遅いことは知っています。
しかし、ゲームプログラマーの方々もいらっしゃいますし、自分に否があるように思えてなりません。
コードの書き方に問題がある、ということは考えられませんか?コードは現在700行程です。
自信はありませんが、Sleepが問題な気がします。どうでしょうか。
「否」でなく「非」でした
だったらコードを晒したら? それができないなら自分で勝手に調べて答えを出せばいいよ。
データ型について質問です。 エクセルのセルに勤務時間が入っており、これをvbaで計算しているのですが 時間の時も日付型(DATE)の方が良いのでしょうか? それともSingleやDoubleでしょうか? VBAの勉強も兼ねてやってますので、関数でやれという回答はご容赦下さい・・
>>76 やっぱり、コード見ないとどうしようもないですよね…
お騒がせしました
そりゃぁ、Sleepが問題だなんて認識している香具師とまともに会話が成立するとは思えないもんねぇ。
>>80 試してみてどちらでもできるということは確認済みなんです
でも一般的に、どちらがベターなのかなと思いまして
一般的には、シート関数だな。
>>79 Sleep関数は問題無いんですね?ありがとうございます!安心しました
Sleepが使えないとなると凄く面倒になるので…
以前に原因を調べていたところ、Sleep関数の欠点(?)を綴ったページを見つけ、
その内容を見て勝手にSleepが原因だと解釈してしまったみたいです。
自己解決出来るよう、もう少し頑張ってみます
84 :
デフォルトの名無しさん :2008/12/16(火) 15:42:22
エクセルでVBAを使ってじゃんけんゲームを作れと言われたのですがわかりません 教えてください
宿題丸投げはご遠慮ください。 VBAでなくてもできることの質問は、VBスレ辺りでどうぞ。
VBスレでも宿題はお断りだw
V=チョキ B=グー A=パー としてじゃんけんを楽しんでください。
意地悪なやつらだな。 逆に考えろよ。VBAなんて宿題かゲームくらいにしか使わないだろ。 おまえらのご自慢のテクニックを披露できるチャンスだぞ。
と学生が申しております 仕事で使うわアホ
>>89 VBAがまともに使えない上に仕事したことないやつが若気の至りってやつで書き込んだんだろう
あまり責めてやるなよw
ルーチンワークは大体そう 他は資料をデータベースっぽく正規化するために使うことも ・・まぁ、大企業ならこんなことしなくても既にシステムは完成されてるんだけどね
SAPのBWなんかはExcelマクロ
オフコンからデータ(CSVとか)受け取って 帳票(見積書とか)の形に整えて印刷とか
WindowsXP、Excel2002ユーザの質問です。 現在VBAマクロ内で、OSのXP/Vistaの違いを問わず、 インストールされているFirefox 3.0.xの 実行ファイルのフルパスを取得しようとしています。Firefox3が ・標準のフォルダ以外にインストールしている可能性がある ・HTML、HTTP等に関連付けられている ・デフォルトブラウザに指定されている という状態で使われているとき、マクロ上で何をすればスマートにフルパスが得られるでしょうか? 検索すると、既存ファイルを利用する方法、レジストリの関連付けを参照する方法がありますが、 他の方法は無いでしょうか? 参考になる情報をご存知の方、教えてください。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\firefox. exe]
問屋でデータ処理に未知のオフコン使ってて、送られてくる売り上げデータのフォーマットが変態的なんで
VBAで整形&正規化してる。なんか
>>94 とよく似た境遇だな。おまけに受け渡しはいまだにフロッピーディスク。
社内でデータベース処理してるマシンも松下製の見たことない機種だったなあ。
こっちはなんとPC-9821が専用ケーブルでつながってて、N88-BASICで書かれた端末ソフトが走ってる。
中小企業でコンピューターの知識がないと、メーカーの営業の言うがままにシステム構築して
記憶媒体から何から何まで汎用性ゼロのシステムで囲い込まれてにっちもさっちもいかないことが多い希ガス。
何年前に作ったシステムだよ?
wikiによるとPC-9821が入ったのは早くても15年位前らしいな パソコンで動くエミュレーターがあるにもかかわらず いまだにバカ端が業務で現役ってところもあるしそんなに珍しくもないんじゃね? まぁスレ違いだしこの辺で流れ斬ろうか・・・
ダム端って言うんだよ
いまユーザーフォームを利用してモグラたたきを作っているのですが じかんをカウントダウンさせるプログラムとモグラの動きのプログラムが うまく作用せず、モグラの動きのプログラムが終了すると 再びカウントダウンするようになってしまいます。両方とも独立して動くように したいのですがよい方法はありませんか。
ソースです スタートボタンを押すと時間のカウントダウンを開始 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
ソースの続き Private Sub back1_Click() back1はイメージオブジェクトです If startflag = 1 Then Call moguratataki End If End Sub コマンドボタンを押したら時間のカウントダウンとゲームの開始したいと 思っていますがそれもまだ分からないので調べ中です。 call命令で、もぐらたたきゲームが始まるような感じで作りたいと思っています。
ソースの続き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
ソースの続き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
ソースの続き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
ソースの続き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
わかりにくく読みにくいコードだと思いますが(すいません)よい方法あれば 教えてください。
Application.Ontimeでゴリゴリやるか、時間計測用のActiveX EXEを作ってイベントドリブンにしろ。 っつってもわかんねーかな。
<<109 さん おはやい回答ありがとうございます。 Application.Ontimeを調べてみました。なんとなくできそうな気が しそうですのでこれでやってみようと思います。ありがとうございました!
111 :
デフォルトの名無しさん :2008/12/18(木) 20:25:38
セルのある列全体ににプルダウンの選択式で○、×を選ぶとします。 それをif判定で、試してみたところうまく結果がでませんでした。 プルダウンの選択式だと、"○"として扱われないのでしょうか?
113 :
デフォルトの名無しさん :2008/12/18(木) 20:48:17
>>112 cellsでとってvalueを参照しております。
イミディエイトで中身みたら、ちゃんと×や○になってたのに・・・
>>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
i=i+1はEndIfとLoopの間だと思う。 sheets(2)の列x(初期値1)を削除した後のループで再び削除する時にはxがインクリメントされてるから初期状態の列番号でいう所の3列目が削除されると思うがそれで良いのか、ふと疑問に思った。 どちらもエラーの原因じゃないけど。 というか、俺には「○×のプルダウンが入ってます」の意味が理解できない。 すまんな。
あと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が間違っていたことが一番の原因だったようです
失礼します シート1から実行するとしてセルB2には名前という文字が入っております const mojicell as string "B2" のようにしてシートの対応するセルに格納されてる値をとりだすことはできますか? やってみたところ、セルを格納するのはできなかったので・・・何か方法があるのかと思いまして 実際どのように試し方といいますと Sheets(mojicell).cells(...... のように使いました。 SHeets("名前").cells(... に置き換えられるかとおもっていたのですが、 実際はSheets("B2")と 入っておりました。 const で指定したセルが参照する値を格納することはできないのでしょうか?
セル参照だけならrangeオブジェクト使いなさい。 シートまで含むならまずconstの値を工夫しなさい。
>>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
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 これだと下の文がインデックスが有効範囲にないとエラーでます
129 :
デフォルトの名無しさん :2008/12/19(金) 01:06:10
>>128 これの意味するところは
range("A17").value = テスト という所なのでは?
よって
sheets("テスト") と
>>124 さんがおっしゃってた意味かとおもってたのですが
動作がうまくいかないということは違いますよねorz
>>129 どのシートの"A17"で
どこのマクロだよ
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
実際のファイルを作って、アップしろ
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("テスト")にて実行する方法ということです 今のままじゃエラーがでますので
137 :
デフォルトの名無しさん :2008/12/19(金) 02:16:52
まったくわからない・・・
うpされたものを拾う気はあるのかや?俺には無いよ。めんどくさい。 質問の意味不明度が増してきたのでそろそろ寝てほしいと思う。適当に脳内補完してみたから。 const moji as string = "A17" debug.print worksheets(sheet(1).range(moji)).cells(3,1)
139 :
デフォルトの名無しさん :2008/12/19(金) 02:22:16
>>138 それを実行してみたところ型が一致していません。とでました。
>>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)
>>141 だから、実際のものをアップしないと話にならねーって
>>138 デバッグどころかコンパイルも通らない物貼り付けて、えらそうに・・・
144 :
デフォルトの名無しさん :2008/12/19(金) 02:37:35
うーむ、簡単に見えてむずかしいようですね・・・
>>144 オマエが単純に間違ってんだよ。
現物をアップしろよ
ごめんよ、テストなんてしてなかったからさ。 だいぶゴツクなっちゃったけど、それでもよければどうぞ。 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行目のところにエラーが・・・
>>147 それはもういいんだよ。
現物上げろよバカ
149 :
デフォルトの名無しさん :2008/12/19(金) 02:45:47
>>148 現物をあげてダウンロードするまでにかかる時間のほうが長いと思うのですが・・・・
>>150 こんだけバカなんだから、根本的なところで間違ってんだよ。
どのセルに何の値を入れてるのかさえ、あてにならない。
もっとスマートに出来ないものかとぐぐったけどINDIRECTばっかでてくる…orz
VBAでの良策ってどんなだろう。
>>149 長いのが気になるだけなら別関数にしてね^^
でもこれじゃconstでセルを指定しずらいというか面倒なのって痛いですね
>>154 オマエがバカなだけ。
Debug.Printもついてない行でエラーになるのはあたりまえ。
>>155 先ほどdebug.printがかかれてたマクロを実行してもエラーがでたのですが・・・
ごめん。それは俺のミス。 以上で終了───
>>156 rangeのデフォルトはValueじゃない。
それとDebug.Printが付いてないやつとは別のコード。
その区別がつかないのは、バカだから。
おぉ。rangeってrangeなのね。そうなのね。 そおしたら随分と無駄なコード書いてきたんだなぁ今まで。反省orz
rangeが指定する値を保存する方法って?
オブジェクト変数にrangeをセット
>>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 が書いてるのはこういうこと。
>>162 流れから見てその件はもう終わったものかと思っていたが・・・
勘違いかな?
日本人はひとつのジョークで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メソッドが失敗しました。 何がいけないのか教えていただけますでしょうか。お願いします。
>>166 アクティブにしないとセレクトできないんじゃないの?
>>167 そうなんですか。困ったな。。。
普段は他のシートを表示させているので、
非アクティブでも動作をさせるにはどうしたらいいですか?
Worksheets("IV").Range("B2:B96").Copy Worksheets("IV").Range("C2").Insert Shift:=xlToRight Worksheets("IV").Range("C2").PasteSpecial ... Application.CutCopyMode = False
>>169 おおおおおお!!!!!!
ありがとおおおおお!!!!
さっそくやってみます。
>>169 できたああああ!
ありがとう!!!!
感謝感謝!!!!
質問させてください。 指定した範囲内にあるデータの種類の数を取得するにはどうしたらいいでしょうか? 汚いながらもVBAで配列に入れながら総当りで調べることはできるのですが ワークシート関数でそのようなものがあれば高速なのでそちらを使いたいと思っています。 例:範囲 A1:C3 A B C 1 山 川 海 2 海 海 川 3 川 都 南 この場合、「山、川、海、都、南」の5種類が出現するので 5を返してくれる関数を知りたいです。 よろしくお願いします。
173 :
デフォルトの名無しさん :2008/12/19(金) 20:14:52
このファイルで別シートからマクロを実行して
特定の列だけ抽出して別のシートに表示したいです。
列を抽出するとき、たとえばA列とC列とE列を削除して表示させたい結果が
下のテーブルです。
このように別のシートからマクロを実行して他の別シートに抽出した結果を表示させるには
どのようしすればいいでしょうか?
単にセル結合を考えない抽出ならできるのですが、
セル結合も考慮して、元の分類タイトルがあるまま抽出するにはどういった
手順でやるのが最適でしょうか?よろしくお願いしますm(__)m
ファイルは以下のやつをみていただければわかりやすいかとおもいます
http://www.dotup.org/uploda/www.dotup.org5812.xlsx.html
>172 配列数式でも良ければ {=SUM(1/COUNTIF(A1:C3,A1:C3))}
>>172 配列の使い方はどうしてる?
for eachで選択範囲をコレクションとして、
.valueが配列に含まれていなかった場合には、配列にぶち込んで、
最後にuboundでカウントすれば高速だと思うんだが。
このロジカルなら一瞬だと思うけど。
配列で総当たりってのがちと気になった。
>>173 シート名を明示してやればOKだね。
タイトル行が空白だったら、空白じゃなくなるまで左に移動してタイトルを取得する。
これを組むのが面倒なら、
結合を全部解除して、全てのセルにタイトルを振ってしまう。
最後に、重複するタイトルの場合に削除なりmergeなりで処理すれば良いと思う。
削除って考えじゃなくて、抽出したい物を残すって考えにしないとタイトルは取得出来ないな。
178 :
デフォルトの名無しさん :2008/12/20(土) 08:34:25
>タイトル行が空白だったら、空白じゃなくなるまで左に移動してタイトルを取得する。 抽出してしまった場合、左にもうタイトルはないのではないでしょうか? あらかじめこれも全ての結合を解除したという前提かな? でも左に移動してタイトルを取得する場合、元からタイトルがない行があった場合 たとえば、メーカーというタイトルが最初からなかったとすると、本来なくていいタイトルに 別のタイトルが埋め込まれますよね? このファイルに対してはいけそうですが、ない場合は大変かな? >結合を全部解除して、全てのセルにタイトルを振ってしまう。 >最後に、重複するタイトルの場合に削除なりmergeなりで処理すれば良いと思う。 これもタイトルがない行があった場合、処理に困るかな・・・ 追加、条件で大変申し訳ないですが、もしタイトルが空白のセルがあった場合はこれじゃ難しいでしょうか?
すみません。CLASSモジュールの書き方がわからないんですが どこかに説明しているサイトないですか?
>>178 元からタイトルが無い列があるなんて知らないし。
てか、excelでレイアウトするなら、VBAで処理しようと考えない事だな。
人間が見やすい見た目と、計算機が処理しやすい(出来る)のは全く違うからね。
帳票として見やすく加工・レイアウトするのは、全ての演算処理が終わってから最後にやるもの。
レイアウトされたものに処理を掛ける事ほど無意味かつ煩雑になる事はないぞよ。
いったん全部のmarge解除して、全てのタイトルをはめ込むしかないでしょ。
181 :
デフォルトの名無しさん :2008/12/20(土) 19:32:18
Excel2003を使ってます。 VBAの勉強をしたいのですが、良い本や教材はありますでしょうか? バカでもわかるようなのでいいです。
VBAで何やりたいの?
183 :
デフォルトの名無しさん :2008/12/21(日) 00:50:07
質問です。 アクティブになっているシートから別のシートを選択したいのですが、 エラーが出てとまってしまいますが、なぜでしょうか? エラーの内容はシートの保護がかかっている状態で、 そのシートを選択したとき(Activate)と同じエラーです。 エクセル2003で、自宅PCでは動作しますが、会社PC(2003だと思う)ではダメです。 もちろん保護ははずしましています。 考えられる原因はなにがあるでしょうか。 文章がわかりにくかったらすいません。
185 :
166 :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
---------------ここまで---------------
>>185 画面がフラッシュするのは仕方ないと思うぞ。Windowsってのはそういうもんだ。
とりあえず右端にコピーする方法
Worksheets("IV").Activate
Range("B1:B96").Copy Destination:=Range("IV1").End(xlToLeft).Offset(0, 1)
>>185 細かいことを言うと、それだと処理が1分よりも少し長い間隔で実行される。
nextTimeはSubの先頭でセットした方が誤差が少なくなる。
>>186 >>187 ありがとうございます。値貼り付けにできますか?
あとこのマクロは時間処理が少しおかしいです。
しばらく席を離れて画面が黒くなりパソコンが待機状態になったとき
(マウスを触るとすぐに画面は表示される状態)などマクロがとまってしまいまいます。
そして再度実行させると、たまっていた処理を一気に吐き出すような感じで、
3連続処理を繰り返すことが多々あります。安定動作にはまだまだ遠いです。
>>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>エラー
ということです。
シートの保護やファイルの保護などの設定の問題のような気はするんですが。
わかる方いたらお願いします。
>>190 単純に考えて、同じマクロではないのだろう。
192 :
デフォルトの名無しさん :2008/12/21(日) 16:46:37
VBAで組んだマクロの仕様書を作ってくれるソフトって無いですか? VBとかcとかはあるんだけど、VBAのやつは見つからない。
193 :
183 :2008/12/21(日) 17:33:42
>>191 すいません。
厳密に言うと違うんですが。
中身はコードのコピー貼り付けなのでコードは同じです。
(ファイルは別物)
ファイル名シート名の書き換えとかはしますけど。
会社のファイルがシート保護されていたので、
ためしに自宅PCでシートの保護をした状態だと、同様のエラーがでました。
なので設定の問題かなと予想してますが。
エラー箇所は毎回切り替えの部分です。
(アクティブシート・ファイルの切り替え)
194 :
166 :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
---------------ここまで---------------
.valueを転載したいだけなら、forなりfor eachなりでまわして、 sheets(2).cells(1,1).value = sheets(1).cells(1,1).value の考えで代入して行っても良いんでないかな。 まぁ、ある程度の量以上になると遅いけど。
>>195 For Eachで回さんでも、Rangeオブジェクトを使えば値が配列として取り出せるから複数のセルを一気にコピーできる。
Set r = Range("IV1").End(xlToLeft).Offset(0, 1)
Range(r, r.Offset(95, 0)).Value = Range("B1:B96").Value
rangeをvariant型の2次元配列に代入するのもいいね。
>>197 >>196 も入れてる。
右辺のRange("B1:B96").Valueが2次元配列。
左辺はResize使った方がすっきりするが。
199 :
166 :2008/12/22(月) 17:36:11
200 :
デフォルトの名無しさん :2008/12/22(月) 21:47:11
Cells(1, 1) = Format("2008 / 12 / 22", "aaa") これを実行すると (月) ってなるんだけど 両側の括弧を消したい場合は文字を操作するしかないですか?
>>200 replaceで括弧取り除くユーザ関数でも作れば?
>>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"" 無理でした。 どうすれば代入した値を扱えるのでしょうか?
>>203 mac版って不便だね
Cells(1, 1) = Mid("日月火水木金土", Weekday(2008 / 12 / 22), 1)
206 :
205 :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)
IF文でCELLS(5,4).VALUE の値が小数点ならとかいう指定はできますでしょうか? もしくは小数点を含まないといった指定はどうやればできるのでしょうか?
>>204 st = "個"
Range("d5").NumberFormatLocal = "0.0" & st
>>196 198さんのに関して、横レスですが、是非、教えてください。
>右辺のRange("B1:B96").Valueが2次元配列。
office tanaka で調べても、これは2次元配列ようにありますが、私には
1次元配列に見えるのです。こう書いてもvariant型変数なので2次元配列
となるというように理解するものですか?
>>207 今思いついたのは
n = (Cells(5, 4).Value * 10) Mod 10
If n <> 0 Then MsgBox "小数"
>値が小数点なら
って言うのをエスパーした結果
2.0は小数点無しでいいんだよね
>>212 書式で小数点以下の桁数指定すれば
1は1.0とか
2は2.0とか表示されるんだけど
その状態だと全部小数点有りだよね
文字列にして"."をFind
>>210 こうじゃね?
st = """個"""
Range("D5").NumberFormatLocal = "0.0" & st
>>209 調べてみりゃわかる。
MsgBox UBound(Range("B1:B96").Value, 1)
MsgBox UBound(Range("B1:B96").Value, 2)
96と1が返るから2次元配列。
find関数で、もし見つかったら処理するを先に記述するにはどうしたらよいのでしょうか? If Obj Is Nothing Then これだと見つからなかったら先に処理して、それ以外は見つかったことになりますよね その逆の順番にしたいのです
>>209 んな難しく考えんでも、行/列 って2次元じゃん。
2次元配列を視覚的に見えるようにしたのがシートってだけだよ。
>>217 if obj is nothing then
else
〜〜
じゃダメなの?
if not obj is nothing then
にしたいって事?
>>219 はい、そうです
Dim Obj As Object
Set Obj = Cells(1,1).Find(".") '小数点含むなら
If not Obj Is Nothing Then
セル1,1に値を入力しました。5と入力したところ
objはnothingになりません・・・一体なぜなのでしょうか?
>>220 表示形式が0.0とかじゃないの?
LookIn:がxlValuesになってたらNothingにはならない。
値=Cells(1,1)..Value
If Int(値) = 値 Then
とかで判定した方がいいと思う。
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だけどねえ。
>>222 LookInがxlValuesなんだろ?
デフォルト状態ではxlFormulasだが、指定しないと前の状態を引き継ぐからな。
224 :
220 :2008/12/23(火) 00:53:43
どうやら、そのようでした。ご迷惑おかけして申し訳ありませんでした。 無事、解決いたしました。ありがとうございます。
セルの値が文字列かどうかって判定できますでしょうか? 数値か文字列かを判定したいだけなのですが、 この場合、どうしたらよいでしょうか?
完全一致検索とかも考えられるか。 Findメソッド使うときは最低でもLookInとLookAtは書いた方がいい。
>>225 VarType関数で調べる。
いまいちな人はWorksheetFUnction.IsNumberで調べる。
>>227 If VarType("Cells(x, y).Value") = 8 Then これで文字列ならと指定したのですが、
何故か、セルに手動で入力した5とかの数字も文字列として認識されてしまいます。
これは回避できないのでしょうか?
>>228 釣りか?
"Cells(x, y).Value"とダブルクォートでくくったら文字列に決まってるだろ?
流石に釣りだろ・・・。
セルに値入力をして、たとえば整数を入力します77とか8とか その入力したセルに対してvartypeやtypenameで調べてみると vartype=5 typaname=double と表示されます。 なぜ整数扱いではないのでしょうか?
>>231 EXcelの仕様。
Long型とかInteger型はありえない。
>>232 こんな仕様にした理由は何かあるのでしょうか?
普通に整数ならintegerに小数点ならとりあえずdoubleにとかしてくれたほうが
わかりやすい?
いや、絶対値とるためにdoubleにしてるのかな
でも、typenameやvartypeをそのまま使えないってのは面倒かも
234 :
デフォルトの名無しさん :2008/12/23(火) 08:12:18
熱海を神奈川に押し付けようと言う魂胆かもしれんがいらんぞ。
235 :
デフォルトの名無しさん :2008/12/23(火) 08:13:11
間違えた…キニスルナ!
ディズニーランドは東京、でも浦安は千葉。 みたいな感じ? どうでもいいわw
>>233 実数の型にはsingleもあるのにどうしてそれは無視してとりあえずdoubleなの?
singleの方が使用バイト数少ないしね!
>>233 0.1 * 10がIntegerにならないぞゴラって声が容易に想像できるから、全部Doubleのほうがいいと思う。
あと、ワークシートでの計算でIntegerとDoubleを区別するよりは
全部Doubleのほうが速いなんてこともありそう。いや想像だけど。
それよりも、一般人が良く使うソフトなのに、基数が10でないことのほうが問題だろ。
さすがにある程度の補正はかかっているけど。
>>239 良く分からんけど
Excelが普通なんでしょ
>>239 てか、2進法で計算してるんだから、わざわざ10進法基数にする必要性が無いよ。
余計な事して誤差が問題になるなら、やらんで欲しいな。
変数の型に関しては、使用バイト数が少ない方が当然処理は早いよ。
混在とか関係ない・・・はず。
んなこたーない。実数同士の足し算よりも、整数と実数の変換の方が余程時間が掛かるのが今のCPUだ。 ついでに言えば、Excel2000だか2002だかを境にdoubleからlong doubleに切り替わっている筈。 レーザ測距のデータみたいに、10桁くらいある数の標準偏差を取ろうとすると違いが判る。
>>241 いや、基数10はセルが保持するデータの話。
Doubleではない何かの型であってほしかったということ。
floatよりdoubleの方が速いらしいぜ
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と入らなければいけないのですが。 どこが間違っているか、御教示ください。
たまたまこのスレ開いた俺が適当に答えてみる Rows.Countって選択してるRowの数返すんじゃないの?
>>246 lastRow = Range("A1048576").End(xlUp).Row
シートを指定していないから 関係無いシートがアクティブになってるんじゃない? 一度シートが1つのBookで試してみ
おそらく、アクティブなシートを勘違いしている。
リロードすればよかった・・・
253 :
246 :2008/12/26(金) 09:15:59
皆様ありがとうございます。 シートを1つにしてもlastRowには1しか入りませんでした。 最終行の取り方自体は合っているようなので、 シート関係を見直してみます。 ありがとうございます。
>>253 「 Range("A" & Rows.Count)」のターゲットが、「AAA.xls」になっていないと思われる。
おそらくは、マクロのあるシート。
A列にデータが無いとかじゃないよな 普通Bookを開いたら、そのBookがアクティブになるから 問題は無いはず まぁ複数のBookを扱うなら、きちんとBookを指定したほうがいい
>>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 という形でコードを組みましたがうまくいきません。 オブジェクト名を変数で定義することはできないのでしょうか? 稚拙な質問で申し訳ありませんが、よろしくお願いします。
>>257 Me.Controls("sample" & Cstr(i)).Text
でできないか?
259 :
デフォルトの名無しさん :2008/12/26(金) 15:49:02
>>258さん 解決しました。ありがとうございました。
知ってる人がいたら教えてほしいのですが、 エクセルVBAのコンボボックス(activX)の 設置数に限界は存在するのでしょうか? とりあえず、3000+αのコンボボックスを1シートに 設定したいのですが・・・・ 裏技的な方法でも良いので教えて頂ければ ありがたいので宜しくお願いします。
>>260 Excelにセルの数だけウィンドウがあるわけではないのは知ってるよな?
262 :
デフォルトの名無しさん :2008/12/26(金) 22:27:44
>とりあえず、3000+αのコンボボックスを1シートに ユーザーも大変だ w
良く分からないけど 一気に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
失敗したときのコードを張ってみそ
265 :
263 :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 :2008/12/27(土) 02:33:26
263氏の方法でなんとかなりそうです ありがとうございました
いや、出来る出来ないはどうでも良いんだよ。 コンボボックス3000ってのは、何とか別方法で再検討すべきじゃないか?
>>260 コンポボックス3000超って単に入力作業をするためのものですか、それとも
何か・・・
非常に興味があるので、横レスですが、使用場面のヒントでも・・・
269 :
260 :2008/12/27(土) 12:40:11
>>268 項目数がやたら多いアンケートを想像してもらえれば、そんなに違わないかとおもいます
その内容を、特定のルールで別シート上へ集計するのが目的です。
>>267 コンボボックス3000が非常識なのは解ってはいたのですが、
社内の決め事なのでとりあえずは作ってみようという話になってしまいまして・・・
一旦使ってみた後での検討はします。
こんなところでしょうか
コンピュータには、ダメなものをダメな方向に力押しする性癖がある。 バカな物は作ってはいけない。
>>269 データベースシステム使えよ。マジで。
煽りとかじゃなくて、後々の事考えても、3000項目の入力なんてDBじゃなきゃ無理だよ。
3000の保守は出来ない、と言うかやるにしても金掛かるよ。
どうしてもやるなら、コンボボックス噛ませる必要性も見いだせないし。
シートをRDBとみなして、ダイレクトにセルに書き込むべきかと。
272 :
268 :2008/12/27(土) 20:20:28
折れの既成概念では、コンボボックスそのものの数が数件から10数件だったwww
>>263 さんので、コンボボックスのオートメイクは1208個、個数制限はない(ようだ)と
言うことを知った今、リストボックスとテキストボックスの利点を併せ持つコンボボックス
の大量使用によるRDB的エクセル活用法となるかも。これは、創造の世界に踏み込むものかも。
>>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
>>274 レス、どうもです。RDBはexcelよりも本拠地です。といっても、msdos時代でのものですが。
>>260 さんの 私の
>>268 に対する
>>269 の返信を見て、
顧客の嗜好調査データとか、アマゾンのこの本を買った人はこんな本を買っていますの
小規模版データを想像してみました。
また、見た目はデータベースソフト、中身はexcelという体の業務用ソフトは結構作られており、
この方の会社の人も類似ソフトを見ての発想(excelであるなしを問わず)と妄想しました。
データ設計例?
100人のレコード、100のフィールドがあるとしてシート毎に異なるキーフィールド相当の位置づけをする。
求めるもの
2値(3値)間にどんな相関関係があるかが視覚的にもわかるように散布図に落とす。
この「求めるもの」=クエリが種々、エクセルで可能ということですね。
どの方法であれ、処理スピードと正確性確保、維持管理の容易さが善し悪しを決めることに
なりますよね。
>>275 ---私が265氏と同等と考えるプログラム を
xp 2003でやってみたら、1列目1000個で完了、2列目が208個で
オートメーションエラー発生しました。
自分のパソはメモリーが小さいのでかも。260さんではありません。 試しにやってみたものです。
279 :
263 :2008/12/28(日) 14:39:49
名前が1208個までしか付けられないのか
280 :
277 :2008/12/28(日) 16:44:44
>>279 私のパソコンでは、
263のでは3000個出来ているが、275の---私が265氏と同等と考えるプログラム
では、一気に3000個出来ず、1208個しか出来なかったという意味です。
mixiでもチラシの裏でも良いから、どっか行って適当に試してくれ・・・。 誰が得するんだ?誰かが得するなら俺が出て行けば済む話だが。
?
283 :
デフォルトの名無しさん :2008/12/29(月) 06:36:24
ある程度、大きなシステム作ってみて気がついたけど似たようなコードを何度も書いてるんだよな 効率のいいコードを書くために必要な知識とか教えてくれないか。
>>283 サブルーチンなり関数なりに分けましょう。
>>284 うん、データはAccessに入れて、ほとんどの操作はExcelのユーザーフォームを使うような感じで
ワークシートは大雑把に全体を見るためにあってデータを追跡したり、試算ができたりするようなやつ
>>285 最初の頃、ほとんど直観でやってたから今になって無駄を省くために自分のレベルでできそうなところはやってる。
でもクラスモジュールで何ができるのかとかが気になる。
>>286 ユーザインタフェースのプログラムを何とかしたいということ?
>>287 まぁ、そういうことなのかな。
入力チェックとか、動作は同じだけど入るデータが違うとか結構あって。
コピペして改変しながら作ってたけど、完成してみるとコードがぐちゃぐちゃになってしまった。
運用は始めてて、今のところ作業者の不満は出てないけど将来的な拡張や保守のためにもう少し勉強したい。
>>288 UI部分はごちゃごちゃしてても仕方ないんじゃないの。
データさえしっかりしてたらいいよ。
>>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
約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 :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...ってな感じで型が増える?)
ああ俺の作ったやつon error resume nextだらけだ、心配になってくるぜ。
別に、エラーをインラインで処理するのはおかしくない。 トラップすれば処理できているとは限らないのと一緒。 論理的破綻はどちらでも起こる。
301 :
296 :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 :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
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 みたいな。
無い
>>309 そもそもbreakしてどこへ行くつもりだ
>>312 それがしたいだけなら、どうにでもなるだろと小一時間…
仕方なくGotoだな
>>316 Select Case exp
Case 0
IF xxx THEN
処理
End IF
End Select
抜ける方法を聞いてんの。 わざわざ論理を逆にして書けば良いじゃんとか 抜けた後にある処理をサブルーチンにしてあげれば良いじゃんとか そういう構造を縛るしか手が無いんですか?それじゃ言語としてどうだろ あとさぁ なんで if() {
はあ〜書いちゃった。。 じゃ、問題。何を書きたかったんでしょうか?
320 :
317 :2009/01/01(木) 00:49:51
ちょっと説明不足かな 要するに、breakで外に出るのもスルーするのも同じ事じゃねーのって意味 Ifの条件がFalseの時にbreakしたいんなら、Ifの条件がTrueの時だけ処理すればいい
答え発表!
ヒューヒュー
あとさぁ
なんで
if()
{
}
else if()
{
}
else if()
{
}
…
みたいにELSE句にIFが書けないんだろう
欠陥だろ。。
でした。
>>320 そりゃかけなくは無いだろうけど構造上書きにくい場合もあるじゃん。
なんでキーワードやステートメントを再発明してまで、不便なってんの!マイクロソフト!!って思うじゃん。
322 :
デフォルトの名無しさん :2009/01/01(木) 00:53:35
go away
>>322 おや?外れたのかな?(^^)
勘がニブいんですねw
> そりゃかけなくは無いだろうけど構造上書きにくい場合もあるじゃん。 ねーよ。
抜ける方法を聞いただけでこの荒れようww VB厨はばかだなぁww 書き方を変えれば良いじゃんとか・・それは変えなきゃ対応できない言語ってことだろ。 高級言語でしょ?書き方縛ったらそこでもう言語としてだめでしょ。 アセンブラじゃないんだからさぁ。 IF THEN ELSE IF THEN ELSE IF THEN ENDIF ENDIF ENDIF うわっ。だっさ。最悪。 書き方変えればできますだったらjmpとかjzとかjnzとかjcとかだけでも出来るよww
>>321 If ... Then
ElseIf ... Then
ElseIf ... Then
End If
>>327 あ!ありがとうございます。
あったんだ。
あんまり笑わせるなよ。 VB分かってないやつがVB馬鹿にしてたのかよ。orz
明らかに分かってないのに、構造構造言いたがるのなんて、 情報系の一年生くらいだろ。
厨とか言っちゃうやつは例外なくアホ
334 :
デフォルトの名無しさん :2009/01/01(木) 13:53:37
結局、Excel2008ではVBAが使えなくなるのですか? C#への布石ですか?
このスレは、Excel の VBE で作るフォームについての質問はスレ違い? スレ違いでしたら誘導をお願いします。
337 :
263 :2009/01/02(金) 09:22:34
>>336 もしかしてデザインの話か
そんな誘導先ないだろ
名前消し忘れた恥ずかしい
あれ本当にOfficeに乗っけるの?
341 :
デフォルトの名無しさん :2009/01/02(金) 14:17:09
>>335 よく事情がわからんが、今必死で覚えてるEXCEL VBAが数年先に使えない、役に立たない言語になる可能性もあるってことですか?
そう言われ続けて何年も経つが、未だに無くなる気配すらないのがVBA。 この先もそれが続くと信じて安穏としているのは間違っているだろうが、 数年でなくなるような存在でもない。
343 :
デフォルトの名無しさん :2009/01/02(金) 16:48:02
Excel VBAによるWin32 APIプログラミング入門 この本って絶版でもう購入不可ですか?
絶版です
345 :
336 :2009/01/02(金) 18:06:59
>>337 そうですか…了解です。
スレ違いを承知で 1 つだけ質問。
Excel のデザインで使うフォームのコントロールの仕様って VB6 と
同じなんですかね?
(コンボボックスでダブルクリックのイベントが起きないので調べたら、
VB6 ではスタイルに 1 を設定しないと起きない、とあったので…。
ちなみに Excel VBA ではスタイルに 0 or 2 しか設定不可。
ダブルクリックのイベント絶対起きないじゃん…。)
ダブルクリックのイベントが発生しない が意味不明 で、絶版かどうかも、役に立つかも、全く見当が付かないが、折れの持っている 「Excel VBA はじめてのプログラミングレッスン1」 技術評論社 H12.8.21初版 に第10章 入力画面を使ってみよう を読んでみたwww ユーザーホームのデザインという用語が使われているが、この本では ダブルクリックをする場面は、VBE上コンボボックスのことで、 excelシート上のコンボボックスではないよ。シート上ではダブルクリックは 使わないものと思っている。
>>346 セルのダブルクリックでセルの値等をコピーする、といったマクロも組むから
別にユーザフォーム専用って訳でもないと思うが
348 :
336 :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
トリプルクリックにまで対応できるのは素晴らしいけど コンボボックスをシングルクリックで 透明なアイテムが一番上に(コンボ上に)きて、その そのアイテムをシングルクリックってすると じゃ駄目なのかな
オレのExcel、コンボボックスにダブルクリックイベント有るけど みんなのには付いてないの? バージョン Excel2003
たぶん コンボボックスのプルダウンメニューの部分のダブルクリックを言っているんだと思う
オリジナリティ溢れるUIほど迷惑なものはない
>トリプルクリックや4回クリックなどにも 何考えてんだ?
V2C には6回クリックまであるぜ
API使えば、ダブルクリックの認識の間隔を取得できるから、 0.5秒決め打ちよりそれを使ったほうがいいと思う。 そういう話をしている場合でないとは思いつつ。
357 :
デフォルトの名無しさん :2009/01/03(土) 19:44:02
質問です。 セル上で、右クリックをすると、編集ダイアログ?が出てくるのを出ないようにしたいのですが どう設定のマクロを書いたものか、よろしく。 右クリックイベントによってコピーモードにしているのに、余分な作業を するのを防止したいので。
マウスの右ボタンを殺す
BeforeRightClickイベントの第二引数にCancelがあるだろ
サーバサイドでの帳票の生成にVBAを検討していて、 安定性、処理性能、MSのライセンス違反等を懸念してますが、 何か懸念事項やアドバイス等ありますでしょうか?
361 :
デフォルトの名無しさん :2009/01/04(日) 14:49:46
論理で「Aでないか、Bでないか、Cでない」ならの類なのですが、 列5 列6 列9なら、イベント処理し、「そうでないなら」、exitする の 「そうでないなら」はどう書いたものでしょうか?
>>361 色々あるだろうけど
普通は
if
elseif
elseif
else
>>357 ワークブックのSheetBeforeRightClickイベントでcancel=trueにしないとだめだよ
>>361 >>362 だとイベント処理のコードが重複するから
If 列5 Or 列6 Or 列9 Then
イベント処理
Else
Exit
EndIf
まあ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なら、ループで何十、何百、何千万回とやってコンマ何秒かの差が出る程度だけどな
あれ? VBって or で連結させた場合、順次判定して、hitしたら後の判定スキップじゃなかったっけ。 勘違いだったらごめん。
ショートサーキットはしないよ まあ,とりあえず素直に書いといて最適化は実際に支障が出てから,が基本だけど
>>365 Select Caseが105って一概には言えないだろ?
>Case 列5, 列6, 列9
これショートサーキットだから列5がTrueなら列6と列9は評価しないし。
>>366 ショートサーキットするのはVB.NetのOrElseとかAndAlso
今はVB.Netって言わないんdっけ?
>>368 Select Caseが105ってのは、実際にカウンタ変数のMod 10に対する
条件分岐のみのループの処理時間を計った結果
それぞれ500万回*3回の平均から算出した値
そもそもが単一条件の場合でも、Select CaseはIfより遅いからね
セル、グラフ、フォーム等の情報を利用してフォーム形成することはできますか? 例えば 名前 値 ラジオボタン という行が連なるフォームを作る場合、 グラフの凡例数、セルの列数、フォームで入力した数分等、行が作成される感じにしたいのですが。 (フォームの大きさに入りきらない場合はスクロールバーを出す)
ユーザーフォーム上のコントロールを動的に生成したいってことなら出来るよ
>>371 調べ方が足りませんでした。すみません。 VBA 可変 フォームとかぐぐってました。
コントロール 動的 VBAでぐぐったらできそうな感じです。
ありがとうございました。
>>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がショートサーキットだって知らなかったんじゃないの?
なんなら実証してみせるが、やり方くらい知ってるよな。
>>373 ・timeGetTimeではなく組込のTimerを使ったこと
・Select Caseでも平等にするためにi Mod 10の結果を変数に取っていること
・結果をMsgBoxではなくDebug.Printで出力したこと
以外は同じコードだよ
ちなみに実証方法は知ってる
Select Caseがカンマ区切りがショートサーキットなのは知ってるからわざわざ
Select Caseでやったことは無いが、デバッグの一手法でもあるからな
375 :
373 :2009/01/05(月) 21:26:44
>>374 i Mod 10の値を処理で使わないんなら
>>373 が平等なコード。
仮にfoo1でi Mod 10を変数にとってもfoo1が速いぞ?
おめーんとこじゃ遅いのか?
> i Mod 10の値を処理で使わないんなら
>>373 が平等なコード。
そうでもない
> おめーんとこじゃ遅いのか?
うん
377 :
373 :2009/01/05(月) 21:40:10
OrもSelect Caseもお互いに速さでベストをつくせばそうなるじゃん。 おまえは最速のコード書けないんだろ?
378 :
373 :2009/01/05(月) 21:41:57
後ろは読んでなかったが、おれのとこと逆になるらしいな。 俺のとこはSelect Caseが速い。
実際の処理に置いて必ずModで算出した値を使うというわけではない以上 条件分岐のステートメントに入る前の時点で、条件となる値が変数に代入されているという 同じ状況を作ることが平等になる Modを使う場合に限定して、IfとSelect Caseのどちらを使った方が速いかを検証するなら、 君の言うとおりベストを尽くして最速コードを書くべきだけどね
なんか分かってないなぁ。
Modで算出した値を使わないなら
>>373 になるんだよ。
まぁどこまで行っても平行線だからもういいが、他のやつらはどっちが速いんだろ?
まぁ速さなんて俺はどっちでもいいけどな。
このような使い方なら普通の美意識を持ってたらSelect Caseだし。
>>381 トンクス
j = i Mod 10
Select Case j
としても?
おれのとこはそれでもfoo1が速いが。
>>383 ふーん、俺のとこと違うな。
まさかjを変数宣言してないとかじゃないよな?
>>384 してなかった
したら差は縮まったけどまだ
foo2が速い
>>385 おいおい、しっかりしてくれよ。
jをLong型で宣言したらそうなるか教えてくれ。
すまん、また後ろ読んでなかった。
まぁModで算出した値を使わないなら
>>373 が平等な比較だが、とりあえず変数に代入したら
人によっては違うということは分かった。
ちなみに俺はWindows xp とExcel2007だ。
ちなみに Excel2002です
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 気持ちは解る
条件式にnotと=を併用するヤツってもうね…
<>
>>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で抜ける必要なし。
というか抜ける記述は普通はしない。
何、今更?
>>392 書き忘れたがTarget.Columnを三度も取得しちゃいかん。
どうしてもAndとかOrを使うんなら、いったん変数に取得してから判定するんだな。
悔しかったの?
シートに商品名が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
相変わらずの人がいるなw
>>402 ループのお勉強なら基本的には配列の勉強かな?
データ範囲を2次元配列に取得して回すとか、AddItemは遅いから1次元配列にため込んでListプロパティで設定するとか。
WorksheetFunction.FindじゃなくInStr使うとか。
たしかExcel2000以降ならFilter関数が簡単。
WorksheetFunction.Transpose(範囲)で1次元配列を取得して、Filter関数にかけてからListプロパティで設定。
イベント処理だし元の質問からも判断してわざわざExitで抜けるようなコードは必要ないと思う。 条件に「合う」場合だけ判定して処理するように書くのが普通だね。 定番はIfだけど質問者のレベルから考えてコンマ何秒の速度差を考える必要はないと思うし 見た目のわかりやすさと保守のしやすさからCaseをすすめとく。 条件が増えたときに簡単に数字が追加できるから。
2008年1月2日を08.01.02と表記してるセルを計算に使う方法ってありますか? 08.01.02と表記されたセルから08.01.01と表記されたセルを引くと1という答えが算出される処理を作りたいです。
>>405 俺は誰かみたいに「何、今更?」なんて言わんが、そのような条件が三つ以上でIfステートメントでOr判定するくらいなら
Select Caseステートメントの方が速いし分かりやすいし定番だと思うよ。
あと知らなくていいことだが、Select CaseステートメントでCase Elseとか、If ThenステートメントでElseとかは
何もそこで処理しなくても書いた方が速くなるね。
まぁ俺は書かないけど。
>>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)
などとやりゃできないか?
if not hoge is nothing then って構文が気持ち悪いんですけど、何か代替えはありませんか?
そんなこといったらVBAなんて気持ち悪い構文だらけですが何か?
「代替え」なんて変な言葉を使う人に言われたくありません。 もしかして、「代替」を「だいがえ」って読んじゃう頭の弱い人やそれらに無意識に迎合しちゃう人ですか?
>>410 If ObjPtr(hoge) <> 0 thenでよくね?
俺はこんなことしないけどね。
それならもっとシンプルにできる If ObjPtr(hoge) Then こういう書き方を知らないと意味がわからなくなるけど
not 〜 nothingは俺も気持ち悪いと思う 直訳すると「ないアルよ」みたいな回りくどい二重否定の表現って 英語だと普通に出てくるから設計者は何の疑問も持たなかったんだろうなあ 俺もまだVBAを勉強中だから知らないだけかもしれないけど、 インスタンス化されてることを、いちいち論理を反転しなくても直接判定できるような 構文か関数ってないの?自分で作るしかない?
別にこの仕様でおかしくもないと思うけどねぇ そもそもがNothingのときに何かをするってことの方が多いんだからさ 有ることと無いこと、両方とも否定文を使わずに判定出来るのが一番かもしれないが どちらかのみと言うなら、無いことを判定する方法を用意すべきだろ
if hoge is not nothingと書けるのが一番良い
余計変だw
>>415 変な言葉が定着しつつあることはその引用で判るが、それで何が言いたいの?
# 頭使うことを知らない人は、自分で考えることを放棄するから困る。
いっそのこと If hoge = Nothing If hoge <> Nothing でいいじゃん。 なんだよ突然Isって。わざわざ演算子を使い分ける妙なこだわりが理解できん。桂正和マニアかよ。
代替〜(ダイタイ〜) の同音異義語が有る場合などに 代替え〜(ダイガエ〜) と重箱読み使うのは昔からあること 変な言葉でもなければ、最近になって定着しつつあるのではなく以前からあったもの 件の場合は重箱読み使うのが適切と言える状況ではないが、誤用や間違いではない "代替"の意味で"代変え"を使っているなら完全な誤用だけどね そもそも、言葉というのは変化していくもの 最近になって定着しつつあるのだとしても、それを頭ごなしに否定するのは愚かしい 頭使うことを知らない人は、誤用と変化の違いを見極めることなく 自分の中の古い知識だけで物事を断定しがちだが、もっと柔軟な頭と広い視野を持たないと困るよ
AndAlsoやOrElseってVBAには無いんだったっけ?
>>412 いや、”だいがえ”が正しいんじゃないかな。
もしかして”だいがい”って呼んでるの?
CやJavaが長年培ってきた洗練された構文をかなぐり捨ててVBはいったいなにがしたかったのだろう。 なぜ}のかわりにEndと入力しないといけないのか理解に苦しむ。 見やすくない上に3文字も打たないといけない。ばっかじゃないか?
馬鹿発見。「だいたい」と読むのだよ。つーか、>422に書いてあるだろ。
いやいや、オリジナルのBASICはCより古いぞ。 その古臭い構文をVBも引きずっているというだけ。 だからこそBasicを名乗っているわけだが。
>>425 CやJavaとbasicはどっちが古いと思っているのかね。
オリジナルのベーシックと今のVBはかなり違うじゃん。 古いベーシックから新しいVBになるにあたって CやJavaで解決されている構文を見習えばよかったのだ。
C#でも使ってろ。
それよりなんでキーワードの先頭は大文字なんだろう 目がチカチカする 小文字ならまだメリハリが出て読みやすいと思う
433 :
デフォルトの名無しさん :2009/01/07(水) 20:12:55
エクセルのセルに入っている文字列の特定の文字の上にオートシェイプを置きたいって質問した人です。 質問させてください。 エクセルの現在のフォントでの文字列の幅を取得するには、 1.HWNDをNULLでデバイスコンテキストを取得する。 2.コンパチブルなDCをつくり、フォントをエクセルのフォントと同じものをセレクト。 3.GetTextExtentPoint32を呼び出して論理単位で文字列幅を得る。 4.(モードがMM_TEXTだと仮定して)ピクセルなので、ポイントに変換する。 (DPIはGetDeviceCapで取得) 5.エクセルのシートのズームが80%なら0.8をかける であっていますか?
>>429 VBが登場した頃は、まだパソコン用の高級言語の人気が
CとPascal(これはBegin〜Endって書く言語)で2分していて、
C系の構文が良いという評価が固まっていなかったのだと思う。
>>432 VB登場の少し時代は全部大文字だったから、そこからは進歩したと言えると思う。
変わったと言うより大幅に拡張されてるね。 根っこの部分はN-BASICの時代から変わってないから 昔覚えた変なテクニックが意外とそのまま使えたりするんだよな。 このあたりN-BASICやN88-BASICの記憶がないとなかなか同意してもらえないと思う。 例えばこんなNextの書き方、VBから始めた人は知らないんじゃないかな。 For i = 1 To 10 For j = 1 To 10 (処理) Next j, i
>>435 あったなぁ・・
そうだ、For文みて思い出したけど、VBは1からカウントするのが好きくね?
配列とか。あれキモイ。
まともな人間なら数字は0からカウントするものだ。
という言葉を思い出した。
fortranなんかは1からだろ 数学も1から C系で0ベースなのはメモリの配置とか低レベルな理由
>>436 配列はN-BASICもVBも0からだろ。
439 :
433 :2009/01/07(水) 20:39:17
あのー。少しは私のことも思い出してあげてください。。(^^;)
>>439 修飾(ボールドとかイタリックとか)も考慮しないとずれるよ
>>440 嗚呼〜。ほんとだ。そうですよね。。
あ、433のやり方で大筋はOKで、かつ、ボールドも考慮みたいな感じでしょうか?
>>407 >>409 表示形式色々変えたんですけど、
Msgboxで表示しても0だし、EXCELのセル上に表記しても#VALUEになります。
なんでなのでしょう。
EXCELのバージョンは2000です。
>>441 細かいことを言えば、Excelは同じセル内でも1文字ごとにフォントを変更できる。
すべてに対応するのはけっこうめんどくさそう。
>>442 元の日付けデータがシリアル値になってないんでねーの?
>>443 そういやそうですね。ちょっとそこらへんも含めて作ってみます。
VBAっていつ無くなるんだっけ?次のバージョンから?
>>444 そもそも08.02.01のような表記をシリアル値にする方法がわからないのですが。
=DATEVALUE("08.02.01")
みたいに表記してもVALUEになるだけですし。
>>447 VBA関係ないよな
=DATEVALUE(SUBSTITUTE("08.02.01",".","/"))
次に何かわからないことがあったら総合相談所行ったら?
>>446 Mac版の2008ではなくなったけど、その次でまた復活する予定。
Win版はなくならない。
>>449 サンクス
本職はC++だけどVBA使えると経理の女の子から結構重宝されるので助かる
てか、事務職でVBAって何に使うんだよw
452 :
デフォルトの名無しさん :2009/01/07(水) 23:49:34
1行目が項目名で、2行目から201行目までデータが入っています。 オートフィルター後のA列のデータを取得したい。 どんなマクロになりますか?
うぇー Workbook.Save False すると Wrokbook_Before_Close動かん
>>452 オートフィルタの実行はAutoFilterメソッド
結果を配列として取り出すのはCurrentRegion.SpecialCellsメソッド
>>451 単純作業をVBAで自動化してやるとけっこう喜ばれるよ
毎日在庫を確認して発注伝票を印刷してFaxで送信するとか
中小だとアバウトな部分が多くて完全な自動化は難しいから
できるところだけやる
下記のような感じで、セルに他のセルを参照した値を入力したいのですが、 下記の入力方法だと、絶対参照になってしまいます。 相対参照にする指定方法をご存じないでしょうか? Cells(i + 1, 9).Value = "=" & Cells(i, 9).Address & "+" & Cells(i + 1, 6).Address
>>451 Officeって言うくらいだから・・・
>>456 Cells(i, 9).Address(False, False)
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
ウォッチやDebug.Printで値を見るくらいは自分でやれよ ほんと、VBA使いって問題起こるとそこで思考停止してしまい 試行錯誤することが出来ない奴が多いよな エラー出たらそこで終わりってなら機械と同じだぜ 処理速度では機械に敵わないんだから機械以下とも言える
多いって何人だよ
464 :
459 :2009/01/08(木) 08:48:02
>>459 計算自体はできてるようなので
書式設定の少数点以下の桁数が0になってるんじゃ?
466 :
デフォルトの名無しさん :2009/01/08(木) 09:52:07
非アクティブシートの選択セルを操作する事は可能ですか?
無理
VBAを作成してもらいたいのですが もし作成していただけるようでしたらメールをお願いします。 1つの縦列から文字や数字を抽出し、横行書き出す作業を繰り返すマクロの作成をお願いしたいです。
469 :
468 :2009/01/08(木) 15:30:04
メール入力し忘れてました(´A`)
幾ら出すの?
カラダで良かったら...
>>468 形式を選択して貼り付け→行列を入れ換える
EXCELのWebブラウザでプレビューの機能を使って作ったブラウザをVBAで閉じるにはどうしたらいいんですか?
Webbrowser.Fuck
OS:XP Version:2003 取得したデータをセルに表示させる処理を作ったのですが 少し処理速度が遅いので、配列を使って処理しようと思っています。 その際、特定データに対してセルの色付けを行っているのですが 配列を使って最後にRangeオブジェクトで貼り付ける場合、どのタイミングで セルに色付けするのがいいんでしょうか? 配列に入れる処理中に色付けをするぐらいしか思い浮かばないのですが どなたか知恵を貸して下さい
> 配列に入れる処理中に色付けをする それでいいじゃん、何か問題有るの?
>>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
>>475 とりあえず大雑把なアドバイスをしておく
できる限りセルへのアクセスを減らす
決まった色の取得にRGBを何度も呼ばない
定数を使うか初期化の段階でLong型の変数に入れておいてそれを使う
的外れなアドバイスだったらスマソ
具体的にどんな処理をしてるのか分かればもう少し細かく何か言えるかも知れん
479 :
デフォルトの名無しさん :2009/01/09(金) 16:28:17
名前の定義のリストをシートに作成し、それを変更して一気に登録しています。 そこで困った事が発生しました。 シート名がS1とかだと名前の前後にシングルコーテーションが付きますね。 セルから取り出した値は先頭の1文字が外されます。 仕様だとは思いますが、シングルコーテーションも一緒に取り出す方法等が あるのでしょうか?
>>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件分の例示マクロをお願いします。
>>481 もうちょっと質問を具体的に。
(1)フィルターの条件は?
(2)フィルターかけたあとどうしたい?
483 :
452 :2009/01/10(土) 00:31:08
(1) フィルターの条件はデータが1又は0となっているので、1を該当データとしてかけています。 (2) フィルターをかけた後は可視セルを対象に、「A列の各コード(3桁)を取得したい。」 おおよそ、20〜50件程が該当データになります。 取得した後の配列から、その各要素を取り出すことは自分でできると思います。 随分以前ですがやったことはありますので。
>>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
VBAを用いてプリンタに印刷させようと考えています。 それ自体はPrintOutメソッドを使えばできると思っているのですが、その際、プリンタのトレイまで指定することは可能でしょうか。 例えば、このシートを印刷する時はA4のトレイ、このシートを印刷する時は手差しのトレイから、という感じで。
>>485 出来るよ
手動でトレイの選択などが出来る状態なら
その辺の制御をするドライバやAPIは入ってるわけだから
それをプログラムから叩けば良いだけ
でもそれはVBAではなくVBの分野(
>>1 参照)
印刷対象がExcelのシートだろうと、プリンタのハード的制御はExcel関係ないのでスレ違い
487 :
452 :2009/01/10(土) 10:10:00
>>484 おかげで、所期目的が達成できました。サンクス。
>>485 >それ自体はPrintOutメソッドを使えばできると思っているのですが、・・・
484氏の回答を得て、機嫌がいいので (~_~);
そうゆう設定は、PrintOutメソッドでは出来ない。
それで、vbaとしての回答は、印刷ダイアログボックスを呼び出して、選択することになる。
Application.Dialogs(xlDialogPrint).Show
但し、excel4マクロ(vbaではない扱いをされている)の世界だとどうだか知らない。
(xpでは見ていないが、97(たぶん?)と)2007ではマクロの記録で、また、
excel4マクロが記述されている。が、これは、触らない方が無難。
xp は2003 の誤記です。
↓のようなWindowオブジェクトの用途がよくわかりません。 Dim window1 As Window workbookでもなくworksheetでもないんですよね?? どなたかご教授お願いします。
用途が判らなければ、使わなければいいのでは?
>>490 大雑把に説明すると、Windowsというのは画面上に表示された状態の物。
ブックやシートは画面に表示されてなくても、例えばHDDに保存されたファイルの中にも存在する。
ブックを開いたらWindowが作られる、みたいに考えておけばいい。
>>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件でも区切り線が引かれるようにするには どのようにすれば良いですか?
>>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
>>495 考えすぎたみたいです。解決しました。
ありがとうございましたm(_ _)m
>>494 オレの知らないテクニック満載で何やってんのか理解できねえ
すみませんw
499 :
デフォルトの名無しさん :2009/01/12(月) 07:19:54
2007の質問ですー 図形の操作がらみが「マクロの記録」に残らないんですが 以前のバージョンのように記録させる方法ないでしょうか?
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 工藤
Excel総合相談所 76
http://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 工藤
こんなスレにホイホイ質問して良かったのか? 俺はマルチポストでも構わず答えちまう男なんだぜ。 俺なら、どっかのセルにクラスと番号を結合させた物を作る。 cells(i,1).value & "-" & cells(i,2).value をforでまわしてどっかに作る。 図1と図2に同じ処理。 後はfindでsetするなり、好きに料理しろ。
実行中のマクロより呼び出すことで、実行を中断しデバッグ可能な状態にする コマンドはありますか? マクロの自動記録で試しましたが記録されませんでした。
>>504 勘違いかも知れんが、Stopとかブレークポイントの事か?
>>505 そうです。
ブックを開いてマクロ実行する運用の中で、
一定の条件が成立した時に止めたいのですが、
ブックを開く度にブレークポイントを手動で設定するのは
現実的ではないのでブレークポイントはちょっとNGと思ってます。
イメージとしては以下のような感じです。
if xxxxx then
application.stop ← ここで止めたい
end if
ブレークポイントをマクロより動的に設定できるか、
ブックに保存できる方法でも助かります。
>>506 errとerr.number使えばいいんじゃねーの?
MsgBoxやInputBox出せばそこで止まるぞ 止まったらEsc押すといい
じゃあSTOPでいいんじゃね? 止まったところでイミディエイトウィンドウで変数の内容を見たり書き換えたり自由にできる。 実行再開はCONT (嘘)
SendKeys "{Break}" ごめん嘘
debug.assert false じゃダメなん?
513 :
505 :2009/01/13(火) 17:18:25
>>506 そのままでいいじゃん
for i=1 to 5
514 :
505 :2009/01/13(火) 17:20:27
>>506 途中で送信してしまった
for i=1 to 5
if i=3 then
stop
endif
next i
みたいに。
単に止めるだけなら for i=1 to 5 if i=3 then stop next i って書く。
俺は処理が1行でもThenの後ろには書かない もちろん、If ... Then ... else ...もやらない
クラスモジュールについてドップリ勉強できる書籍はないだろうか?
勉強するほどのものじゃないんじゃ
521 :
デフォルトの名無しさん :2009/01/13(火) 22:54:17
IPアドレスを 123.456.789.10 からx番目のIPアドレスを求めるような EXCEL関数かVB関数を探してるのですが、 そんな便利なものありませんか?
x番目って何よ?
Split("123.456.789.10", ".")(x)でいいんじゃねーの
>>522 すみません。
123.254.90.10から
1番目は、123.254.90.11
2番目は、123.254.90.12、
…
という意味です。
上のIPアドレスの範囲も間違えて、あぁぁぁ、出直してきます。
失礼しました。。。。
単なる足し算じゃね
うーん 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
123.254.90.256とかやりそうな奴だな
123.54.90.999 とかやってくれたら笑えるんだけど
OSはXP EXCELは2003です。 1.EXCEL上に別のEXCELシートを開くハイパーリンクを貼る 2.リンク先のシートが開くと同時に Private Sub Workbook_Open() Workbooks("Book1").Close End Sub みたいな感じで処理を走らせ、リンクで開いたシート自体を閉じる のような処理を入れるとシートが閉じられた後、EXCELがおかしくなります。 アクティブになっているEXCELシート以外のシートがアクティブにできないし、 新たに別のシートも開けなくなります。 ハイパーリンクとリンク先のシートを閉じる処理って同時には行えないんですかね?
>>529 イベント処理中でブックを閉じると実行中のインスタンスが開放されて暴走するんだっけ、
なんかそんなのがあったような気がする。
開く方に Book1閉じるって書くしかないんじゃね
マクロ専用のブックを1つ用意して、それは閉じないようにするとか
すみません。質問させて下さい。 Excel2002のシートにラベルコントロールを貼付けました。 それをクリックすると、マウスカーソルがコントロールから離れるまで コントロール全体のサイズが若干大きくなってしまいます。 これは仕様でしょうか? もし対処方がありましたら、御教示下さい。
>>533 フォーカス位置を示す点線で囲まれた状態のことを言ってんなら、それは仕様
>>534 回答ありがとうございます。
ラベルのキャプションのテキストのサイズも変化するので、
フォーカスの点線ではないと思われます。
キャプションのテキストは通常状態ですと文字が滲んでおり、
クリックしてラベル全体が大きくなると文字がハッキリすることから、
ラベルをクリックしたときのサイズが正しいような気がします。
536 :
デフォルトの名無しさん :2009/01/15(木) 19:37:27
質問です。 book1をアクティブにした状態のまま、book2の特定のセルに書き込みをしたいのです。 で、 Windows("book2.xls").Cells(1, 2) = 1 とやったのですが、エラーが出ます。 正しくはどうやればいいのでしょうか?
× ブック.セル = 値 ○ ブック.シート.セル = 値
538 :
デフォルトの名無しさん :2009/01/16(金) 18:33:12
すいません質問です。 VBAを使い年賀状を作成しなければならないのですが まず何からどうしたらよいかさえわかりませんm(_ _)m お願いします。汗
まずは作成しなければならない状況に陥らせた人に聞くべきだろう
マクロ記録しながらシートで作ればいいよ
この時期だと年賀状じゃなくて寒中見舞いだぞ
542 :
536 :2009/01/16(金) 19:27:50
>>537 レスありがとうございます。
さっそくやってみました。
Windows("book1.xls").Sheets("Sheet1").Cells(1, 2) = 1
とやったのですが、やはりエラーが出ます。
なぜなのか、さっぱりわかりません。
しつこいようですが、教えて下さい<(_ _)>
ちょっとはぐぐれよ。オブジェクト名やメソッド名がおかしいだろ。 Sub test() Workbooks("book1.xls").Activate Workbooks("book2.xls").Worksheets("Sheet1").Cells(2, 1) = 1 End Sub
Excel 2000ですがマクロのステップ数が大きくなると、 ブックのファイルサイズがMB単位で肥大化して困ってますが、 皆さんどうしてますか?
そんな現象おきないのでどうもしてないが
どんだけ巨大なマクロを作ってるんだか。 ワークシートを操作するマクロを何度も走らせるとファイルが太る可能性はあるが、 それならシートの再構築でダイエットできるかもしれない。
以下の構成で、hogeよりfugaにあるクラスを生成(new)しようとすると、 「ユーザ定義型は定義さていません」エラーとなります。 クラスでないモジュールの場合はそのまま呼び出せてます。 名前空間の問題と思われますが解決方法はありますでしょうか? hoge.xls → fuga.xla(参照設定)
>>546 マクロは相当な量です。
再構築は以前試した時は多少は改善しました。
でも、まっさらなブックにマクロのみ貼り付けても、
それ以上は小さくならなかったのでコレが限界かと。
549 :
デフォルトの名無しさん :2009/01/16(金) 23:32:49
>>543 おおおおお、ありがとうございました!!
Variant型をできるだけ使わないようにするとか
シートをそれぞれ別ブックに保存する方法教えて。 保存名はシートの名前で。
それを手動でやる方法すら思いつかないの? 思いつくならそれをマクロの記録で録ることすら 思いつかないの?馬鹿なの?死ぬの?
>>552 ワークシートコレクションに対するループの中で
(1) シートが1枚のブックを新規作成
(2) そこへシートをコピペ
(3) 名前を付けて保存
(4) 新規ブックを閉じる
を繰り返す
とりあえず
>>1 の★5の理由によりまずは自分で作ってみれ。方法は★6で。
>>551 ありがとうござました。
しかし各クラスごとに生成用のメソッドが必要とは...
これがなければ理想的なんですが。
>>555 オブジェクト指向ではコンストラクタとデストラクタもクラスライブラリで用意することになってる。
というか勝手にインスタンス化するのは不可能だろ。どんだけメモリが必要かもわからんのに。
シートの表示倍率の値は取得できます?
>>556 Excelのclassのインスタンス化プロパティがPrivateかPublicNotCreatebleしか選べないから
外部から直接インスタンス化できないという仕様なのが問題で、コンストラクタは関係ない。
Withっていいな。Withでネストしまくったコード見ると癒される。
562 :
デフォルトの名無しさん :2009/01/18(日) 11:40:34
すみません、質問です。 エクセル2003のVBAについてです。 フォーム内に、セル(もしくは、エクセルのセルと同様の働きをするもの) の貼りつけることってできるのでしょうか?
564 :
デフォルトの名無しさん :2009/01/18(日) 13:52:10
withを使った方が処理の速度は速くなりますか?
はい
EXCEL2003です。 VBAの処理の中でハイパーリンクをセルの書式設定にてロックを解除したセルに貼り、 その後シート全体をセルの選択が出来ない形で保護する つまりハイパーリンクのあるセル以外は押しても反応が無いよう保護する処理を作ったのですが、 ハイパーリンク以外のセルを押すとリンク先の画面が立ち上がってしまいます。 ハイパーリンクのあるセル以外は選択することも出来ないような画面を作りたいのですが、 何故上のような画面が出来てしまうのでしょうか?
> 何故上のような画面が出来てしまうのでしょうか? 保護により選択出来ないセル上で行ったクリック動作は 現在選択状態にあるセル上で行ったものとして扱われる 故に選択できるセルが1セルなら、どこをクリックしようとそのセルをpクリックした扱いになる 君の要望を実現するには、セル上のハイパーリンクではなく、 ボタンコントロールなどを使ってリンク先に飛ぶのが適切だろうな まあガンバレ
うん!僕がんばるよぉぉぉおおお!!
WindowsXP上でEXCEL2003を使用してます。 フォームに入力した内容を編集してシートに反映させるマクロを作成しているのですが、 マクロ実行中はシートをアクティブに出来ないのでマクロを終了させないと シートの変更内容の確認が出来ません。(テスト作業+デバッグの効率が悪い…) マクロ実行中(フォーム表示中)でも、シートのウィンドウをアクティブにしてシート選択が 可能になる方法はあるのでしょうか? よろしくおねがいします
>>569 VBEのウィンドウを最大化しなければいい
マクロを手動で実行ではなく、 (例)表列A1、A2に数値を入力したらリアルタイムに(マクロ側に計算式記述。例えば A1*A2)A3に結果を表示させようとする場合どうすればいいでしょう? 解説サイト見てもブック起動時実行ってのばかりしか見つからない…
573 :
569 :2009/01/18(日) 19:48:39
もう少し作成しているマクロを説明すると、
・マクロはsheet1上に置いたコマンドボックスから開始する(フォームが表示される)
・フォームに入力した内容が反映されるのはsheet2・sheet3
で、
・フォームが表示されている状態ではExcelのウインドゥをアクティブにすることが出来ない
・なので、マクロで変更されている筈のsheet2・sheet3を開くことが出来ない
という状態です。
>>570 VBEのウインドゥについては開いている状態でも閉じている状態でも上記の現象に変わりありません。
>>571 マクロがsheet1を編集しているなら普通に見れるとは思いますが、
編集しているのは背面にある他のシートなので…
>>572 ワークシート関数と同じ感覚?
それならSelectionChangeで出来る。
シートごとに設定しないといかんけどね。
>>569 ,573
Modelessで呼べば良いだけでは?
>>574 SelectionChangeではなくChangeだろ
SelectionChangeは選択セルが変更されたとき
Changeはセルの値が変更(入力、削除など)されたとき
それと対象セルと処理内容が同じならシート毎に設定する必要も無い
ブック単位、あるいは全ブックを対象に一括処理する方法もある
>>575 vbModelessを付けてフォームを開いたところ上手くいきました、
ありがとうございます。
>>574 多分functionとrangeを使ってどうにかこうにか書くのだと思うのですが上手くいかない
>>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
Set motorange = motosheet.Range("a2", Cells(入力済み最終行番号, 19)) → Set motorange = motosheet.Range("a2", motosheet.Cells(入力済み最終行番号, 19))
巷ではこういうコードが普通にあんのかね。
誰もがプログラミングの専門家じゃないからね。 入門書を斜め読みして断片的な知識で「動けばいい」程度のコードを書いてる人のが圧倒的に多いよ。
超初心者で申し訳ありませんが・・・ エクセルのシートにある数字と文字列をCSVファイルに下記のように出力したいです。 (エクセル) 123,鈴木 1013,田中 (出力) 番号,名前 0123,鈴木 1013,田中 自分で作ってみたところ、下記のように文字列になってしまいます。 (出力) ”番号”,”名前” ”0123”,”鈴木” ”1013”,”田中” となってしまいます。 どのようにすれば良いのでしょうか。 よろしくお願い致します。
586 :
579 :2009/01/20(火) 21:14:18
>>582 うぉー!! ありがとうございます!!!!
2日悩み続けてました。CellsオブジェクトもThisworkbookの子オブジェクトとして認識されて
しまっていたのですね。
でも悩みに悩んでいるといろんなことを考えるから、勉強にはなりますよね。
>>583 もっと違った記述方法があるんですかね?教えてください。
>>579 まず変数名に日本語を使うところからダメだわ。
場合というか,使われ方とか規模とか書く人とかによるな どちらかに決めて使い分けはしない
俺も変数名に日本語使うの抵抗あるけど 日本語使うとコードが分りやすくなるような気もするから 使おうかなとも思うけど… でも抵抗あるんだよなー
英語だと既存の関数名、メソッド、プロパティ、その他予約後などと被る時、 ローマ字で書くのは嫌いだから日本語で書いちゃう
>>592 確かに!
日本語で書けば被らないな
てことは日本語で書いたほうが合理的だな
ActiveXコントロールのテキストボックスをワークシート上で使う場合、 Heightを文字の大きさの2倍以上にしないと、文字が崩れますが 解決法はありますか?
日本語は入力が面倒臭いのが難点。
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等のブラウザから見ると正常に‖と見えます。 よろしくおねがいします。
日本語の変数名に関しては、漢字のみの送り仮名無し。って条件ならOKにする事が多いなぁ。 送り仮名が入ると面倒だよね。 あとは、変数名一覧表を作っておく事が絶対条件かも・・・。
>>599 Option Explicitは必須だね。
なまじわかりやすすぎて、同じ意味の別の熟語に無意識に脳内変換しちゃうことがある。
質問です。宜しくお願いします セルA1には、「8:00」がはいっているとして、 Option Explicit Sub test1() UserForm1.TextBox1 = Range("a1").Value UserForm1.Show End Sub これで、テキストボックスに「0.33333333」じゃなく、 きちんと時刻を表示させるにはどうすればよいですか。
右辺を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
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 :2009/01/22(木) 21:23:56
すいませんまちがえました。 上の Do While Cells(row1, 1).Value = "" は Do While Cells(row1, 1).Value <> "" の間違えでした。
読む気になれない・・・。
609 :
606 :2009/01/22(木) 23:37:24
すいません。 最善の処置かはわかりませんが、自己解決しました。 スレ汚し失礼しました。
特定のEXCELシートが開いている時にはそのシートを閉じ、 開いていなければ何もしないという処理って可能ですか?
>>610 ブックなら可能
やりかたは自分で調べろ
613 :
610 :2009/01/23(金) 00:29:16
>>611 間違えました。
シートではなくブックです。
失礼しました。
615 :
610 :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 を拾ってしまうんですが、何が原因でしょうか。
>>615 Workbooks( ブックB ).Close
エラー処理、またはエラー処理をしなくても済むような方法は自力で調べて考えろ
調べても考えてもわからなかったら、そこで始めて人に聞け
XP SP3 Excel 2002 SP3 ユーザフォームのShowModalをFalseに設定しています。 ユーザーフォームには、複数のテキストボックス、チェックボックス コマンドボタンを配置しています。 ユーザフォームとワークシート間を移動した時の イベントを教えて下さい。 Activate,Deactivateを試しましたが、該当しないようです。 宜しくお願いします。
>>618 該当するイベントは存在しないので、何か別の方法を考えるしかない。
例えばタイマーで一定時間ごとにアクティブなウィンドウを調べるとか、
はっきり言ってかなり面倒な方法しかなかったと思う。
621 :
618 :2009/01/23(金) 02:06:26
>>620 有難う御座います。
やはりそうですか。ほかに力技でも考えてみます。
長いこと調べていたんで、これですっきりしました。
622 :
デフォルトの名無しさん :2009/01/23(金) 02:11:43
>>619 そうですね。いろいろ試しているんですが、きびしいです。
Likeにクセあるんだろうと思いながら使えない気がしてます。
入力値をもっと制限する方法も検討しながらもう少し探ってみます。
あのさ、偶に勘違いしてる人が居るけど、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)$"とするべきだ
>>622 こうなったらRightとInstrで1個ずつ調べるしかないと思う
>>619 たとえば、"*[CX,OX,O2X]*"は、
CかXか,かOか2を最低一つ含むという意味では?
>>623 なるほど、つまり
"*[C,O,O2,Fe]" → "*[,2CeFO]"
"*[CX,OX,O2X]*" → "*[,2COX]*"
ということか。納得いった。
VBAの解説してる某有名サイトは間違ってんだな
>>617 ありがとうございます。
その.closeでエラー回避する方法あるんですね。
調べてみます。
628 :
デフォルトの名無しさん :2009/01/23(金) 02:33:57
>>625 >>626 そうなのですか。
確かにそれなら納得がいきます。
参考にしたサイトを間違えたかも。
ありがとうございます。
長いコードを書くことが確定した。
629 :
623 :2009/01/23(金) 02:40:06
>>626 ,
>>628 OfficeTANAKAかな?
まあ解説サイト作ってるからといって全てを熟知してるわけじゃないし
レベルも様々だから仕方ないさ
まあ、あの人レベルはそんなに低くもなく高くもなくだが
もっとレベルの低い人がデタラメばかり書いてる解説サイトもあるから過信は禁物
>>615 プログラムってのはひとつの発想に固執せず、
いろんな角度から発想を転換してみるのが上達のコツ
こういう時はエラーが起きないよう注意するより、
エラーを無視すればいいんだよ
on error resume next
workbooks("B.xls").close
on error goto 0
出来るなら 一度保存して閉じるけど
そういうことじゃなくて、そもそも目的のブックが開いてない可能性があるのよ。
もし 開いていたら 閉じる
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です。
>>610 開いている全てのワークブックの名前をDoで回し取得、
該当ブックが有れば.close
>>635 年/月/日が月/日/年になってしまう時は、コントロールパネルかツール/オプションで地域の設定を見直す
>>636 全ブック回すならFor Eachの方がコードがシンプルになるけど負荷が大きくなる。
エラーを無視するのは行儀は悪いが一番処理は速い。
エラー処理をきちんと書く、例えばエラーメッセージを出すとか実行結果をエラーコードとして返すのが王道だけど
片手間で作る小規模なコードでは大げさすぎる。
どの方法を使うかはケースバイケースだ。
>>637 地域と言語のオプションやEXCELのツール→オプションを見ましたが不自然な場所は内容に見えるのですが。
もう少し詳しくお願いします。
>>639 ExcelじゃなくてWindowsのコントロールパネルの地域と言語のオプションだよ。
どこかのセルに「9/8/7」ってキーボードから入れたらどうなる?
「2009/8/7」になるか「9/8/2007」になるか。
641 :
630 :2009/01/24(土) 22:09:05
>>638 >エラーを無視するのは行儀は悪い
エラー処理って大そうに考えてる人多いみたいだけど、
俺はエラー処理ってのはプログラムの効率化を図る手段だと思ってる
実際にErrorステートメントなんか存在しなくても、
厳密なプログラムを書けば99.9%(経験上100%)同じことはできる
Errorステートメントってのは、あらゆる場面を想定した厳密なプログラムを
書かなくてもいいように効率化(手抜き)をするためのモンじゃないの?
642 :
635 :2009/01/24(土) 22:15:04
>>640 639の地域と言語のオプションというのはもちろんコントロールパネル内のやつの一項目です。
変なところは無いみたいですし、そもそも購入してからいじった覚えもありません。
現状どのEXCELシートでも9/8/7と入力すると2009/8/7に置き換わって問題ないようにみえます。
>>642 A1セルに09.08.07じゃなくて、9/8/7っていれてみ
確認するんならA2セルに9/8/7と入れてみるべきじゃないかな 書式の問題かもしれないし
>>643 >>644 A1A2セル共に9/8/7と入れれば09.08.07に自動で置き換わりますので書式には問題は無い様に思えます。
ちなみにA1セルに9/8/7と入力して635の処理を走らせると2009/8/7が20/9//8/に置き換わるだけでした。
それとMid関数を利用してピリオドをスラッシュに置き換えても結果は同じ07.09.08でした。
この処理の目的としては日付欄なのに入力の際にピリオドを直接入力している間違った記述を一括で直したいというのがあるのですが
どうしてこんな順番入れ替わりがおこるのかが本気で謎です。
>>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 :2009/01/25(日) 07:49:29
>>646 確認しましたが、それで大丈夫みたいですね。
ありがとうございました。
Open ファイル名 For 開き方 As #ファイル番号 というコマンドの「#」の意味を調べてみたんですが 言及されてなくてわかりません。 この#にはどんな意味があるのでしょうか?
あるブックをアクティブにすると同時にマクロを走らせることって可能ですか?
>>648 「#」は「ナンバーサイン」とも言う。そして、例えば「2番目のvoid」を「void#2」とも書く。
その意味を込めてMS-BASICで採用された仕様だ。
>>649 Workbook_WindowActivate
>>650 ほえー!ずぅっとシャープだとばかり思ってました。
番号を表す「ナンバーサイン」という記号だったんですね。
勉強になりました。ありがとうございます。
>>649 そのブックに、Auto_Open()のモジュール名で記述されたプログラムは
ブックを開くと同時に実行されます。
開くときではなくアクティブにしたときでしょ?
654 :
652 :2009/01/25(日) 19:12:30
確かに。読み間違えました。 どうもすみません。
>>651 ありがとうございます。
もう一つ質問です。
非アクティブ状態のシートのアクティブセルの参照はどうすればいいでしょうか?
現在ブックBがアクティブ状態で
Cells(1, 1) = Workbooks("A.xls").Worksheets(1).ActiveCell.Offset(0, 1)
のような処理はオブジェクトはプロパティ・メソッドをサポートしてないと言われました。
ブックAをアクティブにしたくないのですけど、やはりブックAをアクティブにしてからでないと無理ですかね?
そもそも、ちょっと考えてみれば当然のことだが アクティブじゃないシートにはアクティブなセルなど存在しない それにActiveCellはWorksheetオブジェクトのメンバではなくExcelオブジェクトのメンバなので 上位オブジェクトを指定するならExcel.ActiveCellのようになり、Excel以外は指定できない つまり、「(A):非アクティブなシートのアクティブセル」って概念自体が間違いであり 君がやりたいことは「(B):非アクティブなシートが最後にアクティブだったときにアクティブだったセルの取得」 と表現するのが正しい というわけで、存在しないもの(A)は取得できないので、(B)を取得するには 任意のシートにアクティブセルが存在するようにしてやる(任意のシートをアクティブにする)か、 アクティブセルの移動を監視記録するのどちらかだな 表示を止めてアクティブにしたのが見えないようにも出来るが、それでも前者が嫌なら後者しかない
うぜーよ
べつにうざくはないが、よくそこまで親切にレスできるのかと関心する 職場で部下に教えるならまだしも、2ちゃんで赤の他人に教えるだけで
659 :
デフォルトの名無しさん :2009/01/25(日) 23:23:32
EXCEL97です ActiveSheet.PageSetup.LeftHeader = "&18 1月12日 &A" このなかの1月12日の部分をnow()+2かstring型の変数を使いたいのですが方法はありますか
ActiveSheet.PageSetup.LeftHeader = "&18 " & Format(Now() + 2, "m月dd日") & " &A"
>>656 丁寧にありがとうございます。
>アクティブじゃないシートにはアクティブなセルなど存在しない
これが確認できれば出来れば十分です。
ActiveとSelectを混同してると見た 俺がちょっと前までそうだったから
663 :
デフォルトの名無しさん :2009/01/26(月) 19:12:35
質問です。 データをシステムから取り込んだエクセルファイルなんですが、 セル内の数値の先頭に半角スペースがついてしまいます。 たぶんこれが原因で、数値の大小がおかしくなります。 例えば 変数=20.222 if 変数>10.333 then これで =falseとなるんですが何か対処法はないでしょうか。 セルをダブルクリックしてEnterで先頭のスペースは消えて数字扱いとなります。 セルの書式は未選択状態です。 ファイルがで手元にないので詳しいことはすいません。
>>663 変数="20.222 "
if value(trim(変数)) > 10.333 then
665 :
664 :2009/01/26(月) 19:58:01
すまん、ワークシート関数と勘違いしました。 val(trim(変数))
>>663 元のデータは変えちゃいけなくて、VBAでなんとかするなら上のレスのとおり。
修正してもいいんならシート全体を選択してコピー→そのまま貼り付けして、
黄色いびっくりマークをクリックして「数値に変換」
667 :
デフォルトの名無しさん :2009/01/26(月) 20:58:56
質問よろしいでしょうか。 乱数を生成させて、結果によって単純な算術演算を行うプログラムで統計を取っています。 会社のPCで結果が出るまでに2時間はざらなのですが、 会社のCPUがpen4 3Ghz 自宅のCPUがcore i7 940 2.93Ghz 単純なプログラムなので、劇的にはかわらないまでもすこしは早くなるかと思ったんですが、 逆に遅くなりました。 8コア中 1コアしか使用率があがらなかったので、単純にクロック数の問題だと思うのですが、 VBAで8コアフルに稼動させるようなソースは書けるんでしょうか? しかし、前の乱数値の結果が次に影響するような演算なので、 追い越してなにかを処理しておくというのは意味なさそうです。
>>663 csvでも取り込んでいるのかな? csvファイルの仕様がおかしいんで内科医?
>>667 そりゃ無理だ。VBAが今後マルチスレッド化されたとしても、単純なプログラムでは1コアしか使いようがない。
まさかとは思うが、シートの更新を止めてないとか言わないよな。
670 :
667 :2009/01/26(月) 21:10:32
>>669 ですよね;−;
シートの更新は止めています。
シートへのアクセスも極力抑えて、演算に必要な数値はすべて配列で確保しています。
実行時間は単純に量の問題です、10億試行とかそういう回数なので…
671 :
デフォルトの名無しさん :2009/01/26(月) 21:11:18
>>668 単純なcsvの読み込みなら、たとえ " 123 " みたいにダブルクォートで囲ってあっても
強制的に数値化されてしまうので逆に困るくらい。
>>670 そんなに回数が多いならVBAじゃなくてもっと演算向きの言語にしなよ。
必要ならそいつをVBAで起動すればいいんだし。
674 :
デフォルトの名無しさん :2009/01/26(月) 21:18:21
664-666 ありがとうございます。 明日試してみます。
>>670 10億回程度のループならそんなに多いとは思わんけどな。
無駄に時間のかかるプログラムって、アルゴリズムやコーディングに問題があることが多いけど、
誰か詳しい人には相談した?
それから基本的なこととしては、Variant型の変数は使ってないよな?
あとは乱数の発生を別のプロセスにやらせてファイルにどんどん書き出していくとか、
そもそも数値計算にVBAを使うこと自体が疑問なので、全体をコンパイラで書き直すとか。
675の言うことには耳を貸さないのが吉
677 :
667 :2009/01/26(月) 21:43:17
いろいろアドバイスありがとうございます。 すいません統計などと洒落たことを言ってしまいましたが、 プログラム自体はパチスロ機のシミュレータです。 自分ひとりでつかうならいいんですが、 プログラム知識0の人へのインターフェイスや出力、視覚化も兼ねているので…。 そして残念なことに、このシミュレータの作成は片手間でやらないといけないので、 うまいこと作り直す時間も知識もありません…。 同じ課でたまたまプログラムの知識があった私が任されています… ので同じ課にはわかる人はいません…。 もちろん実機担当に質問はできますが、手一杯だとは思います…。 アルゴリズムはやりようがあると思いますがなるべく実機に近くなるようにしています。 実機はもちろん人の操作によって一連の流れになるので、 アルゴリズムも単純な上から下です。 実行時間は現状でそれなりに満足しています。 10億試行は最終的段階なので、普段は5分とかそういうレベルです。 ただ、環境(CPU)による違いがなかったので質問した次第です。 気遣いありがとうございました。
会社のCPUがpen4 3Ghz 自宅のCPUがcore i7 940 2.93Ghz で逆に遅くなるってのは悲しいな 結局クロックが全てか てか 実機担当って職業プログラマーが居る、その会社は何だろう 気になる
パチンコ機屋じゃないの?
>>678 うちは北森コアのPen4 3.4CGHzとi7 965(3.2GHz)を使ってるが
1スレッド処理でもi7の方が速いぞ
そもそもCPIもバス帯域もメモリコントロールも拡張命令も勝っているi7が
0.07GHz程度の実周波数の差程度でPen4に負けるのはおかしい
会社のPCがベースクロック3GHzの石を使ってOCしてるとかじゃなければ
君が自宅で使ってるi7のPCは、構成に問題有りで何処かに極端なボトルネックが
発生していると思われる
質問です。 EXCELシートにハイパーリンク貼って、そのシートをブラウザでプレビューすると ブラウザにもハイパーリンクが表示されるけど そのブラウザ上のリンクをクリックした時に Private Sub Workbook_SheetFollowHyperlink を起動することってやっぱ無理かな?
>>680 自宅PCは省電力でクロックダウンしているんじゃないか?
>>681 自分でHTMLとVBScript or JavaScriptでそういうコードを書けばできなくもないだろう。
つまり、VBAでは無理だ。
何かにCPUパワーを喰われてるとか 「遅くなった」のが実は0.01秒程度の差だったとか もし自作ならドライバがちゃんと入ってないとか
CommandButtonでClickイベントが呼ばれたときに、そのボタンのキャプションを取得したいのですが、 よい方法はありませんでしょうか? ネットのフォーラムなどの情報では、 ActiveSheet.Buttons(Application.Caller) や ActiveSheet.DrawingObjects(Application.Caller) などでオブジェクトを取得できるとあるのですが、 プロパティがない、などと言われます。 代替手段はないものでしょうか? 環境:Excel2007
686 :
685 :2009/01/27(火) 04:54:33
すいません。そもそも _ClickイベントやMouseDownなどではApplication.Callerは使えないですね。 どうしたらよいのだろうか
>>686 押したボタンのクリックイベントに適当に書くのが普通じゃない?
>>685 コマンドボタンには2種類あるでしょ。
挿入を選ぶとコントロール(部品)の一覧が出てきて
上段が「フォーム コントロール」、下段が「ActiveX コントロール」ってなってるやつ。
下段の方のボタン使ってる?
>>685 「マクロの登録」で登録されたマクロはコマンドボタンのクリックで呼び出される
Sub test()
MsgBox ActiveSheet.Buttons(Application.Caller).Caption
End Sub
>>688 マクロが登録できるのはフォームコントロールの方だぞ
>>686 そもそもCommandbutton1のClickイベントで呼ばれるのはCommandbutton1_clickなんだから、
Private sub commandbutton1_click
Msgbox commadbutton1.caption
End sub
で、いいんじゃねーの?
クラスモジュール使って擬似コントロール配列にしてるとしても、どうにでもなんじゃん
アホなの?
693 :
685 :2009/01/27(火) 10:53:06
694 :
685 :2009/01/27(火) 10:57:08
695 :
デフォルトの名無しさん :2009/01/27(火) 16:07:22
シート保護はprotectで非保護はunprotectでいいですか?出先なので簡単な質問ですが。
ありが十匹!!
>>693 一つのプロシージャに1行ずつ書き足すのが冗長性があると言ってるってことは、
擬似コントロール配列を使ってクラスモジュールで処理してるとしか考えられない訳だから、
取りあえず今使ってるソース出せ
そしたら改良してやるから
699 :
デフォルトの名無しさん :2009/01/29(木) 09:07:22
すみません初心者ですが質問です。 Msgboxに「月度を入力してください」と表示 →インプットboxに月(1〜12までの数字)を入力する画面を出して尚且つ、 1〜12以外の数字または文字を入力したら、「1〜12の数字を入力してください」 というエラーメッセージが出る→最後にまたMsgboxが出てきて「○月度ですね」と 表示するにはどう組めばいいでしょうか。 ○には入力した月数を出したいのですがよろしくお願い致します。
701 :
デフォルトの名無しさん :2009/01/29(木) 11:00:04
>700 すみません、VBAの初心者スレは探しましたが無いみたいです。 どなたかお願い致します。
>>699 流れは大体できてるように見えるのだが・・・
「インプットboxに入れられたものを数値にして1〜12だったら抜ける」ってことを
Do〜Loopを使って組めばいいだけ
超初心者です。 何個か開いたファイルの中から、特定のファイルを探す。 という単純な事がしたいのですが ファイル名が例えば「経理ファイル200812.xls」のように、 月によってYYYYMMの部分が変わってしまいます。 開いたファイルの中から、ファイル名に「経理ファイル」が付いているファイルをアクティブにしたい場合 どのようにすればよいでしょうか。 ワイルドカードが使えないかと思ってやってみているのですが よろしくお願いします。
dim b as workbook for each b in workbooks if b.name like "経理ファイル*" then b.activate end if next
>>704 できました!!
ありがとうございました。
質問です 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行にしたい場合どのようにすればよいでしょうか
>>706 最初に見つけた位置のhを保存しといてそこに入れていく
708 :
707 :2009/01/29(木) 19:00:08
違ったな 「Deleteしたときはhをインクリメントしない」かな?
End Ifの前にh = h - 1で解決しました ありがとうございます
>>701 頭だけでなく眼が悪いんでしょうか。
VBA ( V B A ) のスレではなく、VB ( V B ) のスレへどうぞ。
OS XP EXCEL2003 dteProductDay=format(date,゙yyyy/m/d゙) cells(1,1)=dteProductDay というように、システムの日付を整形してセルに表示させたいのですが、 フォーマット通りに表示されず1/29/2009となります。何が悪いのでしょうか。
>>711 的外れかも知れないが
表示するセル自体の書式を適切に設定しないとそうなる。
そのフォーマットだと、変数に代入された値は2009/1/29となるので
エクセルはこれを日付と認識し内部的に日付のシリアル値として値を保持するのでは。
たとえばdteProductDay=format(date,゙yyyy m d゙)
とするとセルには「2009 1 29」と表示される。
OS-XP Office2003 Shiftキーを押しながらドラッグでセルの移動ができますが、 Shiftキーを押さなくても常にセルを移動することはできますか。 もしくはExcel上でのみ、Windowsの固定キー機能のように Shiftキーを押しっぱなしにすることはできないでしょうか。 キーボードでなら、たとえば上に移動したい場合 ActiveCellを取得して、真上のセルと置換していけばできそうなんですが。
715 :
711 :2009/01/30(金) 20:50:12
>>712-713 ありがとん
cells(1,1)= "'" & dteProductDayでうまくいきました。
エクセルでシート1で例えばF団体をA列の1で書いてそれを シート3のD列の3に自動記入させるマクロは分かるんだけど シート1でF団体がA列の1以外になっても自動記入できるマクロある? あるなら教えて
日本語で質問できない人お断り
>>716 Private Sub Worksheet_Change(ByVal Target As Range)
~~~~~~~
どこに書き込まれたかはTargetという変数に入ってる
718さん 意味がわかりません
日本語読めない人お断り
Worksheets("シート3").Range("D3") = Worksheets("シート1").Range("A1") みたいにセル名が固定ならわかるけど、コピー元のセルが不定の場合はどうするかって質問でしょ?
F団体ってなんだろ…新しい宗教か?
>>723 A1とA2の両方に値がある場合はどちらを採用するの?
>>724 1月23日 団体名 内容
F団体
このときF団体がAの2列に書いてるけど
Aの2列にD団体を記入して
Aが3列になってもシート3のまとめシートには自動記入できるかなぁって
>>725 1対1対応ならなんの問題もないでしょう?
それから行と列を区別して書いてたほうが他人に伝わりやすいですよ。
ABCは列
123は行
A列からD列の10行までの範囲がコピー範囲のときは どうマクロ組むの?
できました! ありがとうございました。
俺が質問を理解できないうちに解決か
>>730 VBAを使うやつは問題をミクロにとらえ過ぎている。
もっとマクロなレベルで考えるんだ。
コピー元とコピー先の対応がどうなっているかだけ理解したらできるかできないか判断できるだろ?
EXCELを使うのは本来はすんごく高度なスキル(=異常な思考様式)が必要 そうでもない人、もしくはそういう発想をするのがヤな人がVBAを使うのだが、 VBAは最高級のBASICの一つで、これだけでも結構重量物 (VB.NETはこれは超ベテランが使う言語で、これからいきなり始めるのだ けはやめたほうがいい) VBAの入門に向いているのはExcelよりかAccessだね。Excelだと動作 は遅いはExcelと基本的に合わないわでロクなことないね。
いやできてないんだけど マクロ記録とは?
もういいから帰ってくれ!
ひどすぎ
>>725 マクロの前に日本語を勉強した方が…
でも一応想像してみた
シート1
年月日 団体名 内容
1/23 F団体 陳情
1/26 D団体 年始挨拶
1/27 A団体 予算ヒア
みたいに日付ごとの日報が書いてあって
団体ごとに各シートに抽出したいんじゃないのか?
でもこれだったらわざわざ聞いてこないよな。
確かにそれだったらその辺のOL捕まえた方が手っ取り早いな。
長文ですがお許しを 最近クラスモジュールを勉強しているんですがプロパティの設定で 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 として実行するとプロパティプロシージャの定義が一致していないというコンパイルエラーが出ます。 これはなぜでしょうか?
Public Property Get TestValue() As String もしくは Public Property Let TestValue(ByVal New_Value As Variant) Getの戻り値の型と、Letの最後の引数の型 つまり、ひとつのプロパティの型は一致させてください
なるほど!Property Getの戻り値も型を指定する必要があるんですね。 m_TestValue変数の型を指定していてそれを返しているから てっきりそれだけでいいと思ってた。 ありがとうございました。
ブック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を、足した結果をだしたい場合、どの様に入力すればよいですか? どうかおしえてください。お願いします。
>>741 ハイパーリンクでは、ブックを非表示で開くことは出来ない
ハイパーリンクをボタンとかに変えて、ブックAのVBAからブックBを非表示で開きましょう
因みにVBAからブックを非表示で開く方法は、幾らでも情報有るから自分で調べましょう
>>1 ★5
>>742 入力規則のリストの連動ならまだしも、Excel用ではなく汎用ActiveXのコンボボックスの連動は
Excelに関係ない話なのでスレ違いです
>>1 ★3〜★4
とりあえずVB6用の方法がほとんどそのまま使えるし、サンプルも転がってる
>>743 WorksheetFunction.Sum
中に入る式は、普通にシート上で入力する式と同じだから解るよな?
まあ解らなくてもスレ違いだから自分で調べろってことになるが
745 :
741 :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の情報を転記する
という処理って作れますか?
ハイパーリンクみたいにクリックするとその下のセルがセレクトされるみたいな処理が作れればいいんですけど。
>>745 作れるよ
ボタンに限らずオブジェクトには配置されてるセルアドレスを返すプロパティがあるから
それが何かくらいは自分で調べようね
>>742 Private Sub
Select change
AddItem
748 :
741 :2009/02/03(火) 23:43:31
セルを左クリックするとマクロが起動する処理って作れませんかね? Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) というのを使うと目当てのセルをクリックしただけでマクロを起動できるようになったんですけど エンターを何回か押していたらその目当てのセルまでアクティブが移動してしまって望まないタイミングでマクロが起動されてしまいます。 そうではなくあくまでクリックした時にマクロが起動できるようにしたいんですけど、いい方法ありませんか?
>>748 WorkSheetにはクリックイベントがないから、
セルに同じサイズのボタンを貼り付けるぐらいしかないんじゃ
ワークブックにWorkbook_SheetBeforeDoubleClickてイベントに有るし Workbook_SheetBeforeRightClickっていうのも有るし、シート名を取得して実行すれば良いのでは?
>>750 普通「クリック」と言えば左シングルクリックのことだろう。
右クリックやダブルクリックイベントでどうしろと。
それ言い出すと、
>>749 も
セルをクリックで処理したいって言ってるのに
ボタンクリックでどうしろと
ってことになるな。
俺は
>>749 も
>>750 も代用法のひとつとして有用な情報だと思うけどね。
>>749 も書いてるが「セル」の「左(シングル)クリック」イベントは無いから、
対象が「セル」であること(ボタンなどを配置しなくても済むこと)を優先するなら
>>750 「左シングルクリック」で操作できること(ダブルクリックしなくて済むこと)を優先するなら
>>749 ってことでいいじゃん。
俺の場合、目当てのセルが複数ならダブルクリックイベントで、ひとつならボタンで妥協するかな。
ボタンでやってみたけど、色を透明にしておいてもクリックするとなぜか灰色になって 下のセルが見えなくなっちゃうんだな。XPと2003の環境で。 代用案として出すなら、イメージコントロールを貼り付けて透明なGIFを貼った方がよさそう。
ボタンの代わりか・・・ つラベル
なぜ“左”クソツクなのか。右でいいやん。
作った本人が使うんならいいけど、人が使う物なら標準と異なるUIは避けるべきかと
757 :
741 :2009/02/04(水) 20:59:06
741です。 皆さん色々とありがとうございました。 とりあえずボタンでやってみようと思いますが、 745でも言ってるように複数張ったボタンの内一つを押した後それに応じたセルを指定する方法が いまだにわからない状態です。 とりあえずもうちょい調べてみます。
>>757 VBAにはコントロール配列が存在しないから、
ボタンをたくさん貼ればボタンの数だけ独立したイベントハンドラが作られる。
だから、ボタンごとに各セルの処理をずらずらっと並べて書けばいい。
冗長だし面倒だけど。
さもなくば、ボタンの座標とセルの座標を比較して、重なった位置のセルを探し出すとか。
疑似コントロール配列使おうよ クラスの作り方工夫すれば、疑似コントロール配列にした上で 処理は同じだが対象は違うというようにも出来るし、 そもそもボタンがどのセル上に配置されてるかは取得できるし
質問です Sheets("sheet1").Select Dim MyRange As Range Set MyRange = Columns("A").Find(What:=Sheets("Sheet2").Range("A1")) いくらやっても検索値がnothingになってしまいます どこを変えればうまく検索できますか
Sheets("Sheet2").Range("A1")に入っている値が Sheets("sheet1")のA列に存在しないとnothingになるけど
>>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)
Flash持ってるなら、Flashの透明ボタン張るのが一番良いと思う。
質問です。 Dim v(1 To 10) As Long とするのと Dim a(1& To 10&) As Long とするのはどっちがいいですか?
765 :
764 :2009/02/05(木) 00:05:42
すいません。 vとaとなりましたが、どっちもvです。
Columns("A")もまずいな。 シートモジュールに書いてるかも知らんしな。 ちゃんとシートくらいは指定汁.
>>764 この場合、配列のサイズはコンパイラが解釈するので型指定は意味がないと思う
768 :
764 :2009/02/05(木) 00:23:21
>>767 そうなんですか。ありがとうございます。
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
>>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
みたいな感じにしなきゃいけない。
確認してないからオブジェクトのエラーが出るかもしれないけど、基本的な考え方としてはこんなところ。
773 :
769 :2009/02/05(木) 18:35:27
>>772 ご返答ありがとうございます。
もし良かったら何か例文を載せて頂けないでしょうか。
フォーム上に配置したWEBブラウザコントロールを印刷したいのですがうまくいきません。 印刷はフォームのPrintFormメソッドを使っています。 コマンドボタン・ラベル・テキストボックス・コンボボックス等は印刷されるのですが WEBブラウザが配置されているところは空白になってしまいます。 検索してみたところAPIを使用する方法を見つけたのですが理解することができませんでした。 APIはブラウザ表示内容を画像として取得する方法だったのですが それをイメージコントロールに貼り付けるという流れになるのでしょうか? よろしくお願いします。
>>773 >>1 ★5の通り、ここはヒントだけで自分でコード書ける人用のスレなので例文は書きません
とりあえずヒントとしてBのブックオブジェクトさえ作ってしまえば、あとはBから取得するのと変わらないと言っておく
>>774 >>1 ★3,4
Excelと直接関係ない汎用コントロールの話はスレ違いです
あのさー、何度も言ってるけど
>>1 はスレの合意じゃないから。
誰かが勝手に書いて、次スレ立てるときにコピペしてるだけ。
気に入らない発言はスルーしろよ。
>>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 も同じ間違いだ・
ちょっとミスった。
>>777 の3行目は
Sheet1のシートモジュールに書いてればCellsの親はSheet1なんだよ。
に訂正。
>>771 も嘘書いちゃいかん。
ActiveSheetが処理されるとは限らないんだよ。
フォルダ「A」に 「A」「1」「2」「3」というファイル名のExcelワークシートが4つあります ファイル「A」のcell(P1:DY1850)の数式をコピーし「1」「2」「3」のcell(P1:DY1850)に自動的に貼り付けていきたいのですが どのようにすればいいのでしょうか? よろしくおねがいします
>>779 これ言っとかないと、
>>1 を理由にスレ違い認定したがる奴が増えるかもしれんからな。
★使ってるのは多分一人。 気に入らないなら無視すれ。
>>1 のテンプレが無かった頃から、同じ様な内容の指摘は多々あったので
指摘が
>>1 ★n形式か、毎回文章で書かれるかの違いでしかないんだけどね
反抗期の子って、対象が形(テンプレ)になると妙に反発心燃やしたりするけど
そもそもテンプレったって、書いてあることを端的に見れば
「バージョン情報書け(★1)」「他分野の話を持ち込むな(★2〜4)」「丸投げするな(★5)」「マクロの記録くらい試せ(★6)」
だけ
これに反発してる子って、バージョン情報不要だと思ってるの?
COMやOCXやWin32APIの話から、VB言語で組める全てのアルゴリズムの話までオールOK?
そして丸投げも大歓迎で、マクロの記録なんて試すくらいなら、俺が親切丁寧にコード書いちゃるってか?
実のところはそんなこと無いだろ?
結局形有る物に反発したい年頃なだけで、根底は
>>1 の内容に賛同してるんだろ?
上記3つともOKなら、「
>>1 は絶対のルールじゃない」とか「気に入らないなら無視しろ」とか
みみっちいこと書くのではなく、それこそ「気に入らない"スレ違い指摘"は無視」して、ちゃっちゃと答えちゃえば
スレ違い指摘の意味すら無くせるので一番効果的なはずなのに、それをしないのが何よりの証拠
と、暇なので長々と書いてみたが、「気に入らないなら無視すれ。」
言ってる本人が出来なかったら恥ずかしいからなw
785 :
769 :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 ←ここでエラーになります。
>>784 つまり、俺様はスレ違い認定する権利があってそれをするのだが、お前はそれに口出すな、ってことですね。
>>785 コントロールの前にシートを指定していないせいだ
>>784 が★使ってスレ違い認定する奴だってことは分かった。
>>787 別に口出ししてもいいよ
ただ、本当に
>>1 が気に入らないなら、スレ違い指摘してる奴に
ムキになって食い付くより、そんなの無視して答えちゃえばいいじゃんと
口出すなと言ってるのは
>>776 他
>>790 もちろん俺も使ってるよ
というか、改めて言うまでもなく解るように書いたんだがw
どっちがムキになってんだかw
反論できないときは、相手を卑下して優位に立ったつもりになり 精神的安定を図るのが吉です
794 :
769 :2009/02/06(金) 13:59:58
>>789 ↓でできました!!ありがとうございます。!!!
MsgBox Application.Workbooks("b.xls").Sheets("Sheet1").ComboBox1.Value
これも
>>1 に反発するなら、ブックだシートだとヒント出してる俺等を無視して、
丸投げ上等でスパっとコード書いちゃえばいいのに、何故それをしないんだろう?
結局は何かに反抗してみたい年頃なだけで、心底
>>1 を否定してるわけではないんだよな
どうやって教えるかは決まってないし、人それぞれだから。 別にいきなり答えを書いちゃってもいいし、 それだと同じ人が何度も質問してきてウザく感じたりスレが荒れたりする可能性があるから、 できるだけ自分で考えるように誘導してやった方がいいと考える人もいる。 進行中の質問に別の回答者が割り込んで、いきなり答えだけを書いても何も問題はない。
質問者だって、いきなり答えだけ書けよって思ってるかもしれないし まじめにVBAの勉強をしてるかもしれない
質問です 隠しシートに読み込んだCSVファイルの中身を出力しようとしているんですが元のシートのほうに出力されてしまいます。 シート参照のが仕方マズイのでしょうかヒントをください
・どうやって読み込んだのか書け ・「元シート」とは何だ? ・「シートの参照」とは具体的に?
追加 ・どこに出力しようとしてるのか書け
worksheets("隠しシート名").range(hogehoge
みんな落ちつけ。 落ち着いてExcelにFlash張りつけろ。
806 :
デフォルトの名無しさん :2009/02/07(土) 00:03:53
>>805 Flashってなぁに??
聞いたことあるけど、、実際どおいうことができちゃうの?
ググレカス
お前は過去スレに類似情報があると知ってるから読めと言ってるが、 大抵は類似情報なんかないのである。
>>809 大抵のまともな人間はまず自力で何とかしようとするモンだ
それでも行き詰った場合に質問をするのがまともな人間の行動
だからお前みたいなヤツは、まともじゃない平均以下の存在価値の無い人間
>>810 質問する奴がいなくなっちゃうね。
このスレもういらないや。
おい、ここ2chだぞ。
いや落ち着け
>>808 はツンデレだけどちゃんと教えてあげてる優しい人
そして
質問した
>>799 は学習して次は現スレくらいは読むだろう
流れがさっぱりわからん
815 :
807 :2009/02/07(土) 01:37:17
過去レスなんか読まないのが今は普通なんだよ、オジサン
♪けんかはやめてー
↑喧嘩、早めてぇ
何これ
コレクションのKey値を取得するにはどうすればいいんでしょうか? 具体的には、For Each In でコレクション内を回って、Key値がある値だった場合だけ、処理を実行させる というコードを作りたいのですが
>>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
特定のBookを開いている時に エンターキーを押すごとにマクロを起動させることってできませんか?
824 :
823 :2009/02/08(日) 20:43:22
書き忘れましたが、EXCELは2003です。
>>822 おおクラスモジュールとかオブジェクト指向とかってやつですか・・・
やはりそういうのも覚えていかないと駄目ですね
ただ今回は隠しシートを使って済ませることにしました
回答ありがとうございました
OSはXP Excel2000 VB6.0です ユーザフォームでツールボックスから「ピクチャボックスコントロール」と いう物を貼り付けたいのですが、ツールボックスに入っておらず、 方法がわかりません。 コントロールを追加しようとしたのですがそれらしいのが見当たらず。 ググってもピクチャボックスが選択できる事が前提のようなので 探すことができませんでした。 どうすれば表示されるのか教えていただけませんか?
>VB6.0です きっと誤爆だな
いやExcelのVBAから、VB6のインストール時に導入される ピクチャボックスを使いたいってことなのでは? しかしVB6使ってる人なら、こんなの簡単に解るはずなんだがな 因みにVB6持って無くて、ランタイムだけ入れてるとかは無しね それじゃダメだから
>>823 キーボードやマウスを使ったイベントはAPI使わないと無理
実行しているsub名を取得する事は出来ますでしょうか。 sub aaa() msgbox bbb '←aaaと表示したい end sub よろしくお願いします。
>>830 実行しているsub名を取得することはできないけど、次のようなことをするのは可能。
sub aaa()
msgbox "placeholder"
end sub
というコードを
sub aaa()
msgbox "aaa"
end sub
というコードに書き換えるようなこと。
ところで、何でそれ知りたいの?
subの最初に適当な変数にsub名を入れとけばいいじゃん
>>833 たしかに。
そういうの思い付く人と思い付かない人って
何が違うだろね
そういう事か? msgboxは質問時の方便で常時表示させたいんじゃないのか 今何の関数に飛んでますとか
質問者のレス待てよ
EXCEL2003です。 特定のフォルダの中に、テスト.xls、テスト1.xls、テスト1000.xls、という3つのEXCELがあるとして killを使ってテスト.xls以外のブックをすべて削除する処理を作りたいと思っています。 kazu = "*" Kill "\\フォルダ\テスト" & kazu & ".xls" だとフォルダ内の3つはすべて消してしまうんですよね。 「テスト」の後に何もつかないブックだけを消さずに残すにはどうしたらいいでしょう?
"テスト1*.xls"
839 :
デフォルトの名無しさん :2009/02/10(火) 04:24:49
かなりど素人なのですがEXCELでA列に文字を入力する際、A列の最終行数を ランダムにしたいのですがどうすればいいでしょうか? わかる方よろしくお願しますm(__)m
>>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文やデータベースを開くことに失敗している可能性は低いです
>>844 まずForの直前でDebug.Print TypeName(dbRes.Field)ってやって、
Fieldメソッドがコレクションを返してるかどうか確認汁。
ごめん。今のなし。 よく見たらこの2行が矛盾してる。 Set dbFld = dbRes.Fields For Each dbFld In dbRes.Fields setの行を削除してみ。
エラーの原因は、 ×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) ってのもおかしかろ?
Option Base 1って邪道ですか? 先々で弊害とか出ます?
>>848 昔はちょっとでもメモリを節約するために、用途に合わせて配列の範囲を削ってた。
VBAなら配列の範囲は自由に決められるからあんまり意味はないと思う。
盲腸みたいなもんだな。
850 :
830 :2009/02/10(火) 22:23:28
すみません。スレ違いと指摘を受け、昨日はレスできませんでした。レスありがとうございます。 皆さんが仰る通り、現在はsub名をコピペして、文字列として組み込んでおります。 なぜこの様な事をしているかと言いますと、 論理チェックのプログラム集合体を作成しています。(500個くらい) 現在、チェックのリストに振ってあるナンバーをsub名としております。 論理エラーがプログラムで検出された場合、sub名=チェックナンバー とエラーの内容を吐き出し、 チェックナンバーを主キーとして、リストからエラーメッセージを取得しています。 チェックナンバーをコピペして出力するのは問題無く出来ているのですが、 sub名を取得出来れば、コピペのミスが減ると思い、質問させていただきました。
>>850 ExcelのVBAではモジュール名を取得する方法はない。
すでに書かれているように、スクリプトを使ってSubの直後にグローバル変数をセットするように
ソースを書き換えるのが、一番間違いが起こりにくいと思う。
エラーナンバー体系と、チェック関数体系は分けたほうがいいと思うんだけど。 エラー内容とチェック関数が1:nやn:1の関係になったりしてない? 仮に1:1の関係だというのなら、チェック関数内に文字列を直接書いといた方がいいとも思う。 (関数名=エラーコードからエラー文字列が正しく対応しているかどうかのチェックが面倒なので) それはともかく、コピペに勝る方法はまずないのだから、今回有効な手段としては、 後からチェックするコードを書くくらいかな。
AccessのVBAなら自分自身の名前が取れるらしいので、Excelに依存しない作業ならAccessを使うという手もある。
854 :
830 :2009/02/10(火) 23:15:07
レスありがとうございます。 ExcelVBAで出来ないと言う事が分かったので、大きな収穫でした。 ダミーデータでエラーを出力した結果に対して目視チェックをする際、 1:1でエラーメッセージが取得出来ているかに重きを置く方向で調整したいと思います。 本当にありがとうございました。
>>855 それ、行番号さえ指定すればプロシージャ名は取得できるけど、
自分自身が何行目に書いてあるかってのは結局わからないのよ。
857 :
843 :2009/02/10(火) 23:36:52
>>845 >>846 >>847 動きました!いろいろアドバイス頂き、本当にありがとうございました
>>847 ああ・・・エラーの理由がわからないのでできるだけシンプルにしたかったのと
改行制限に引っかかったのでいろいろ削ってたのでこうなってしまいました。
すいませんでした
>>855 マクロでコードを書き換えるとか、コードをマクロでチェックする系のレスは全部それ使うんだよ。
ビミョーに方向違いの質問ですがすいません まだおもちゃ程度にしかVBAいじれないんですが On Error〜がらみは古いかもと思って避けてたんですよ でもワークシート関数使うときにシート上で使うときはエラー処理が面倒なのに VBA上だとOn Error〜で簡単にできるのに最近気付いてですね こんな使い方はどこかに落とし穴があるんじゃあと気になるのと ここで回答者されてる皆様のOn Error〜への視線ってどんなものかと思いまして 漠然とした質問すいません
VBAで飯食わせてもらうくらいちゃんとしたもの使うならちゃんとエラー処理して、 エラー内容をユーザーにフィードバックする。 ちょっとしたマクロ程度ならOn Errorで十分。てか面倒。
On Errorは滅多に使わん。 関数を呼ぶ前にちゃんと変数の値をチェックするとか、最初からエラーが出ないように作ってるから。
>>860 えーと飯食わせてもらう作業のなかで利用しつつあるって感じなんですが
ちょっとしたマクロ程度でもあるし「使うな」って程でもないならちょっと安心です
ありがとうございます
VBA自体を商品にするんじゃなくて、 業務効率化のためのマクロ使用なら とにかく目的が達成できればいいんだから早く作れるほうがよい。
>>861 あっやっぱりプロの方はそうですか・・・
ちょっと前まではVBAなしでワークシート上でやってたんですが
その時も確かにエラーが出ないように工夫はしてたんです
でも例えばFor〜Nextで回す時とか「結果がエラーになるときは飛ばす」って
ワークシート上でやってた時を思うとすごく斬新に思えてですね
もし初心者の私に気付いてない「ありがちな間違い」があればと思ってここにきました
>>863 ですよねー
今のところ私のどんくささのせいでマクロ作るのも時間かかるし作らなくても時間かかるし(涙)
事前にチェックするのと、事後にエラー処理するのと、どっちがいいかと言えばケースバイケースだけど、 VBAに限って言えばエラー処理が貧弱だから事前にチェックする方が結果的にコードがすっきり書けることが多い。
on error resume next はたまに使います。 いや、完全にデバッグしてから納品するのが当然なのは分かってる・・・。 分かってはいるんだが、ごく希に納品後にデバッグも止む無し、ってケースが・・・。 とりあえず動けば良い。とにかく早く、今日中に!! みたいな場合には。
ネットワーク先が生きてるかどうかってエラーなしで判断できたっけ?
「生きてる」の定義が問題だが、まぁスレ違いだわな
>>868 ネットワークを介した共有フォルダorファイル?
ネットのURLの有効性?
TMネットワーク?
画面描画しないとかカーソルを砂時計にするコマンドを使用している場合には on errorは便利だよ。 カーソル砂時計になりっぱなしとか避けられるから。
>>864 騙されるな。
本当にエラーが出ないほどチェックしてから関数を呼び出すなら、
チェックの部分が無防備なわけないだろ。
>>867 インラインで処理するのと、何でもエラーを読み飛ばすのとは違うだろ。
チェックするコードと処理するコードはアトミックじゃないから、普通はどんなチェックを行っても 原理的にはエラーが発生する可能性はある。 if dir("hogehoge") <> "" then 'ここでもうファイルが無い可能性がある end if
on errorで飛ばすんじゃなくて、簡単に予測出来るエラーの場合は条件分岐させて当然。 それでも出るのがエラーなのだよ。
876 :
859 :2009/02/11(水) 20:39:36
859ですレス頂いた皆さんありがとうございます 人様に売るものでもないんでマクロに産毛が生えたくらいのものしかつくってないんですが ワークシート上で関数で処理するときはエラーになる時はそのセルを参照するときも意識してないといけないですよね VBAでワークシート関数使ってから入力するならOn Errorですっ飛ばせば逆に綺麗に計算できるなと思ったんです エラーになるかどうかの計算をさせる部分が省略できるから返って負荷軽減にはいいかもと勝手に思ってですね あくまでワークシート関数使うときに限る話なんで皆さんのように複雑なプログラム組んでるときには 当て嵌まらないケースが多いんだと思います それでもここまで読んでいて参考になりました
877 :
デフォルトの名無しさん :2009/02/12(木) 00:25:55
「firefoxで或るURLを開く」をvbaはどう書くの
シェルに渡せ
880 :
デフォルトの名無しさん :2009/02/12(木) 17:23:16
firefoxで「或るURL」を開くは、まさにその URLのシェルへの渡し方がわからないので、聞いているんだが。
>>880 firefoxの使い方とか、スレ違いだろ。
普通に。
コマンドラインからやるようにやればいいだろ。
"C:\Program Files\Mozilla Firefox\firefox.exe" www.yahoo.co.jp
とか。
たぶん、こういうことだろ? REM 「firefoxで或るURLを開く」
883 :
880 :2009/02/12(木) 19:53:36
>>881 もちろん、VBAの書き方の問題として、"""あたりのことが、気になっていたもので。
大変、参考になりました。所期の目的を達成することが出来ます。サンクス。
いままで、IEでやっていたのをfirefoxでやるにあたって、より難しいとの思い込みが
邪魔してましたw
お前は一体何を言ってるんだ・・・
すみませんアホな質問だと思いますがお願いします 標準モジュールで 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になってるんですが これは何故でしょうか?
すみませんやっぱりアホでした 標準モジュールでDimで2重に宣言してました・・・ スレ汚しスミマセン
>>884 自分で考えるより他人に聞いたほうが早いと、、、
質問の文章を書いてると考えがまとまるんだよな。 脳が疑問点を俯瞰するというか。
その場合 書き込みボタン押す前に やめて欲しい
ボタンを押した瞬間にひらめくんだよ、これが。 脳のどこかが切り替わるんだろうな。 例えば誰かに質問するために電話をかけて、 つながった瞬間解決するとか、誰でも経験あると思うんだけどなあ。
とかいうつまんないやり取りは、くだらん質問よりうざい
てな感じ
894 :
デフォルトの名無しさん :2009/02/14(土) 06:55:41
携帯からすみません。 一定時間経過したが、何も操作が無かったら、エクセル自体を閉じるコードを考えてます。 これって可能です? ちなみに、エクセル2003です。 VBAは、ある程度使えます。
>>894 Excelに標準で用意されてる関数だけでは無理
APIを使えば可能
896 :
デフォルトの名無しさん :2009/02/14(土) 11:06:14
APIですか〜 それは、手に余ってしまいます。 素直に、作業ブックを閉じるようにします。 ありがとうございました!
本で勉強中なのですが for nextの例で下記コードをためしにやってみたところ 変数が定義されていないとエラーがでます。 例と変わらずに打ち込んでいるのになぜエラーが出るのか教えてもらえないでしょうか? Sub ループ() For Cnt = 1 To 10 MsgBox ("こんにちは") Next Cnt End Sub Cntがカウンタ変数って事でよさそうなんですが。
そのまんまじゃんか。 Cntが宣言されてないんでしょ。 option explicit外すか、dim cntで宣言すれば良いんじゃない?
ためしに
Dim Cnt As Integer
を追加してみたところうまく動作しました。
何度みなおしても本には
>>897 のコードだけで動くように書いてあるのですが。。
ちなみにEXCEL VBAのコツが面白いほどよくわかるって本です。
>>898 ありがとうございます。
option explicitってオプションで「変数の宣言を強制する」って奴と関係してるものですかね?
ちょっと調べてみますが、この設定のせいだったんですね。
別の本だと「変数の宣言を〜」って設定を推奨してたので
チェックしてました。
option explicit無しがデフォルト設定じゃなかったっけ?
変数の宣言は強制しておけ。 ついでに、きちんと型の概念を持っておくと良いよ。 ただのお遊びマクロで終わるか、仕事で使えるプログラムになるかはそこが大きい。 型を理解してない奴は、ほぼ100%お遊びマクロ。
javascriptもお遊びですね
904 :
名無しという名無し :2009/02/14(土) 19:21:39
質問なんですけど ExcelってXLSのことなんですか? だとしたらここで質問したいんですけど 間違ってたらいってください 今、Excel viewer2003で XLSのファイルを見ようとしてるんですけど 「コマンドラインオプションの構文エラーです Command /?を入力するとヘルプが表示できます」 とか出てきて訳わかんないんですけど詳しい人がいたら教えてください。 お願いします。 (一応、ググって見ましたが、僕の見る限りなかったと思います)
905 :
名無しという名無し :2009/02/14(土) 19:24:16
すみません上のやつ 書くとこミスりました すいませんがスルーでお願いします 本当にすいませんでした
すいません。質問なんですが、 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")」が無いと正しく動作しないのでしょうか?
何で自分で調べないの?
調べたんですけど分からなかったです。スマンコ
>>908 Offset()もRange()もRange型オブジェクトを返す。両者の違いは、
Offset()はマイナスを指定できる。相対指定しかできない。1つのセルしか指定できない。
Range()はマイナス(左、または上)を指定できない。相対指定も絶対指定も可能。複数セルからなる領域を指すことが可能。
両者を組み合わせればあらゆる矩形領域を相対的に示すことが出来る。
この場合に限って言えば、Range("A1")は単なる無駄。
わざわざ無駄な式を書くには理由があるはず。あとで別の例題で書き換えて使うんでねーの?
調べてない奴の台詞。> 調べたんですけど分からなかったです。
>>909 なるほど!
調べたけど分からなかったことが分かりました!
ありがとうございます!
┐(´ー`)┌
グラフ範囲 =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 で動きません。 よろしくお願いします。
マルチすんな
定数戦隊 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が不正」と言われます。 どのあたりがおかしいのでしょうか。
with で囲んでないのに、何でピリオドから始まってるの?
質問させてください 以下の様な入力があった際に 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
なんか色々アレしてたら突破口が出来ました スレ汚し失礼しました。 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
日記はやめてください
922 :
デフォルトの名無しさん :2009/02/17(火) 01:28:52
おまんこ Then
気持ちよくて End If
エラー 存在しないオブジェクトを指定しています
ちんこがないのかまんこがないのか それがもんだいだ
include<スタジオ.エッチ>
927 :
デフォルトの名無しさん :2009/02/19(木) 20:46:29
どうしたVBA!
もうやだこのスレ
じゃあ何で未だにここに居るの?
そこにスレがあるから
約65万の全てのスレに書き込みしてるのでなければ、その理由はおかしい
「そこに山があるから」と言った人も、全世界のすべての山を制覇したわけではない むしろ登ってない山のほうがはるかに多い
「そこに山があるから」という理由で【嫌な】山に登る奴は居ない 故にその例えは間違っている 単純にこのスレに来た理由を聞いてるのではなく 「もうやだ」と言いながらも来る理由を聞いているということをお忘れなく
コピペにマジレスする男の人って
くやしいのう、くやしいのうwww
>>933 嫌な山という風には
普通とらない
つらいのに登る理由が
「そこに山があるから」
えらいどーでもいいネタで盛り上がってるな
938 :
デフォルトの名無しさん :2009/02/20(金) 17:08:14
>>920 自分も初心者だけど、書いてみました。こんな感じ?
Option Explicit
Option Base 1
Private Sub FontColorIndex()
Dim varData As Variant
Dim intRow As Integer
Dim intCol As Integer
Dim i As Integer
Dim j As Integer
varData = Cells(1, 1).CurrentRegion.Value
intRow = UBound(varData, 1)
intCol = UBound(varData, 2)
For i = 1 To intRow Step 1
For j = 1 To intCol Step 1
If i = 1 Then
Cells(1, j).Font.ColorIndex = 1
Else
With Cells(i, j)
Select Case .Text
Case Is = "kuro"
.Font.ColorIndex = 1
Case Is = "kimi"
.Font.ColorIndex = 4
Case Else
.Font.ColorIndex = 8 'xlAutomatic
End Select
End With
End If
Next j
Next i
End Sub
2chだからインデントは表示されないんだけど、 インデント無いと、マジで可読性って下がるんだな・・・。
そういう問題じゃないと思うぞ
半角スペース2個を全角スペース1個に置換してから貼るべし
いつも手抜きコードばかり作ってるから、
TextプロパティをIsで参照するのがなんか無駄に見えてしまう。
With Cells(i, j)
Select Case .Value
Case "kuro": .Font.ColorIndex = 1
Case "kimi": .Font.ColorIndex = 3
Case Else: .Font.ColorIndex = 0 'xlAutomatic
End Select
End With
>>941 単純に置換しちゃうと文字列定数が壊れることがあるから注意な
Option Explicitとかいらねーし
944 :
デフォルトの名無しさん :2009/02/20(金) 22:57:16
初歩的な質問なんですが 複数の名前があるとします。 例 鈴木、木村、田辺、鈴木、林田、村瀬、田中、田辺、室田、田辺 この場合鈴木が2名、田辺が3名と重複してるのですが これをマクロで同じ名前をひとつにするにはどうすればいよいでしょうか? 鈴木、木村、田辺、林田、村瀬、室田のようにしたいのです。
ピボットテーブルでええやん
どこに名前があって、ひとつにした名前をどうしたいんだ
>>944 ぼくなら、まず名前を並び替えて
木村、鈴木、鈴木、田中、田辺、田辺、田辺、林田、村瀬、室田、
こういう風に同じ名前が隣り合うようにした後で
左から右へ選択を一個づつずらしながら、
「今選択されてるセルの内容が、一つ左のセルと同じならそのセルを削除する」っていう風にします
VBAスレなんだからVBA使った方法を書こうよ
>>944 Sub test01()
' 元データ
n = Array("鈴木", "木村", "田辺", "鈴木", "林田", "村瀬", "田中", "田辺", "室田", "田辺")
' 連想配列で重複を取り除く
Set d = CreateObject("Scripting.Dictionary")
On Error Resume Next
For i = 0 To UBound(n)
d.Add n(i), ""
Next
' 結果を配列に代入
m = d.Keys
' 確認
For i = 0 To UBound(m)
Debug.Print m(i);
Next
End Sub
collection使え
>>950 現時点では処理結果をどうしたいのか元質問に明記されてないのでなんとも言えないが、
Collectionオブジェクトだと一覧を取り出すのにループ回す必要があるから美しくない。
どうしてKeysプロパティを用意しなかったんだろう。
配列にpushして行くのが一般的ではなかろうか。
pushできる配列など無い
配列より素直にシート使った方が早いというか楽というか 'アクティブなシートの引数の列について重複している行を削除します '引数列が空白の行については削除しません Sub DuplicationRowsDelete(KeyCol As Integer) Cells.Sort key1:=Columns(KeyCol), Order1:=xlAscending, Header:=xlNo, MatchCase:=True With Cells(1, KeyCol) Dim C As Long For C = Cells(65536, KeyCol).End(xlUp).Row To 1 Step -1 If .Offset(C, 0) = .Offset(C - 1, 0) And .Offset(C, 0) <> "" _ Then .Offset(C, 0).EntireRow.Delete Next C If .Value = Cells(2, KeyCol).Value Then Cells(2, KeyCol).Delete End With End Sub
削除可能なシート状にデータがあるかどうかわからないから、VBAのコードでやってるんでしょ
シートなんてただの二次元配列じゃないか。 シート使うより、プログラム上で配列組んだ方がよっぽどやりやすい。
957 :
デフォルトの名無しさん :2009/02/21(土) 11:50:07
質問です。 コンボボックスのプルダウンリストに5つのデータを表示させたいと思っています。 元のデータは1行5列に記入されています。それを5行1列で表示させることは可能でしょうか? よろしくお願いします。
>>949 On Error Resume Next 必要ないのに使うな
d(n(i))= ""
>>957 データはどんな順番で並んでいても大丈夫。一直線じゃなくて完全にバラバラでも。
あとVBA関係ない質問はExcel相談所へ行くこと。
>>949 On Error Resume Next しっぱなしすな
ほかの場所でOn Error使ってるとこの方法はアウトだから、 どうしても使う必要がある時は別プロシージャに飛ばすしかないな
てか、配列内に既に同じ物が入ってるかどうか監査してからpushすりゃいいじゃん。 VBAにはpushないから、redim preserveで増やす事になるだろうけど。 重複取り除くなんてのはスマートじゃない。 配列内の総当たりだろうが、大した負荷掛からんて。
>>962 連想配列ってのは、単純に代入するだけで重複チェックが全自動で行われるんだよ。
検索すると、連想配列なのにいちいちIfで重複チェックしたりエラー処理してるサンプルが大量に出てくるけど、
それらはみんな無駄な処理をしてるの。
もちろん
>>949 のOn Errorも無駄。
単に重複を除いたリストが欲しいだけなら、全データを配列に代入するだけ。
重複データに印を付けるとか個数を数える場合も、ちょっとした工夫だけでできる。
データを追加するたびにいちいち総当たりチェックなんて最悪。
お前は何を言ってるんだ
連想配列の間違った使い方だな。でも何かと便利なんだよな。 測ったことないけどスピードはどうなんだろう。総当たりよりは間違いなく速そうだけど。
>>963 ランタイムエラーや例外が発生する言語・実装が多いから、重複チェックするのは全くおかしくない。妥当。
お前は何を言ってるんだ
少なくともDictionaryは、重複キーをAddしようとするとランタイムエラーが発生するんだが、 お前は何を言いたいんだ?
on error resume nextなんてものが無いまっとうな言語では、存在チェックするのがあたりまえ
何言いたいのかわからん奴が一人いるな
何かの言語のmapと間違えてるんだろ。
シートをソースにしたODBCでselect distinctする。
連想配列の仕様を理解していれば、重複チェックもエラーチェックも必要ないんだよ。 これは別に裏技でも言語使用の穴を突いてるわけでもない。
まぁまぁ。
Dictionaryでも、mydic(key) = itemという書き方をすれば、重複キーでもランタイムエラーが
発生しないのだよ。Addじゃなくて、代入ね。なければAddされ、あればitemが上書きされる。
だから、この問題に限って言えば、
>>958 が正しい。
975 :
973 :2009/02/22(日) 00:06:33
おっと、書いてる途中にレス入ったな。 だが、存在チェックやエラーチェックをするのが間違い(冗長)だと言い切るのもどうかと思うぞ。
>>949 を流用して具体的に書くと、こういうこと。
重複チェックもエラートラップも使わずに、きちんと重複を除いたリストが得られる。
Sub test02()
' 元データ
n = Array("鈴木", "木村", "田辺", "鈴木", "林田", "村瀬", "田中", "田辺", "室田", "田辺")
' 連想配列で重複を取り除く
Set d = CreateObject("Scripting.Dictionary")
For i = 0 To UBound(n)
d(n(i)) = ""
Next
' 結果を配列に代入
m = d.Keys
' 確認
For i = 0 To UBound(m)
Debug.Print m(i);
Next
End Sub
977 :
974 :2009/02/22(日) 00:07:06
うお、名前間違えた。 973じゃなくて974ね。
おまいらもちつけ 複数の有名サイトでもAddメソッドを使ったコードしか紹介してないから、 それしかないと思い込んでるやつもいるんじゃね?
979 :
974 :2009/02/22(日) 00:12:18
>>976 ちなみに俺なら「連想配列で重複を取り除く」などという無様なコメントなんか入れずに、
if not d.exist(key) then
d.add key, ""
end if
と書くけどね。
>>973 連想配列を重複チェックに使うこと自体が一種の裏技だよな…
まぁ、ArrayクラスにExistメソッドがあって、 If Not Array.Exist(key) Then Array.PushBack(key) End If のように書けた方が気持ちいいんだよな。
わざわざPush関数をVBAで自作してるサイトなら見たことある
俺は
>>962 を支持する。
つか、これ白熱するようなことなのか?
>>1 >★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。
On Error Resume Nextしっぱなしにするから話が暴走するんだ On Error GoTo 0でおしまいにしろ
End スレ
d(n(i)) = "" の方式って昔はよく使っていたけど、可読性の悪い禁じ手と知ってからは 一度使ったらすぐ消すようなスクリプト以外では使わなくなったな
どうでも良いんだが、VBAの配列は貧弱だな・・・。 硬いと言えば硬くて良いんだけどさ。
Foe Each ちんこ In まんこ
な・・・何てことを仰る!!!
コレクションの要素がちんこって、どんだヤリマンなんだよ
ちんこは変数名なので型はまんこ型になるけどまんこコレクションのメンバーそのものではない あとForじゃなくてFoeだからVBAにすらなってない
マジレスするとまんこも変数 宣言部がないから型も不明
暴走話のほうがまだましだな On Error Resume Next はいどうぞ
バリアントナイフの2刀流みだれうちでケフカなんて一撃だぜ
1000 :
デフォルトの名無しさん :2009/02/22(日) 19:52:49
1000 !!!!!!!!!!!!!!!!!!!!!!!!!!!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。