- 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)
- 481 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 22:15:01 ]
- プログラム起動時のパラメータはスペースで分割される。
スペース入りのパスを渡す場合には、分割されないようダブルコーテーションで囲む必要がある。 ダブルコーテーションの中にダブルコーテーションを書く場合場、""と書く。 以上をあわせると、 """abc def""" """" & range.value & """" の意味がわかるはず。
- 482 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 22:15:55 ]
- 質問スレだろ?
変な研究とかの丸投げじゃなきゃ質問に答えてやれよ どーせ分からないだけだろ
- 483 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 22:22:22 ]
- >>482
偉そうなこと言ってる暇があるならお前が教えてやればいい それとも質問者本人が煽ってるだけなのかな?
- 484 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 22:22:58 ]
- これわからない奴なんてほとんどいないだろw
- 485 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 22:26:30 ]
- >>483
そんなくだらん煽りなんかしないで、お前が答えてやれよ。
- 486 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 22:27:15 ]
- 丸投げでも良いじゃない。人間だもの。
- 487 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 22:41:46 ]
- いや、俺にはわからん。
A2なのに(1, 1)になる理由とか、、、 >>484はわかるのか。すごいなあ。
- 488 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 22:49:44 ]
- >>481
ご親切にありがとうございます。
- 489 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 22:50:44 ]
- >>487
わかんねーなら黙っとけ糞が
- 490 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 22:53:50 ]
- ExcelVBA覚えるのにおススメの本ありませんか?
当方のレベルは、超簡単なシェルスクリプトぐらいなら作りますが VBAの文法とか構造がさっぱりわからなくて初学者向けから勉強したいと思ってます。
- 491 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 22:59:25 ]
- Excel VBAのプログラミングのツボとコツがゼッタイにわかる本―最初からそう教えてくれればいいのに!
- 492 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 23:05:29 ]
- 本屋に行って手に取ってみるぐらいの労力惜しむなよ…
- 493 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 23:11:58 ]
- >>492
書評ってなんで必要だと思う?
- 494 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 23:13:09 ]
- 大村あつしの入門書っぽいの選んどけ
- 495 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 23:22:34 ]
- うちのばあちゃんが、人の悪口ってのはコンプレックスの裏返しだって言ってた。
つまり>>489自己紹介乙
- 496 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 23:24:28 ]
- >>493
(1) 書評欄を埋めるため (2) 評論家がゼニをふんだくるため
- 497 名前:490 mailto:sage [2009/03/30(月) 23:46:29 ]
- ありがとうございます
>>491 よさそうですね。見てみます。エロゲみたいなタイトルですが >>492 >>494 実はすでに大村あつしの入門書を見たんですが最初は簡単だったのにいきなりむずかしくなって 自分には合わないなって思いました。 ほかたくさんあったんですがイマイチピンとこずここで聞きました。
- 498 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 23:52:18 ]
- >>493
書評は別に必要ではないだろ
- 499 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 23:56:12 ]
- できる大辞典 Excel VBA
がオススメ 大村あつしは知識はあるが根本的にバカなので こいつの書いた本は素人にはオススメしない バカな内容に引きずられないだけの基礎スキルを持っていて 知識だけ上乗せしたい中級者以降なら構わないが
- 500 名前:472 mailto:sage [2009/03/31(火) 00:04:55 ]
- ヒントありがとうございます。助かります。
別のイベントで指定すれば良いんですね。やってみます。
- 501 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 00:57:31 ]
- (^p^)あうあうあー
- 502 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 01:13:54 ]
- >>475
changeイベントなんて1文字打ち込むごとに…
- 503 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 01:22:15 ]
- …は発生しない
確定された時にのみ発生する あとは変更確定されたセルが、目的のセル範囲かで条件分岐して処理すれば良いだけ
- 504 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 08:02:57 ]
- 1文字打ち込むごとにchangeイベントが発生するのはComboBoxやTextBoxなどだな
- 505 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 08:04:59 ]
- >>499
著者は誰?
- 506 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 15:10:37 ]
- Excel-VBAでXMLデータを引っ張ってるのですが
-------------------------------------------------------------- NGパターン Set xmlHttp = CreateObject("MSXML2.XMLHTTP.4.0") xmlHttp.Open "POST", "https://192.168.1.1:8080/xml/", False xmlHttp.Send xmlData -------------------------------------------------------------- -------------------------------------------------------------- OKパターン Set xmlHttp = CreateObject("MSXML2.XMLHTTP.4.0") xmlHttp.Open "GET", "https://192.168.1.1:8080/xml/", False xmlHttp.Send xmlData -証明書確認画面が出る。(主導ではいを選択)- Set xmlHttp = CreateObject("MSXML2.XMLHTTP.4.0") xmlHttp.Open "POST", "https://192.168.1.1:8080/xml/", False xmlHttp.Send xmlData -------------------------------------------------------------- POSTでリクエストを出すとエラーが返ります。 GETでサーバ証明書を取得後にPOSTを続けるとエラーが出ないので、証明書関連だと おもってるのですが、オレオレ証明書でも無視して続行する方法を 教えて頂けないでしょうか。
- 507 名前:デフォルトの名無しさん [2009/04/01(水) 01:57:32 ]
- >>506
ぐぐれ
- 508 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 15:26:40 ]
- XPのExcel2007です。
次の流れのプログラムを作成しました。 1.テキストファイルを読み込み 2.不要データの削除 3.作表(列の追加など) 4.罫線・セルの色付け プログラム自体は稼働し、結果も希望通りのものができました。 しかし、一度実行した後にもう一度実行すると、初回時に比べて処理時間がかかります。 マクロの最初と最後に、画面更新の停止と解除(screenupdating)も追加してみたのですが、改善にいたりませんでした。 一度ファイルを終了し、再度開きなおした場合の初回はやはり処理は早いです。 そういった現象を回避できる手掛かりを探しています。 ご助言をいただけましたら幸いです。
- 509 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 15:28:50 ]
- 再実行の前に、初回の実行したときのデータをすべて削除してるか?
- 510 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 15:37:54 ]
- >>509
ありがとうございます。 データの削除は最初に行っています。 (Cells.Delete Shift:=xlUp) 使用しているシートは2つ。(2つとも削除しています) 1.テキストファイルを読み込むシートと読み込んだ後に、 2.別シートにすべてコピーしてから、不要データの削除や罫線処理を行っています。 何度か確認したところ、別シートにコピーしてからの処理が重くなるようです。
- 511 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 16:34:06 ]
- >>507
証明書を入れて回避する方法は探せたけど 認証を無視する方法がみつからない。(回避じゃダメなので) ぐぐって見つかるサイトがあるならURLを教えてください。
- 512 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 16:36:58 ]
- >>510
とりあえずブックうp 外部に出せないデータとかは、適当な文字列と置き換えていいから
- 513 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 17:08:14 ]
- >>508,510です。
ファイルあげてみました。よろしくお願いします。 ttp://uproda.2ch-library.com/lib116394.xls.shtml DLパスは変更なしです。 外に出せないコードは削除してあります。 しかし一回目早く、2回目以降が遅いという現象はおきます。 何分手探りでVBAやっているため、コードが見づらいと思います。 (基本マクロ記録からいじくっているのが多いです) よろしくご教授ください。
- 514 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 17:11:57 ]
- >>513 ですが、一回削除してからうpしなおしました。
ttp://uproda.2ch-library.com/lib116395.xls.shtml パス変更なしです。 お願いします。
- 515 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 17:20:32 ]
- >>513-514です。
たびたび本当に申し訳ありません。 うまくあがってなかたったので、再度あげました。 ttp://uproda.2ch-library.com/lib116397.xls.shtml お願いします。
- 516 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 17:29:06 ]
- 事務所名でてるから早く消せ
- 517 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 17:32:07 ]
- >>516
最後にあげたのは全部消したはずなので、大丈夫だと思います。
- 518 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 17:45:18 ]
- >>517
マクロの中に
- 519 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 18:06:53 ]
- ありがとうございます。
先程削除しました。 今後はあげるのやめときます。 お騒がせしてすいませんでした。
- 520 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 18:55:05 ]
- 諦めるって事か
お疲れさまでした
- 521 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 19:33:11 ]
- >>510
>データの削除は最初に行っています。 これは、マクロの中でやってるのか? 再実行する前に手で全部削除(コピー残すんじゃなくて)して再実行してみてどうだ 考えられる可能性は、コピーを残すことによりデータ量が増えて遅くなってるとか 空シートのクリアは早いがデータの多いシートのクリアは遅いとか まあ、まずマクロのどこ(どの命令)が遅いか確認したら?
- 522 名前:非508 mailto:sage [2009/04/01(水) 20:12:53 ]
- 落としたやつを動かしてみたが、枠線とか背景色とかをいじってる所が遅くなるようだ。
セルでなくシートを削除して、新しいシートで実行すると速度が変わらないので、Excelの仕様の問題かと。 シートの中に何か覚えている部分があるんだろう。
- 523 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 00:40:12 ]
- >>521、522
ありがとうございました。 その後、メモリの消去の命令とかいろいろ追加してみましたが、やっぱり駄目でした。 仕様ということであきらめてみます。 お見苦しいところを、多々お見せして、申しわけありませんでした。
- 524 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 01:45:51 ]
- >>523
upし続けてくれる? 直ぐ消すと 見てくれる人も見てくれないよ
- 525 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 20:01:17 ]
- 開放する命令を出さないとダメだぞ。
- 526 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 00:36:17 ]
- open ?
- 527 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 01:45:48 ]
- 初心者なんですが質問をさせてください。
ワークシートのセルに関数を入れて 4(=index(〜)とかで4になったもの) n = ↑のセル range("a1")=n とかにするとa1には=index(〜)がそのままはいってしまって。 値(この場合4)にしたいんだがどうすればいいか教えてください。説明が下手で申し訳ありません。
- 528 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 01:59:19 ]
- 自己解決しました。
マクロの記録でコピペして値のみでできました。 もし他にも方法があったら教えてください。
- 529 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 02:06:10 ]
- ここって日本の掲示板だよな?
あまりにも日本語の質問が少ないんで 何処か日本以外の国の掲示板に迷い込んだのかと錯覚する…
- 530 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 04:30:14 ]
- 自然言語がちょっと乱れた程度で外国語と間違えそうになるなんてすごいです。
尊敬します。先生と呼ばせてください。 ところで先生は文末に約物だけを付けるのは正しい日本語とみなす派なんですね。
- 531 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 04:34:51 ]
- どうしたの?
- 532 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 07:05:43 ]
- 自分で不自由て自覚あるみたいだから好きに呼ばせておけばいいよ
- 533 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 19:57:19 ]
- 4(=index(〜)とかで4になったもの)
もうね。メタ文字が入ってると、どんなパターンなのか考えてしまってダメだわ。
- 534 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 01:52:17 ]
- 日本語でOK
- 535 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 15:28:15 ]
- >>527-528
だいたい俺んとこじゃそういうふうにならないんだが。 仮にC1に=INDEX(D:D,4)となってて n=Range("C1") Range("A1")=n と.Valueを省略して書いてもA1には値が入るぞ?
- 536 名前:デフォルトの名無しさん [2009/04/04(土) 16:16:24 ]
- かつてoffice2003で作ったxlsファイルでVBAを組んだのですが
それをoffice2007のxlsxで開こうとするとエラーになってしまいます。 もちろん保存するときにxlsで保存すれば開けるのですが。 xlsで作ったVBAはあくまでもxlsファイルでしか開けなく 互換性はないのでしょうか?
- 537 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 16:55:47 ]
- >>536
マクロ付きの場合、xlsxではなくxlsmになる。 名前を付けて保存のダイアログのファイルの種類のところから、それ選べ。
- 538 名前:デフォルトの名無しさん [2009/04/05(日) 09:46:08 ]
- ボタンが一個置いてあり、その下に、数字がはいった二つのセル(仮にセルA、セルBとする)がある。
で、ボタンを押すと、別シートの表の中からセルAと一致 するセルをもつ行のうち最初にみつかったセルの1マス右側のセルにセルBの内容を書き込む・・・ というようなことをVBAでやりたいのですが、 単純化したサンプルでいいんでどういうコードになるか教えていただけませんか
- 539 名前:デフォルトの名無しさん [2009/04/05(日) 10:28:13 ]
- オートシェイプにMouseMoveとかのイベントはありませんか?
オートシェイプ上にカーソルが移動すると オートシェイプに合わせたデータを表示する というのプログラムを組みたいのですが
- 540 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 10:32:32 ]
- >>538
With Sheet2 .Range(.Cells(1, 1), .Cells(10, 1)).Find(what:=Sheet1.Cells(1, 1)).Offset(0, 1) = Sheet1.Cells(2, 1) End With Sheet2が別シート、Sheet1がボタンがあるシートな。
- 541 名前:デフォルトの名無しさん [2009/04/05(日) 11:04:03 ]
- >>540
ありがとうございました。 ちなみにセルAとセルBじゃなくて、 列Aと列Bだったとして、 列Aの内容と一致するデータを別シートから検索し、右隣のセルに列Bの 内容を書き込む、みたいな場合はどうなるんでしょうか
- 542 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 11:11:31 ]
- 丸投げよくない
- 543 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 11:48:36 ]
- >>539
シェイプ系には無い ActiveXオブジェクトには有る 矩形で良いならコントロールツールのイメージオブジェクト使うのが手っ取り早い 凝った形が良いならActiveXオブジェクト作って取り込めば良い
- 544 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 12:38:49 ]
- >>539
無い。けど、マウス座標からObject位置判定を自前でやれば同じことはできる できたとしても、定義済みシェイプを使う方法が面倒だと思う シェイプと情報をうまく自動リンクさせる手法の方が難しいと思われ
- 545 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 13:58:18 ]
- デフォルトプロパティって書くべきなんだよな?
- 546 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 13:59:21 ]
- 関数だと必ず()にして表記したほうがわかりやすいよな
仕事としての意味で
- 547 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 14:25:50 ]
- >>451
非表示シートって表示できるの? 矛盾した質問で申し訳ない
- 548 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 15:16:03 ]
- セルの値を二元配列に組み込みたいのですが、
簡単にする方法はありますか? data(0, 0) = A1.value data(0, 1) = A2.value data(1, 0) = B1.value data(1, 1) = B2.value data(1, 2) = B3.value のように一度に格納したいのです
- 549 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 15:21:55 ]
- >>547
出来ない理由でも?
- 550 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 16:05:28 ]
- >>548
Dim ary As Variant ary = Range(Cells(1, 1), Cells(3, 3)).Value これで配列に入る。 添え字は1始まり。
- 551 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 16:11:28 ]
- >>550
ありがとうございます
- 552 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 17:01:28 ]
- >>549
拾ってきたソースで非表示シートに値を入れてるのがあって それを目で追うために見えるようにしたかったんだよ
- 553 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 17:11:41 ]
- 表示できない場合、うっかり非表示にしちゃったときどうするんだ
- 554 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 17:16:02 ]
- >>545
保守的には書いたほうが良い。書くべき。 けど、VB6に限れば書かない方が速度が速い。もしかしたらVBAも・・・? まあ、所詮Excelなんで筋違いか。2008は知らん。
- 555 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 17:26:50 ]
- どこぞのサイトに書く場合と書かない場合の計測結果があったな
- 556 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 18:06:51 ]
- 書いた方がわずかに早いけど、そこまでスピードにこだわる処理にVBAは向いてない気が
- 557 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 19:43:34 ]
- 質問です。
Variantに複数のRangeを代入した際の動きって どこかにドキュメントとかありますか? いまいちアレが配列になる理由がわからない。
- 558 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 19:57:49 ]
- >>557
どゆこと?
- 559 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 20:06:05 ]
- それは代入以前の問題だろ
君は複数範囲のRangeオブジェクトのValueプロパティが、配列を返すってことを理解してないだけじゃん。 変数は単にValueプロパティが返した値をそのまま保持しているだけで、Variant型変数に代入したときに 何か変換とかが行われてるわけじゃないし。
- 560 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 20:09:38 ]
- >>557
variantでメモリを確保します 最低16バイトです そこに配列の値を入れていきます。増えたらVariantが確保してるメモリ量も増大します 終わり 多分可変長ってところでひっかかてるんじゃないかな
- 561 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 20:51:12 ]
- >>558,560
複数のRangeといったのは、下記のような代入です。 Dim var as Variant var = [A1:B3] なんでvarに配列が入るのか不思議だったので聞きました。 (普通に先頭要素の値が文字列として入ると思っていたから) >>559 うーん、そういうExcelのCOMの作り方であって、 別にVBA的な何かというわけではないのですね。 デフォルトプロパティの動作についてドキュメントないのかな。 CVarでも動作同じなのかな。
- 562 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 20:53:46 ]
- つまり勘違いしてただけか
- 563 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 21:32:03 ]
- Range型に不用意にVariantを使用しない。後で意味が分からなくなる。
デフォルト云々の前に、Variantは不定形型ということを理解すべき。
- 564 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 21:38:54 ]
- range == stringの認識も改めたほうがよさそだね
- 565 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 22:45:48 ]
- >>563
なにいってんの?ばか?
- 566 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 22:46:10 ]
- >>564
を見てふと思ったんだけど、 やっぱり比較演算子と代入演算子が同じってのは分かりにくいよね。 >>563 ユーザー定義関数なんかで、セル指定or文字 を引数で使うみたいに、 明確にvariantじゃなきゃ条件分岐がしっかり出来ないって用途は限定されるしね。 まぁ、そんな目的だとしてもTypenameあたりでしっかりと何型が入ったかを判定させるべきだと思う。 入れっぱなし、とりあえず問題なく動くからOK。って作り方はわしゃ好まん。
- 567 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 23:10:16 ]
- VBAでカレーライスって作れますか?
- 568 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 23:12:10 ]
- >>567
外部マイコンをVBAで制御すればできる もちろん、マイコンでカレーライスが作れるように設定しておいてくれ
- 569 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 00:27:07 ]
- だがそれは、はたしてVBAで作ったことになるのだろうか?
- 570 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 00:41:36 ]
- 『パソコンはC言語で動いてる』の考え方次第じゃない?
目に見える結果にプログラミング言語は限定されないと思う しいて言うなら、カレーライス製造装置の制御ソフトの大半がVBAなら、VBAで出来てるといえるのでは? 最悪、かーちゃんにメールするだけでも成立しそうだが 激しくスレチ乙
- 571 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 00:44:00 ]
- なるよ
- 572 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 01:05:33 ]
- 「パソコンで年賀状作った」
「それはプリンタに作らせただけだろう」 みたいな話か
- 573 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 06:53:16 ]
- 最後にちょっと国内で加工すれば国産になるのと同じ道理ですな
- 574 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 21:04:10 ]
- >>563は何か勘違いしてるの?
セルの値の配列をいっぺんに入れるならVariant型しかないじゃん。
- 575 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 21:38:27 ]
- Range.Value()の代入先がVariant()型に限るってのもVBAの妙な仕様の一つだよな。
別にDouble()やString()を許容してくれてもよさそうに思えるのに。
- 576 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 22:02:15 ]
- プロパティの定義が
Value As Variant なんだから、妙でもなんでもなく当然だろ? というか、配列じゃないときに変換関数も通さず別型の変数に代入できてしまう方が妙だ。 自動型変換なんてのは行われないのが普通だからね。 VB6以前やVBAにどっぷりハマっていると、自動型変換されるのが当然で、プロパティの戻り値を プロパティの型とは別型の変数に代入できないという当たり前のことが不自然に感じてしまうものなのか?
- 577 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 22:22:28 ]
- ならばセルに数値が入ってる時TypeName(Range("A1").Value)ってやると
Doubleが返ってくるのをやめてほしい。 Range("A1").ValueTypeみたいなデータ型を調べるプロパティを用意すべき。
- 578 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 22:39:47 ]
- >>577
オブジェクト指向を一から勉強し直せ
- 579 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 22:40:13 ]
- >>577
それはTypeNameが内部型を返すという仕様通りの結果だろ? 結局全てに置いて理解が浅いだけの話じゃん。 そして問題点を指摘しているのではなく、「俺の妄想通りに動かない」とブー垂れてるだけ。 ホント、どうしようもないな。
- 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 ]
- 拡張子は?
|

|