- 1 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 04:56:43 ]
- ExcelのVBAに関する質問スレです
前スレ pc11.2ch.net/test/read.cgi/tech/1228372971/ ★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)
- 580 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 22:53:11 ]
- じゃあ問題なのは一部の演算子で自動的に型変換が行われてしまうってこと?
VBAだと暗黙の型変換を禁止する方法ってないよね?
- 581 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 22:55:04 ]
- >>580
何いってんの?馬鹿なの?
- 582 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 23:11:21 ]
- >>580
それ、結構重要だと思うわ 最近のスクリプト言語でも思う 勝手に型変換して書いたソースをなんとか動く形に解釈してしまうのは 俺もダメだわ
- 583 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 23:20:39 ]
- 単純な変数への代入だと勝手に型変換してくれるのに
配列への代入だと型変換してくれない。 なんで統一してくれないの?
- 584 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 23:22:08 ]
- VBAは中途半端に型があるからなぁ
VBSみたいに、もう型なんてバリアント以外禁止!にすればよかったんだよ 実行環境が勝手に型変換するのは、勝手に型変換するコードを書くからなんだがな それは問題なんじゃなくて、そういう言語だと理解して使うしかない
- 585 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 23:25:23 ]
- >>577
それって意味あるの? ValueTypeプロパティがあったとして、 VarType/TypeNameが廃止なら、現状のVarType/TypeNameと何も変わりない。 見た目が変わるだけ。 一方、VarType/TypeNameが存在するとしたら、そっちは何をするんだ? 例えば、Variantであるという戻り値なら、そんなものソースコードを見れば自明だ。 ほかの方法は思いつかない。まさかValueTypeと同じとは言わないだろうし。
- 586 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 23:30:16 ]
- 「variantの使い方は気をつけよう」でおk?
初心者はよく勉強すること 熟練者は的確なスレをすること 反論だけのキチガイはスルーすること
- 587 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 23:33:36 ]
- スレをする?
- 588 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 23:40:27 ]
- Variantはまだいい方。
一番わかりにくいのはRangeオブジェクトだと思う。 よく使われることを想定したためか、かなりの省略が許容されているおかげで誤解も多い。
- 589 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 23:46:17 ]
- 別に解りにくいなんて思ったことは無いけどな
理解度が低かった初心者の頃以外は
- 590 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 23:59:16 ]
- EntireRowとかのRow自体のRangeとか、
結合セル時のOffsetとか、Find・FindNextとかはわかりづらいと思った。
- 591 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:10:04 ]
- 理論的な思考が出来る人なら問題にはならないけどね
結局は個人の問題
- 592 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:15:09 ]
- んなアホな
- 593 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:24:04 ]
- まあ出来ないうちはそう思うのは仕方ない
解ってみれば単純な物だが
- 594 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:26:06 ]
- うゎ、こいつうぜ
- 595 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:31:57 ]
- ここはヒトの理解というものについて考察するスレじゃないというのは、
論 理 的な思考が出来る人なら問題にはならないけどね。
- 596 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:36:17 ]
- 悔しかったの?
- 597 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:39:06 ]
- Cellsの使い方がおかしい奴は多いねぇ。
Set r = Range("a1:b5") r.Cells(2,1).hogehoge なんてやつ見るとアフォかと。
- 598 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:40:46 ]
- なにやってんのそれ?w
- 599 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:49:29 ]
- やってることはどうでもRange("a1:b5") がセルの集合だからCellsを使うのはおかしいってこと。
- 600 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 00:58:52 ]
- >>599
ただの相対参照じゃねーの?
- 601 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 01:07:32 ]
- >>597
複数セルに対するCellsで第二引数まで指定するのは確かにおかしいが やってる奴は滅多に見ないぞ 複数セルに対するCellsで第一引数のみの指定や 単一セルに対するCellsで第二引数まで指定するのならよく見るが、これらはちゃんと意味有るし 前者は範囲内、若しくは範囲の延長上で右下方向に何番目のセルという指定で Range("A1:E5").Cells(12)なら、A1:E5の5行5列範囲で右下方向12番目ということで 1 2 3 4 5 6 7 8 9 10 11 12 のような感じで3行2列目のB3を返す 後者はOffsetの初期インデックス違いのようなもので、Offsetが0始まりなのに対して、Cellsが1始まり Debug.Print Range("A1").Cells(3, 3).Address(0, 0) Debug.Print Range("A1").Offset(2, 2).Address(0, 0) 因みに前者のような使い方があるので、「(親が)セルの集合だからCellsを使うのはおかしい」って言い方は不適切だな
- 602 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 01:35:18 ]
- 問題は、RangeもCellsもRangeオブジェクトを返すのに、その明確な
使い分けができてないことだろ
- 603 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 01:40:10 ]
- 使ってればそのうち使い分けられるようになるさ。
- 604 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 01:54:34 ]
- いや、たしかに自然と使い分けてるんだが、
問題としては、使い分けの方法ってか、指針を説明できないってことなんだ 今だから白状するが、俺は初心者の頃は、Cellsは単一セルそのものを返してると思ってた まあ、だからRangeとCellsの使い分けはあんまり悩まなかったが、かといって 範囲が1×1のレンジ操作はCells使えってのも、なんかちょっと違う気がする
- 605 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 09:06:00 ]
- >>597がおかしいのは
r.Cells(2,1).hogehoge じゃなくて rItem(2,1).hogehogeとかr(2,1).hogehogeって書けって意味だよ。 r.Cells(2,1).hogehoge ってr.Cells.Item(2,1).hogehoge の意味だけどセルの集合にわざわざ再度Cellsを使うのは無駄ってもんだ。 例えばCells(2,1)もCells.Cells.Cells(2,1)も同じセルををさすが、動けばいいってもんじゃねーからな。 EntireRowとかのセルの集合じゃないものにCellsを使うのは意味があるが>>597ではCellsは無意味だね
- 606 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 09:19:44 ]
- r.Cells(2,1).hogehogeがr.Cells.[_Default](2,1).hogehogeの意味だって突っ込みは無しよ。
- 607 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 11:41:21 ]
- >>605
デフォルトプロパティを省略するなって議論が上の方にあったな だが実際問題、Cells.Item(2,1)なんて書かないなぁ デフォルトプロパティがインデクサとして作用するなら普通みんな書かないんじゃない まあ、そのせいで、Cells(2,1)はプロパティ取得じゃなくて、 Cellsというメソッドを2と1という引数で呼び出してると勘違いしてる時期があった VBAの入門書とか、そのへんちゃんと解説してるようなのはほとんどないと思う ちゃんとしたコード読まないと、ちゃんとしたコードかけるようにならないってことだな ただ、Range.RangeとかCells.Cellsとかは感覚的におかしいと思うんだが Range.Cellsは感覚的におかしいと思わないんだよなぁ
- 608 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 13:12:17 ]
- >>607
Excel95の頃はCellsはメソッドじゃなかった? 中身は実質変わってないのかな?
- 609 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 15:27:47 ]
- ソース見てRangeがオブジェクトかプロパティかわからない俺参上
Range("A1") = "abc" たとえばこれはオブジェクトでデフォルトプロパティのValueが省略、でいいの?
- 610 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 15:52:48 ]
- Rangeはオブジェクトを返すプロパティだよ
- 611 名前:デフォルトの名無しさん [2009/04/07(火) 17:35:05 ]
- EXCEL2003です
セルの書式設定の[表示形式]定義が[文字列]かどうか 判断する方法を教えて下さい。 やりたい事は「日付を表すデータ」([表示形式]が[日付]とは限らない)が 元々どのように入力されているか判断したいのです。 具体的には、 文字列で「3/1」、「2009/3」「2009/3/1」と入力されて いるのか、日付データで「2009/3」等と入力されているのかの 判断方法は、どうすれば良いかということです。 よろしくお願い致します。
- 612 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 17:40:30 ]
- >>611
NumberFormatLocal
- 613 名前:デフォルトの名無しさん [2009/04/07(火) 22:14:32 ]
- 文字列で"0.1"とか"1"をDoubleに変換したいです。
且つ、"abc"のようなものなら失敗して欲しいです。 CDbl()でよいと思うのですが、"abc"などを渡した場合どのように失敗を通知してくれるのでしょうか? 例外などですか?このときの例外の補足の仕方を教えていただけますか? 宜しくおねがいします
- 614 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 23:24:36 ]
- On Error GoTo xxxx
でエラートラップ Err.Numberでエラーの種類しらべてしかるべき処理 はっきりいってVBAのエラー処理はおまけみたいなもんだ 変換してエラーでる可能性があるとわかってるなら、 変換する前に変換元が数字かどうかぐらい自分でチェックするほうがいいと思うぞ
- 615 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 23:34:04 ]
- >>614
それは他の言語とどこが違うの?
- 616 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 23:41:15 ]
- >>614
ありがとうございます。m(_ _)m アドバイス助かります。自分でエラーチェックすべきか、 オブジェクトの例外スローに期待すべきかも悩んでました。 とりあえず試してみます。 例外が送出され、それを捕らえて上手くメッセージが出せたらそれに越したことはないものですから。。
- 617 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 03:42:55 ]
- >>615
エラー処理ルーチンにうつった場合の、それ以降の処理が非常にややこしくなるんだ まあ、詳しくは構造化エラー処理あたりでぐぐってみてくれ で、613はJava系のプログラマか? VBAで例外スロー、キャッチとか考えんほうがいいぞw
- 618 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 03:50:08 ]
- つーか、IsNumericじゃダメなの?
- 619 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 06:07:31 ]
- IsNumericかregexを使う
- 620 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 10:11:12 ]
- vbのエラー処理ってこんなかんじだったかな
1: on error resume next (処理) if err.number = xxx then 〜 end if on error goto 0 2: on error goto eh (処理) exit sub/function eh: (errで分岐したり処理したりする。resume next で戻ることも出来るが、大体はそのままプロシージャを抜ける。)
- 621 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 10:15:33 ]
- 負の日付を判断する関数ってあります?
もしくは負の日付か判断する方法があったら教えてください isDate(負の日付)や変数 = 負の日付とかするだけでエラーに飛んでしまって・・・
- 622 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 13:07:38 ]
- まず、負の日付の定義についておしえてくれ
- 623 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 13:45:02 ]
- 1899/12/29以前ってことか?
俺のとこじゃDate型の変数にCdate("1872/8/13")を入れてMsgBox IsDate(変数)とすりゃTrueだけどな。 直にMsgBox IsDate(-10000)だとFalseだが。 エラーにはならんな。
- 624 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:07:01 ]
- >>622-623
説明不足でもうしわけないです 表示形式が「日付」のセルに、例えば9999999999って値を打つと ####と表示され、マウスカーソルをあてると「負の日付または時間は####と表示されます。」 と出てきまして、そこの値をvbaの方で参照しようとして落ちているという状況です (日付型のとこには0〜2958465以外の数値だと日付シリアル対象外でこうなるようで・・・) 関数があれば〜と言いましたが、代入するにしろ引数にするにしろ、 参照した時点で落ちてるので関数があっても意味がないと思い、 結局エラーに行かせた先で判断するようにしました どうもありがとうございました
- 625 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:19:05 ]
- >>624
Value2プロパティが2958465以下かで判断する方法もあるかもね。 ValueプロパティだとオーバーフローのエラーだがValue2だとオーバーフローしないから。
- 626 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 14:59:38 ]
- >>625
知らないプロパティだったんで早速調べてみたんですがこれで行けそうです! >>625氏の言うとおりの方法で範囲外なら無効な日付とメッセージを出すようにしてみました 出来ればエラーに飛ばしたくないと考えていたので助かりました どうもありがとうございます!
- 627 名前:611 [2009/04/08(水) 17:37:10 ]
- >612
レスありがとうございます
- 628 名前:デフォルトの名無しさん [2009/04/09(木) 00:08:50 ]
- EXCELファイルがどのバージョン(EXCEL97、2000、2003)で
作成されたものか調べる方法を教えてくれ神ども。
- 629 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 05:48:16 ]
- 拡張子は?
|

|