Excel VBA質問スレ Part9
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/12/04(木) 15:42:51前スレ 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)
0002デフォルトの名無しさん
2008/12/04(木) 15:43:4901 http://pc11.2ch.net/test/read.cgi/tech/1054356121/
02 http://pc11.2ch.net/test/read.cgi/tech/1168308855/
03 http://pc11.2ch.net/test/read.cgi/tech/1180192018/
04 http://pc11.2ch.net/test/read.cgi/tech/1189814602/
05 http://pc11.2ch.net/test/read.cgi/tech/1197448064/
06 http://pc11.2ch.net/test/read.cgi/tech/1205231499/
07 http://pc11.2ch.net/test/read.cgi/tech/1212587819/
08 http://pc11.2ch.net/test/read.cgi/tech/1219673793/
0003デフォルトの名無しさん
2008/12/04(木) 18:29:10前スレ1000立てもせずに埋めやがって
氏ねばいいのに
0004デフォルトの名無しさん
2008/12/04(木) 20:11:57おまいらが一番すごいと思うものって何?
参考までに教えてほしい
0005デフォルトの名無しさん
2008/12/04(木) 21:03:29alt =アルト
Delete =デリート
VBA =ブバ
0006デフォルトの名無しさん
2008/12/04(木) 21:19:260007デフォルトの名無しさん
2008/12/04(木) 21:35:090008デフォルトの名無しさん
2008/12/04(木) 21:51:500009デフォルトの名無しさん
2008/12/04(木) 23:25:220010デフォルトの名無しさん
2008/12/05(金) 10:30:09excel VBAからSAS参照できるんだけど、どこまで使えるのかがリファレンス見てもさっぱり・・・。
他言語とのマッシュアップでお勧めの本ってありますか?
もしくは他スレへ誘導してくれるとありがたいです。
0011デフォルトの名無しさん
2008/12/05(金) 10:45:000012デフォルトの名無しさん
2008/12/05(金) 11:45:16そのSASとやらのスレに行けよ
0013デフォルトの名無しさん
2008/12/05(金) 23:14:09IEのアイコンをダボークリッ
0014デフォルトの名無しさん
2008/12/06(土) 01:23:02が「ああ」になるけど、半角カタカナは送れんの?
0015デフォルトの名無しさん
2008/12/06(土) 02:05:44Sub a()
SendKeys "あア"
End Sub
0016デフォルトの名無しさん
2008/12/06(土) 15:15:51あ「あ」←未確定状態
0017デフォルトの名無しさん
2008/12/06(土) 16:18:23うちがATOKだからか?
0018デフォルトの名無しさん
2008/12/08(月) 11:59:35IME 結果
OFF :あア
ひらがな :あ「あ」
全角カナ :あ「ア」
全角英数:あ
半角カナ :あ「ア」
半角英数:あ
※「」内は未確定状態
0019デフォルトの名無しさん
2008/12/08(月) 15:28:30VBE上では あ だけ
IME OFF→ひらがな に変化
メモ帳に
あ「あ」
IME English
?? に
IMEに依存する模様
0020デフォルトの名無しさん
2008/12/08(月) 22:25:490021デフォルトの名無しさん
2008/12/08(月) 23:06:58VBAで数独。人に解かせる(GUI)のでもプログラムに解かせるのでもよし。
問題生成もできたらなおよし。
0022デフォルトの名無しさん
2008/12/08(月) 23:14:13経過秒数、正答率表示機能付き。
0023デフォルトの名無しさん
2008/12/09(火) 00:59:280024デフォルトの名無しさん
2008/12/09(火) 11:00:26コードの書き込みが一切できません。
新規で開いたエクセルファイルで、まっさらな状態でも
「メモリが不足しています。」と表示されます。
対処法はありますでしょうか?
Mac OS 9.2.2 Microsoft Office 2001 バージョン9.0(2615)です。あと何か必要な情報はありますか?
0025デフォルトの名無しさん
2008/12/09(火) 11:58:26ttp://support.apple.com/kb/TA25701?viewlocale=ja_JP&locale=ja_JP
0027デフォルトの名無しさん
2008/12/09(火) 12:55:43オマエのいってる「べらぼう」がなんだか知らないけど、
メモリがたりないんだろ?
002824
2008/12/09(火) 14:43:36そういう基本的なことじゃないらしいというところまではわかっているんですけどね。
オマエ呼ばわりするオタクがいるところにきたオレがバカだった。
0029デフォルトの名無しさん
2008/12/09(火) 14:51:50わかってねーじゃん
0030デフォルトの名無しさん
2008/12/09(火) 14:53:43再インスコくらいは試してるよな?
2chで質問する前にこんな基本的なこともしてないならマジでバカだな
0031デフォルトの名無しさん
2008/12/09(火) 22:21:16こちらへどうぞ
http://pc11.2ch.net/pcqa/
0032デフォルトの名無しさん
2008/12/09(火) 22:48:23配列について教えてください。
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を入れる感じの、これのほうがしっくり来る気がするのですが
どういうことなんでしょうか?
0033デフォルトの名無しさん
2008/12/09(火) 23:11:070034デフォルトの名無しさん
2008/12/10(水) 01:47:18dim As Integer
これはどういう意味ですか?
0035デフォルトの名無しさん
2008/12/10(水) 01:48:570036デフォルトの名無しさん
2008/12/10(水) 07:01:070037デフォルトの名無しさん
2008/12/10(水) 08:18:23A1セルに「業務1」という値がある場合、A2セルに「担当1」、
A1セルに「業務2」という値がある場合、A2セルに「担当2」
B1セルに「業務1」という値がある場合、B2セルに「担当1」...
というようなものを、現在If関数でやっています。
追加追加で来ていたので、ネストがかなり深いです。
だんだん条件が増えてきたので、何とかマクロで作成できないものかと考えています。
メンテを楽にする条件で、変数と代入で可能でしょうか。
VBAが初めてなので、ちょこちょこ調べながらなのですが、
方向性がつかめなくて・・・
0038デフォルトの名無しさん
2008/12/10(水) 10:44:31>>37
1行目に業務を入れて2行目にその担当を出したい
今はIFでやってるから業務が増えてくると大変なのでどうにかしたい
ってところか?
LOOKUPとかじゃだめなのか?
0039デフォルトの名無しさん
2008/12/10(水) 11:48:48Dim i As Integerの書き間違い?
コピペすれば間違いようがないと思うんだけど、もしかしてパソコン使わずに本だけで勉強してんのかな。
0040デフォルトの名無しさん
2008/12/10(水) 17:03:11VBAやったことない人なら、lookup なり作業列なり使って、
考え方から整理し直した方がどう考えてもラク
今の考え方のままだと、VBAでも if でネストしまくったわかりにくいコードになりそう
改行とインデントがある分読みやすいだけみたいな
0041デフォルトの名無しさん
2008/12/10(水) 18:46:07VLOOKUPであっさり出来ました・・・orz
VBAもちょこちょこ勉強していきます。
スレ汚しすみませんでした
0042デフォルトの名無しさん
2008/12/10(水) 19:40:57印刷された時に、セルに入力されているデータが長すぎて、
全文表示されなかったりしますが、
そういう状態かどうか調べるにはどうしたらいいでしょうか?
0043デフォルトの名無しさん
2008/12/10(水) 19:48:51文字数や文字バイト数(unicodeだと全部2バイトだから変換しる。)で情報量を調べておいて、、
予め余裕持って設計しましょう。
80バイト毎にheightをX倍してやるとかね。
印刷すると崩れるのは仕方の無い事。
崩したくないならば、excelじゃなくて優秀なドローツールを使うか、ラスタライズしてから印刷するとか。
0044デフォルトの名無しさん
2008/12/10(水) 20:48:45xp 2003 空白文字も含めて全て全角にしています。
if left$(moziretu,6)=space(6) then
004544
2008/12/10(水) 20:50:50よろしく
0046デフォルトの名無しさん
2008/12/10(水) 21:09:530047デフォルトの名無しさん
2008/12/10(水) 21:58:41mid関数
0048デフォルトの名無しさん
2008/12/10(水) 23:47:47左から6文字「目」じゃない
0049デフォルトの名無しさん
2008/12/11(木) 10:42:48それは半角の空白6文字かどうかの判定式。
全角6文字の空白かどうかなら
If Left$(moziretu,6)=String$(6," ") then
混在だとちょっと面倒かな?
0050デフォルトの名無しさん
2008/12/11(木) 11:48:18全角半角考慮してこんなのはどうかな?
LTrim$(Left$(moziretu, 6)) = ""
0051デフォルトの名無しさん
2008/12/11(木) 13:07:48なるほどね。
それが一番いいだろうな。
0052デフォルトの名無しさん
2008/12/11(木) 16:54:360053デフォルトの名無しさん
2008/12/11(木) 17:24:22数も6個で固定なら>>46で充分でしょ
わざわざ余分な関数使う意味がわからない
0055デフォルトの名無しさん
2008/12/11(木) 20:34:08ありがとうございました。
バイト数を数える事で対応してみます。
0056デフォルトの名無しさん
2008/12/13(土) 03:22:22表示させてEXCELのシートとやりとりしたいのだが、
そういったコントロールってないの?
今使ってるのがEXCEL2000なんだが。。。
0057デフォルトの名無しさん
2008/12/13(土) 03:48:020058デフォルトの名無しさん
2008/12/13(土) 14:45:20VBAのリファレンス本でお勧めを教えて頂ければ助かります。
環境はWin2kでExcel 2003です。Cとか弄ったことがあるのでまるっきり初心者ではないです。
0059デフォルトの名無しさん
2008/12/13(土) 14:56:020060デフォルトの名無しさん
2008/12/13(土) 16:22:48owc
>>58
msdnのヘルプ
0061デフォルトの名無しさん
2008/12/13(土) 18:39:410062デフォルトの名無しさん
2008/12/13(土) 18:43:120063デフォルトの名無しさん
2008/12/13(土) 19:36:140064デフォルトの名無しさん
2008/12/13(土) 20:57:44VBAくらい中学生でも使え紆余w
0065デフォルトの名無しさん
2008/12/13(土) 22:32:27「技術評論社 Excel VBA ポケットレファレンス」
成りは小さいが、他のどの本よりも役に立った。
今年、確か、2007対応の改訂版が出たと思うが2003等も使えるように整理してあるはず。
0066デフォルトの名無しさん
2008/12/13(土) 22:55:26本なら俺も↑のポケットリファレンスだな。
あとはできる大事典VBAもいい
勉強中なら本のほうがやりやすい所あるし。
006758
2008/12/14(日) 15:30:22>65,66で紹介して頂いたポケットリファレンスを購入してきました。
ちょっと手に取って調べられる本が欲しかったので、まさにぴったりです。
0068デフォルトの名無しさん
2008/12/14(日) 16:42:59だったらそれを先に書いておけよ。
0069デフォルトの名無しさん
2008/12/14(日) 17:19:150070デフォルトの名無しさん
2008/12/15(月) 02:04:110071デフォルトの名無しさん
2008/12/15(月) 16:37:15もし2003で使うならブックオフあたりで古いやつを探すといいかも。
0072デフォルトの名無しさん
2008/12/15(月) 23:15:34WindowsXP、Excel2000です
マクロでゲーム作りに挑戦し、遊べる段階にまで出来上がったのですが…
なぜだか遊んでいると、高確率で突然「画面更新」が止まってしまいます。
処理は続いているので、音も鳴りますし、Escボタンでコードの実行を中断すると、画面更新が再開され内容が反映されます。
その時「継続」を選ぶとゲームを続けられるのですが、しばらくするとまた止まってしまいます。
ループ中にScreenupdating = Trueを入れてみましたが、効果はありませんでした。
何が原因なのでしょうか?思い当たる節があれば教えて下さい。
因みに落ちゲーで、セルドット方式です。Sleep関数を多用しています。
長文失礼しました…
0073デフォルトの名無しさん
2008/12/16(火) 00:01:40おとなしくFlashの勉強するのが吉。
007472
2008/12/16(火) 04:33:53レスありがとうございます。
仕様ですか…Excelの描写速度が遅いことは知っています。
しかし、ゲームプログラマーの方々もいらっしゃいますし、自分に否があるように思えてなりません。
コードの書き方に問題がある、ということは考えられませんか?コードは現在700行程です。
自信はありませんが、Sleepが問題な気がします。どうでしょうか。
0075デフォルトの名無しさん
2008/12/16(火) 04:41:100076デフォルトの名無しさん
2008/12/16(火) 06:08:43それができないなら自分で勝手に調べて答えを出せばいいよ。
0077デフォルトの名無しさん
2008/12/16(火) 10:00:26エクセルのセルに勤務時間が入っており、これをvbaで計算しているのですが
時間の時も日付型(DATE)の方が良いのでしょうか?
それともSingleやDoubleでしょうか?
VBAの勉強も兼ねてやってますので、関数でやれという回答はご容赦下さい・・
0078デフォルトの名無しさん
2008/12/16(火) 12:24:26やっぱり、コード見ないとどうしようもないですよね…
お騒がせしました
0079デフォルトの名無しさん
2008/12/16(火) 13:09:500080デフォルトの名無しさん
2008/12/16(火) 13:10:45勉強を兼ねているんだろ。全部やれ。
0081デフォルトの名無しさん
2008/12/16(火) 13:15:49試してみてどちらでもできるということは確認済みなんです
でも一般的に、どちらがベターなのかなと思いまして
0082デフォルトの名無しさん
2008/12/16(火) 13:27:290083デフォルトの名無しさん
2008/12/16(火) 15:03:10Sleep関数は問題無いんですね?ありがとうございます!安心しました
Sleepが使えないとなると凄く面倒になるので…
以前に原因を調べていたところ、Sleep関数の欠点(?)を綴ったページを見つけ、
その内容を見て勝手にSleepが原因だと解釈してしまったみたいです。
自己解決出来るよう、もう少し頑張ってみます
0084デフォルトの名無しさん
2008/12/16(火) 15:42:22教えてください
0085デフォルトの名無しさん
2008/12/16(火) 15:50:10VBAでなくてもできることの質問は、VBスレ辺りでどうぞ。
0086デフォルトの名無しさん
2008/12/16(火) 21:46:590087デフォルトの名無しさん
2008/12/16(火) 23:12:04B=グー
A=パー
としてじゃんけんを楽しんでください。
0088デフォルトの名無しさん
2008/12/17(水) 07:58:32逆に考えろよ。VBAなんて宿題かゲームくらいにしか使わないだろ。
おまえらのご自慢のテクニックを披露できるチャンスだぞ。
0089デフォルトの名無しさん
2008/12/17(水) 09:42:52仕事で使うわアホ
0090デフォルトの名無しさん
2008/12/17(水) 11:06:52VBAがまともに使えない上に仕事したことないやつが若気の至りってやつで書き込んだんだろう
あまり責めてやるなよw
0091デフォルトの名無しさん
2008/12/17(水) 12:55:10どんなことに使ってるの?
0092デフォルトの名無しさん
2008/12/17(水) 13:49:36他は資料をデータベースっぽく正規化するために使うことも
・・まぁ、大企業ならこんなことしなくても既にシステムは完成されてるんだけどね
0093デフォルトの名無しさん
2008/12/17(水) 13:51:220094デフォルトの名無しさん
2008/12/17(水) 13:57:12帳票(見積書とか)の形に整えて印刷とか
0095デフォルトの名無しさん
2008/12/17(水) 18:51:26現在VBAマクロ内で、OSのXP/Vistaの違いを問わず、 インストールされているFirefox 3.0.xの
実行ファイルのフルパスを取得しようとしています。Firefox3が
・標準のフォルダ以外にインストールしている可能性がある
・HTML、HTTP等に関連付けられている
・デフォルトブラウザに指定されている
という状態で使われているとき、マクロ上で何をすればスマートにフルパスが得られるでしょうか?
検索すると、既存ファイルを利用する方法、レジストリの関連付けを参照する方法がありますが、
他の方法は無いでしょうか?
参考になる情報をご存知の方、教えてください。
0096デフォルトの名無しさん
2008/12/17(水) 19:27:430097デフォルトの名無しさん
2008/12/18(木) 01:52:45VBAで整形&正規化してる。なんか>>94とよく似た境遇だな。おまけに受け渡しはいまだにフロッピーディスク。
社内でデータベース処理してるマシンも松下製の見たことない機種だったなあ。
こっちはなんとPC-9821が専用ケーブルでつながってて、N88-BASICで書かれた端末ソフトが走ってる。
中小企業でコンピューターの知識がないと、メーカーの営業の言うがままにシステム構築して
記憶媒体から何から何まで汎用性ゼロのシステムで囲い込まれてにっちもさっちもいかないことが多い希ガス。
0098デフォルトの名無しさん
2008/12/18(木) 10:56:240099デフォルトの名無しさん
2008/12/18(木) 11:40:21パソコンで動くエミュレーターがあるにもかかわらず
いまだにバカ端が業務で現役ってところもあるしそんなに珍しくもないんじゃね?
まぁスレ違いだしこの辺で流れ斬ろうか・・・
0100デフォルトの名無しさん
2008/12/18(木) 13:42:450101sage
2008/12/18(木) 15:09:13じかんをカウントダウンさせるプログラムとモグラの動きのプログラムが
うまく作用せず、モグラの動きのプログラムが終了すると
再びカウントダウンするようになってしまいます。両方とも独立して動くように
したいのですがよい方法はありませんか。
0102sage
2008/12/18(木) 15:11:29スタートボタンを押すと時間のカウントダウンを開始
Private Sub CommandButton1_Click()
starttime1 = 2
starttime2 = 0
startflag = 1 'ゲーム開始用フラグ
Do While starttime1 >= 0
keika = Timer + 1
Do While keika > Timer
Loop
starttime2 = starttime2 - 1
If starttime2 < 0 Then
starttime2 = 59
starttime1 = starttime1 - 1
End If
If starttime1 < 0 Then
MsgBox "TIME UP!" '時間が過ぎたら
Exit Do
End If
Label4 = starttime1 & ":" & starttime2 'ラベルに時間のカウントダウンを表示
DoEvents
Loop
End Sub
0103sage
2008/12/18(木) 15:18:27Private Sub back1_Click() back1はイメージオブジェクトです
If startflag = 1 Then
Call moguratataki
End If
End Sub
コマンドボタンを押したら時間のカウントダウンとゲームの開始したいと
思っていますがそれもまだ分からないので調べ中です。
call命令で、もぐらたたきゲームが始まるような感じで作りたいと思っています。
0104sage
2008/12/18(木) 15:22:58Sub 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
0105sage
2008/12/18(木) 15:25:33b = 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
0106sage
2008/12/18(木) 15:26:25Else
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
0107sage
2008/12/18(木) 15:27:54For 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
0108sage
2008/12/18(木) 15:30:53教えてください。
0109デフォルトの名無しさん
2008/12/18(木) 15:31:07っつってもわかんねーかな。
0110デフォルトの名無しさん
2008/12/18(木) 15:46:55おはやい回答ありがとうございます。
Application.Ontimeを調べてみました。なんとなくできそうな気が
しそうですのでこれでやってみようと思います。ありがとうございました!
0111デフォルトの名無しさん
2008/12/18(木) 20:25:38それをif判定で、試してみたところうまく結果がでませんでした。
プルダウンの選択式だと、"○"として扱われないのでしょうか?
0112デフォルトの名無しさん
2008/12/18(木) 20:46:33何のプロパティをチェックしてるの?
0113デフォルトの名無しさん
2008/12/18(木) 20:48:17cellsでとってvalueを参照しております。
イミディエイトで中身みたら、ちゃんと×や○になってたのに・・・
0114デフォルトの名無しさん
2008/12/18(木) 21:40:37実際のif文は?
0115デフォルトの名無しさん
2008/12/18(木) 21:41:19そもそも、プルダウンじゃなくすれば判定できるの?
0116デフォルトの名無しさん
2008/12/18(木) 21:48:14do until なんとか =""
with ほにゃらら
if .cells(x, y).value = "○" then
処理
end if
loop
.valueにはいってる値を確認したところ、×とかちゃんとはいってました
セル全体にプルダウンの選択がそれぞれ入ってるからループ文では聞かないのかな
0117デフォルトの名無しさん
2008/12/18(木) 22:26:25これでやるとエラーがでます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
0118デフォルトの名無しさん
2008/12/18(木) 22:36:44sheets(2)の列x(初期値1)を削除した後のループで再び削除する時にはxがインクリメントされてるから初期状態の列番号でいう所の3列目が削除されると思うがそれで良いのか、ふと疑問に思った。
どちらもエラーの原因じゃないけど。
というか、俺には「○×のプルダウンが入ってます」の意味が理解できない。
すまんな。
0119デフォルトの名無しさん
2008/12/18(木) 22:46:18それでもif文の行にはエラーは出ない。
力になれなくてすまんな。
0120デフォルトの名無しさん
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文にオブジェクトはプロパティかメソッドをサポートしてない
ってでてまたエラーになってしまいました
0121デフォルトの名無しさん
2008/12/18(木) 22:53:48columnsがまちがっていたようでした
無事いけました
ご指摘いただいたcolumnsが間違っていたことが一番の原因だったようです
0122デフォルトの名無しさん
2008/12/18(木) 23:16:55シート1から実行するとしてセルB2には名前という文字が入っております
const mojicell as string "B2"
のようにしてシートの対応するセルに格納されてる値をとりだすことはできますか?
やってみたところ、セルを格納するのはできなかったので・・・何か方法があるのかと思いまして
実際どのように試し方といいますと
Sheets(mojicell).cells(...... のように使いました。
SHeets("名前").cells(... に置き換えられるかとおもっていたのですが、
実際はSheets("B2")と 入っておりました。
const で指定したセルが参照する値を格納することはできないのでしょうか?
0123デフォルトの名無しさん
2008/12/18(木) 23:19:36シートまで含むならまずconstの値を工夫しなさい。
0124デフォルトの名無しさん
2008/12/18(木) 23:21:20const mojicell as string = "B2"
worksheets(range(mojicell).value).cells(...
0125デフォルトの名無しさん
2008/12/18(木) 23:50:23これだと
シート1からこのマクロ実行してシート1にあるセルを参照するならわかりやすいですが
シート2からこのマクロを実行してシート1にあるセルを参照するとなると、
できなくなるのでは?
0126デフォルトの名無しさん
2008/12/19(金) 00:50:28これだとエラーでます・・・
0127デフォルトの名無しさん
2008/12/19(金) 00:59:34Sub tes2()
Const moji As String = "A17"
Sheets("テスト").Cells(3, 1).Value
Sheets(Range(moji).Value).Cells(3, 1).Value
これだと下の文がインデックスが有効範囲にないとエラーでます
0128デフォルトの名無しさん
2008/12/19(金) 01:03:33"A17"は、シート名じゃねーだろ
0129デフォルトの名無しさん
2008/12/19(金) 01:06:10これの意味するところは
range("A17").value = テスト という所なのでは?
よって
sheets("テスト") と>>124さんがおっしゃってた意味かとおもってたのですが
動作がうまくいかないということは違いますよねorz
0130デフォルトの名無しさん
2008/12/19(金) 01:16:52どのシートの"A17"で
どこのマクロだよ
0131デフォルトの名無しさん
2008/12/19(金) 01:18:18右辺を書け!
0132デフォルトの名無しさん
2008/12/19(金) 01:23:35で、このsheets(1)のA17セルの値をconstとして間接的に参照できる形にして
sheets("テスト")の3行1列目のセルの値を取得します
でも、なぜか
print Range(moji).value
テスト
とは表示されるのに、先ほどの下の文では表示されません
0133デフォルトの名無しさん
2008/12/19(金) 01:26:27これではインデックス範囲のエラーがでますorz
0134デフォルトの名無しさん
2008/12/19(金) 01:35:000135デフォルトの名無しさん
2008/12/19(金) 01:42:37Const moji As String = "A17"
Sheets("Range(moji).Value").Cells(3, 1).Value
End Sub
sheets(1)のA17セルには、テスト という値が格納されている
sheets("テスト")のセル(3行1列目)の値には、たとえば 100 といった値が格納されている
このマクロをsheet("テスト")にて実行する方法ということです
今のままじゃエラーがでますので
0136デフォルトの名無しさん
2008/12/19(金) 01:46:07実際に作ったものをアップしろって
0137デフォルトの名無しさん
2008/12/19(金) 02:16:520138デフォルトの名無しさん
2008/12/19(金) 02:19:01質問の意味不明度が増してきたのでそろそろ寝てほしいと思う。適当に脳内補完してみたから。
const moji as string = "A17"
debug.print worksheets(sheet(1).range(moji)).cells(3,1)
0139デフォルトの名無しさん
2008/12/19(金) 02:22:16それを実行してみたところ型が一致していません。とでました。
0140デフォルトの名無しさん
2008/12/19(金) 02:23:02>>135
>Sheets("Range(moji).Value").Cells(3, 1).Value
この辺の行の意味不明度からして、根本的な間違いがあると思う。
0141デフォルトの名無しさん
2008/12/19(金) 02:24:541がSheet1
2がテスト
です。
Sheet1のA17セルには、テスト と書かれています。他のすべてのセルは空白です。
テストのcells(3,1)の場所には適当に文字を書き込んでいます。
で、お教え頂いたマクロを実行したところ>>139のエラーがでました。
const moji as string = "A17"
debug.print worksheets(sheets(1).range(moji)).cells(3,1)
0142デフォルトの名無しさん
2008/12/19(金) 02:26:16だから、実際のものをアップしないと話にならねーって
0143デフォルトの名無しさん
2008/12/19(金) 02:35:29デバッグどころかコンパイルも通らない物貼り付けて、えらそうに・・・
0144デフォルトの名無しさん
2008/12/19(金) 02:37:350145デフォルトの名無しさん
2008/12/19(金) 02:41:18オマエが単純に間違ってんだよ。
現物をアップしろよ
0146デフォルトの名無しさん
2008/12/19(金) 02:43:48だいぶゴツクなっちゃったけど、それでもよければどうぞ。
Sub test()
Const moji As String = "A17"
Dim sh As Worksheet
Dim obj
For Each obj In ThisWorkbook.Worksheets
If obj.Name = Worksheets(1).Range(moji) Then
Set sh = obj
Exit For
End If
Next obj
If IsObject(sh) And (Not sh Is Nothing) Then
MsgBox sh.Cells(3, 1)
End If
End Sub
0147デフォルトの名無しさん
2008/12/19(金) 02:44:20sheet2のシート名を手動でテストという名前に変更します
sheet2のA1セルに 値 と入植します
このブックをつくって
マクロを
sub テスト()
const moji as string = "A1"
debug.print worksheets(sheets(1).range(moji)).cells(1,1)
end sub
これでエラーがでてしまうということです。下から2行目のところにエラーが・・・
0148デフォルトの名無しさん
2008/12/19(金) 02:45:00それはもういいんだよ。
現物上げろよバカ
0149デフォルトの名無しさん
2008/12/19(金) 02:45:47さすがにこれは長いですね・・・
0150デフォルトの名無しさん
2008/12/19(金) 02:46:35現物をあげてダウンロードするまでにかかる時間のほうが長いと思うのですが・・・・
0151デフォルトの名無しさん
2008/12/19(金) 02:47:40こんだけバカなんだから、根本的なところで間違ってんだよ。
どのセルに何の値を入れてるのかさえ、あてにならない。
0152デフォルトの名無しさん
2008/12/19(金) 02:48:58概ね>>135通りのコードを書き込んで、コンパイルもしてないだろうさ
0153デフォルトの名無しさん
2008/12/19(金) 03:05:44VBAでの良策ってどんなだろう。
>>149
長いのが気になるだけなら別関数にしてね^^
0154デフォルトの名無しさん
2008/12/19(金) 03:06:300155デフォルトの名無しさん
2008/12/19(金) 03:10:01オマエがバカなだけ。
Debug.Printもついてない行でエラーになるのはあたりまえ。
0156デフォルトの名無しさん
2008/12/19(金) 03:11:19先ほどdebug.printがかかれてたマクロを実行してもエラーがでたのですが・・・
0157デフォルトの名無しさん
2008/12/19(金) 03:13:36以上で終了───
0158デフォルトの名無しさん
2008/12/19(金) 03:13:43rangeのデフォルトはValueじゃない。
それとDebug.Printが付いてないやつとは別のコード。
その区別がつかないのは、バカだから。
0159デフォルトの名無しさん
2008/12/19(金) 03:31:01そおしたら随分と無駄なコード書いてきたんだなぁ今まで。反省orz
0160デフォルトの名無しさん
2008/12/19(金) 07:04:250161デフォルトの名無しさん
2008/12/19(金) 07:10:540162デフォルトの名無しさん
2008/12/19(金) 13:17:19質問するとき小文字でコードアップするんじゃねーよ。
実際にVBEからコピペしろ。
回答者でも長いコードをオール小文字とかオール大文字は嫌味なくらいだ。
Sub テスト( )
Const moji As String = "A1"
Debug.Print Worksheets(Worksheets("Sheet1").Range(moji).Value).Cells(1,1).Vallue
End Sub
と.Valueが抜けてるから型が一致しないとなるんだよ。
最後の.Valueはなくても動くが途中のは必須。
>>158が書いてるのはこういうこと。
0163デフォルトの名無しさん
2008/12/19(金) 13:22:11その発言、なんかのギャグ?
0164デフォルトの名無しさん
2008/12/19(金) 13:25:02流れから見てその件はもう終わったものかと思っていたが・・・
勘違いかな?
0165デフォルトの名無しさん
2008/12/19(金) 14:00:421回目はジョークを聞いたとき
2回目はジョークの意味を教えてもらったとき
3回目は家に帰った後、やっとジョークの意味がわかったとき
0166デフォルトの名無しさん
2008/12/19(金) 14:09:44以下のようなへたくそなマクロを作りました。
------------------------ここから------------------------
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メソッドが失敗しました。
何がいけないのか教えていただけますでしょうか。お願いします。
0167デフォルトの名無しさん
2008/12/19(金) 14:13:32アクティブにしないとセレクトできないんじゃないの?
0168デフォルトの名無しさん
2008/12/19(金) 14:24:07そうなんですか。困ったな。。。
普段は他のシートを表示させているので、
非アクティブでも動作をさせるにはどうしたらいいですか?
0169デフォルトの名無しさん
2008/12/19(金) 14:40:39Worksheets("IV").Range("C2").Insert Shift:=xlToRight
Worksheets("IV").Range("C2").PasteSpecial ...
Application.CutCopyMode = False
0170デフォルトの名無しさん
2008/12/19(金) 14:51:43おおおおおお!!!!!!
ありがとおおおおお!!!!
さっそくやってみます。
0171デフォルトの名無しさん
2008/12/19(金) 14:56:51できたああああ!
ありがとう!!!!
感謝感謝!!!!
0172デフォルトの名無しさん
2008/12/19(金) 20:04:42指定した範囲内にあるデータの種類の数を取得するにはどうしたらいいでしょうか?
汚いながらもVBAで配列に入れながら総当りで調べることはできるのですが
ワークシート関数でそのようなものがあれば高速なのでそちらを使いたいと思っています。
例:範囲 A1:C3
A B C
1 山 川 海
2 海 海 川
3 川 都 南
この場合、「山、川、海、都、南」の5種類が出現するので 5を返してくれる関数を知りたいです。
よろしくお願いします。
0173デフォルトの名無しさん
2008/12/19(金) 20:14:52特定の列だけ抽出して別のシートに表示したいです。
列を抽出するとき、たとえばA列とC列とE列を削除して表示させたい結果が
下のテーブルです。
このように別のシートからマクロを実行して他の別シートに抽出した結果を表示させるには
どのようしすればいいでしょうか?
単にセル結合を考えない抽出ならできるのですが、
セル結合も考慮して、元の分類タイトルがあるまま抽出するにはどういった
手順でやるのが最適でしょうか?よろしくお願いしますm(__)m
ファイルは以下のやつをみていただければわかりやすいかとおもいます
http://www.dotup.org/uploda/www.dotup.org5812.xlsx.html
0174デフォルトの名無しさん
2008/12/19(金) 22:38:02もぐらたたきが大まかですがだいたいできたので
UPします
ttp://www.mediafire.com/?bj352f2jaxz
ttp://www.mediafire.com/?mn94db0mc4j
まだもんだいはありますがよろしければ批評してください
0175デフォルトの名無しさん
2008/12/19(金) 23:33:05配列数式でも良ければ
{=SUM(1/COUNTIF(A1:C3,A1:C3))}
0176デフォルトの名無しさん
2008/12/20(土) 00:54:59配列の使い方はどうしてる?
for eachで選択範囲をコレクションとして、
.valueが配列に含まれていなかった場合には、配列にぶち込んで、
最後にuboundでカウントすれば高速だと思うんだが。
このロジカルなら一瞬だと思うけど。
配列で総当たりってのがちと気になった。
0177デフォルトの名無しさん
2008/12/20(土) 01:05:35シート名を明示してやればOKだね。
タイトル行が空白だったら、空白じゃなくなるまで左に移動してタイトルを取得する。
これを組むのが面倒なら、
結合を全部解除して、全てのセルにタイトルを振ってしまう。
最後に、重複するタイトルの場合に削除なりmergeなりで処理すれば良いと思う。
削除って考えじゃなくて、抽出したい物を残すって考えにしないとタイトルは取得出来ないな。
0178デフォルトの名無しさん
2008/12/20(土) 08:34:25抽出してしまった場合、左にもうタイトルはないのではないでしょうか?
あらかじめこれも全ての結合を解除したという前提かな?
でも左に移動してタイトルを取得する場合、元からタイトルがない行があった場合
たとえば、メーカーというタイトルが最初からなかったとすると、本来なくていいタイトルに
別のタイトルが埋め込まれますよね?
このファイルに対してはいけそうですが、ない場合は大変かな?
>結合を全部解除して、全てのセルにタイトルを振ってしまう。
>最後に、重複するタイトルの場合に削除なりmergeなりで処理すれば良いと思う。
これもタイトルがない行があった場合、処理に困るかな・・・
追加、条件で大変申し訳ないですが、もしタイトルが空白のセルがあった場合はこれじゃ難しいでしょうか?
0179デフォルトの名無しさん
2008/12/20(土) 12:23:58どこかに説明しているサイトないですか?
0180デフォルトの名無しさん
2008/12/20(土) 12:29:58元からタイトルが無い列があるなんて知らないし。
てか、excelでレイアウトするなら、VBAで処理しようと考えない事だな。
人間が見やすい見た目と、計算機が処理しやすい(出来る)のは全く違うからね。
帳票として見やすく加工・レイアウトするのは、全ての演算処理が終わってから最後にやるもの。
レイアウトされたものに処理を掛ける事ほど無意味かつ煩雑になる事はないぞよ。
いったん全部のmarge解除して、全てのタイトルをはめ込むしかないでしょ。
0181デフォルトの名無しさん
2008/12/20(土) 19:32:18VBAの勉強をしたいのですが、良い本や教材はありますでしょうか?
バカでもわかるようなのでいいです。
0182デフォルトの名無しさん
2008/12/20(土) 22:48:340183デフォルトの名無しさん
2008/12/21(日) 00:50:07アクティブになっているシートから別のシートを選択したいのですが、
エラーが出てとまってしまいますが、なぜでしょうか?
エラーの内容はシートの保護がかかっている状態で、
そのシートを選択したとき(Activate)と同じエラーです。
エクセル2003で、自宅PCでは動作しますが、会社PC(2003だと思う)ではダメです。
もちろん保護ははずしましています。
考えられる原因はなにがあるでしょうか。
文章がわかりにくかったらすいません。
0184デフォルトの名無しさん
2008/12/21(日) 02:20:11>>167
0185166
2008/12/21(日) 12:41:12動作のたびに画面がフラッシュして非常にストレスを感じます。
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
---------------ここまで---------------
0186デフォルトの名無しさん
2008/12/21(日) 13:44:32画面がフラッシュするのは仕方ないと思うぞ。Windowsってのはそういうもんだ。
とりあえず右端にコピーする方法
Worksheets("IV").Activate
Range("B1:B96").Copy Destination:=Range("IV1").End(xlToLeft).Offset(0, 1)
0187デフォルトの名無しさん
2008/12/21(日) 13:53:12細かいことを言うと、それだと処理が1分よりも少し長い間隔で実行される。
nextTimeはSubの先頭でセットした方が誤差が少なくなる。
0188デフォルトの名無しさん
2008/12/21(日) 14:27:42ありがとうございます。値貼り付けにできますか?
あとこのマクロは時間処理が少しおかしいです。
しばらく席を離れて画面が黒くなりパソコンが待機状態になったとき
(マウスを触るとすぐに画面は表示される状態)などマクロがとまってしまいまいます。
そして再度実行させると、たまっていた処理を一気に吐き出すような感じで、
3連続処理を繰り返すことが多々あります。安定動作にはまだまだ遠いです。
0189デフォルトの名無しさん
2008/12/21(日) 16:06:47矩形範囲の種類を数える高速なワークシート関数なんてない。
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
一次元配列に移してからソートして数える方法もあるが。
0190183
2008/12/21(日) 16:15:46少し意味がわかりませんが。
PCが違うときに同じマクロでもエラーが出るんです・・・。
自宅PC>動く
会社PC>エラー
ということです。
シートの保護やファイルの保護などの設定の問題のような気はするんですが。
わかる方いたらお願いします。
0191デフォルトの名無しさん
2008/12/21(日) 16:34:38単純に考えて、同じマクロではないのだろう。
0192デフォルトの名無しさん
2008/12/21(日) 16:46:37VBとかcとかはあるんだけど、VBAのやつは見つからない。
0193183
2008/12/21(日) 17:33:42すいません。
厳密に言うと違うんですが。
中身はコードのコピー貼り付けなのでコードは同じです。
(ファイルは別物)
ファイル名シート名の書き換えとかはしますけど。
会社のファイルがシート保護されていたので、
ためしに自宅PCでシートの保護をした状態だと、同様のエラーがでました。
なので設定の問題かなと予想してますが。
エラー箇所は毎回切り替えの部分です。
(アクティブシート・ファイルの切り替え)
0194166
2008/12/21(日) 17:49:37Copy 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
---------------ここまで---------------
0195デフォルトの名無しさん
2008/12/21(日) 18:00:59sheets(2).cells(1,1).value = sheets(1).cells(1,1).value
の考えで代入して行っても良いんでないかな。
まぁ、ある程度の量以上になると遅いけど。
0196デフォルトの名無しさん
2008/12/21(日) 20:18:24For Eachで回さんでも、Rangeオブジェクトを使えば値が配列として取り出せるから複数のセルを一気にコピーできる。
Set r = Range("IV1").End(xlToLeft).Offset(0, 1)
Range(r, r.Offset(95, 0)).Value = Range("B1:B96").Value
0197デフォルトの名無しさん
2008/12/22(月) 07:46:080198デフォルトの名無しさん
2008/12/22(月) 11:08:13>>196も入れてる。
右辺のRange("B1:B96").Valueが2次元配列。
左辺はResize使った方がすっきりするが。
0199166
2008/12/22(月) 17:36:11ありがとうございます。
>>196さんのVBAを使わせてもらってます。
あと3分間に3回も4回も動作を繰り返す症状があり、
以下のサイトを参考にしてexcelを強制リロード
させるようにしたところ安定動作するようになりました。
http://www.efcit.co.jp/cgi-bin2/exqalounge.cgi?print+200502/05020118.txt
お礼まで。
0200デフォルトの名無しさん
2008/12/22(月) 21:47:11これを実行すると (月) ってなるんだけど
両側の括弧を消したい場合は文字を操作するしかないですか?
0201デフォルトの名無しさん
2008/12/22(月) 21:49:23replaceで括弧取り除くユーザ関数でも作れば?
0202デフォルトの名無しさん
2008/12/22(月) 21:51:41ならないよ
0203デフォルトの名無しさん
2008/12/22(月) 22:04:30申し訳ない、環境書きます
osx excel 2004
この環境特有の処理かな?
0204デフォルトの名無しさん
2008/12/22(月) 22:18:23Range("d5").NumberFormatLocal = "0.0""個"""
これだと設定を変えられました。stに代入する意味はありませんが
st = "個"
Range("d5").NumberFormatLocal = "0.0""st"""
これだとエラーがでます。文字列なので""をとってみても
"0.0"st"" 無理でした。
どうすれば代入した値を扱えるのでしょうか?
0205デフォルトの名無しさん
2008/12/22(月) 22:46:05mac版って不便だね
Cells(1, 1) = Mid("日月火水木金土", Weekday(2008 / 12 / 22), 1)
0206205
2008/12/22(月) 23:05:03すいません
こうですね
Cells(1, 1) = Mid("日月火水木金土", Weekday("2008/12/22"), 1)
若しくは
Cells(1, 2) = WeekdayName(Weekday("2008/12/22"), True)
0207デフォルトの名無しさん
2008/12/22(月) 23:05:49もしくは小数点を含まないといった指定はどうやればできるのでしょうか?
0208デフォルトの名無しさん
2008/12/22(月) 23:11:10st = "個"
Range("d5").NumberFormatLocal = "0.0" & st
0209デフォルトの名無しさん
2008/12/22(月) 23:15:04>右辺のRange("B1:B96").Valueが2次元配列。
office tanaka で調べても、これは2次元配列ようにありますが、私には
1次元配列に見えるのです。こう書いてもvariant型変数なので2次元配列
となるというように理解するものですか?
0210デフォルトの名無しさん
2008/12/22(月) 23:18:10それでもエラーでましたorz
0211デフォルトの名無しさん
2008/12/22(月) 23:29:43今思いついたのは
n = (Cells(5, 4).Value * 10) Mod 10
If n <> 0 Then MsgBox "小数"
>値が小数点なら
って言うのをエスパーした結果
2.0は小数点無しでいいんだよね
0212デフォルトの名無しさん
2008/12/22(月) 23:34:532.0も小数点扱いしたいです・・・
0213デフォルトの名無しさん
2008/12/22(月) 23:40:40書式で小数点以下の桁数指定すれば
1は1.0とか
2は2.0とか表示されるんだけど
その状態だと全部小数点有りだよね
0214デフォルトの名無しさん
2008/12/22(月) 23:46:520215デフォルトの名無しさん
2008/12/22(月) 23:50:59こうじゃね?
st = """個"""
Range("D5").NumberFormatLocal = "0.0" & st
0216デフォルトの名無しさん
2008/12/22(月) 23:58:08調べてみりゃわかる。
MsgBox UBound(Range("B1:B96").Value, 1)
MsgBox UBound(Range("B1:B96").Value, 2)
96と1が返るから2次元配列。
0217デフォルトの名無しさん
2008/12/23(火) 00:18:33If Obj Is Nothing Then
これだと見つからなかったら先に処理して、それ以外は見つかったことになりますよね
その逆の順番にしたいのです
0218デフォルトの名無しさん
2008/12/23(火) 00:20:50んな難しく考えんでも、行/列 って2次元じゃん。
2次元配列を視覚的に見えるようにしたのがシートってだけだよ。
0219デフォルトの名無しさん
2008/12/23(火) 00:22:03if obj is nothing then
else
〜〜
じゃダメなの?
if not obj is nothing then
にしたいって事?
0220デフォルトの名無しさん
2008/12/23(火) 00:39:13はい、そうです
Dim Obj As Object
Set Obj = Cells(1,1).Find(".") '小数点含むなら
If not Obj Is Nothing Then
セル1,1に値を入力しました。5と入力したところ
objはnothingになりません・・・一体なぜなのでしょうか?
0221デフォルトの名無しさん
2008/12/23(火) 00:46:03表示形式が0.0とかじゃないの?
LookIn:がxlValuesになってたらNothingにはならない。
値=Cells(1,1)..Value
If Int(値) = 値 Then
とかで判定した方がいいと思う。
0222デフォルトの名無しさん
2008/12/23(火) 00:47:32Dim 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だけどねえ。
0223デフォルトの名無しさん
2008/12/23(火) 00:50:45LookInがxlValuesなんだろ?
デフォルト状態ではxlFormulasだが、指定しないと前の状態を引き継ぐからな。
0224220
2008/12/23(火) 00:53:43無事、解決いたしました。ありがとうございます。
0225デフォルトの名無しさん
2008/12/23(火) 00:56:00数値か文字列かを判定したいだけなのですが、
この場合、どうしたらよいでしょうか?
0226デフォルトの名無しさん
2008/12/23(火) 00:56:31Findメソッド使うときは最低でもLookInとLookAtは書いた方がいい。
0227デフォルトの名無しさん
2008/12/23(火) 01:00:41VarType関数で調べる。
いまいちな人はWorksheetFUnction.IsNumberで調べる。
0228デフォルトの名無しさん
2008/12/23(火) 01:08:34If VarType("Cells(x, y).Value") = 8 Then これで文字列ならと指定したのですが、
何故か、セルに手動で入力した5とかの数字も文字列として認識されてしまいます。
これは回避できないのでしょうか?
0229デフォルトの名無しさん
2008/12/23(火) 01:16:35釣りか?
"Cells(x, y).Value"とダブルクォートでくくったら文字列に決まってるだろ?
0230デフォルトの名無しさん
2008/12/23(火) 01:20:550231デフォルトの名無しさん
2008/12/23(火) 01:37:50その入力したセルに対してvartypeやtypenameで調べてみると
vartype=5 typaname=double と表示されます。
なぜ整数扱いではないのでしょうか?
0232デフォルトの名無しさん
2008/12/23(火) 01:48:55EXcelの仕様。
Long型とかInteger型はありえない。
0233デフォルトの名無しさん
2008/12/23(火) 01:52:44こんな仕様にした理由は何かあるのでしょうか?
普通に整数ならintegerに小数点ならとりあえずdoubleにとかしてくれたほうが
わかりやすい?
いや、絶対値とるためにdoubleにしてるのかな
でも、typenameやvartypeをそのまま使えないってのは面倒かも
0234デフォルトの名無しさん
2008/12/23(火) 08:12:180235デフォルトの名無しさん
2008/12/23(火) 08:13:110236デフォルトの名無しさん
2008/12/23(火) 09:46:16みたいな感じ?
どうでもいいわw
0237デフォルトの名無しさん
2008/12/23(火) 12:38:37実数の型にはsingleもあるのにどうしてそれは無視してとりあえずdoubleなの?
0238デフォルトの名無しさん
2008/12/23(火) 13:30:070239デフォルトの名無しさん
2008/12/23(火) 21:24:420.1 * 10がIntegerにならないぞゴラって声が容易に想像できるから、全部Doubleのほうがいいと思う。
あと、ワークシートでの計算でIntegerとDoubleを区別するよりは
全部Doubleのほうが速いなんてこともありそう。いや想像だけど。
それよりも、一般人が良く使うソフトなのに、基数が10でないことのほうが問題だろ。
さすがにある程度の補正はかかっているけど。
0240デフォルトの名無しさん
2008/12/24(水) 14:01:15良く分からんけど
Excelが普通なんでしょ
0241デフォルトの名無しさん
2008/12/24(水) 19:50:07てか、2進法で計算してるんだから、わざわざ10進法基数にする必要性が無いよ。
余計な事して誤差が問題になるなら、やらんで欲しいな。
変数の型に関しては、使用バイト数が少ない方が当然処理は早いよ。
混在とか関係ない・・・はず。
0242デフォルトの名無しさん
2008/12/24(水) 20:35:29ついでに言えば、Excel2000だか2002だかを境にdoubleからlong doubleに切り替わっている筈。
レーザ測距のデータみたいに、10桁くらいある数の標準偏差を取ろうとすると違いが判る。
0243デフォルトの名無しさん
2008/12/24(水) 21:58:35いや、基数10はセルが保持するデータの話。
Doubleではない何かの型であってほしかったということ。
0244デフォルトの名無しさん
2008/12/24(水) 23:50:410245デフォルトの名無しさん
2008/12/25(木) 00:30:23マジレスすると、ケースバイケース。
0246デフォルトの名無しさん
2008/12/26(金) 00:36:57windowsXPで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と入らなければいけないのですが。
どこが間違っているか、御教示ください。
0247デフォルトの名無しさん
2008/12/26(金) 01:42:25xlUpはどう言う意味?
0248デフォルトの名無しさん
2008/12/26(金) 01:49:04Rows.Countって選択してるRowの数返すんじゃないの?
0249デフォルトの名無しさん
2008/12/26(金) 01:56:21lastRow = Range("A1048576").End(xlUp).Row
0250デフォルトの名無しさん
2008/12/26(金) 02:04:26関係無いシートがアクティブになってるんじゃない?
一度シートが1つのBookで試してみ
0251デフォルトの名無しさん
2008/12/26(金) 02:06:540252デフォルトの名無しさん
2008/12/26(金) 02:07:270253246
2008/12/26(金) 09:15:59シートを1つにしてもlastRowには1しか入りませんでした。
最終行の取り方自体は合っているようなので、 シート関係を見直してみます。
ありがとうございます。
0254デフォルトの名無しさん
2008/12/26(金) 11:39:51「 Range("A" & Rows.Count)」のターゲットが、「AAA.xls」になっていないと思われる。
おそらくは、マクロのあるシート。
0255デフォルトの名無しさん
2008/12/26(金) 12:51:43普通Bookを開いたら、そのBookがアクティブになるから
問題は無いはず
まぁ複数のBookを扱うなら、きちんとBookを指定したほうがいい
0256デフォルトの名無しさん
2008/12/26(金) 12:58:20> 普通Bookを開いたら、そのBookがアクティブになるから
> 問題は無いはず
ねーよ
0257デフォルトの名無しさん
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
という形でコードを組みましたがうまくいきません。
オブジェクト名を変数で定義することはできないのでしょうか?
稚拙な質問で申し訳ありませんが、よろしくお願いします。
0258デフォルトの名無しさん
2008/12/26(金) 15:42:33Me.Controls("sample" & Cstr(i)).Text
でできないか?
0259デフォルトの名無しさん
2008/12/26(金) 15:49:02解決しました。ありがとうございました。
0260デフォルトの名無しさん
2008/12/26(金) 21:56:21エクセルVBAのコンボボックス(activX)の
設置数に限界は存在するのでしょうか?
とりあえず、3000+αのコンボボックスを1シートに
設定したいのですが・・・・
裏技的な方法でも良いので教えて頂ければ
ありがたいので宜しくお願いします。
0261デフォルトの名無しさん
2008/12/26(金) 22:13:21Excelにセルの数だけウィンドウがあるわけではないのは知ってるよな?
0262デフォルトの名無しさん
2008/12/26(金) 22:27:44ユーザーも大変だ w
0263デフォルトの名無しさん
2008/12/27(土) 01:03:57一気にfor nextで3000作ろうとすると1208個でオブジェクトが有りませんだけど
1000作るを3回繰り返すと3000個出来た
For a = 1 To 3
For n = 1 To 1000
ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
DisplayAsIcon:=False, Left:=a * 72, Top:=(n * 18), Width:=72, Height:=18).Name = "ComboBox" & n
Next n
Next a
0264デフォルトの名無しさん
2008/12/27(土) 01:51:370265263
2008/12/27(土) 02:04:11ActiveSheet.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を見て
試してみたら解るだろと思ってやってみただけだから
質問主じゃないよ
0266260
2008/12/27(土) 02:33:26ありがとうございました
0267デフォルトの名無しさん
2008/12/27(土) 07:25:59コンボボックス3000ってのは、何とか別方法で再検討すべきじゃないか?
0268デフォルトの名無しさん
2008/12/27(土) 09:32:05コンポボックス3000超って単に入力作業をするためのものですか、それとも
何か・・・
非常に興味があるので、横レスですが、使用場面のヒントでも・・・
0269260
2008/12/27(土) 12:40:11項目数がやたら多いアンケートを想像してもらえれば、そんなに違わないかとおもいます
その内容を、特定のルールで別シート上へ集計するのが目的です。
>>267
コンボボックス3000が非常識なのは解ってはいたのですが、
社内の決め事なのでとりあえずは作ってみようという話になってしまいまして・・・
一旦使ってみた後での検討はします。
こんなところでしょうか
0270デフォルトの名無しさん
2008/12/27(土) 13:10:26バカな物は作ってはいけない。
0271デフォルトの名無しさん
2008/12/27(土) 17:51:01データベースシステム使えよ。マジで。
煽りとかじゃなくて、後々の事考えても、3000項目の入力なんてDBじゃなきゃ無理だよ。
3000の保守は出来ない、と言うかやるにしても金掛かるよ。
どうしてもやるなら、コンボボックス噛ませる必要性も見いだせないし。
シートをRDBとみなして、ダイレクトにセルに書き込むべきかと。
0272268
2008/12/27(土) 20:20:28>>263 さんので、コンボボックスのオートメイクは1208個、個数制限はない(ようだ)と
言うことを知った今、リストボックスとテキストボックスの利点を併せ持つコンボボックス
の大量使用によるRDB的エクセル活用法となるかも。これは、創造の世界に踏み込むものかも。
0273デフォルトの名無しさん
2008/12/27(土) 20:34:24こらこらw
0274デフォルトの名無しさん
2008/12/27(土) 20:47:59DBの知識がどれくらいあるのか分からないし、
スレ違いにもなってしまうから適当なところまでしか話しないけど、
エクセルではトランザクションの概念はビルドインされてない。
エクセルをRDB的に使用する事があるのは、
シートがRDB構造と視覚的に同じである事が理由。
つまり、RDBをダンプして、その結果をシートに表示するのに向いてるって事。
エクセル自体はDBじゃないから、入力に関しては向いてない。(出来なくはない)
やはりトランザクションとロックの概念が無いシステムでは怖い。
これはエクセルが劣ってるとかではなく、向き不向きがあるって事なのよ。
エクセルのシートにRDBをダンプすれば、言語が分からなくても、
オートフィルタ機能使ったり、VBAで複雑なクエリが出せる訳。
関数だってクエリと言えるよね。これは凄く魅力的な事だよ。
全部無理とは言わないし、勉強のためにやるのは一向に構わないけど、
老婆心ながら、エクセルをRDBに見立てて業務に使うのだけはやめた方が良いと思う。
0275デフォルトの名無しさん
2008/12/27(土) 23:59:21---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
0276デフォルトの名無しさん
2008/12/28(日) 00:09:40>>260さんの 私の>>268 に対する >>269の返信を見て、
顧客の嗜好調査データとか、アマゾンのこの本を買った人はこんな本を買っていますの
小規模版データを想像してみました。
また、見た目はデータベースソフト、中身はexcelという体の業務用ソフトは結構作られており、
この方の会社の人も類似ソフトを見ての発想(excelであるなしを問わず)と妄想しました。
データ設計例?
100人のレコード、100のフィールドがあるとしてシート毎に異なるキーフィールド相当の位置づけをする。
求めるもの
2値(3値)間にどんな相関関係があるかが視覚的にもわかるように散布図に落とす。
この「求めるもの」=クエリが種々、エクセルで可能ということですね。
どの方法であれ、処理スピードと正確性確保、維持管理の容易さが善し悪しを決めることに
なりますよね。
0277デフォルトの名無しさん
2008/12/28(日) 13:15:14---私が265氏と同等と考えるプログラム を
xp 2003でやってみたら、1列目1000個で完了、2列目が208個で
オートメーションエラー発生しました。
0278デフォルトの名無しさん
2008/12/28(日) 13:37:14試しにやってみたものです。
0279263
2008/12/28(日) 14:39:490280277
2008/12/28(日) 16:44:44私のパソコンでは、
263のでは3000個出来ているが、275の---私が265氏と同等と考えるプログラム
では、一気に3000個出来ず、1208個しか出来なかったという意味です。
0281デフォルトの名無しさん
2008/12/28(日) 19:45:07誰が得するんだ?誰かが得するなら俺が出て行けば済む話だが。
0282デフォルトの名無しさん
2008/12/28(日) 20:22:280283デフォルトの名無しさん
2008/12/29(月) 06:36:24効率のいいコードを書くために必要な知識とか教えてくれないか。
0284デフォルトの名無しさん
2008/12/29(月) 08:22:46そのシステムはExcelで作ったの?
0285デフォルトの名無しさん
2008/12/29(月) 08:29:17サブルーチンなり関数なりに分けましょう。
0286デフォルトの名無しさん
2008/12/29(月) 10:25:34うん、データはAccessに入れて、ほとんどの操作はExcelのユーザーフォームを使うような感じで
ワークシートは大雑把に全体を見るためにあってデータを追跡したり、試算ができたりするようなやつ
>>285
最初の頃、ほとんど直観でやってたから今になって無駄を省くために自分のレベルでできそうなところはやってる。
でもクラスモジュールで何ができるのかとかが気になる。
0287デフォルトの名無しさん
2008/12/29(月) 12:51:23ユーザインタフェースのプログラムを何とかしたいということ?
0288デフォルトの名無しさん
2008/12/29(月) 13:11:23まぁ、そういうことなのかな。
入力チェックとか、動作は同じだけど入るデータが違うとか結構あって。
コピペして改変しながら作ってたけど、完成してみるとコードがぐちゃぐちゃになってしまった。
運用は始めてて、今のところ作業者の不満は出てないけど将来的な拡張や保守のためにもう少し勉強したい。
0289デフォルトの名無しさん
2008/12/29(月) 14:19:59UI部分はごちゃごちゃしてても仕方ないんじゃないの。
データさえしっかりしてたらいいよ。
0290デフォルトの名無しさん
2008/12/29(月) 15:09:44誰もが一度は通る悩み。
モジュールの独立性をあげ過ぎても使い勝手悪くなるけど。
モジュール結合度とかでググってみるといいよ
0291デフォルトの名無しさん
2008/12/29(月) 18:53:44↓ マクロ発動
100円○ 500円 250円
もっとも小さい数字を選んでその数字の横に
○印をつけたいのですが
なかなかうまくいきません
どういった関数を使えばいいでしょう?
0292291
2008/12/29(月) 19:08:002003
0293デフォルトの名無しさん
2008/12/29(月) 21:35:37こんな感じでどうですか?
Sub mini()
Dim mymin
mymin = WorksheetFunction.Min(Range("a1:a3")) '対象データのの範囲
Cells(4, 1) = mymin & "円○"
End Sub
0294デフォルトの名無しさん
2008/12/29(月) 22:24:22テキスト名が 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
0295294
2008/12/29(月) 22:31:54ググり直したら簡単に出てきやがった・・・
エラーを回避する便利なプログラムがあったのね
0296デフォルトの名無しさん
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
0297デフォルトの名無しさん
2008/12/29(月) 22:36:550298デフォルトの名無しさん
2008/12/29(月) 22:43:48すると色々あるわけですが、型情報の意味がさっぱり分かりませんでした。
この情報はどんなルールで何を表現しているのでしょうか?
たとえば
Variant/Double
だと、/の手前はVariantで、これは任意の型だと思うんです。だから/の後ろで、実際には今Doubleが入ってるよ、みたいな感じ?
でも、Variant/Object/Range見たいな奴もあるし。。
(これはVariantでObjectでその実態はRangeということかな?)
Worksheet/Sheet1なんていうのもあります。
(これはなんだろ??Sheet1ってのは型なんですかねぇ。ユーザがシートをガンガン追加したらSheet4,Sheet5...ってな感じで型が増える?)
0299デフォルトの名無しさん
2008/12/29(月) 23:19:000300デフォルトの名無しさん
2008/12/29(月) 23:48:10トラップすれば処理できているとは限らないのと一緒。
論理的破綻はどちらでも起こる。
0301296
2008/12/30(火) 00:08:18たびたびすいません
こんなのありました
large関数
(指定された範囲データから大きい方から任意の数字番目を返す)
small関数
(指定された範囲データから小さい方から任意の数字番目を返す)
0302デフォルトの名無しさん
2008/12/30(火) 00:58:44をその文字の上に配置して、その文字を囲っているように見せたいと思っています。
そこで、文字列の幅を求め、その文字列が入っているセルの位置と、その文字列の幅から、
オートシェイプを配置すべき座標を計算することを考えています。
フォントは固定幅で考えております。
今、自分が分からないのは、
(1)文字の幅の単位(cmとかインチ?ピクセル??)
(2)文字列の長さをcmとかインチで正確に取得する方法
(関数?VC++でもこの手の問題にぶつかったことがあるけどそちらでは上手く取れなかった覚えがあります。VBAは高機能なので正確にゲットできると期待!)
(3)オートシェイプの座標系の単位(cmとかインチ?ピクセル??)
(4)文字列の長さの単位と、オートシェープの座標系の単位が違うのなら、それを変換してくれる関数あるいは公式
何方か教えていただけますですか?
(自分でも継続して調べます。)
よろしくお願いします。
0303デフォルトの名無しさん
2008/12/30(火) 04:13:54テキストのFont.Size掛ける文字数で
シェイプの位置は
セルの.Top .Leftで
目的のセルはFindと FindNextで
あとは細かい調整で
いいみたい
0304デフォルトの名無しさん
2008/12/30(火) 08:28:530305デフォルトの名無しさん
2008/12/30(火) 11:28:03同時起動は多分出来ないけど、WindowsAPI使ってタスク複製するかスレッド使えば出来ると思う。
VBAではやり方は良くわからんのだけど、
"Excel VBAによるWin32 APIプログラミング入門"
この辺を見ればよいと思う。
タスク複製だのは結構癖があるからがんばって。
あと、どういうタイマーなのかわからんが、タイマ割り込みみたいに定期的に何かをやらせる場合、並列にすると旨く動かなくなる可能性があるので、きちんと実行時間を計測した方がいいよ。
0306302
2008/12/30(火) 17:09:11ありがとうございます!!!
自分でも探したんですけどさっぱりその手の情報がなくて(;_;)
非常に助かりました。本当にありがとうございました!
0307304
2008/12/30(火) 18:30:260308291
2008/12/31(水) 14:49:44ありがとうごさいます
やってみます
0309デフォルトの名無しさん
2008/12/31(水) 22:39:19Select Case exp
Case 0
IF xxx = FALSE THEN
Break ←これ!!!!
End IF
End Select
みたいな。
0310デフォルトの名無しさん
2008/12/31(水) 23:29:230311デフォルトの名無しさん
2009/01/01(木) 00:31:04そもそもbreakしてどこへ行くつもりだ
0312デフォルトの名無しさん
2009/01/01(木) 00:36:55ありがと
>>311
Selectの外に決まってんじゃん。。。
0313デフォルトの名無しさん
2009/01/01(木) 00:41:39それがしたいだけなら、どうにでもなるだろと小一時間…
0314デフォルトの名無しさん
2009/01/01(木) 00:41:510315デフォルトの名無しさん
2009/01/01(木) 00:44:16ちょ、おま、そんな最終手段をっ!
0316デフォルトの名無しさん
2009/01/01(木) 00:44:45どうすんの?
0317デフォルトの名無しさん
2009/01/01(木) 00:46:24Select Case exp
Case 0
IF xxx THEN
処理
End IF
End Select
0318デフォルトの名無しさん
2009/01/01(木) 00:48:24わざわざ論理を逆にして書けば良いじゃんとか
抜けた後にある処理をサブルーチンにしてあげれば良いじゃんとか
そういう構造を縛るしか手が無いんですか?それじゃ言語としてどうだろ
あとさぁ
なんで
if()
{
0319デフォルトの名無しさん
2009/01/01(木) 00:48:59じゃ、問題。何を書きたかったんでしょうか?
0320317
2009/01/01(木) 00:49:51要するに、breakで外に出るのもスルーするのも同じ事じゃねーのって意味
Ifの条件がFalseの時にbreakしたいんなら、Ifの条件がTrueの時だけ処理すればいい
0321デフォルトの名無しさん
2009/01/01(木) 00:53:31ヒューヒュー
あとさぁ
なんで
if()
{
}
else if()
{
}
else if()
{
}
…
みたいにELSE句にIFが書けないんだろう
欠陥だろ。。
でした。
>>320
そりゃかけなくは無いだろうけど構造上書きにくい場合もあるじゃん。
なんでキーワードやステートメントを再発明してまで、不便なってんの!マイクロソフト!!って思うじゃん。
0322デフォルトの名無しさん
2009/01/01(木) 00:53:350323デフォルトの名無しさん
2009/01/01(木) 00:57:44おや?外れたのかな?(^^)
勘がニブいんですねw
0324デフォルトの名無しさん
2009/01/01(木) 01:04:13アホなのか・・・
0325デフォルトの名無しさん
2009/01/01(木) 01:06:26ねーよ。
0326デフォルトの名無しさん
2009/01/01(木) 01:09:56VB厨はばかだなぁww
書き方を変えれば良いじゃんとか・・それは変えなきゃ対応できない言語ってことだろ。
高級言語でしょ?書き方縛ったらそこでもう言語としてだめでしょ。
アセンブラじゃないんだからさぁ。
IF THEN
ELSE
IF THEN
ELSE
IF THEN
ENDIF
ENDIF
ENDIF
うわっ。だっさ。最悪。
書き方変えればできますだったらjmpとかjzとかjnzとかjcとかだけでも出来るよww
0327デフォルトの名無しさん
2009/01/01(木) 01:14:31If ... Then
ElseIf ... Then
ElseIf ... Then
End If
0328デフォルトの名無しさん
2009/01/01(木) 01:27:43あ!ありがとうございます。
あったんだ。
0329デフォルトの名無しさん
2009/01/01(木) 01:48:45意外と素直w
0330デフォルトの名無しさん
2009/01/01(木) 02:10:17VB分かってないやつがVB馬鹿にしてたのかよ。orz
0331デフォルトの名無しさん
2009/01/01(木) 02:11:14情報系の一年生くらいだろ。
0332デフォルトの名無しさん
2009/01/01(木) 02:21:16ゴメンね(´・ω・`)
ついイライラしてたから
0333デフォルトの名無しさん
2009/01/01(木) 02:30:420334デフォルトの名無しさん
2009/01/01(木) 13:53:37C#への布石ですか?
0335デフォルトの名無しさん
2009/01/01(木) 17:12:57Excel 2008はMac版。移行先は、C#ではなくAppleScript。
しかも、次のバージョンで復活することが発表済み。
http://www.microsoft.com/japan/presspass/detail.aspx?newsid=3439
0336デフォルトの名無しさん
2009/01/02(金) 08:30:00スレ違いでしたら誘導をお願いします。
0338デフォルトの名無しさん
2009/01/02(金) 09:23:060339デフォルトの名無しさん
2009/01/02(金) 13:45:39>>334-335
0340デフォルトの名無しさん
2009/01/02(金) 14:03:270341デフォルトの名無しさん
2009/01/02(金) 14:17:09よく事情がわからんが、今必死で覚えてるEXCEL VBAが数年先に使えない、役に立たない言語になる可能性もあるってことですか?
0342デフォルトの名無しさん
2009/01/02(金) 15:03:36この先もそれが続くと信じて安穏としているのは間違っているだろうが、
数年でなくなるような存在でもない。
0343デフォルトの名無しさん
2009/01/02(金) 16:48:02この本って絶版でもう購入不可ですか?
0344デフォルトの名無しさん
2009/01/02(金) 16:58:060345336
2009/01/02(金) 18:06:59そうですか…了解です。
スレ違いを承知で 1 つだけ質問。
Excel のデザインで使うフォームのコントロールの仕様って VB6 と
同じなんですかね?
(コンボボックスでダブルクリックのイベントが起きないので調べたら、
VB6 ではスタイルに 1 を設定しないと起きない、とあったので…。
ちなみに Excel VBA ではスタイルに 0 or 2 しか設定不可。
ダブルクリックのイベント絶対起きないじゃん…。)
0346デフォルトの名無しさん
2009/01/03(土) 00:31:02で、絶版かどうかも、役に立つかも、全く見当が付かないが、折れの持っている
「Excel VBA はじめてのプログラミングレッスン1」 技術評論社 H12.8.21初版
に第10章 入力画面を使ってみよう を読んでみたwww
ユーザーホームのデザインという用語が使われているが、この本では
ダブルクリックをする場面は、VBE上コンボボックスのことで、
excelシート上のコンボボックスではないよ。シート上ではダブルクリックは
使わないものと思っている。
0347デフォルトの名無しさん
2009/01/03(土) 00:58:20セルのダブルクリックでセルの値等をコピーする、といったマクロも組むから
別にユーザフォーム専用って訳でもないと思うが
0348336
2009/01/03(土) 02:30:30コンボボックスを使いたい場所はユーザーフォーム上で、
ワークシート上ではありません。
というかワークシート上にもコントロールを置けたんですね。
で、試してみると…コンボボックスのプルダウンメニュー表示中のダブルクリックで
ダブルクリックのイベントが発生しました。なんで?
目的はユーザーフォーム上にあるコンボボックスでダブルクリックのイベントを
取得することですが、無理そうなので、擬似的にダブルクリックを検知することにしました。
方法は下記です。
(1) マウスダウンのイベントが発生した時の時刻を Timer 関数で取得して
モジュール変数に退避する。
(2) マウスダウンのイベント発生都度、退避した時刻と押した時刻を比較する。
(3) (2)の時刻差が 0.5 秒以下の場合にダブルクリックのイベントでしたかった
処理を実行する。
コンボボックスでダブルクリックのイベントを拾った後の使い道は、
(1) True ⇔ False の切り替え(VBE のプロパティ設定画面では出来る!)
(2) コンボボックスより詳細なリストが表示できるフォームの呼び出し
を考えていました。
上記を応用すれば、トリプルクリックや4回クリックなどにも対応できそうです。
解答してくださった方、ありがとうございました。
0349デフォルトの名無しさん
2009/01/03(土) 03:55:36コンボボックスをシングルクリックで
透明なアイテムが一番上に(コンボ上に)きて、その
そのアイテムをシングルクリックってすると
じゃ駄目なのかな
0350デフォルトの名無しさん
2009/01/03(土) 04:52:180351デフォルトの名無しさん
2009/01/03(土) 04:53:58みんなのには付いてないの?
バージョン Excel2003
0352デフォルトの名無しさん
2009/01/03(土) 06:03:46コンボボックスのプルダウンメニューの部分のダブルクリックを言っているんだと思う
0353デフォルトの名無しさん
2009/01/03(土) 13:26:280354デフォルトの名無しさん
2009/01/03(土) 16:11:29何考えてんだ?
0355デフォルトの名無しさん
2009/01/03(土) 16:20:560356デフォルトの名無しさん
2009/01/03(土) 17:11:000.5秒決め打ちよりそれを使ったほうがいいと思う。
そういう話をしている場合でないとは思いつつ。
0357デフォルトの名無しさん
2009/01/03(土) 19:44:02セル上で、右クリックをすると、編集ダイアログ?が出てくるのを出ないようにしたいのですが
どう設定のマクロを書いたものか、よろしく。
右クリックイベントによってコピーモードにしているのに、余分な作業を
するのを防止したいので。
0358デフォルトの名無しさん
2009/01/03(土) 21:18:270359デフォルトの名無しさん
2009/01/04(日) 02:39:560360デフォルトの名無しさん
2009/01/04(日) 13:15:18安定性、処理性能、MSのライセンス違反等を懸念してますが、
何か懸念事項やアドバイス等ありますでしょうか?
0361デフォルトの名無しさん
2009/01/04(日) 14:49:46列5 列6 列9なら、イベント処理し、「そうでないなら」、exitする の
「そうでないなら」はどう書いたものでしょうか?
0362デフォルトの名無しさん
2009/01/04(日) 15:11:17色々あるだろうけど
普通は
if
elseif
elseif
else
0363デフォルトの名無しさん
2009/01/04(日) 15:18:49ワークブックのSheetBeforeRightClickイベントでcancel=trueにしないとだめだよ
0364デフォルトの名無しさん
2009/01/04(日) 15:21:38>>362だとイベント処理のコードが重複するから
If 列5 Or 列6 Or 列9 Then
イベント処理
Else
Exit
EndIf
0365デフォルトの名無しさん
2009/01/04(日) 23:41:35条件1つずつでネストした方が速い
何故なら、例えば列5に一致するならイベント処理は行うので
列6、列9に一致するか否かは判定する必要が無いのに
>>364では毎回全てを判定した上で論理演算してしまう
複数条件でAnd、Orを使わないのは、コード最適化の常套手段
逆に速度気にせず手を抜きたいなら、カンマ区切りで
複数条件指定できるSelect Case使う方がお手軽だろ
Case 列5, 列6, 列9
イベント処理
Case Else
Exit
因みに論理演算(>>364)の処理時間を100とするなら、Ifのネストは70、Select Caseは105くらいだ
とは言え最近のPCなら、ループで何十、何百、何千万回とやってコンマ何秒かの差が出る程度だけどな
0366デフォルトの名無しさん
2009/01/04(日) 23:56:00VBって or で連結させた場合、順次判定して、hitしたら後の判定スキップじゃなかったっけ。
勘違いだったらごめん。
0367デフォルトの名無しさん
2009/01/05(月) 00:00:55まあ,とりあえず素直に書いといて最適化は実際に支障が出てから,が基本だけど
0368デフォルトの名無しさん
2009/01/05(月) 12:09:49Select Caseが105って一概には言えないだろ?
>Case 列5, 列6, 列9
これショートサーキットだから列5がTrueなら列6と列9は評価しないし。
>>366
ショートサーキットするのはVB.NetのOrElseとかAndAlso
今はVB.Netって言わないんdっけ?
0369デフォルトの名無しさん
2009/01/05(月) 13:14:41Select Caseが105ってのは、実際にカウンタ変数のMod 10に対する
条件分岐のみのループの処理時間を計った結果
それぞれ500万回*3回の平均から算出した値
そもそもが単一条件の場合でも、Select CaseはIfより遅いからね
0370デフォルトの名無しさん
2009/01/05(月) 14:13:14例えば
名前 値 ラジオボタン
という行が連なるフォームを作る場合、
グラフの凡例数、セルの列数、フォームで入力した数分等、行が作成される感じにしたいのですが。
(フォームの大きさに入りきらない場合はスクロールバーを出す)
0371デフォルトの名無しさん
2009/01/05(月) 14:19:160372デフォルトの名無しさん
2009/01/05(月) 14:22:53調べ方が足りませんでした。すみません。 VBA 可変 フォームとかぐぐってました。
コントロール 動的 VBAでぐぐったらできそうな感じです。
ありがとうございました。
0373デフォルトの名無しさん
2009/01/05(月) 18:24:45Ifや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がショートサーキットだって知らなかったんじゃないの?
なんなら実証してみせるが、やり方くらい知ってるよな。
0374デフォルトの名無しさん
2009/01/05(月) 19:51:47・timeGetTimeではなく組込のTimerを使ったこと
・Select Caseでも平等にするためにi Mod 10の結果を変数に取っていること
・結果をMsgBoxではなくDebug.Printで出力したこと
以外は同じコードだよ
ちなみに実証方法は知ってる
Select Caseがカンマ区切りがショートサーキットなのは知ってるからわざわざ
Select Caseでやったことは無いが、デバッグの一手法でもあるからな
0375373
2009/01/05(月) 21:26:44i Mod 10の値を処理で使わないんなら>>373が平等なコード。
仮にfoo1でi Mod 10を変数にとってもfoo1が速いぞ?
おめーんとこじゃ遅いのか?
0376デフォルトの名無しさん
2009/01/05(月) 21:35:16そうでもない
> おめーんとこじゃ遅いのか?
うん
0377373
2009/01/05(月) 21:40:10おまえは最速のコード書けないんだろ?
0378373
2009/01/05(月) 21:41:57俺のとこはSelect Caseが速い。
0379デフォルトの名無しさん
2009/01/05(月) 22:00:24条件分岐のステートメントに入る前の時点で、条件となる値が変数に代入されているという
同じ状況を作ることが平等になる
Modを使う場合に限定して、IfとSelect Caseのどちらを使った方が速いかを検証するなら、
君の言うとおりベストを尽くして最速コードを書くべきだけどね
0380デフォルトの名無しさん
2009/01/05(月) 22:12:28Modで算出した値を使わないなら>>373になるんだよ。
まぁどこまで行っても平行線だからもういいが、他のやつらはどっちが速いんだろ?
まぁ速さなんて俺はどっちでもいいけどな。
このような使い方なら普通の美意識を持ってたらSelect Caseだし。
0381デフォルトの名無しさん
2009/01/05(月) 22:19:50foo1が速かった
0382デフォルトの名無しさん
2009/01/05(月) 22:24:07トンクス
j = i Mod 10
Select Case j
としても?
おれのとこはそれでもfoo1が速いが。
0383デフォルトの名無しさん
2009/01/05(月) 22:26:51逆転した
0384デフォルトの名無しさん
2009/01/05(月) 22:31:23ふーん、俺のとこと違うな。
まさかjを変数宣言してないとかじゃないよな?
0385デフォルトの名無しさん
2009/01/05(月) 22:33:56してなかった
したら差は縮まったけどまだ
foo2が速い
0386デフォルトの名無しさん
2009/01/05(月) 22:35:45おいおい、しっかりしてくれよ。
jをLong型で宣言したらそうなるか教えてくれ。
0387デフォルトの名無しさん
2009/01/05(月) 22:36:450388デフォルトの名無しさん
2009/01/05(月) 22:41:46&で宣言したよ
30位foo2が速い
0389デフォルトの名無しさん
2009/01/05(月) 22:42:49人によっては違うということは分かった。
ちなみに俺はWindows xp とExcel2007だ。
0390デフォルトの名無しさん
2009/01/05(月) 22:44:22Excel2002です
0391デフォルトの名無しさん
2009/01/05(月) 22:47:06トンクス。
0392361
2009/01/05(月) 23:18:31>列5 列6 列9なら、イベント処理し、「そうでないなら」、exitする の
>「そうでないなら」はどう書いたものでしょうか?
訊き方が悪かったみたいですね。結局、次のこれで、希望する動きをしています。
If Not (Target.Column = 5) And Not (Target.Column = 6) And Not (Target.Column = 9) Then Exit Sub
0393デフォルトの名無しさん
2009/01/06(火) 00:21:36ハイパーリンク │ 転記情報1
ハイパーリンク │ 転記情報2
EXCELシートの一覧表に上のようにハイパーリンクが張られた一列を作り、
それをWEBブラウザでプレビューできるようにしています。
WEBブラウザ上のリンクをクリックすると、
新しくEXCELシートを呼び出し、
クリックした行の情報(一番上のハイパーリンクをクリックしたなら転記情報1)を
呼び出したシートに転記する処理を作りたいと思っています。
EXCELシートならリンクをクリックすると同時にそのセルがアクティブになるので同行の情報も簡単に転記できそうですが、
WEBブラウザ上でもこれと同じような情報転記は可能でしょうか?
0394デフォルトの名無しさん
2009/01/06(火) 03:38:21背中がムズムズする……
0395デフォルトの名無しさん
2009/01/06(火) 05:39:55気持ちは解る
条件式にnotと=を併用するヤツってもうね…
0396デフォルトの名無しさん
2009/01/06(火) 07:33:050397デフォルトの名無しさん
2009/01/06(火) 09:47:49「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で抜ける必要なし。
というか抜ける記述は普通はしない。
0398デフォルトの名無しさん
2009/01/06(火) 09:49:540399デフォルトの名無しさん
2009/01/06(火) 09:59:59書き忘れたがTarget.Columnを三度も取得しちゃいかん。
どうしてもAndとかOrを使うんなら、いったん変数に取得してから判定するんだな。
0400デフォルトの名無しさん
2009/01/06(火) 10:02:35昨晩のアフォの>>365か?
無視してすまんね。
0401デフォルトの名無しさん
2009/01/06(火) 10:29:050402デフォルトの名無しさん
2009/01/06(火) 10:30:29テキストボックスに商品名の一部を入力⇒キーワードが含まれるセルのデータを
リストボックスに追加 という処理を考えていたのですが
下記の方法で試してみるとかなり時間がかかってしまいます
高速に処理をさせるには根本的な方法の見直しが必要でしょうか?
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
0403デフォルトの名無しさん
2009/01/06(火) 10:59:470404デフォルトの名無しさん
2009/01/06(火) 11:20:39ループのお勉強なら基本的には配列の勉強かな?
データ範囲を2次元配列に取得して回すとか、AddItemは遅いから1次元配列にため込んでListプロパティで設定するとか。
WorksheetFunction.FindじゃなくInStr使うとか。
たしかExcel2000以降ならFilter関数が簡単。
WorksheetFunction.Transpose(範囲)で1次元配列を取得して、Filter関数にかけてからListプロパティで設定。
0405デフォルトの名無しさん
2009/01/06(火) 16:29:31条件に「合う」場合だけ判定して処理するように書くのが普通だね。
定番はIfだけど質問者のレベルから考えてコンマ何秒の速度差を考える必要はないと思うし
見た目のわかりやすさと保守のしやすさからCaseをすすめとく。
条件が増えたときに簡単に数字が追加できるから。
0406デフォルトの名無しさん
2009/01/07(水) 01:50:3608.01.02と表記されたセルから08.01.01と表記されたセルを引くと1という答えが算出される処理を作りたいです。
0407デフォルトの名無しさん
2009/01/07(水) 03:34:54セルの表示形式で「yy.mm.dd」
0408デフォルトの名無しさん
2009/01/07(水) 05:57:34俺は誰かみたいに「何、今更?」なんて言わんが、そのような条件が三つ以上でIfステートメントでOr判定するくらいなら
Select Caseステートメントの方が速いし分かりやすいし定番だと思うよ。
あと知らなくていいことだが、Select CaseステートメントでCase Elseとか、If ThenステートメントでElseとかは
何もそこで処理しなくても書いた方が速くなるね。
まぁ俺は書かないけど。
0409デフォルトの名無しさん
2009/01/07(水) 06:18:38数式でよけれべ普通に=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)
などとやりゃできないか?
0410デフォルトの名無しさん
2009/01/07(水) 07:26:12って構文が気持ち悪いんですけど、何か代替えはありませんか?
0411デフォルトの名無しさん
2009/01/07(水) 07:53:250412デフォルトの名無しさん
2009/01/07(水) 08:23:23もしかして、「代替」を「だいがえ」って読んじゃう頭の弱い人やそれらに無意識に迎合しちゃう人ですか?
0413デフォルトの名無しさん
2009/01/07(水) 08:34:53If ObjPtr(hoge) <> 0 thenでよくね?
俺はこんなことしないけどね。
0414デフォルトの名無しさん
2009/01/07(水) 10:38:45If ObjPtr(hoge) Then
こういう書き方を知らないと意味がわからなくなるけど
0415デフォルトの名無しさん
2009/01/07(水) 12:12:25ttp://dictionary.goo.ne.jp/search.php?kind=jn&MT=%C2%E5%C2%D8%A4%A8
0416デフォルトの名無しさん
2009/01/07(水) 12:25:38直訳すると「ないアルよ」みたいな回りくどい二重否定の表現って
英語だと普通に出てくるから設計者は何の疑問も持たなかったんだろうなあ
俺もまだVBAを勉強中だから知らないだけかもしれないけど、
インスタンス化されてることを、いちいち論理を反転しなくても直接判定できるような
構文か関数ってないの?自分で作るしかない?
0417デフォルトの名無しさん
2009/01/07(水) 16:19:22そもそもがNothingのときに何かをするってことの方が多いんだからさ
有ることと無いこと、両方とも否定文を使わずに判定出来るのが一番かもしれないが
どちらかのみと言うなら、無いことを判定する方法を用意すべきだろ
0418デフォルトの名無しさん
2009/01/07(水) 17:08:300419デフォルトの名無しさん
2009/01/07(水) 17:21:500420デフォルトの名無しさん
2009/01/07(水) 18:39:23変な言葉が定着しつつあることはその引用で判るが、それで何が言いたいの?
# 頭使うことを知らない人は、自分で考えることを放棄するから困る。
0421デフォルトの名無しさん
2009/01/07(水) 18:42:58If hoge = Nothing
If hoge <> Nothing
でいいじゃん。
なんだよ突然Isって。わざわざ演算子を使い分ける妙なこだわりが理解できん。桂正和マニアかよ。
0422デフォルトの名無しさん
2009/01/07(水) 19:10:25の同音異義語が有る場合などに
代替え〜(ダイガエ〜)
と重箱読み使うのは昔からあること
変な言葉でもなければ、最近になって定着しつつあるのではなく以前からあったもの
件の場合は重箱読み使うのが適切と言える状況ではないが、誤用や間違いではない
"代替"の意味で"代変え"を使っているなら完全な誤用だけどね
そもそも、言葉というのは変化していくもの
最近になって定着しつつあるのだとしても、それを頭ごなしに否定するのは愚かしい
頭使うことを知らない人は、誤用と変化の違いを見極めることなく
自分の中の古い知識だけで物事を断定しがちだが、もっと柔軟な頭と広い視野を持たないと困るよ
0423デフォルトの名無しさん
2009/01/07(水) 19:32:330424デフォルトの名無しさん
2009/01/07(水) 19:50:59いや、”だいがえ”が正しいんじゃないかな。
もしかして”だいがい”って呼んでるの?
0425デフォルトの名無しさん
2009/01/07(水) 19:54:09なぜ}のかわりにEndと入力しないといけないのか理解に苦しむ。
見やすくない上に3文字も打たないといけない。ばっかじゃないか?
0426デフォルトの名無しさん
2009/01/07(水) 19:55:490427デフォルトの名無しさん
2009/01/07(水) 19:56:12その古臭い構文をVBも引きずっているというだけ。
だからこそBasicを名乗っているわけだが。
0428デフォルトの名無しさん
2009/01/07(水) 19:56:28CやJavaとbasicはどっちが古いと思っているのかね。
0429デフォルトの名無しさん
2009/01/07(水) 20:00:04古いベーシックから新しいVBになるにあたって
CやJavaで解決されている構文を見習えばよかったのだ。
0430デフォルトの名無しさん
2009/01/07(水) 20:00:560431デフォルトの名無しさん
2009/01/07(水) 20:05:32エクセルのマクロでC#って使えるの?
0432デフォルトの名無しさん
2009/01/07(水) 20:06:30目がチカチカする
小文字ならまだメリハリが出て読みやすいと思う
0433デフォルトの名無しさん
2009/01/07(水) 20:12:55質問させてください。
エクセルの現在のフォントでの文字列の幅を取得するには、
1.HWNDをNULLでデバイスコンテキストを取得する。
2.コンパチブルなDCをつくり、フォントをエクセルのフォントと同じものをセレクト。
3.GetTextExtentPoint32を呼び出して論理単位で文字列幅を得る。
4.(モードがMM_TEXTだと仮定して)ピクセルなので、ポイントに変換する。
(DPIはGetDeviceCapで取得)
5.エクセルのシートのズームが80%なら0.8をかける
であっていますか?
0434デフォルトの名無しさん
2009/01/07(水) 20:22:18VBが登場した頃は、まだパソコン用の高級言語の人気が
CとPascal(これはBegin〜Endって書く言語)で2分していて、
C系の構文が良いという評価が固まっていなかったのだと思う。
>>432
VB登場の少し時代は全部大文字だったから、そこからは進歩したと言えると思う。
0435デフォルトの名無しさん
2009/01/07(水) 20:27:07根っこの部分はN-BASICの時代から変わってないから
昔覚えた変なテクニックが意外とそのまま使えたりするんだよな。
このあたりN-BASICやN88-BASICの記憶がないとなかなか同意してもらえないと思う。
例えばこんなNextの書き方、VBから始めた人は知らないんじゃないかな。
For i = 1 To 10
For j = 1 To 10
(処理)
Next j, i
0436デフォルトの名無しさん
2009/01/07(水) 20:31:28あったなぁ・・
そうだ、For文みて思い出したけど、VBは1からカウントするのが好きくね?
配列とか。あれキモイ。
まともな人間なら数字は0からカウントするものだ。
という言葉を思い出した。
0437デフォルトの名無しさん
2009/01/07(水) 20:36:44数学も1から
C系で0ベースなのはメモリの配置とか低レベルな理由
0438デフォルトの名無しさん
2009/01/07(水) 20:38:03配列はN-BASICもVBも0からだろ。
0439433
2009/01/07(水) 20:39:170440デフォルトの名無しさん
2009/01/07(水) 20:40:30修飾(ボールドとかイタリックとか)も考慮しないとずれるよ
0441デフォルトの名無しさん
2009/01/07(水) 20:43:21嗚呼〜。ほんとだ。そうですよね。。
あ、433のやり方で大筋はOKで、かつ、ボールドも考慮みたいな感じでしょうか?
0442デフォルトの名無しさん
2009/01/07(水) 21:25:06表示形式色々変えたんですけど、
Msgboxで表示しても0だし、EXCELのセル上に表記しても#VALUEになります。
なんでなのでしょう。
EXCELのバージョンは2000です。
0443デフォルトの名無しさん
2009/01/07(水) 21:27:33細かいことを言えば、Excelは同じセル内でも1文字ごとにフォントを変更できる。
すべてに対応するのはけっこうめんどくさそう。
0444デフォルトの名無しさん
2009/01/07(水) 21:28:40元の日付けデータがシリアル値になってないんでねーの?
0445デフォルトの名無しさん
2009/01/07(水) 21:31:48そういやそうですね。ちょっとそこらへんも含めて作ってみます。
0446デフォルトの名無しさん
2009/01/07(水) 21:50:110447デフォルトの名無しさん
2009/01/07(水) 21:55:32そもそも08.02.01のような表記をシリアル値にする方法がわからないのですが。
=DATEVALUE("08.02.01")
みたいに表記してもVALUEになるだけですし。
0448デフォルトの名無しさん
2009/01/07(水) 22:01:53VBA関係ないよな
=DATEVALUE(SUBSTITUTE("08.02.01",".","/"))
次に何かわからないことがあったら総合相談所行ったら?
0449デフォルトの名無しさん
2009/01/07(水) 22:03:37Mac版の2008ではなくなったけど、その次でまた復活する予定。
Win版はなくならない。
0450デフォルトの名無しさん
2009/01/07(水) 22:18:53サンクス
本職はC++だけどVBA使えると経理の女の子から結構重宝されるので助かる
0451デフォルトの名無しさん
2009/01/07(水) 23:29:120452デフォルトの名無しさん
2009/01/07(水) 23:49:34オートフィルター後のA列のデータを取得したい。
どんなマクロになりますか?
0453デフォルトの名無しさん
2009/01/08(木) 00:20:500454デフォルトの名無しさん
2009/01/08(木) 00:29:40オートフィルタの実行はAutoFilterメソッド
結果を配列として取り出すのはCurrentRegion.SpecialCellsメソッド
>>451
単純作業をVBAで自動化してやるとけっこう喜ばれるよ
毎日在庫を確認して発注伝票を印刷してFaxで送信するとか
中小だとアバウトな部分が多くて完全な自動化は難しいから
できるところだけやる
0455デフォルトの名無しさん
2009/01/08(木) 00:35:23どんだけ想像力ねぇの?
0456デフォルトの名無しさん
2009/01/08(木) 00:35:29下記の入力方法だと、絶対参照になってしまいます。
相対参照にする指定方法をご存じないでしょうか?
Cells(i + 1, 9).Value = "=" & Cells(i, 9).Address & "+" & Cells(i + 1, 6).Address
0457デフォルトの名無しさん
2009/01/08(木) 00:43:52Officeって言うくらいだから・・・
0458デフォルトの名無しさん
2009/01/08(木) 00:53:51Cells(i, 9).Address(False, False)
0459デフォルトの名無しさん
2009/01/08(木) 01:14:30Ver: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
0460デフォルトの名無しさん
2009/01/08(木) 01:22:28ありがとう
0461デフォルトの名無しさん
2009/01/08(木) 01:49:40表示形式
0462デフォルトの名無しさん
2009/01/08(木) 02:57:09ほんと、VBA使いって問題起こるとそこで思考停止してしまい
試行錯誤することが出来ない奴が多いよな
エラー出たらそこで終わりってなら機械と同じだぜ
処理速度では機械に敵わないんだから機械以下とも言える
0463デフォルトの名無しさん
2009/01/08(木) 06:24:190464459
2009/01/08(木) 08:48:02もしかすると、これに近い問題でしょうか。
http://questionbox.jp.msn.com/qa2390763.html
また、デバッグ方法もありがとうございました。
VBAというか、プログラミング的なものを初めて2日目なもので、まだよく使い方がわかっていませんでした。
今から会社に行っていろいろ試してみようと思います!
0465デフォルトの名無しさん
2009/01/08(木) 09:05:06計算自体はできてるようなので
書式設定の少数点以下の桁数が0になってるんじゃ?
0466デフォルトの名無しさん
2009/01/08(木) 09:52:070467デフォルトの名無しさん
2009/01/08(木) 10:48:210468デフォルトの名無しさん
2009/01/08(木) 15:28:00もし作成していただけるようでしたらメールをお願いします。
1つの縦列から文字や数字を抽出し、横行書き出す作業を繰り返すマクロの作成をお願いしたいです。
0469468
2009/01/08(木) 15:30:040470デフォルトの名無しさん
2009/01/08(木) 19:05:090471デフォルトの名無しさん
2009/01/08(木) 19:42:270472デフォルトの名無しさん
2009/01/08(木) 20:41:14形式を選択して貼り付け→行列を入れ換える
0473デフォルトの名無しさん
2009/01/08(木) 23:45:400474デフォルトの名無しさん
2009/01/09(金) 00:43:190475デフォルトの名無しさん
2009/01/09(金) 00:44:26Version:2003
取得したデータをセルに表示させる処理を作ったのですが
少し処理速度が遅いので、配列を使って処理しようと思っています。
その際、特定データに対してセルの色付けを行っているのですが
配列を使って最後にRangeオブジェクトで貼り付ける場合、どのタイミングで
セルに色付けするのがいいんでしょうか?
配列に入れる処理中に色付けをするぐらいしか思い浮かばないのですが
どなたか知恵を貸して下さい
0476デフォルトの名無しさん
2009/01/09(金) 00:50:04それでいいじゃん、何か問題有るの?
0477デフォルトの名無しさん
2009/01/09(金) 03:10:36穴だらけのコードだけど、とりあえず…
環境依存かもしれない
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
0478デフォルトの名無しさん
2009/01/09(金) 09:28:53とりあえず大雑把なアドバイスをしておく
できる限りセルへのアクセスを減らす
決まった色の取得にRGBを何度も呼ばない
定数を使うか初期化の段階でLong型の変数に入れておいてそれを使う
的外れなアドバイスだったらスマソ
具体的にどんな処理をしてるのか分かればもう少し細かく何か言えるかも知れん
0479デフォルトの名無しさん
2009/01/09(金) 16:28:17そこで困った事が発生しました。
シート名がS1とかだと名前の前後にシングルコーテーションが付きますね。
セルから取り出した値は先頭の1文字が外されます。
仕様だとは思いますが、シングルコーテーションも一緒に取り出す方法等が
あるのでしょうか?
0480デフォルトの名無しさん
2009/01/09(金) 16:45:36リストを作る時に先頭にシングルコーテーションをもう1つ入れておく
もしくはシート名と名前で列を分ける(使う時に編集する)
この程度しか思いつかないな・・・
0481452
2009/01/09(金) 23:15:141行目が項目名で、2行目から201行目までデータが入っています。
オートフィルター後のA列のデータを取得したい。
どんなマクロになりますか?
>454 :デフォルトの名無しさん:2009/01/08(木) 00:29:40
> >>452
> オートフィルタの実行はAutoFilterメソッド
> 結果を配列として取り出すのはCurrentRegion.SpecialCellsメソッド
との答えをいただき、
いろいろとやってみるのですが、全くのお手上げ状態です。
フィルター後の上2件分の例示マクロをお願いします。
0482デフォルトの名無しさん
2009/01/09(金) 23:25:47もうちょっと質問を具体的に。
(1)フィルターの条件は?
(2)フィルターかけたあとどうしたい?
0483452
2009/01/10(土) 00:31:08(2) フィルターをかけた後は可視セルを対象に、「A列の各コード(3桁)を取得したい。」
おおよそ、20〜50件程が該当データになります。
取得した後の配列から、その各要素を取り出すことは自分でできると思います。
随分以前ですがやったことはありますので。
0484デフォルトの名無しさん
2009/01/10(土) 01:11:171か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
0485デフォルトの名無しさん
2009/01/10(土) 08:15:13それ自体はPrintOutメソッドを使えばできると思っているのですが、その際、プリンタのトレイまで指定することは可能でしょうか。
例えば、このシートを印刷する時はA4のトレイ、このシートを印刷する時は手差しのトレイから、という感じで。
0486デフォルトの名無しさん
2009/01/10(土) 09:20:27出来るよ
手動でトレイの選択などが出来る状態なら
その辺の制御をするドライバやAPIは入ってるわけだから
それをプログラムから叩けば良いだけ
でもそれはVBAではなくVBの分野(>>1参照)
印刷対象がExcelのシートだろうと、プリンタのハード的制御はExcel関係ないのでスレ違い
0488デフォルトの名無しさん
2009/01/10(土) 11:09:59>それ自体はPrintOutメソッドを使えばできると思っているのですが、・・・
484氏の回答を得て、機嫌がいいので (~_~);
そうゆう設定は、PrintOutメソッドでは出来ない。
それで、vbaとしての回答は、印刷ダイアログボックスを呼び出して、選択することになる。
Application.Dialogs(xlDialogPrint).Show
但し、excel4マクロ(vbaではない扱いをされている)の世界だとどうだか知らない。
(xpでは見ていないが、97(たぶん?)と)2007ではマクロの記録で、また、
excel4マクロが記述されている。が、これは、触らない方が無難。
0489デフォルトの名無しさん
2009/01/10(土) 11:17:020490デフォルトの名無しさん
2009/01/11(日) 16:30:56Dim window1 As Window
workbookでもなくworksheetでもないんですよね??
どなたかご教授お願いします。
0491デフォルトの名無しさん
2009/01/11(日) 16:53:340492デフォルトの名無しさん
2009/01/11(日) 17:04:46大雑把に説明すると、Windowsというのは画面上に表示された状態の物。
ブックやシートは画面に表示されてなくても、例えばHDDに保存されたファイルの中にも存在する。
ブックを開いたらWindowが作られる、みたいに考えておけばいい。
0493デフォルトの名無しさん
2009/01/11(日) 17:44:48ありがとう。
自分が作るプログラムには特に必要はなさそうです。
自分のPCでは
Set window1 = Workbooks(1)
でwindow1には”PERSONAL.XLS”が入ります。
勉強になりました。
0494デフォルトの名無しさん
2009/01/11(日) 20:05:41となっていて、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件でも区切り線が引かれるようにするには
どのようにすれば良いですか?
0495デフォルトの名無しさん
2009/01/11(日) 20:24:15努力だけは認めるが、無駄が多すぎる。
店名が同じかどうか判定するのに、わざわざワークシート関数なんか使わなくても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
0496デフォルトの名無しさん
2009/01/11(日) 20:37:40考えすぎたみたいです。解決しました。
ありがとうございましたm(_ _)m
0497デフォルトの名無しさん
2009/01/11(日) 20:43:27オレの知らないテクニック満載で何やってんのか理解できねえ
0498デフォルトの名無しさん
2009/01/11(日) 20:46:090499デフォルトの名無しさん
2009/01/12(月) 07:19:54図形の操作がらみが「マクロの記録」に残らないんですが
以前のバージョンのように記録させる方法ないでしょうか?
0500デフォルトの名無しさん
2009/01/12(月) 08:23:04ない
0501デフォルトの名無しさん
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 工藤
0502デフォルトの名無しさん
2009/01/12(月) 17:57:54http://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 工藤
0503デフォルトの名無しさん
2009/01/12(月) 21:11:53俺はマルチポストでも構わず答えちまう男なんだぜ。
俺なら、どっかのセルにクラスと番号を結合させた物を作る。
cells(i,1).value & "-" & cells(i,2).value をforでまわしてどっかに作る。
図1と図2に同じ処理。
後はfindでsetするなり、好きに料理しろ。
0504デフォルトの名無しさん
2009/01/12(月) 21:50:33コマンドはありますか?
マクロの自動記録で試しましたが記録されませんでした。
0505デフォルトの名無しさん
2009/01/12(月) 21:58:38勘違いかも知れんが、Stopとかブレークポイントの事か?
0506デフォルトの名無しさん
2009/01/12(月) 22:28:43そうです。
ブックを開いてマクロ実行する運用の中で、
一定の条件が成立した時に止めたいのですが、
ブックを開く度にブレークポイントを手動で設定するのは
現実的ではないのでブレークポイントはちょっとNGと思ってます。
イメージとしては以下のような感じです。
if xxxxx then
application.stop ← ここで止めたい
end if
ブレークポイントをマクロより動的に設定できるか、
ブックに保存できる方法でも助かります。
0507デフォルトの名無しさん
2009/01/12(月) 22:30:16errとerr.number使えばいいんじゃねーの?
0508デフォルトの名無しさん
2009/01/12(月) 22:34:30止まったらEsc押すといい
0509デフォルトの名無しさん
2009/01/12(月) 22:37:150510デフォルトの名無しさん
2009/01/12(月) 22:53:25止まったところでイミディエイトウィンドウで変数の内容を見たり書き換えたり自由にできる。
実行再開はCONT (嘘)
0511デフォルトの名無しさん
2009/01/12(月) 22:58:17ごめん嘘
0512デフォルトの名無しさん
2009/01/13(火) 01:58:500515デフォルトの名無しさん
2009/01/13(火) 20:24:40for i=1 to 5
if i=3 then stop
next i
って書く。
0516デフォルトの名無しさん
2009/01/13(火) 21:12:47もちろん、If ... Then ... else ...もやらない
0517デフォルトの名無しさん
2009/01/13(火) 21:36:38>>515
ありがとうございました。
stopで止まりました。
0518デフォルトの名無しさん
2009/01/13(火) 21:51:33すいません
そのわけを教えてください
0519デフォルトの名無しさん
2009/01/13(火) 22:15:210520デフォルトの名無しさん
2009/01/13(火) 22:39:310521デフォルトの名無しさん
2009/01/13(火) 22:54:17123.456.789.10
からx番目のIPアドレスを求めるような
EXCEL関数かVB関数を探してるのですが、
そんな便利なものありませんか?
0522デフォルトの名無しさん
2009/01/13(火) 23:17:280523デフォルトの名無しさん
2009/01/13(火) 23:23:360524デフォルトの名無しさん
2009/01/13(火) 23:25:33すみません。
123.254.90.10から
1番目は、123.254.90.11
2番目は、123.254.90.12、
…
という意味です。
上のIPアドレスの範囲も間違えて、あぁぁぁ、出直してきます。
失礼しました。。。。
0525デフォルトの名無しさん
2009/01/13(火) 23:28:290526デフォルトの名無しさん
2009/01/14(水) 00:02:10Sub test()
For x = 1 To 10
A = Split("169.254.100.10", ".")
A(3) = A(3) + x
Debug.Print Join(A, ".")
Next
End Sub
0527デフォルトの名無しさん
2009/01/14(水) 01:48:010528デフォルトの名無しさん
2009/01/14(水) 20:38:530529デフォルトの名無しさん
2009/01/15(木) 00:29:42EXCELは2003です。
1.EXCEL上に別のEXCELシートを開くハイパーリンクを貼る
2.リンク先のシートが開くと同時に
Private Sub Workbook_Open()
Workbooks("Book1").Close
End Sub
みたいな感じで処理を走らせ、リンクで開いたシート自体を閉じる
のような処理を入れるとシートが閉じられた後、EXCELがおかしくなります。
アクティブになっているEXCELシート以外のシートがアクティブにできないし、
新たに別のシートも開けなくなります。
ハイパーリンクとリンク先のシートを閉じる処理って同時には行えないんですかね?
0530デフォルトの名無しさん
2009/01/15(木) 01:01:19イベント処理中でブックを閉じると実行中のインスタンスが開放されて暴走するんだっけ、
なんかそんなのがあったような気がする。
0531デフォルトの名無しさん
2009/01/15(木) 03:44:25Book1閉じるって書くしかないんじゃね
0532デフォルトの名無しさん
2009/01/15(木) 04:02:020533デフォルトの名無しさん
2009/01/15(木) 18:17:44Excel2002のシートにラベルコントロールを貼付けました。
それをクリックすると、マウスカーソルがコントロールから離れるまで
コントロール全体のサイズが若干大きくなってしまいます。
これは仕様でしょうか?
もし対処方がありましたら、御教示下さい。
0534デフォルトの名無しさん
2009/01/15(木) 18:20:29フォーカス位置を示す点線で囲まれた状態のことを言ってんなら、それは仕様
0535デフォルトの名無しさん
2009/01/15(木) 18:37:33回答ありがとうございます。
ラベルのキャプションのテキストのサイズも変化するので、
フォーカスの点線ではないと思われます。
キャプションのテキストは通常状態ですと文字が滲んでおり、
クリックしてラベル全体が大きくなると文字がハッキリすることから、
ラベルをクリックしたときのサイズが正しいような気がします。
0536デフォルトの名無しさん
2009/01/15(木) 19:37:27book1をアクティブにした状態のまま、book2の特定のセルに書き込みをしたいのです。
で、
Windows("book2.xls").Cells(1, 2) = 1
とやったのですが、エラーが出ます。
正しくはどうやればいいのでしょうか?
0537デフォルトの名無しさん
2009/01/15(木) 22:06:50○ ブック.シート.セル = 値
0538デフォルトの名無しさん
2009/01/16(金) 18:33:12VBAを使い年賀状を作成しなければならないのですが まず何からどうしたらよいかさえわかりませんm(_ _)m
お願いします。汗
0539デフォルトの名無しさん
2009/01/16(金) 18:40:340540デフォルトの名無しさん
2009/01/16(金) 18:48:410541デフォルトの名無しさん
2009/01/16(金) 19:00:270542536
2009/01/16(金) 19:27:50レスありがとうございます。
さっそくやってみました。
Windows("book1.xls").Sheets("Sheet1").Cells(1, 2) = 1
とやったのですが、やはりエラーが出ます。
なぜなのか、さっぱりわかりません。
しつこいようですが、教えて下さい<(_ _)>
0543デフォルトの名無しさん
2009/01/16(金) 20:03:41Sub test()
Workbooks("book1.xls").Activate
Workbooks("book2.xls").Worksheets("Sheet1").Cells(2, 1) = 1
End Sub
0544デフォルトの名無しさん
2009/01/16(金) 23:03:00ブックのファイルサイズがMB単位で肥大化して困ってますが、
皆さんどうしてますか?
0545デフォルトの名無しさん
2009/01/16(金) 23:17:270546デフォルトの名無しさん
2009/01/16(金) 23:24:57ワークシートを操作するマクロを何度も走らせるとファイルが太る可能性はあるが、
それならシートの再構築でダイエットできるかもしれない。
0547デフォルトの名無しさん
2009/01/16(金) 23:27:09「ユーザ定義型は定義さていません」エラーとなります。
クラスでないモジュールの場合はそのまま呼び出せてます。
名前空間の問題と思われますが解決方法はありますでしょうか?
hoge.xls → fuga.xla(参照設定)
0548デフォルトの名無しさん
2009/01/16(金) 23:31:21マクロは相当な量です。
再構築は以前試した時は多少は改善しました。
でも、まっさらなブックにマクロのみ貼り付けても、
それ以上は小さくならなかったのでコレが限界かと。
0549デフォルトの名無しさん
2009/01/16(金) 23:32:49おおおおお、ありがとうございました!!
0550デフォルトの名無しさん
2009/01/16(金) 23:34:080551デフォルトの名無しさん
2009/01/17(土) 00:30:00http://support.microsoft.com/?scid=kb%3Ben-us%3B555159&x=14&y=9
0552デフォルトの名無しさん
2009/01/17(土) 10:08:15保存名はシートの名前で。
0553デフォルトの名無しさん
2009/01/17(土) 11:38:51思いつくならそれをマクロの記録で録ることすら
思いつかないの?馬鹿なの?死ぬの?
0554デフォルトの名無しさん
2009/01/17(土) 11:44:17ワークシートコレクションに対するループの中で
(1) シートが1枚のブックを新規作成
(2) そこへシートをコピペ
(3) 名前を付けて保存
(4) 新規ブックを閉じる
を繰り返す
とりあえず>>1の★5の理由によりまずは自分で作ってみれ。方法は★6で。
0555デフォルトの名無しさん
2009/01/17(土) 13:44:33ありがとうござました。
しかし各クラスごとに生成用のメソッドが必要とは...
これがなければ理想的なんですが。
0556デフォルトの名無しさん
2009/01/17(土) 17:44:47オブジェクト指向ではコンストラクタとデストラクタもクラスライブラリで用意することになってる。
というか勝手にインスタンス化するのは不可能だろ。どんだけメモリが必要かもわからんのに。
0557デフォルトの名無しさん
2009/01/17(土) 17:49:40おまい判ってない。
↓ではコンストラクタでなはく生成用のグローバルなメソッドを
クラスの外に定義しろっていってんだよ。
オブジェクト指向以前の問題。
ttp://support.microsoft.com/?scid=kb%3Ben-us%3B555159&x=14&y=9
0558デフォルトの名無しさん
2009/01/17(土) 18:00:010559デフォルトの名無しさん
2009/01/17(土) 18:44:18Excelのclassのインスタンス化プロパティがPrivateかPublicNotCreatebleしか選べないから
外部から直接インスタンス化できないという仕様なのが問題で、コンストラクタは関係ない。
0560デフォルトの名無しさん
2009/01/17(土) 19:30:450561デフォルトの名無しさん
2009/01/17(土) 20:43:17出来ますよ
0562デフォルトの名無しさん
2009/01/18(日) 11:40:34エクセル2003のVBAについてです。
フォーム内に、セル(もしくは、エクセルのセルと同様の働きをするもの)
の貼りつけることってできるのでしょうか?
0563デフォルトの名無しさん
2009/01/18(日) 12:15:21ググれカス
http://q.hatena.ne.jp/1148568634
これで良い?
0564デフォルトの名無しさん
2009/01/18(日) 13:52:100565デフォルトの名無しさん
2009/01/18(日) 13:54:430566デフォルトの名無しさん
2009/01/18(日) 13:59:02VBAの処理の中でハイパーリンクをセルの書式設定にてロックを解除したセルに貼り、
その後シート全体をセルの選択が出来ない形で保護する
つまりハイパーリンクのあるセル以外は押しても反応が無いよう保護する処理を作ったのですが、
ハイパーリンク以外のセルを押すとリンク先の画面が立ち上がってしまいます。
ハイパーリンクのあるセル以外は選択することも出来ないような画面を作りたいのですが、
何故上のような画面が出来てしまうのでしょうか?
0567デフォルトの名無しさん
2009/01/18(日) 14:34:48保護により選択出来ないセル上で行ったクリック動作は
現在選択状態にあるセル上で行ったものとして扱われる
故に選択できるセルが1セルなら、どこをクリックしようとそのセルをpクリックした扱いになる
君の要望を実現するには、セル上のハイパーリンクではなく、
ボタンコントロールなどを使ってリンク先に飛ぶのが適切だろうな
まあガンバレ
0568デフォルトの名無しさん
2009/01/18(日) 15:07:110569デフォルトの名無しさん
2009/01/18(日) 16:35:58フォームに入力した内容を編集してシートに反映させるマクロを作成しているのですが、
マクロ実行中はシートをアクティブに出来ないのでマクロを終了させないと
シートの変更内容の確認が出来ません。(テスト作業+デバッグの効率が悪い…)
マクロ実行中(フォーム表示中)でも、シートのウィンドウをアクティブにしてシート選択が
可能になる方法はあるのでしょうか?
よろしくおねがいします
0570デフォルトの名無しさん
2009/01/18(日) 17:58:08VBEのウィンドウを最大化しなければいい
0571デフォルトの名無しさん
2009/01/18(日) 18:31:58普通に見れるだろ
0572デフォルトの名無しさん
2009/01/18(日) 19:46:29(例)表列A1、A2に数値を入力したらリアルタイムに(マクロ側に計算式記述。例えば A1*A2)A3に結果を表示させようとする場合どうすればいいでしょう?
解説サイト見てもブック起動時実行ってのばかりしか見つからない…
0573569
2009/01/18(日) 19:48:39・マクロはsheet1上に置いたコマンドボックスから開始する(フォームが表示される)
・フォームに入力した内容が反映されるのはsheet2・sheet3
で、
・フォームが表示されている状態ではExcelのウインドゥをアクティブにすることが出来ない
・なので、マクロで変更されている筈のsheet2・sheet3を開くことが出来ない
という状態です。
>>570
VBEのウインドゥについては開いている状態でも閉じている状態でも上記の現象に変わりありません。
>>571
マクロがsheet1を編集しているなら普通に見れるとは思いますが、
編集しているのは背面にある他のシートなので…
0574デフォルトの名無しさん
2009/01/18(日) 19:48:44ワークシート関数と同じ感覚?
それならSelectionChangeで出来る。
シートごとに設定しないといかんけどね。
0575デフォルトの名無しさん
2009/01/18(日) 20:11:43Modelessで呼べば良いだけでは?
>>574
SelectionChangeではなくChangeだろ
SelectionChangeは選択セルが変更されたとき
Changeはセルの値が変更(入力、削除など)されたとき
それと対象セルと処理内容が同じならシート毎に設定する必要も無い
ブック単位、あるいは全ブックを対象に一括処理する方法もある
0576デフォルトの名無しさん
2009/01/18(日) 20:20:07vbModelessを付けてフォームを開いたところ上手くいきました、
ありがとうございます。
0577デフォルトの名無しさん
2009/01/18(日) 21:34:00多分functionとrangeを使ってどうにかこうにか書くのだと思うのですが上手くいかない
0578デフォルトの名無しさん
2009/01/18(日) 21:36:51ヒント
Workbook_SheetChange
Application.EnableEvents = False
0579教えてください
2009/01/20(火) 00:51:55複数のブックに散らばっている同じ名前のシートを、1ブックの1シートにまとめたいのですがうまくいきません。
msgbox "5"までは表示されるので、次の行がおかしいのだと思います。
「motosheet.」の記述を消すとマクロ自体は動作するのですが、コピー元のブックではなくてコピー先のブックを参照してしまいます。
なぜか、rangeの親オブジェクトを記述すると「実行時エラー 1004 アプリケーション定義またはオブジェクト定義エラー」となります。
1行前はrangeの親オブジェクトを記述しても問題ないのに・・・
本当に困っています。よろしくお願いします。
0580教えてください
2009/01/20(火) 00:52:34Private 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"
0581教えてください
2009/01/20(火) 00:53:00For 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
0582デフォルトの名無しさん
2009/01/20(火) 01:06:50→
Set motorange = motosheet.Range("a2", motosheet.Cells(入力済み最終行番号, 19))
0583デフォルトの名無しさん
2009/01/20(火) 06:51:420584デフォルトの名無しさん
2009/01/20(火) 11:38:28入門書を斜め読みして断片的な知識で「動けばいい」程度のコードを書いてる人のが圧倒的に多いよ。
0585デフォルトの名無しさん
2009/01/20(火) 19:28:45エクセルのシートにある数字と文字列をCSVファイルに下記のように出力したいです。
(エクセル)
123,鈴木
1013,田中
(出力) 番号,名前
0123,鈴木
1013,田中
自分で作ってみたところ、下記のように文字列になってしまいます。
(出力) ”番号”,”名前”
”0123”,”鈴木”
”1013”,”田中”
となってしまいます。
どのようにすれば良いのでしょうか。
よろしくお願い致します。
0586579
2009/01/20(火) 21:14:18うぉー!! ありがとうございます!!!!
2日悩み続けてました。CellsオブジェクトもThisworkbookの子オブジェクトとして認識されて
しまっていたのですね。
でも悩みに悩んでいるといろんなことを考えるから、勉強にはなりますよね。
>>583
もっと違った記述方法があるんですかね?教えてください。
0587デフォルトの名無しさん
2009/01/20(火) 21:48:51どんなプログラムを作ったの?
0588デフォルトの名無しさん
2009/01/20(火) 22:07:54まず変数名に日本語を使うところからダメだわ。
0589デフォルトの名無しさん
2009/01/20(火) 22:14:47それは場合によりけりだな
0590デフォルトの名無しさん
2009/01/20(火) 22:21:17どちらかに決めて使い分けはしない
0591デフォルトの名無しさん
2009/01/21(水) 00:29:10日本語使うとコードが分りやすくなるような気もするから
使おうかなとも思うけど…
でも抵抗あるんだよなー
0592デフォルトの名無しさん
2009/01/21(水) 00:39:52ローマ字で書くのは嫌いだから日本語で書いちゃう
0593デフォルトの名無しさん
2009/01/21(水) 01:02:53確かに!
日本語で書けば被らないな
てことは日本語で書いたほうが合理的だな
0594デフォルトの名無しさん
2009/01/21(水) 05:44:10Heightを文字の大きさの2倍以上にしないと、文字が崩れますが
解決法はありますか?
0595デフォルトの名無しさん
2009/01/21(水) 07:15:080596デフォルトの名無しさん
2009/01/21(水) 20:02:04いるところなのですが、文字化けを起こします。
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等のブラウザから見ると正常に‖と見えます。
よろしくおねがいします。
0597デフォルトの名無しさん
2009/01/21(水) 20:23:54>>1★3,★4
0598デフォルトの名無しさん
2009/01/21(水) 22:56:21失礼しました。。。
0599デフォルトの名無しさん
2009/01/22(木) 17:46:03送り仮名が入ると面倒だよね。
あとは、変数名一覧表を作っておく事が絶対条件かも・・・。
0600デフォルトの名無しさん
2009/01/22(木) 18:10:08Option Explicitは必須だね。
なまじわかりやすすぎて、同じ意味の別の熟語に無意識に脳内変換しちゃうことがある。
0601デフォルトの名無しさん
2009/01/22(木) 19:03:30セルA1には、「8:00」がはいっているとして、
Option Explicit
Sub test1()
UserForm1.TextBox1 = Range("a1").Value
UserForm1.Show
End Sub
これで、テキストボックスに「0.33333333」じゃなく、
きちんと時刻を表示させるにはどうすればよいですか。
0602デフォルトの名無しさん
2009/01/22(木) 19:27:06TextはA列のセル幅が狭いと##とかなるけど。
0603質問です
2009/01/22(木) 20:03:19Sub 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
0604質問です
2009/01/22(木) 20:04:18If 入力値 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
どうも分岐がうまくいかないのですが。
0605質問です
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
0606デフォルトの名無しさん
2009/01/22(木) 21:16:29KUMI = 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)がスペースの行が検索に引っかかりません。
一覧の中で検索対象セルの入力有無に関わらず、検索に引っ掛けるようにするにはどうしたらいいでしょう?
質問がわかりにくいとは思いますがお願いします。
0607606
2009/01/22(木) 21:23:56上の
Do While Cells(row1, 1).Value = ""
は
Do While Cells(row1, 1).Value <> ""
の間違えでした。
0608デフォルトの名無しさん
2009/01/22(木) 22:23:090609606
2009/01/22(木) 23:37:24最善の処置かはわかりませんが、自己解決しました。
スレ汚し失礼しました。
0610デフォルトの名無しさん
2009/01/23(金) 00:05:26開いていなければ何もしないという処理って可能ですか?
0611デフォルトの名無しさん
2009/01/23(金) 00:08:50ブックじゃなくてシート?
0612デフォルトの名無しさん
2009/01/23(金) 00:28:23ブックなら可能
やりかたは自分で調べろ
0614デフォルトの名無しさん
2009/01/23(金) 01:04:27Workbooks( ).Close
0615610
2009/01/23(金) 01:16:51それって全部閉じませんか?
ブックAでマクロを起動するとブックAはそのままでブックBを閉じる機能なんですが。
そしてブックBが閉じている状態で起動してもエラーがおきないようにしたいです。
0616603
2009/01/23(金) 01:22:49If 入力値 Like "*[C,O,O2,Fe]" = True Or 入力値 Like "*[CX,OX,O2X]*" = True Then
この分岐で(入力値)
J0235-2PtAuX10
H0053-1PtX2
を拾ってしまうんですが、何が原因でしょうか。
0617デフォルトの名無しさん
2009/01/23(金) 01:25:39Workbooks( ブックB ).Close
エラー処理、またはエラー処理をしなくても済むような方法は自力で調べて考えろ
調べても考えてもわからなかったら、そこで始めて人に聞け
0618デフォルトの名無しさん
2009/01/23(金) 01:37:15ユーザフォームのShowModalをFalseに設定しています。
ユーザーフォームには、複数のテキストボックス、チェックボックス
コマンドボタンを配置しています。
ユーザフォームとワークシート間を移動した時の
イベントを教えて下さい。
Activate,Deactivateを試しましたが、該当しないようです。
宜しくお願いします。
0619デフォルトの名無しさん
2009/01/23(金) 01:47:47色々な文字列のうち、どれがLikeの条件にヒットするか試してみたけど、法則が見えない
ttp://momoiro.s4.x-beat.com/up/img/momoiro08659.png
0620デフォルトの名無しさん
2009/01/23(金) 01:54:13該当するイベントは存在しないので、何か別の方法を考えるしかない。
例えばタイマーで一定時間ごとにアクティブなウィンドウを調べるとか、
はっきり言ってかなり面倒な方法しかなかったと思う。
0622デフォルトの名無しさん
2009/01/23(金) 02:11:43そうですね。いろいろ試しているんですが、きびしいです。
Likeにクセあるんだろうと思いながら使えない気がしてます。
入力値をもっと制限する方法も検討しながらもう少し探ってみます。
0623デフォルトの名無しさん
2009/01/23(金) 02:17:18[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)$"とするべきだ
0624デフォルトの名無しさん
2009/01/23(金) 02:19:54こうなったらRightとInstrで1個ずつ調べるしかないと思う
0625デフォルトの名無しさん
2009/01/23(金) 02:25:34たとえば、"*[CX,OX,O2X]*"は、
CかXか,かOか2を最低一つ含むという意味では?
0626デフォルトの名無しさん
2009/01/23(金) 02:26:37なるほど、つまり
"*[C,O,O2,Fe]" → "*[,2CeFO]"
"*[CX,OX,O2X]*" → "*[,2COX]*"
ということか。納得いった。
VBAの解説してる某有名サイトは間違ってんだな
0627デフォルトの名無しさん
2009/01/23(金) 02:28:49ありがとうございます。
その.closeでエラー回避する方法あるんですね。
調べてみます。
0628デフォルトの名無しさん
2009/01/23(金) 02:33:57>>626
そうなのですか。
確かにそれなら納得がいきます。
参考にしたサイトを間違えたかも。
ありがとうございます。
長いコードを書くことが確定した。
0629623
2009/01/23(金) 02:40:06OfficeTANAKAかな?
まあ解説サイト作ってるからといって全てを熟知してるわけじゃないし
レベルも様々だから仕方ないさ
まあ、あの人レベルはそんなに低くもなく高くもなくだが
もっとレベルの低い人がデタラメばかり書いてる解説サイトもあるから過信は禁物
0630デフォルトの名無しさん
2009/01/23(金) 02:51:41プログラムってのはひとつの発想に固執せず、
いろんな角度から発想を転換してみるのが上達のコツ
こういう時はエラーが起きないよう注意するより、
エラーを無視すればいいんだよ
on error resume next
workbooks("B.xls").close
on error goto 0
0631デフォルトの名無しさん
2009/01/23(金) 04:24:46一度保存して閉じるけど
0632デフォルトの名無しさん
2009/01/23(金) 04:26:530633デフォルトの名無しさん
2009/01/23(金) 04:46:04開いていたら
閉じる
0634デフォルトの名無しさん
2009/01/23(金) 09:08:26ありがとうございます
0635デフォルトの名無しさん
2009/01/24(土) 21:32:21A1セルに文字列で「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です。
0636デフォルトの名無しさん
2009/01/24(土) 21:32:44開いている全てのワークブックの名前をDoで回し取得、
該当ブックが有れば.close
0637デフォルトの名無しさん
2009/01/24(土) 21:39:01年/月/日が月/日/年になってしまう時は、コントロールパネルかツール/オプションで地域の設定を見直す
0638デフォルトの名無しさん
2009/01/24(土) 21:43:34全ブック回すならFor Eachの方がコードがシンプルになるけど負荷が大きくなる。
エラーを無視するのは行儀は悪いが一番処理は速い。
エラー処理をきちんと書く、例えばエラーメッセージを出すとか実行結果をエラーコードとして返すのが王道だけど
片手間で作る小規模なコードでは大げさすぎる。
どの方法を使うかはケースバイケースだ。
0639デフォルトの名無しさん
2009/01/24(土) 21:58:53地域と言語のオプションやEXCELのツール→オプションを見ましたが不自然な場所は内容に見えるのですが。
もう少し詳しくお願いします。
0640デフォルトの名無しさん
2009/01/24(土) 22:06:36ExcelじゃなくてWindowsのコントロールパネルの地域と言語のオプションだよ。
どこかのセルに「9/8/7」ってキーボードから入れたらどうなる?
「2009/8/7」になるか「9/8/2007」になるか。
0641630
2009/01/24(土) 22:09:05>エラーを無視するのは行儀は悪い
エラー処理って大そうに考えてる人多いみたいだけど、
俺はエラー処理ってのはプログラムの効率化を図る手段だと思ってる
実際にErrorステートメントなんか存在しなくても、
厳密なプログラムを書けば99.9%(経験上100%)同じことはできる
Errorステートメントってのは、あらゆる場面を想定した厳密なプログラムを
書かなくてもいいように効率化(手抜き)をするためのモンじゃないの?
0642635
2009/01/24(土) 22:15:04639の地域と言語のオプションというのはもちろんコントロールパネル内のやつの一項目です。
変なところは無いみたいですし、そもそも購入してからいじった覚えもありません。
現状どのEXCELシートでも9/8/7と入力すると2009/8/7に置き換わって問題ないようにみえます。
0643デフォルトの名無しさん
2009/01/24(土) 22:19:03A1セルに09.08.07じゃなくて、9/8/7っていれてみ
0644デフォルトの名無しさん
2009/01/24(土) 22:22:37書式の問題かもしれないし
0645デフォルトの名無しさん
2009/01/24(土) 23:11:33A1A2セル共に9/8/7と入れれば09.08.07に自動で置き換わりますので書式には問題は無い様に思えます。
ちなみにA1セルに9/8/7と入力して635の処理を走らせると2009/8/7が20/9//8/に置き換わるだけでした。
それとMid関数を利用してピリオドをスラッシュに置き換えても結果は同じ07.09.08でした。
この処理の目的としては日付欄なのに入力の際にピリオドを直接入力している間違った記述を一括で直したいというのがあるのですが
どうしてこんな順番入れ替わりがおこるのかが本気で謎です。
0646デフォルトの名無しさん
2009/01/24(土) 23:48:18DateSerialをかますんだ!
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
0648デフォルトの名無しさん
2009/01/25(日) 17:56:18というコマンドの「#」の意味を調べてみたんですが
言及されてなくてわかりません。
この#にはどんな意味があるのでしょうか?
0649デフォルトの名無しさん
2009/01/25(日) 18:08:330650デフォルトの名無しさん
2009/01/25(日) 18:25:52「#」は「ナンバーサイン」とも言う。そして、例えば「2番目のvoid」を「void#2」とも書く。
その意味を込めてMS-BASICで採用された仕様だ。
0651デフォルトの名無しさん
2009/01/25(日) 18:55:24Workbook_WindowActivate
0652デフォルトの名無しさん
2009/01/25(日) 19:04:08ほえー!ずぅっとシャープだとばかり思ってました。
番号を表す「ナンバーサイン」という記号だったんですね。
勉強になりました。ありがとうございます。
>>649
そのブックに、Auto_Open()のモジュール名で記述されたプログラムは
ブックを開くと同時に実行されます。
0653デフォルトの名無しさん
2009/01/25(日) 19:08:000654652
2009/01/25(日) 19:12:30どうもすみません。
0655デフォルトの名無しさん
2009/01/25(日) 19:40:49ありがとうございます。
もう一つ質問です。
非アクティブ状態のシートのアクティブセルの参照はどうすればいいでしょうか?
現在ブックBがアクティブ状態で
Cells(1, 1) = Workbooks("A.xls").Worksheets(1).ActiveCell.Offset(0, 1)
のような処理はオブジェクトはプロパティ・メソッドをサポートしてないと言われました。
ブックAをアクティブにしたくないのですけど、やはりブックAをアクティブにしてからでないと無理ですかね?
0656デフォルトの名無しさん
2009/01/25(日) 20:29:26アクティブじゃないシートにはアクティブなセルなど存在しない
それにActiveCellはWorksheetオブジェクトのメンバではなくExcelオブジェクトのメンバなので
上位オブジェクトを指定するならExcel.ActiveCellのようになり、Excel以外は指定できない
つまり、「(A):非アクティブなシートのアクティブセル」って概念自体が間違いであり
君がやりたいことは「(B):非アクティブなシートが最後にアクティブだったときにアクティブだったセルの取得」
と表現するのが正しい
というわけで、存在しないもの(A)は取得できないので、(B)を取得するには
任意のシートにアクティブセルが存在するようにしてやる(任意のシートをアクティブにする)か、
アクティブセルの移動を監視記録するのどちらかだな
表示を止めてアクティブにしたのが見えないようにも出来るが、それでも前者が嫌なら後者しかない
0657デフォルトの名無しさん
2009/01/25(日) 21:02:480658デフォルトの名無しさん
2009/01/25(日) 22:30:01職場で部下に教えるならまだしも、2ちゃんで赤の他人に教えるだけで
0659デフォルトの名無しさん
2009/01/25(日) 23:23:32ActiveSheet.PageSetup.LeftHeader = "&18 1月12日 &A"
このなかの1月12日の部分をnow()+2かstring型の変数を使いたいのですが方法はありますか
0660デフォルトの名無しさん
2009/01/25(日) 23:36:150661デフォルトの名無しさん
2009/01/25(日) 23:51:02丁寧にありがとうございます。
>アクティブじゃないシートにはアクティブなセルなど存在しない
これが確認できれば出来れば十分です。
0662デフォルトの名無しさん
2009/01/26(月) 16:18:41俺がちょっと前までそうだったから
0663デフォルトの名無しさん
2009/01/26(月) 19:12:35データをシステムから取り込んだエクセルファイルなんですが、
セル内の数値の先頭に半角スペースがついてしまいます。
たぶんこれが原因で、数値の大小がおかしくなります。
例えば
変数=20.222
if 変数>10.333 then
これで =falseとなるんですが何か対処法はないでしょうか。
セルをダブルクリックしてEnterで先頭のスペースは消えて数字扱いとなります。
セルの書式は未選択状態です。
ファイルがで手元にないので詳しいことはすいません。
0664デフォルトの名無しさん
2009/01/26(月) 19:51:29変数="20.222 "
if value(trim(変数)) > 10.333 then
0665664
2009/01/26(月) 19:58:01val(trim(変数))
0666デフォルトの名無しさん
2009/01/26(月) 20:58:54元のデータは変えちゃいけなくて、VBAでなんとかするなら上のレスのとおり。
修正してもいいんならシート全体を選択してコピー→そのまま貼り付けして、
黄色いびっくりマークをクリックして「数値に変換」
0667デフォルトの名無しさん
2009/01/26(月) 20:58:56乱数を生成させて、結果によって単純な算術演算を行うプログラムで統計を取っています。
会社のPCで結果が出るまでに2時間はざらなのですが、
会社のCPUがpen4 3Ghz
自宅のCPUがcore i7 940 2.93Ghz
単純なプログラムなので、劇的にはかわらないまでもすこしは早くなるかと思ったんですが、
逆に遅くなりました。
8コア中 1コアしか使用率があがらなかったので、単純にクロック数の問題だと思うのですが、
VBAで8コアフルに稼動させるようなソースは書けるんでしょうか?
しかし、前の乱数値の結果が次に影響するような演算なので、
追い越してなにかを処理しておくというのは意味なさそうです。
0668デフォルトの名無しさん
2009/01/26(月) 21:00:29csvでも取り込んでいるのかな? csvファイルの仕様がおかしいんで内科医?
0669デフォルトの名無しさん
2009/01/26(月) 21:04:13そりゃ無理だ。VBAが今後マルチスレッド化されたとしても、単純なプログラムでは1コアしか使いようがない。
まさかとは思うが、シートの更新を止めてないとか言わないよな。
0670667
2009/01/26(月) 21:10:32ですよね;−;
シートの更新は止めています。
シートへのアクセスも極力抑えて、演算に必要な数値はすべて配列で確保しています。
実行時間は単純に量の問題です、10億試行とかそういう回数なので…
0671デフォルトの名無しさん
2009/01/26(月) 21:11:180672デフォルトの名無しさん
2009/01/26(月) 21:14:15単純なcsvの読み込みなら、たとえ " 123 " みたいにダブルクォートで囲ってあっても
強制的に数値化されてしまうので逆に困るくらい。
0673デフォルトの名無しさん
2009/01/26(月) 21:17:18そんなに回数が多いならVBAじゃなくてもっと演算向きの言語にしなよ。
必要ならそいつをVBAで起動すればいいんだし。
0674デフォルトの名無しさん
2009/01/26(月) 21:18:21ありがとうございます。
明日試してみます。
0675デフォルトの名無しさん
2009/01/26(月) 21:23:5210億回程度のループならそんなに多いとは思わんけどな。
無駄に時間のかかるプログラムって、アルゴリズムやコーディングに問題があることが多いけど、
誰か詳しい人には相談した?
それから基本的なこととしては、Variant型の変数は使ってないよな?
あとは乱数の発生を別のプロセスにやらせてファイルにどんどん書き出していくとか、
そもそも数値計算にVBAを使うこと自体が疑問なので、全体をコンパイラで書き直すとか。
0676デフォルトの名無しさん
2009/01/26(月) 21:26:210677667
2009/01/26(月) 21:43:17すいません統計などと洒落たことを言ってしまいましたが、
プログラム自体はパチスロ機のシミュレータです。
自分ひとりでつかうならいいんですが、
プログラム知識0の人へのインターフェイスや出力、視覚化も兼ねているので…。
そして残念なことに、このシミュレータの作成は片手間でやらないといけないので、
うまいこと作り直す時間も知識もありません…。
同じ課でたまたまプログラムの知識があった私が任されています…
ので同じ課にはわかる人はいません…。
もちろん実機担当に質問はできますが、手一杯だとは思います…。
アルゴリズムはやりようがあると思いますがなるべく実機に近くなるようにしています。
実機はもちろん人の操作によって一連の流れになるので、
アルゴリズムも単純な上から下です。
実行時間は現状でそれなりに満足しています。
10億試行は最終的段階なので、普段は5分とかそういうレベルです。
ただ、環境(CPU)による違いがなかったので質問した次第です。
気遣いありがとうございました。
0678デフォルトの名無しさん
2009/01/26(月) 22:31:23自宅のCPUがcore i7 940 2.93Ghz
で逆に遅くなるってのは悲しいな
結局クロックが全てか
てか
実機担当って職業プログラマーが居る、その会社は何だろう
気になる
0679デフォルトの名無しさん
2009/01/26(月) 22:41:480680デフォルトの名無しさん
2009/01/26(月) 23:30:39うちは北森コアのPen4 3.4CGHzとi7 965(3.2GHz)を使ってるが
1スレッド処理でもi7の方が速いぞ
そもそもCPIもバス帯域もメモリコントロールも拡張命令も勝っているi7が
0.07GHz程度の実周波数の差程度でPen4に負けるのはおかしい
会社のPCがベースクロック3GHzの石を使ってOCしてるとかじゃなければ
君が自宅で使ってるi7のPCは、構成に問題有りで何処かに極端なボトルネックが
発生していると思われる
0681デフォルトの名無しさん
2009/01/26(月) 23:32:56EXCELシートにハイパーリンク貼って、そのシートをブラウザでプレビューすると
ブラウザにもハイパーリンクが表示されるけど
そのブラウザ上のリンクをクリックした時に
Private Sub Workbook_SheetFollowHyperlink
を起動することってやっぱ無理かな?
0682デフォルトの名無しさん
2009/01/26(月) 23:38:43自宅PCは省電力でクロックダウンしているんじゃないか?
0683デフォルトの名無しさん
2009/01/26(月) 23:59:12自分でHTMLとVBScript or JavaScriptでそういうコードを書けばできなくもないだろう。
つまり、VBAでは無理だ。
0684デフォルトの名無しさん
2009/01/27(火) 00:37:43「遅くなった」のが実は0.01秒程度の差だったとか
もし自作ならドライバがちゃんと入ってないとか
0685デフォルトの名無しさん
2009/01/27(火) 04:47:10よい方法はありませんでしょうか?
ネットのフォーラムなどの情報では、
ActiveSheet.Buttons(Application.Caller)
や
ActiveSheet.DrawingObjects(Application.Caller)
などでオブジェクトを取得できるとあるのですが、
プロパティがない、などと言われます。
代替手段はないものでしょうか?
環境:Excel2007
0686685
2009/01/27(火) 04:54:33どうしたらよいのだろうか
0687デフォルトの名無しさん
2009/01/27(火) 05:11:01押したボタンのクリックイベントに適当に書くのが普通じゃない?
0688デフォルトの名無しさん
2009/01/27(火) 05:23:04コマンドボタンには2種類あるでしょ。
挿入を選ぶとコントロール(部品)の一覧が出てきて
上段が「フォーム コントロール」、下段が「ActiveX コントロール」ってなってるやつ。
下段の方のボタン使ってる?
0689デフォルトの名無しさん
2009/01/27(火) 05:38:13「マクロの登録」で登録されたマクロはコマンドボタンのクリックで呼び出される
Sub test()
MsgBox ActiveSheet.Buttons(Application.Caller).Caption
End Sub
0690デフォルトの名無しさん
2009/01/27(火) 05:43:14マクロが登録できるのはフォームコントロールの方だぞ
0691デフォルトの名無しさん
2009/01/27(火) 06:11:34そもそもCommandbutton1のClickイベントで呼ばれるのはCommandbutton1_clickなんだから、
Private sub commandbutton1_click
Msgbox commadbutton1.caption
End sub
で、いいんじゃねーの?
クラスモジュール使って擬似コントロール配列にしてるとしても、どうにでもなんじゃん
アホなの?
0692デフォルトの名無しさん
2009/01/27(火) 07:45:56両方出来るぞ
0693685
2009/01/27(火) 10:53:06http://oshiete1.watch.impress.co.jp/qa4024188.html
ここの方法でいけましたが、もう少しスマートな方法がないかな?と。
>>687 >>691
10個あったら、10個分イベントと名前の組をかかないといけないですよね。
冗長性があります。
>>689
ActiveXの方では無理っぽいです・・・
>>688
ActiveXの方を使っています。
やりたいことはボタンのキャプションを取得することなので、
できるのであればフォームコントロールの方でもよいのですが・・・
0694685
2009/01/27(火) 10:57:08moug|即効テクニック | コマンドボタンのクリックイベント内でボタン名を取得するには
http://www.moug.net/tech/exvba/0150059.htm
0695デフォルトの名無しさん
2009/01/27(火) 16:07:220696デフォルトの名無しさん
2009/01/27(火) 16:13:46いんじゃね
0697デフォルトの名無しさん
2009/01/27(火) 16:19:400698デフォルトの名無しさん
2009/01/27(火) 20:14:57一つのプロシージャに1行ずつ書き足すのが冗長性があると言ってるってことは、
擬似コントロール配列を使ってクラスモジュールで処理してるとしか考えられない訳だから、
取りあえず今使ってるソース出せ
そしたら改良してやるから
0699デフォルトの名無しさん
2009/01/29(木) 09:07:22Msgboxに「月度を入力してください」と表示
→インプットboxに月(1〜12までの数字)を入力する画面を出して尚且つ、
1〜12以外の数字または文字を入力したら、「1〜12の数字を入力してください」
というエラーメッセージが出る→最後にまたMsgboxが出てきて「○月度ですね」と
表示するにはどう組めばいいでしょうか。
○には入力した月数を出したいのですがよろしくお願い致します。
0700デフォルトの名無しさん
2009/01/29(木) 09:08:34VB初心者スレへどうぞ。
0701デフォルトの名無しさん
2009/01/29(木) 11:00:04すみません、VBAの初心者スレは探しましたが無いみたいです。
どなたかお願い致します。
0702デフォルトの名無しさん
2009/01/29(木) 12:15:27流れは大体できてるように見えるのだが・・・
「インプットboxに入れられたものを数値にして1〜12だったら抜ける」ってことを
Do〜Loopを使って組めばいいだけ
0703デフォルトの名無しさん
2009/01/29(木) 14:29:53何個か開いたファイルの中から、特定のファイルを探す。
という単純な事がしたいのですが
ファイル名が例えば「経理ファイル200812.xls」のように、
月によってYYYYMMの部分が変わってしまいます。
開いたファイルの中から、ファイル名に「経理ファイル」が付いているファイルをアクティブにしたい場合
どのようにすればよいでしょうか。
ワイルドカードが使えないかと思ってやってみているのですが
よろしくお願いします。
0704デフォルトの名無しさん
2009/01/29(木) 15:01:32for each b in workbooks
if b.name like "経理ファイル*" then
b.activate
end if
next
0705デフォルトの名無しさん
2009/01/29(木) 15:53:30できました!!
ありがとうございました。
0706デフォルトの名無しさん
2009/01/29(木) 18:39:44h = 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行にしたい場合どのようにすればよいでしょうか
0707デフォルトの名無しさん
2009/01/29(木) 18:57:21最初に見つけた位置のhを保存しといてそこに入れていく
0708707
2009/01/29(木) 19:00:08「Deleteしたときはhをインクリメントしない」かな?
0709デフォルトの名無しさん
2009/01/29(木) 19:45:32ありがとうございます
0710デフォルトの名無しさん
2009/01/29(木) 23:41:33頭だけでなく眼が悪いんでしょうか。
VBA ( V B A ) のスレではなく、VB ( V B ) のスレへどうぞ。
0711デフォルトの名無しさん
2009/01/29(木) 23:59:42EXCEL2003
dteProductDay=format(date,゙yyyy/m/d゙)
cells(1,1)=dteProductDay
というように、システムの日付を整形してセルに表示させたいのですが、
フォーマット通りに表示されず1/29/2009となります。何が悪いのでしょうか。
0712デフォルトの名無しさん
2009/01/30(金) 00:09:19書式を変えるか、または文字列で
0713デフォルトの名無しさん
2009/01/30(金) 02:12:09的外れかも知れないが
表示するセル自体の書式を適切に設定しないとそうなる。
そのフォーマットだと、変数に代入された値は2009/1/29となるので
エクセルはこれを日付と認識し内部的に日付のシリアル値として値を保持するのでは。
たとえばdteProductDay=format(date,゙yyyy m d゙)
とするとセルには「2009 1 29」と表示される。
0714デフォルトの名無しさん
2009/01/30(金) 12:23:35Office2003
Shiftキーを押しながらドラッグでセルの移動ができますが、
Shiftキーを押さなくても常にセルを移動することはできますか。
もしくはExcel上でのみ、Windowsの固定キー機能のように
Shiftキーを押しっぱなしにすることはできないでしょうか。
キーボードでなら、たとえば上に移動したい場合
ActiveCellを取得して、真上のセルと置換していけばできそうなんですが。
07167777
2009/01/30(金) 22:31:30シート3のD列の3に自動記入させるマクロは分かるんだけど
シート1でF団体がA列の1以外になっても自動記入できるマクロある?
あるなら教えて
0717デフォルトの名無しさん
2009/01/30(金) 23:07:320718デフォルトの名無しさん
2009/01/30(金) 23:08:56Private Sub Worksheet_Change(ByVal Target As Range)
~~~~~~~
どこに書き込まれたかはTargetという変数に入ってる
07197777
2009/01/30(金) 23:13:26意味がわかりません
0720デフォルトの名無しさん
2009/01/30(金) 23:18:170721デフォルトの名無しさん
2009/01/30(金) 23:31:13みたいにセル名が固定ならわかるけど、コピー元のセルが不定の場合はどうするかって質問でしょ?
0722デフォルトの名無しさん
2009/01/30(金) 23:53:130724デフォルトの名無しさん
2009/01/31(土) 09:19:07A1とA2の両方に値がある場合はどちらを採用するの?
07257777
2009/01/31(土) 09:52:091月23日 団体名 内容
F団体
このときF団体がAの2列に書いてるけど
Aの2列にD団体を記入して
Aが3列になってもシート3のまとめシートには自動記入できるかなぁって
0726デフォルトの名無しさん
2009/01/31(土) 10:06:031対1対応ならなんの問題もないでしょう?
それから行と列を区別して書いてたほうが他人に伝わりやすいですよ。
ABCは列
123は行
07277777
2009/01/31(土) 10:42:31どうマクロ組むの?
0728デフォルトの名無しさん
2009/01/31(土) 11:15:45マクロ記録してみたら?
07297777
2009/01/31(土) 11:34:10ありがとうございました。
0730デフォルトの名無しさん
2009/01/31(土) 11:39:370731デフォルトの名無しさん
2009/01/31(土) 13:05:52VBAを使うやつは問題をミクロにとらえ過ぎている。
もっとマクロなレベルで考えるんだ。
コピー元とコピー先の対応がどうなっているかだけ理解したらできるかできないか判断できるだろ?
0732デフォルトの名無しさん
2009/01/31(土) 15:18:32そうでもない人、もしくはそういう発想をするのがヤな人がVBAを使うのだが、
VBAは最高級のBASICの一つで、これだけでも結構重量物
(VB.NETはこれは超ベテランが使う言語で、これからいきなり始めるのだ
けはやめたほうがいい)
VBAの入門に向いているのはExcelよりかAccessだね。Excelだと動作
は遅いはExcelと基本的に合わないわでロクなことないね。
07337777
2009/01/31(土) 15:24:34マクロ記録とは?
0734デフォルトの名無しさん
2009/01/31(土) 16:13:2807357777
2009/01/31(土) 17:09:510736デフォルトの名無しさん
2009/01/31(土) 17:10:34マクロの前に日本語を勉強した方が…
でも一応想像してみた
シート1
年月日 団体名 内容
1/23 F団体 陳情
1/26 D団体 年始挨拶
1/27 A団体 予算ヒア
みたいに日付ごとの日報が書いてあって
団体ごとに各シートに抽出したいんじゃないのか?
でもこれだったらわざわざ聞いてこないよな。
0737デフォルトの名無しさん
2009/01/31(土) 17:50:160738デフォルトの名無しさん
2009/01/31(土) 19:48:09最近クラスモジュールを勉強しているんですがプロパティの設定で
Letがうまくいきません。
WindowsXPSP3、Excel2003
クラスモジュール内容
Private m_TestValue As String
Public Property Get TestValue()
TestValue = m_TestValue
End Property
Public Property Let TestValue(ByVal New_Value As String)
m_TestValue = New_Value
End Property
で標準モジュールに
Public Sub Test()
Dim Test As Class1
Set Test = New Class1
Test.TestValue = "testtest"
MsgBox Test.TestValue
End Sub
として実行するとプロパティプロシージャの定義が一致していないというコンパイルエラーが出ます。
これはなぜでしょうか?
0739デフォルトの名無しさん
2009/01/31(土) 20:07:43もしくは
Public Property Let TestValue(ByVal New_Value As Variant)
Getの戻り値の型と、Letの最後の引数の型
つまり、ひとつのプロパティの型は一致させてください
0740デフォルトの名無しさん
2009/01/31(土) 21:01:13なるほど!Property Getの戻り値も型を指定する必要があるんですね。
m_TestValue変数の型を指定していてそれを返しているから
てっきりそれだけでいいと思ってた。
ありがとうございました。
0741デフォルトの名無しさん
2009/02/02(月) 00:36:34Private Sub Workbook_Open()
内で色々と処理をしているのですが、
ブックA内のハイパーリンクをクリックした時にブックBを表示させずにその後の処理を実行する方法はありませんか?
0742デフォルトの名無しさん
2009/02/02(月) 00:57:32今フォームを使ってデータの抽出をするプログラムを作っています。
データは階層構造になっています。
仮に3階層あるとして、フォームにその3階層をプルダウンで指定してやると条件に一致したデータが表示されるようにしたいのです。
その際、上位階層をプルダウンで指定すると、その上位階層が包含する下位階層のみが
プルダウンで表示されるようにしたいのですが、どうしたらいいのでしょうか。
フィルタオプションを使用しようと思うのですが、可能でしょうか?
困っています。教えてください。
0743デフォルトの名無しさん
2009/02/02(月) 01:47:00ブックAのシート1のA1にブックBのシート1のA1からA5を、足した結果をだしたい場合、どの様に入力すればよいですか?
どうかおしえてください。お願いします。
0744デフォルトの名無しさん
2009/02/02(月) 04:53:09ハイパーリンクでは、ブックを非表示で開くことは出来ない
ハイパーリンクをボタンとかに変えて、ブックAのVBAからブックBを非表示で開きましょう
因みにVBAからブックを非表示で開く方法は、幾らでも情報有るから自分で調べましょう>>1★5
>>742
入力規則のリストの連動ならまだしも、Excel用ではなく汎用ActiveXのコンボボックスの連動は
Excelに関係ない話なのでスレ違いです>>1★3〜★4
とりあえずVB6用の方法がほとんどそのまま使えるし、サンプルも転がってる
>>743
WorksheetFunction.Sum
中に入る式は、普通にシート上で入力する式と同じだから解るよな?
まあ解らなくてもスレ違いだから自分で調べろってことになるが
0745741
2009/02/02(月) 21:58:13741です。
お答えありがとうございます。
うーん、やはりハイパーリンクでは無理でしたか。
私の作った処理をもう少し詳しく言うと
ハイパーリンクをクリックするとそのセルがアクティブになることを利用して
ブックBのPrivate Sub Workbook_Open() の中で
Workbooks("B.xls").Worksheets(1).Cells(1, 1) = ActiveCell.Offset(0, 1)
みたいな感じでハイパーリンクの隣のセルの情報を転記するという処理を行っていたのですが。
例えばA1とA2のセルの上にセルと同じ大きさのボタンを作り、両方のボタンに同じマクロを登録して
A1の上に作ったボタンをクリックするとB1の情報を転記し、A2の上に作ったボタンをクリックするとB2の情報を転記する
という処理って作れますか?
ハイパーリンクみたいにクリックするとその下のセルがセレクトされるみたいな処理が作れればいいんですけど。
0746デフォルトの名無しさん
2009/02/03(火) 00:52:18作れるよ
ボタンに限らずオブジェクトには配置されてるセルアドレスを返すプロパティがあるから
それが何かくらいは自分で調べようね
0747デフォルトの名無しさん
2009/02/03(火) 07:39:03Private Sub
Select change
AddItem
0748741
2009/02/03(火) 23:43:31Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
というのを使うと目当てのセルをクリックしただけでマクロを起動できるようになったんですけど
エンターを何回か押していたらその目当てのセルまでアクティブが移動してしまって望まないタイミングでマクロが起動されてしまいます。
そうではなくあくまでクリックした時にマクロが起動できるようにしたいんですけど、いい方法ありませんか?
0749デフォルトの名無しさん
2009/02/04(水) 00:04:20WorkSheetにはクリックイベントがないから、
セルに同じサイズのボタンを貼り付けるぐらいしかないんじゃ
0750デフォルトの名無しさん
2009/02/04(水) 00:38:21Workbook_SheetBeforeRightClickっていうのも有るし、シート名を取得して実行すれば良いのでは?
0751デフォルトの名無しさん
2009/02/04(水) 01:35:00普通「クリック」と言えば左シングルクリックのことだろう。
右クリックやダブルクリックイベントでどうしろと。
0752デフォルトの名無しさん
2009/02/04(水) 02:43:54セルをクリックで処理したいって言ってるのに
ボタンクリックでどうしろと
ってことになるな。
俺は>>749も>>750も代用法のひとつとして有用な情報だと思うけどね。
>>749も書いてるが「セル」の「左(シングル)クリック」イベントは無いから、
対象が「セル」であること(ボタンなどを配置しなくても済むこと)を優先するなら>>750
「左シングルクリック」で操作できること(ダブルクリックしなくて済むこと)を優先するなら>>749
ってことでいいじゃん。
俺の場合、目当てのセルが複数ならダブルクリックイベントで、ひとつならボタンで妥協するかな。
0753デフォルトの名無しさん
2009/02/04(水) 02:55:30下のセルが見えなくなっちゃうんだな。XPと2003の環境で。
代用案として出すなら、イメージコントロールを貼り付けて透明なGIFを貼った方がよさそう。
0754デフォルトの名無しさん
2009/02/04(水) 16:22:39つラベル
0755デフォルトの名無しさん
2009/02/04(水) 20:43:070756デフォルトの名無しさん
2009/02/04(水) 20:48:340757741
2009/02/04(水) 20:59:06皆さん色々とありがとうございました。
とりあえずボタンでやってみようと思いますが、
745でも言ってるように複数張ったボタンの内一つを押した後それに応じたセルを指定する方法が
いまだにわからない状態です。
とりあえずもうちょい調べてみます。
0758デフォルトの名無しさん
2009/02/04(水) 21:05:26VBAにはコントロール配列が存在しないから、
ボタンをたくさん貼ればボタンの数だけ独立したイベントハンドラが作られる。
だから、ボタンごとに各セルの処理をずらずらっと並べて書けばいい。
冗長だし面倒だけど。
さもなくば、ボタンの座標とセルの座標を比較して、重なった位置のセルを探し出すとか。
0759デフォルトの名無しさん
2009/02/04(水) 21:30:54クラスの作り方工夫すれば、疑似コントロール配列にした上で
処理は同じだが対象は違うというようにも出来るし、
そもそもボタンがどのセル上に配置されてるかは取得できるし
0760デフォルトの名無しさん
2009/02/04(水) 21:53:42Sheets("sheet1").Select
Dim MyRange As Range
Set MyRange = Columns("A").Find(What:=Sheets("Sheet2").Range("A1"))
いくらやっても検索値がnothingになってしまいます
どこを変えればうまく検索できますか
0761デフォルトの名無しさん
2009/02/04(水) 22:03:34Sheets("sheet1")のA列に存在しないとnothingになるけど
0762デフォルトの名無しさん
2009/02/04(水) 22:28:03別にどこも間違ってないから、原因として考えられるのは、本当に探してるデータが存在しないか、検索条件が違ってるか、だな。
それでもうまくいかない時は、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)
0763デフォルトの名無しさん
2009/02/04(水) 23:33:130764デフォルトの名無しさん
2009/02/05(木) 00:03:24Dim v(1 To 10) As Long
とするのと
Dim a(1& To 10&) As Long
とするのはどっちがいいですか?
0765764
2009/02/05(木) 00:05:42vとaとなりましたが、どっちもvです。
0766デフォルトの名無しさん
2009/02/05(木) 00:08:28シートモジュールに書いてるかも知らんしな。
ちゃんとシートくらいは指定汁.
0767デフォルトの名無しさん
2009/02/05(木) 00:09:34この場合、配列のサイズはコンパイラが解釈するので型指定は意味がないと思う
0769デフォルトの名無しさん
2009/02/05(木) 11:43:29仮に「A」というファイルがあったとして「A」のVBAから、
別のファイル「B」の「ActiveX コントールのコンボボックス」の値を参照することは可能でしょうか?
0770デフォルトの名無しさん
2009/02/05(木) 15:25:43sheet2のAAAという文字列がBBBに置換されません
sheet2ではなく、sheet1のAAAが置換されます
Worksheets("Sheet2").Select
Cells.Replace What:="AAA", Replacement:="BBB", MatchByte:=False
0771デフォルトの名無しさん
2009/02/05(木) 15:31:171行ごと(処理ごと)にいちいち対象となるシートを書かないとActiveSheetが処理される。
Worksheets("Sheet2").Cells.Replace What:="AAA", Replacement:="BBB", MatchByte:=False
または、
Worksheets("Sheet2").Select
Selection.Cells.Replace What:="AAA", Replacement:="BBB", MatchByte:=False
みたいな感じにしなきゃいけない。
確認してないからオブジェクトのエラーが出るかもしれないけど、基本的な考え方としてはこんなところ。
0772デフォルトの名無しさん
2009/02/05(木) 15:33:20可能です
0774デフォルトの名無しさん
2009/02/05(木) 19:10:09印刷はフォームのPrintFormメソッドを使っています。
コマンドボタン・ラベル・テキストボックス・コンボボックス等は印刷されるのですが
WEBブラウザが配置されているところは空白になってしまいます。
検索してみたところAPIを使用する方法を見つけたのですが理解することができませんでした。
APIはブラウザ表示内容を画像として取得する方法だったのですが
それをイメージコントロールに貼り付けるという流れになるのでしょうか?
よろしくお願いします。
0775デフォルトの名無しさん
2009/02/06(金) 03:46:41>>1★5の通り、ここはヒントだけで自分でコード書ける人用のスレなので例文は書きません
とりあえずヒントとしてBのブックオブジェクトさえ作ってしまえば、あとはBから取得するのと変わらないと言っておく
>>774
>>1★3,4
Excelと直接関係ない汎用コントロールの話はスレ違いです
0776デフォルトの名無しさん
2009/02/06(金) 10:08:58誰かが勝手に書いて、次スレ立てるときにコピペしてるだけ。
気に入らない発言はスルーしろよ。
0777デフォルトの名無しさん
2009/02/06(金) 10:34:26だから標準モジュールじゃなくシートモジュールに書いてるんだろ?
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も同じ間違いだ・
0778デフォルトの名無しさん
2009/02/06(金) 10:37:42>>777の3行目は
Sheet1のシートモジュールに書いてればCellsの親はSheet1なんだよ。
に訂正。
>>771も嘘書いちゃいかん。
ActiveSheetが処理されるとは限らないんだよ。
0779デフォルトの名無しさん
2009/02/06(金) 10:42:36気に入らない発言はスルーしろよ。
0780デフォルトの名無しさん
2009/02/06(金) 10:42:54「A」「1」「2」「3」というファイル名のExcelワークシートが4つあります
ファイル「A」のcell(P1:DY1850)の数式をコピーし「1」「2」「3」のcell(P1:DY1850)に自動的に貼り付けていきたいのですが
どのようにすればいいのでしょうか?
よろしくおねがいします
0781デフォルトの名無しさん
2009/02/06(金) 10:43:52これ言っとかないと、>>1を理由にスレ違い認定したがる奴が増えるかもしれんからな。
0782デフォルトの名無しさん
2009/02/06(金) 10:48:13まずマクロの記録をやってみろ
0783デフォルトの名無しさん
2009/02/06(金) 11:41:22気に入らないなら無視すれ。
0784デフォルトの名無しさん
2009/02/06(金) 12:32:05指摘が>>1★n形式か、毎回文章で書かれるかの違いでしかないんだけどね
反抗期の子って、対象が形(テンプレ)になると妙に反発心燃やしたりするけど
そもそもテンプレったって、書いてあることを端的に見れば
「バージョン情報書け(★1)」「他分野の話を持ち込むな(★2〜4)」「丸投げするな(★5)」「マクロの記録くらい試せ(★6)」
だけ
これに反発してる子って、バージョン情報不要だと思ってるの?
COMやOCXやWin32APIの話から、VB言語で組める全てのアルゴリズムの話までオールOK?
そして丸投げも大歓迎で、マクロの記録なんて試すくらいなら、俺が親切丁寧にコード書いちゃるってか?
実のところはそんなこと無いだろ?
結局形有る物に反発したい年頃なだけで、根底は>>1の内容に賛同してるんだろ?
上記3つともOKなら、「>>1は絶対のルールじゃない」とか「気に入らないなら無視しろ」とか
みみっちいこと書くのではなく、それこそ「気に入らない"スレ違い指摘"は無視」して、ちゃっちゃと答えちゃえば
スレ違い指摘の意味すら無くせるので一番効果的なはずなのに、それをしないのが何よりの証拠
と、暇なので長々と書いてみたが、「気に入らないなら無視すれ。」
言ってる本人が出来なかったら恥ずかしいからなw
0785769
2009/02/06(金) 13:13:03ブックオブジェクトを作るとのことだったので、
a.xlsに下記のように記述し実行してみたのですがエラーになってしまいました。
アドバイスを頂けないでしょうか。
Workbooks.Open Filename:="c:\b.xls"
Workbooks("b.xls").Activate
MsgBox Application.Workbooks("b.xls").ComboBox1.Value ←ここでエラーになります。
0786デフォルトの名無しさん
2009/02/06(金) 13:15:27落ち着けよ
0787デフォルトの名無しさん
2009/02/06(金) 13:17:16つまり、俺様はスレ違い認定する権利があってそれをするのだが、お前はそれに口出すな、ってことですね。
0788デフォルトの名無しさん
2009/02/06(金) 13:20:36とりあえず落ち着け
0789デフォルトの名無しさん
2009/02/06(金) 13:31:10コントロールの前にシートを指定していないせいだ
0790デフォルトの名無しさん
2009/02/06(金) 13:34:510791デフォルトの名無しさん
2009/02/06(金) 13:47:00別に口出ししてもいいよ
ただ、本当に>>1が気に入らないなら、スレ違い指摘してる奴に
ムキになって食い付くより、そんなの無視して答えちゃえばいいじゃんと
口出すなと言ってるのは>>776他
>>790
もちろん俺も使ってるよ
というか、改めて言うまでもなく解るように書いたんだがw
0792デフォルトの名無しさん
2009/02/06(金) 13:50:410793デフォルトの名無しさん
2009/02/06(金) 13:55:11精神的安定を図るのが吉です
0794769
2009/02/06(金) 13:59:58MsgBox Application.Workbooks("b.xls").Sheets("Sheet1").ComboBox1.Value
0795デフォルトの名無しさん
2009/02/06(金) 14:13:36丸投げ上等でスパっとコード書いちゃえばいいのに、何故それをしないんだろう?
結局は何かに反抗してみたい年頃なだけで、心底>>1を否定してるわけではないんだよな
0796デフォルトの名無しさん
2009/02/06(金) 14:26:17別にいきなり答えを書いちゃってもいいし、
それだと同じ人が何度も質問してきてウザく感じたりスレが荒れたりする可能性があるから、
できるだけ自分で考えるように誘導してやった方がいいと考える人もいる。
進行中の質問に別の回答者が割り込んで、いきなり答えだけを書いても何も問題はない。
0797デフォルトの名無しさん
2009/02/06(金) 14:54:01まじめにVBAの勉強をしてるかもしれない
0798デフォルトの名無しさん
2009/02/06(金) 20:38:01いや、俺は否定してるけど何か?
0799Excel2003,XP home sp2
2009/02/06(金) 20:42:54隠しシートに読み込んだCSVファイルの中身を出力しようとしているんですが元のシートのほうに出力されてしまいます。
シート参照のが仕方マズイのでしょうかヒントをください
0800デフォルトの名無しさん
2009/02/06(金) 20:50:52・「元シート」とは何だ?
・「シートの参照」とは具体的に?
0801デフォルトの名無しさん
2009/02/06(金) 20:51:26・どこに出力しようとしてるのか書け
0802Excel2003,XP home sp2
2009/02/06(金) 20:51:330803デフォルトの名無しさん
2009/02/06(金) 20:54:380804Excel2003,XP home sp2
2009/02/06(金) 20:56:24やってみますありがとうございます
0805デフォルトの名無しさん
2009/02/06(金) 22:36:38落ち着いてExcelにFlash張りつけろ。
0806デフォルトの名無しさん
2009/02/07(土) 00:03:53Flashってなぁに??
聞いたことあるけど、、実際どおいうことができちゃうの?
0807デフォルトの名無しさん
2009/02/07(土) 00:05:040808デフォルトの名無しさん
2009/02/07(土) 00:30:12カスは>>799
まんま>>777
ちょっとぐらいは過去レス嫁と小一時間(ry
0809デフォルトの名無しさん
2009/02/07(土) 00:53:38大抵は類似情報なんかないのである。
0810デフォルトの名無しさん
2009/02/07(土) 01:21:59大抵のまともな人間はまず自力で何とかしようとするモンだ
それでも行き詰った場合に質問をするのがまともな人間の行動
だからお前みたいなヤツは、まともじゃない平均以下の存在価値の無い人間
0811デフォルトの名無しさん
2009/02/07(土) 01:26:40質問する奴がいなくなっちゃうね。
このスレもういらないや。
0812デフォルトの名無しさん
2009/02/07(土) 01:27:560813デフォルトの名無しさん
2009/02/07(土) 01:29:47>>808
はツンデレだけどちゃんと教えてあげてる優しい人
そして
質問した>>799は学習して次は現スレくらいは読むだろう
0814デフォルトの名無しさん
2009/02/07(土) 01:34:410816デフォルトの名無しさん
2009/02/07(土) 01:44:110817デフォルトの名無しさん
2009/02/07(土) 01:54:39おばはんですが何か?
0818デフォルトの名無しさん
2009/02/07(土) 10:19:160819デフォルトの名無しさん
2009/02/07(土) 12:27:120820デフォルトの名無しさん
2009/02/07(土) 21:36:240821デフォルトの名無しさん
2009/02/08(日) 12:26:13具体的には、For Each In でコレクション内を回って、Key値がある値だった場合だけ、処理を実行させる
というコードを作りたいのですが
0822デフォルトの名無しさん
2009/02/08(日) 15:42:15Collectionでやりたいなら
' 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
0823デフォルトの名無しさん
2009/02/08(日) 20:42:26エンターキーを押すごとにマクロを起動させることってできませんか?
0824823
2009/02/08(日) 20:43:220825デフォルトの名無しさん
2009/02/08(日) 20:54:06おおクラスモジュールとかオブジェクト指向とかってやつですか・・・
やはりそういうのも覚えていかないと駄目ですね
ただ今回は隠しシートを使って済ませることにしました
回答ありがとうございました
0826デフォルトの名無しさん
2009/02/08(日) 23:38:45Excel2000
VB6.0です
ユーザフォームでツールボックスから「ピクチャボックスコントロール」と
いう物を貼り付けたいのですが、ツールボックスに入っておらず、
方法がわかりません。
コントロールを追加しようとしたのですがそれらしいのが見当たらず。
ググってもピクチャボックスが選択できる事が前提のようなので
探すことができませんでした。
どうすれば表示されるのか教えていただけませんか?
0827デフォルトの名無しさん
2009/02/09(月) 08:45:49きっと誤爆だな
0828デフォルトの名無しさん
2009/02/09(月) 09:02:10ピクチャボックスを使いたいってことなのでは?
しかしVB6使ってる人なら、こんなの簡単に解るはずなんだがな
因みにVB6持って無くて、ランタイムだけ入れてるとかは無しね
それじゃダメだから
0829デフォルトの名無しさん
2009/02/09(月) 12:12:54キーボードやマウスを使ったイベントはAPI使わないと無理
0830デフォルトの名無しさん
2009/02/09(月) 20:41:23sub aaa()
msgbox bbb '←aaaと表示したい
end sub
よろしくお願いします。
0831デフォルトの名無しさん
2009/02/09(月) 20:56:33>>1★3,4
0832デフォルトの名無しさん
2009/02/10(火) 00:30:35実行しているsub名を取得することはできないけど、次のようなことをするのは可能。
sub aaa()
msgbox "placeholder"
end sub
というコードを
sub aaa()
msgbox "aaa"
end sub
というコードに書き換えるようなこと。
ところで、何でそれ知りたいの?
0833デフォルトの名無しさん
2009/02/10(火) 00:39:590834デフォルトの名無しさん
2009/02/10(火) 00:46:13たしかに。
そういうの思い付く人と思い付かない人って
何が違うだろね
0835デフォルトの名無しさん
2009/02/10(火) 00:51:12msgboxは質問時の方便で常時表示させたいんじゃないのか
今何の関数に飛んでますとか
0836デフォルトの名無しさん
2009/02/10(火) 00:57:130837デフォルトの名無しさん
2009/02/10(火) 01:30:14特定のフォルダの中に、テスト.xls、テスト1.xls、テスト1000.xls、という3つのEXCELがあるとして
killを使ってテスト.xls以外のブックをすべて削除する処理を作りたいと思っています。
kazu = "*"
Kill "\\フォルダ\テスト" & kazu & ".xls"
だとフォルダ内の3つはすべて消してしまうんですよね。
「テスト」の後に何もつかないブックだけを消さずに残すにはどうしたらいいでしょう?
0838デフォルトの名無しさん
2009/02/10(火) 02:03:560839デフォルトの名無しさん
2009/02/10(火) 04:24:49ランダムにしたいのですがどうすればいいでしょうか?
わかる方よろしくお願しますm(__)m
0840デフォルトの名無しさん
2009/02/10(火) 04:29:13こんな感じかな
A列のランダムな位置に文字を入れる
乱数 = Int(Rnd(1) * 65536) + 1
セル = "A" & 乱数
Range(セル) = "文字"
0841デフォルトの名無しさん
2009/02/10(火) 04:31:480842デフォルトの名無しさん
2009/02/10(火) 04:40:29できました〜。 ホント感謝です(^−^)
0843デフォルトの名無しさん
2009/02/10(火) 20:09:04excel2000VBAで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
どのように直すとよいのでしょうか?よろしくお願いします
0844843
2009/02/10(火) 20:12:44For Each を使わずに走らせると、正常に動作する(兵庫県神戸市長田区イカニケイサイガナイバアイ)
と表示されるため、SQL文やデータベースを開くことに失敗している可能性は低いです
0845デフォルトの名無しさん
2009/02/10(火) 20:18:39まずForの直前でDebug.Print TypeName(dbRes.Field)ってやって、
Fieldメソッドがコレクションを返してるかどうか確認汁。
0846デフォルトの名無しさん
2009/02/10(火) 20:21:47よく見たらこの2行が矛盾してる。
Set dbFld = dbRes.Fields
For Each dbFld In dbRes.Fields
setの行を削除してみ。
0847デフォルトの名無しさん
2009/02/10(火) 20:40:56×Dim dbFld As ADODB.Fields
○Dim dbFld As ADODB.Field
じゃね?
Set dbFld = dbRes.Fieldsは無しで。
しかし、
Do Until dbRes.EOF
...
dbRes.MoveNext
Loop
で回す部分が無いし、
出力先が全部Sheet1.Cells(1, i) ってのもおかしかろ?
0848デフォルトの名無しさん
2009/02/10(火) 22:06:52先々で弊害とか出ます?
0849デフォルトの名無しさん
2009/02/10(火) 22:19:30昔はちょっとでもメモリを節約するために、用途に合わせて配列の範囲を削ってた。
VBAなら配列の範囲は自由に決められるからあんまり意味はないと思う。
盲腸みたいなもんだな。
0850830
2009/02/10(火) 22:23:28皆さんが仰る通り、現在はsub名をコピペして、文字列として組み込んでおります。
なぜこの様な事をしているかと言いますと、
論理チェックのプログラム集合体を作成しています。(500個くらい)
現在、チェックのリストに振ってあるナンバーをsub名としております。
論理エラーがプログラムで検出された場合、sub名=チェックナンバー とエラーの内容を吐き出し、
チェックナンバーを主キーとして、リストからエラーメッセージを取得しています。
チェックナンバーをコピペして出力するのは問題無く出来ているのですが、
sub名を取得出来れば、コピペのミスが減ると思い、質問させていただきました。
0851デフォルトの名無しさん
2009/02/10(火) 22:44:46ExcelのVBAではモジュール名を取得する方法はない。
すでに書かれているように、スクリプトを使ってSubの直後にグローバル変数をセットするように
ソースを書き換えるのが、一番間違いが起こりにくいと思う。
0852デフォルトの名無しさん
2009/02/10(火) 22:47:18エラー内容とチェック関数が1:nやn:1の関係になったりしてない?
仮に1:1の関係だというのなら、チェック関数内に文字列を直接書いといた方がいいとも思う。
(関数名=エラーコードからエラー文字列が正しく対応しているかどうかのチェックが面倒なので)
それはともかく、コピペに勝る方法はまずないのだから、今回有効な手段としては、
後からチェックするコードを書くくらいかな。
0853デフォルトの名無しさん
2009/02/10(火) 22:49:510854830
2009/02/10(火) 23:15:07ExcelVBAで出来ないと言う事が分かったので、大きな収穫でした。
ダミーデータでエラーを出力した結果に対して目視チェックをする際、
1:1でエラーメッセージが取得出来ているかに重きを置く方向で調整したいと思います。
本当にありがとうございました。
0855デフォルトの名無しさん
2009/02/10(火) 23:16:14http://support.microsoft.com/kb/410621/ja
使い方しらないけど、なんとなく近そうな道具
0856デフォルトの名無しさん
2009/02/10(火) 23:36:01それ、行番号さえ指定すればプロシージャ名は取得できるけど、
自分自身が何行目に書いてあるかってのは結局わからないのよ。
0857843
2009/02/10(火) 23:36:52>>846
>>847
動きました!いろいろアドバイス頂き、本当にありがとうございました
>>847
ああ・・・エラーの理由がわからないのでできるだけシンプルにしたかったのと
改行制限に引っかかったのでいろいろ削ってたのでこうなってしまいました。
すいませんでした
0858デフォルトの名無しさん
2009/02/10(火) 23:59:30マクロでコードを書き換えるとか、コードをマクロでチェックする系のレスは全部それ使うんだよ。
0859デフォルトの名無しさん
2009/02/11(水) 00:13:55まだおもちゃ程度にしかVBAいじれないんですが
On Error〜がらみは古いかもと思って避けてたんですよ
でもワークシート関数使うときにシート上で使うときはエラー処理が面倒なのに
VBA上だとOn Error〜で簡単にできるのに最近気付いてですね
こんな使い方はどこかに落とし穴があるんじゃあと気になるのと
ここで回答者されてる皆様のOn Error〜への視線ってどんなものかと思いまして
漠然とした質問すいません
0860デフォルトの名無しさん
2009/02/11(水) 00:30:21エラー内容をユーザーにフィードバックする。
ちょっとしたマクロ程度ならOn Errorで十分。てか面倒。
0861デフォルトの名無しさん
2009/02/11(水) 00:40:07関数を呼ぶ前にちゃんと変数の値をチェックするとか、最初からエラーが出ないように作ってるから。
0862デフォルトの名無しさん
2009/02/11(水) 00:44:27えーと飯食わせてもらう作業のなかで利用しつつあるって感じなんですが
ちょっとしたマクロ程度でもあるし「使うな」って程でもないならちょっと安心です
ありがとうございます
0863デフォルトの名無しさん
2009/02/11(水) 00:48:34業務効率化のためのマクロ使用なら
とにかく目的が達成できればいいんだから早く作れるほうがよい。
0864デフォルトの名無しさん
2009/02/11(水) 00:54:33あっやっぱりプロの方はそうですか・・・
ちょっと前まではVBAなしでワークシート上でやってたんですが
その時も確かにエラーが出ないように工夫はしてたんです
でも例えばFor〜Nextで回す時とか「結果がエラーになるときは飛ばす」って
ワークシート上でやってた時を思うとすごく斬新に思えてですね
もし初心者の私に気付いてない「ありがちな間違い」があればと思ってここにきました
0865デフォルトの名無しさん
2009/02/11(水) 01:00:25ですよねー
今のところ私のどんくささのせいでマクロ作るのも時間かかるし作らなくても時間かかるし(涙)
0866デフォルトの名無しさん
2009/02/11(水) 01:00:51VBAに限って言えばエラー処理が貧弱だから事前にチェックする方が結果的にコードがすっきり書けることが多い。
0867デフォルトの名無しさん
2009/02/11(水) 09:02:47いや、完全にデバッグしてから納品するのが当然なのは分かってる・・・。
分かってはいるんだが、ごく希に納品後にデバッグも止む無し、ってケースが・・・。
とりあえず動けば良い。とにかく早く、今日中に!! みたいな場合には。
0868デフォルトの名無しさん
2009/02/11(水) 10:56:140869デフォルトの名無しさん
2009/02/11(水) 11:29:330870デフォルトの名無しさん
2009/02/11(水) 13:05:13ネットワークを介した共有フォルダorファイル?
ネットのURLの有効性?
TMネットワーク?
0871デフォルトの名無しさん
2009/02/11(水) 13:36:15on errorは便利だよ。
カーソル砂時計になりっぱなしとか避けられるから。
0872デフォルトの名無しさん
2009/02/11(水) 14:31:26騙されるな。
本当にエラーが出ないほどチェックしてから関数を呼び出すなら、
チェックの部分が無防備なわけないだろ。
0873デフォルトの名無しさん
2009/02/11(水) 14:32:30インラインで処理するのと、何でもエラーを読み飛ばすのとは違うだろ。
0874デフォルトの名無しさん
2009/02/11(水) 14:41:12原理的にはエラーが発生する可能性はある。
if dir("hogehoge") <> "" then
'ここでもうファイルが無い可能性がある
end if
0875デフォルトの名無しさん
2009/02/11(水) 15:03:16それでも出るのがエラーなのだよ。
0876859
2009/02/11(水) 20:39:36人様に売るものでもないんでマクロに産毛が生えたくらいのものしかつくってないんですが
ワークシート上で関数で処理するときはエラーになる時はそのセルを参照するときも意識してないといけないですよね
VBAでワークシート関数使ってから入力するならOn Errorですっ飛ばせば逆に綺麗に計算できるなと思ったんです
エラーになるかどうかの計算をさせる部分が省略できるから返って負荷軽減にはいいかもと勝手に思ってですね
あくまでワークシート関数使うときに限る話なんで皆さんのように複雑なプログラム組んでるときには
当て嵌まらないケースが多いんだと思います
それでもここまで読んでいて参考になりました
0877デフォルトの名無しさん
2009/02/12(木) 00:25:55「firefoxで或るURLを開く」をvbaはどう書くの
0878デフォルトの名無しさん
2009/02/12(木) 01:13:310879デフォルトの名無しさん
2009/02/12(木) 13:33:52>>874?
0880デフォルトの名無しさん
2009/02/12(木) 17:23:16URLのシェルへの渡し方がわからないので、聞いているんだが。
0881デフォルトの名無しさん
2009/02/12(木) 18:07:32firefoxの使い方とか、スレ違いだろ。
普通に。
コマンドラインからやるようにやればいいだろ。
"C:\Program Files\Mozilla Firefox\firefox.exe" www.yahoo.co.jp
とか。
0882デフォルトの名無しさん
2009/02/12(木) 18:31:56REM 「firefoxで或るURLを開く」
0883880
2009/02/12(木) 19:53:36もちろん、VBAの書き方の問題として、"""あたりのことが、気になっていたもので。
大変、参考になりました。所期の目的を達成することが出来ます。サンクス。
いままで、IEでやっていたのをfirefoxでやるにあたって、より難しいとの思い込みが
邪魔してましたw
0884デフォルトの名無しさん
2009/02/12(木) 20:33:350885デフォルトの名無しさん
2009/02/12(木) 20:44:56標準モジュールで
Public Check As Boolean
Public Sub hoge()
Check = False
Load Form1: Form1.Show
として、
ユーザーフォームで
Private Button1_Click()
If TextBox1.Text = "" Then
TextBox1.SetFocus
Else
Check = True ←※
Me.Hide
End If
End Sub
というコードなんですけど、
デバッグで※の所をちゃんと通っているのに、
標準モジュールに戻ってくると値がFalseになってるんですが
これは何故でしょうか?
0886デフォルトの名無しさん
2009/02/12(木) 21:12:24標準モジュールでDimで2重に宣言してました・・・
スレ汚しスミマセン
0887デフォルトの名無しさん
2009/02/13(金) 01:06:50自分で考えるより他人に聞いたほうが早いと、、、
0888デフォルトの名無しさん
2009/02/13(金) 18:21:30脳が疑問点を俯瞰するというか。
0889デフォルトの名無しさん
2009/02/13(金) 19:33:48書き込みボタン押す前に
やめて欲しい
0890デフォルトの名無しさん
2009/02/13(金) 20:00:55脳のどこかが切り替わるんだろうな。
例えば誰かに質問するために電話をかけて、
つながった瞬間解決するとか、誰でも経験あると思うんだけどなあ。
0891デフォルトの名無しさん
2009/02/13(金) 20:58:220892デフォルトの名無しさん
2009/02/13(金) 21:05:19うぜー
0893デフォルトの名無しさん
2009/02/13(金) 21:25:130894デフォルトの名無しさん
2009/02/14(土) 06:55:41一定時間経過したが、何も操作が無かったら、エクセル自体を閉じるコードを考えてます。
これって可能です?
ちなみに、エクセル2003です。
VBAは、ある程度使えます。
0895デフォルトの名無しさん
2009/02/14(土) 08:55:09Excelに標準で用意されてる関数だけでは無理
APIを使えば可能
0896デフォルトの名無しさん
2009/02/14(土) 11:06:14それは、手に余ってしまいます。
素直に、作業ブックを閉じるようにします。
ありがとうございました!
0897デフォルトの名無しさん
2009/02/14(土) 18:09:38for nextの例で下記コードをためしにやってみたところ
変数が定義されていないとエラーがでます。
例と変わらずに打ち込んでいるのになぜエラーが出るのか教えてもらえないでしょうか?
Sub ループ()
For Cnt = 1 To 10
MsgBox ("こんにちは")
Next Cnt
End Sub
Cntがカウンタ変数って事でよさそうなんですが。
0898デフォルトの名無しさん
2009/02/14(土) 18:14:23Cntが宣言されてないんでしょ。
option explicit外すか、dim cntで宣言すれば良いんじゃない?
0899デフォルトの名無しさん
2009/02/14(土) 18:14:57Dim Cnt As Integer
を追加してみたところうまく動作しました。
何度みなおしても本には>>897のコードだけで動くように書いてあるのですが。。
ちなみにEXCEL VBAのコツが面白いほどよくわかるって本です。
0900デフォルトの名無しさん
2009/02/14(土) 18:17:39ありがとうございます。
option explicitってオプションで「変数の宣言を強制する」って奴と関係してるものですかね?
ちょっと調べてみますが、この設定のせいだったんですね。
別の本だと「変数の宣言を〜」って設定を推奨してたので
チェックしてました。
0901デフォルトの名無しさん
2009/02/14(土) 18:19:300902デフォルトの名無しさん
2009/02/14(土) 19:17:07ついでに、きちんと型の概念を持っておくと良いよ。
ただのお遊びマクロで終わるか、仕事で使えるプログラムになるかはそこが大きい。
型を理解してない奴は、ほぼ100%お遊びマクロ。
0903デフォルトの名無しさん
2009/02/14(土) 19:21:320904名無しという名無し
2009/02/14(土) 19:21:39ExcelってXLSのことなんですか?
だとしたらここで質問したいんですけど
間違ってたらいってください
今、Excel viewer2003で
XLSのファイルを見ようとしてるんですけど
「コマンドラインオプションの構文エラーです
Command /?を入力するとヘルプが表示できます」
とか出てきて訳わかんないんですけど詳しい人がいたら教えてください。
お願いします。
(一応、ググって見ましたが、僕の見る限りなかったと思います)
0905名無しという名無し
2009/02/14(土) 19:24:16書くとこミスりました
すいませんがスルーでお願いします
本当にすいませんでした
0906デフォルトの名無しさん
2009/02/14(土) 21:22:21Sub 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")」が無いと正しく動作しないのでしょうか?
0907デフォルトの名無しさん
2009/02/14(土) 21:26:410908デフォルトの名無しさん
2009/02/14(土) 21:29:020909デフォルトの名無しさん
2009/02/14(土) 21:55:56Offset()もRange()もRange型オブジェクトを返す。両者の違いは、
Offset()はマイナスを指定できる。相対指定しかできない。1つのセルしか指定できない。
Range()はマイナス(左、または上)を指定できない。相対指定も絶対指定も可能。複数セルからなる領域を指すことが可能。
両者を組み合わせればあらゆる矩形領域を相対的に示すことが出来る。
この場合に限って言えば、Range("A1")は単なる無駄。
わざわざ無駄な式を書くには理由があるはず。あとで別の例題で書き換えて使うんでねーの?
0910デフォルトの名無しさん
2009/02/14(土) 22:23:260911デフォルトの名無しさん
2009/02/14(土) 22:29:07なるほど!
調べたけど分からなかったことが分かりました!
ありがとうございます!
0912デフォルトの名無しさん
2009/02/14(土) 22:50:200913デフォルトの名無しさん
2009/02/14(土) 22:59:06=Sheet1!$O$3:$T$3,Sheet1!$O$5:$T$269
をマクロで実行するためにはどうすればいいですか?
myC = Range("L2")
ActiveChart.SetSourceData Source:=Sheets("Sheet1")
.Range("$O$3:$T$3", "$O$5:$T$ & myC")
, PlotBy:= _ xlColumns
で動きません。
よろしくお願いします。
0914デフォルトの名無しさん
2009/02/14(土) 23:12:300915デフォルトの名無しさん
2009/02/15(日) 01:10:16vbRed
vbBlue
vbGreen
vbYellow
vbPink
敵か味方か、謎の戦士
vbBlack
0916デフォルトの名無しさん
2009/02/15(日) 22:38:43Worksheets.Select
For 行番号 = 2 To 10
.Cells(行番号, 列合計).Value = _
.Cells(行番号, 列数量).Value * Cells(行番号, 列単価).Value
Next 行番号
と書くと「.cellsが不正」と言われます。
どのあたりがおかしいのでしょうか。
0917デフォルトの名無しさん
2009/02/15(日) 23:04:530918デフォルトの名無しさん
2009/02/16(月) 13:53:54以下の様な入力があった際に
A列は(A,1)だけ文字色を黒に、それ以下はすべて指定色に変更
B列は(B,1)が文字色黒、(B,2)(B,3)が指定色
(B,4)が文字色黒、(B,5)(B,6)(B,7)が指定色
になるようにしたいのですが、どのように実装すれば良いのでしょうか
A B C
ore kimi warota
ore kimi warota
ore kimi warota
ore dare warota
ore dare warota
ore dare warota
ore dare warota
0919デフォルトの名無しさん
2009/02/16(月) 14:20:01マクロの記録してから質問しろ
0920デフォルトの名無しさん
2009/02/16(月) 14:40:30スレ汚し失礼しました。
JavaとかCを軽くやっただけだったので
喜んで引き受けたんですが
スコープは分かりにくいし、なんか予約語?っぽいのがもうわかんなくて。。。
ま、すいませんでした、自力でなんとかしまウィッシュ
'2行目から終端までループしましょう
For i = 2 To LAST_ROW
'テーマが全項目と同じか調べる
'次の行のテーマを変数に入れときます
THEME_NEW = Worksheets("Sheet1").Range("A" & i).Value
'前の行と現在参照している行が異なる場合
If THEME_NEW <> THEME_OLD Then
Worksheets("Sheet1").Range("A" & i).Font.colorIndex = 3
Else
Worksheets("Sheet1").Range("A" & i).Font.colorIndex = 1
End If
THEME_OLD = THEME_NEW
Next
0921デフォルトの名無しさん
2009/02/16(月) 22:41:430922デフォルトの名無しさん
2009/02/17(火) 01:28:520923デフォルトの名無しさん
2009/02/17(火) 09:08:000924デフォルトの名無しさん
2009/02/17(火) 17:07:37存在しないオブジェクトを指定しています
0925デフォルトの名無しさん
2009/02/17(火) 20:50:55それがもんだいだ
0926デフォルトの名無しさん
2009/02/18(水) 21:54:340927デフォルトの名無しさん
2009/02/19(木) 20:46:290928デフォルトの名無しさん
2009/02/19(木) 21:48:560929デフォルトの名無しさん
2009/02/19(木) 23:52:440930デフォルトの名無しさん
2009/02/20(金) 01:05:450931デフォルトの名無しさん
2009/02/20(金) 02:49:540932デフォルトの名無しさん
2009/02/20(金) 02:57:38むしろ登ってない山のほうがはるかに多い
0933デフォルトの名無しさん
2009/02/20(金) 03:23:39故にその例えは間違っている
単純にこのスレに来た理由を聞いてるのではなく
「もうやだ」と言いながらも来る理由を聞いているということをお忘れなく
0934デフォルトの名無しさん
2009/02/20(金) 04:10:360935デフォルトの名無しさん
2009/02/20(金) 04:33:190936デフォルトの名無しさん
2009/02/20(金) 11:03:35嫌な山という風には
普通とらない
つらいのに登る理由が
「そこに山があるから」
0937デフォルトの名無しさん
2009/02/20(金) 12:16:500938デフォルトの名無しさん
2009/02/20(金) 17:08:14自分も初心者だけど、書いてみました。こんな感じ?
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
0939デフォルトの名無しさん
2009/02/20(金) 20:22:06インデント無いと、マジで可読性って下がるんだな・・・。
0940デフォルトの名無しさん
2009/02/20(金) 20:39:040941デフォルトの名無しさん
2009/02/20(金) 21:01:400942デフォルトの名無しさん
2009/02/20(金) 21:35:57Textプロパティを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
単純に置換しちゃうと文字列定数が壊れることがあるから注意な
0943デフォルトの名無しさん
2009/02/20(金) 22:09:350944デフォルトの名無しさん
2009/02/20(金) 22:57:16複数の名前があるとします。
例
鈴木、木村、田辺、鈴木、林田、村瀬、田中、田辺、室田、田辺
この場合鈴木が2名、田辺が3名と重複してるのですが
これをマクロで同じ名前をひとつにするにはどうすればいよいでしょうか?
鈴木、木村、田辺、林田、村瀬、室田のようにしたいのです。
0945デフォルトの名無しさん
2009/02/20(金) 23:18:530946デフォルトの名無しさん
2009/02/20(金) 23:20:370947デフォルトの名無しさん
2009/02/20(金) 23:23:030948デフォルトの名無しさん
2009/02/20(金) 23:24:35ぼくなら、まず名前を並び替えて
木村、鈴木、鈴木、田中、田辺、田辺、田辺、林田、村瀬、室田、
こういう風に同じ名前が隣り合うようにした後で
左から右へ選択を一個づつずらしながら、
「今選択されてるセルの内容が、一つ左のセルと同じならそのセルを削除する」っていう風にします
0949デフォルトの名無しさん
2009/02/20(金) 23:41:07>>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
0950デフォルトの名無しさん
2009/02/20(金) 23:41:240951デフォルトの名無しさん
2009/02/21(土) 00:00:23現時点では処理結果をどうしたいのか元質問に明記されてないのでなんとも言えないが、
Collectionオブジェクトだと一覧を取り出すのにループ回す必要があるから美しくない。
どうしてKeysプロパティを用意しなかったんだろう。
0952デフォルトの名無しさん
2009/02/21(土) 06:40:050953デフォルトの名無しさん
2009/02/21(土) 09:29:020954デフォルトの名無しさん
2009/02/21(土) 09:48:02'アクティブなシートの引数の列について重複している行を削除します
'引数列が空白の行については削除しません
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
0955デフォルトの名無しさん
2009/02/21(土) 10:11:420956デフォルトの名無しさん
2009/02/21(土) 11:43:41シート使うより、プログラム上で配列組んだ方がよっぽどやりやすい。
0957デフォルトの名無しさん
2009/02/21(土) 11:50:07コンボボックスのプルダウンリストに5つのデータを表示させたいと思っています。
元のデータは1行5列に記入されています。それを5行1列で表示させることは可能でしょうか?
よろしくお願いします。
0958デフォルトの名無しさん
2009/02/21(土) 15:41:47On Error Resume Next 必要ないのに使うな
d(n(i))= ""
0959デフォルトの名無しさん
2009/02/21(土) 16:01:24データはどんな順番で並んでいても大丈夫。一直線じゃなくて完全にバラバラでも。
あとVBA関係ない質問はExcel相談所へ行くこと。
0960デフォルトの名無しさん
2009/02/21(土) 18:49:46On Error Resume Next しっぱなしすな
0961デフォルトの名無しさん
2009/02/21(土) 18:52:23どうしても使う必要がある時は別プロシージャに飛ばすしかないな
0962デフォルトの名無しさん
2009/02/21(土) 21:58:06VBAにはpushないから、redim preserveで増やす事になるだろうけど。
重複取り除くなんてのはスマートじゃない。
配列内の総当たりだろうが、大した負荷掛からんて。
0963デフォルトの名無しさん
2009/02/21(土) 22:47:31連想配列ってのは、単純に代入するだけで重複チェックが全自動で行われるんだよ。
検索すると、連想配列なのにいちいちIfで重複チェックしたりエラー処理してるサンプルが大量に出てくるけど、
それらはみんな無駄な処理をしてるの。
もちろん>>949のOn Errorも無駄。
単に重複を除いたリストが欲しいだけなら、全データを配列に代入するだけ。
重複データに印を付けるとか個数を数える場合も、ちょっとした工夫だけでできる。
データを追加するたびにいちいち総当たりチェックなんて最悪。
0964デフォルトの名無しさん
2009/02/21(土) 22:55:430965デフォルトの名無しさん
2009/02/21(土) 23:11:08測ったことないけどスピードはどうなんだろう。総当たりよりは間違いなく速そうだけど。
0966デフォルトの名無しさん
2009/02/21(土) 23:32:20ランタイムエラーや例外が発生する言語・実装が多いから、重複チェックするのは全くおかしくない。妥当。
0967デフォルトの名無しさん
2009/02/21(土) 23:39:070968デフォルトの名無しさん
2009/02/21(土) 23:40:55お前は何を言いたいんだ?
0969デフォルトの名無しさん
2009/02/21(土) 23:44:410970デフォルトの名無しさん
2009/02/21(土) 23:52:130971デフォルトの名無しさん
2009/02/21(土) 23:55:310972デフォルトの名無しさん
2009/02/21(土) 23:56:370973デフォルトの名無しさん
2009/02/22(日) 00:02:45これは別に裏技でも言語使用の穴を突いてるわけでもない。
0974デフォルトの名無しさん
2009/02/22(日) 00:04:29Dictionaryでも、mydic(key) = itemという書き方をすれば、重複キーでもランタイムエラーが
発生しないのだよ。Addじゃなくて、代入ね。なければAddされ、あればitemが上書きされる。
だから、この問題に限って言えば、>>958が正しい。
0975973
2009/02/22(日) 00:06:33だが、存在チェックやエラーチェックをするのが間違い(冗長)だと言い切るのもどうかと思うぞ。
0976デフォルトの名無しさん
2009/02/22(日) 00:06:54重複チェックもエラートラップも使わずに、きちんと重複を除いたリストが得られる。
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
0977974
2009/02/22(日) 00:07:06973じゃなくて974ね。
0978デフォルトの名無しさん
2009/02/22(日) 00:11:42複数の有名サイトでもAddメソッドを使ったコードしか紹介してないから、
それしかないと思い込んでるやつもいるんじゃね?
0979974
2009/02/22(日) 00:12:18ちなみに俺なら「連想配列で重複を取り除く」などという無様なコメントなんか入れずに、
if not d.exist(key) then
d.add key, ""
end if
と書くけどね。
0980デフォルトの名無しさん
2009/02/22(日) 00:13:47連想配列を重複チェックに使うこと自体が一種の裏技だよな…
0981デフォルトの名無しさん
2009/02/22(日) 00:15:29俺も昔は分かったふりして>>958と同じ書き方してたけど、
速度比較してからは意識的に>>979の書き方にしてる
0982デフォルトの名無しさん
2009/02/22(日) 00:15:38If Not Array.Exist(key) Then
Array.PushBack(key)
End If
のように書けた方が気持ちいいんだよな。
0983デフォルトの名無しさん
2009/02/22(日) 00:19:370984デフォルトの名無しさん
2009/02/22(日) 00:21:37つか、これ白熱するようなことなのか?
0985デフォルトの名無しさん
2009/02/22(日) 00:22:37>★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。
0986デフォルトの名無しさん
2009/02/22(日) 01:01:11>>776
0987デフォルトの名無しさん
2009/02/22(日) 01:31:45On Error GoTo 0でおしまいにしろ
0988デフォルトの名無しさん
2009/02/22(日) 02:20:430989デフォルトの名無しさん
2009/02/22(日) 02:40:18の方式って昔はよく使っていたけど、可読性の悪い禁じ手と知ってからは
一度使ったらすぐ消すようなスクリプト以外では使わなくなったな
0990デフォルトの名無しさん
2009/02/22(日) 07:39:22硬いと言えば硬くて良いんだけどさ。
0991デフォルトの名無しさん
2009/02/22(日) 07:48:480992デフォルトの名無しさん
2009/02/22(日) 08:10:230993デフォルトの名無しさん
2009/02/22(日) 08:28:480994デフォルトの名無しさん
2009/02/22(日) 09:28:190995デフォルトの名無しさん
2009/02/22(日) 11:41:50あとForじゃなくてFoeだからVBAにすらなってない
0996デフォルトの名無しさん
2009/02/22(日) 13:54:19宣言部がないから型も不明
0997デフォルトの名無しさん
2009/02/22(日) 18:35:080998デフォルトの名無しさん
2009/02/22(日) 19:28:16On Error Resume Next
はいどうぞ
0999デフォルトの名無しさん
2009/02/22(日) 19:30:121000デフォルトの名無しさん
2009/02/22(日) 19:52:4910011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。