トップページtech
1001コメント350KB

Excel VBA 質問スレ Part32

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/10/07(月) 22:19:55.86
ExcelのVBAに関する質問スレです

★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。

★2 ExcelのVBA以外の部分に関する質問はNGです。
   但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。

★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。

 VBAとは、『Visual Basic for Applications』の略で
  Application
  ├Workbooks
  |└Workbook
  |  ├Worksheets
  |  |└Worksheet
 というApplication以下のオブジェクトを、VB言語で操作するものを指します。
 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。

★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。

★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み、
   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。

★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)

前スレ:Excel VBA 質問スレ Part31
http://toro.2ch.net/test/read.cgi/tech/1376371376/

関連スレ:VBAなんでも質問スレ
http://toro.2ch.net/test/read.cgi/tech/1342087380/
0286デフォルトの名無しさん2013/12/29(日) 21:51:06.62
シートに自作関数を作るとき
なぜ標準モジュールに作らないとダメなんですか?
ThisWorkbookモジュールやSheet1モジュールじゃなぜ動かないんですか?
理由が知りたいです。
0287デフォルトの名無しさん2013/12/29(日) 21:59:39.81
>>286
>シートに自作関数を作るとき
どゆこと?
0288デフォルトの名無しさん2013/12/29(日) 22:06:15.50
ふつうのシート用に。
0289デフォルトの名無しさん2013/12/29(日) 22:16:09.85
質問です。
(1) 関数、IsNumberとIsNumericの違いはなんですか?
(2) それはどうやって調べましたか? (記憶してた人は回答しないでね)

(2)のほうがすごく知りたいです。なぜなら調べる方法がちゃんとわかっていればこのことに限らずこんご自分で解決できるから。
GoogleというのはできればNGでお願い。
0290デフォルトの名無しさん2013/12/29(日) 22:45:57.27
>>289
Yahooならいいんか?
0291デフォルトの名無しさん2013/12/29(日) 22:54:17.48
>>290
Ahoo
0292デフォルトの名無しさん2013/12/29(日) 22:57:57.90
>>289
VBAの組み込み関数かEXCELのワークシート関数かとか
型チェックするか暗黙の変換するとかしないとか

とりあえず両方のヘルプみれば済む話
0293デフォルトの名無しさん2013/12/29(日) 23:05:10.44
>>286
マイクロソフトがそう言う風にEXCELを作ったから
それ以上はマイクロソフトに聞かないとわかりません
0294デフォルトの名無しさん2013/12/29(日) 23:05:12.81
>>292
簡単にヘルプとおっしゃいますが
どうやってヘルプを起動するかとか
そのあとどうやって知りたい機能の関数を検索するかとか
そういうのが知りたいのですが
0295デフォルトの名無しさん2013/12/29(日) 23:06:26.77
>>293
マイクロソフトがどう言う風にEXCELを作ったかを調べるほうほうを聞いているのですが
0296デフォルトの名無しさん2013/12/29(日) 23:18:02.59
>>294
ヘルプだしたことないのかよ?
VBEのメニューにあるし、普通は知りたいところでF1押すだけだ
0297デフォルトの名無しさん2013/12/29(日) 23:19:47.85
>>295
それはマイクロソフトに聞いてください
0298デフォルトの名無しさん2013/12/30(月) 00:36:13.04
F1キーが付いて無いキーボードを使ってるんじゃね
つか簡単におっしゃいますがとか臭いな、行き遅れのキチガイババア的な臭いだ
0299デフォルトの名無しさん2013/12/30(月) 01:13:49.38
>>297
あなたはそれをマイクロソフトに聞いたのですか?
0300デフォルトの名無しさん2013/12/30(月) 04:23:14.97
ふつう直接聞かなくても、公式や非公式のドキュメント
第3者の解説等で十分じゃないですかね

必要があればマイクロソフトに問い合わせますがね
問い合わせが全部タダと言うわけでもないので
0301182013/12/30(月) 09:37:31.59
パソコン教室とかにいった方いいレベル
0302デフォルトの名無しさん2013/12/30(月) 09:42:45.56
>>300
その公式や非公式のドキュメントは具体的になんなのか
PCのどこかにdocファイルとして存在してるのか
もしそうならそのPathはどこなのか
ヘルプ機能で見るものなのか
もしそうならその呼び出し方は
そういうのを質問者様は聞いてると思うぞ
抽象的なことではなくて
0303デフォルトの名無しさん2013/12/30(月) 10:44:40.44
DoEvents関数とAPIのSleep関数は、同じものと思ってさしつかえないでしょうか?
0304デフォルトの名無しさん2013/12/30(月) 11:40:58.82
フリーソフトをVBAで操作したいのですが
CreateObject("InternetExplorer.Application")やCreateObject("Outlook.Application")のように
そのソフトをオブジェクト変数として扱うにはどのような呪文を唱えればいいでしょうか?

そしてそのソフトの機能を呼びだすためどのようなメソッドがあるかを調べる方法は?
0305デフォルトの名無しさん2013/12/30(月) 11:45:39.16
>>303
差し支えるよ
全然違うから
0306デフォルトの名無しさん2013/12/30(月) 11:53:59.12
>>303
部屋に鍵をかけずに買い物に行くのがDoEvents
鍵をかけて眠るのがSleep
0307デフォルトの名無しさん2013/12/30(月) 13:28:00.33
>>304
そのフリーソフトがCreateObjectできるように作られてるソフトじゃないと無理
普通はまずそのフリーソフトの作者側で公開された情報がないか調べるんだがな
そう言う風に作られてるなら、メソッドの調べ方は参照設定してオブジェクトブラウザで見るとか
03083032013/12/30(月) 13:30:08.67
>>306
じゃあ鍵をかけずに眠るのはどんなステートメント/関数?
03093032013/12/30(月) 13:30:54.04
鍵をかけて買い物に行く場合も。
0310デフォルトの名無しさん2013/12/30(月) 13:31:16.47
>>306
その例えはおかしくないか

郵便物チェックするのがDoEvents
無視して寝るのがSleep

だろ
0311デフォルトの名無しさん2013/12/30(月) 13:34:05.56
帰ってくるまでに部屋をあらされるリスクを負う
0312デフォルトの名無しさん2013/12/30(月) 13:52:47.65
>>309
Sleepはそのまんまの意味
DoEventsはイベント処理中に後続のイベントを割り込ませるもの。
なのでスリープ同様CPU使用率を下げるが全くの別物。
というかDoEventsはそんな認識で使われるとバクの元だし必要とする時点で設計ミスの可能性が高いので忘れた方がいいよ。
0313デフォルトの名無しさん2013/12/30(月) 14:26:52.86
"後続のイベント処理"の中には画面更新も含まれるしフォームを閉じるといったものまで含まれるので
「DoEvents関数を抜けて戻ってきたら船が無くなってていきなり海中に叩き込まれた」みたいな
愉快な体験がいくらでもできるよ やったねたえちゃん!
0314デフォルトの名無しさん2013/12/30(月) 20:17:35.02
は?
Windowsに処理を明け渡すんじゃなくて?
0315デフォルトの名無しさん2013/12/30(月) 22:06:05.57
Windowsに処理を明け渡すというよりは、溜まってたWindowsからの処理要求を処理するって感じ
0316デフォルトの名無しさん2014/01/01(水) 11:16:42.52
イベントキューを片付けるだけだよ
ようするに仕事の順序が変わるだけ
0317デフォルトの名無しさん2014/01/01(水) 11:19:51.82
買い物に行くとか鍵かけるとか、別の作業増やしてどうすんだよ
やることは決まってんだよ

Sleepは溜まった仕事をそのままずっと先送りするだけ、DoEventsは順番が変わって急ぎの仕事を先にやるだけ
0318デフォルトの名無しさん2014/01/01(水) 14:23:24.77
ADOを使いたいのですが
会社のイントラWeb(?)から見れるデータベースを参照するためにすべきことはなんですか?
データベースにもURLとかサーバの名前みたいなのがあるんですよね?

どういうしくみか分かってないので、それも含めて質問できたらなと存じます。
0319デフォルトの名無しさん2014/01/01(水) 15:37:21.51
>>318
まず社内のシステム管理者に聞け
03203182014/01/04(土) 09:54:05.01
>>319
教えてくれないんですよ。

空ファイルをつくり拡張子をudlにしてそれを開くと道は開けるみたいな情報を得ましたがそこから先がわかりません。
イントラWebのFormを使ってアクセスしてるDBをVBAで自由に扱うには
どうすればいいですか?
DBのサーバ名を調べればいいんですよね?
それはHTMLのソースのどこかに書いてるんでしょうか?
0321182014/01/04(土) 10:56:13.66
>>320
> 教えてくれないんですよ。

やっちゃダメってことだろ。
03223182014/01/04(土) 11:00:04.71
>>321
でもやりたいんですよ。
0323デフォルトの名無しさん2014/01/04(土) 11:26:36.29
データベースをいじることの危険性判ってんのかいな w
0324デフォルトの名無しさん2014/01/04(土) 11:32:17.50
>>320
DB ? サーバ ? クライアント
こういうふうになっていて
HTMLはサーバとクライアント間のやりとりに使われるものだから
DBのアドレスはHTMLのソースに書かれてないはずよ。

DBに接続するときふつうはDBのアドレスとユーザIDとパスワードが必要。
システム管理者からそれを教えてもらえないのであれば、
システム管理者と一緒にお酒飲みにいって酔わせて聞き出したり、
ノーパンしゃぶしゃぶに接待して聞き出すしか手はないと思うよ。
ノーパンしゃぶしゃぶがおすすめかな。しゃぶしゃぶできるし。
03253182014/01/04(土) 11:55:05.29
>>323
なにが危険ですか?
データを更新しないかぎり大丈夫じゃんと思いますが。

>>324
IDパスワードはそのサイトのログインと同じもので良さそうな気がしてますが。
DBのアドレスかホスト名がHTMLに書かれてなければどこに書かれているの?
黒画面からnetstatみたいなコマンドはダメですか?
しゃぶしゃぶのことは分からんがポン酢だれじゃなきゃイヤだ。ゴマだれは不味い。
0326デフォルトの名無しさん2014/01/04(土) 12:02:56.72
「数値が文字列として保存されています」というコメントがある
数値らしきものが入っているセルについての質問です。

これはIsnumeric関数ではTrueを返すのはやめてほしいです。
これは文字列なんだから。

このような処理をする必要に駆られたとき
みんなはどうしてますか?
03273262014/01/04(土) 12:05:05.32
だいたい数値をExcelが自動判別するというおせっかい機能が問題だ。
こんな機能は即廃止してほしい。
この機能を切る方法はない?

プログラミングでもvariant型みたいな中途半端な道具は即刻廃止してほしい。
数値らしきものも+や*で計算したら数値扱い、&や文字列とくっつける演算をしたら文字列扱いという機能もうざすぎる。
この機能も切る方法はない?
0328デフォルトの名無しさん2014/01/04(土) 12:07:02.81
' (アポー)が先頭に挿入された数字もこれは文字列なんだから
文字列と判断させる方法はない?
これもIsnumeric関数ではTrueと返しくさる。
0329182014/01/04(土) 12:16:11.12
>>324
> ノーパンしゃぶしゃぶがおすすめかな。

いまでも、あるんか?
0330182014/01/04(土) 12:21:05.25
>>326
おまえの嫌いな Variant に受けて、VarType( ) か TypeName( )
0331デフォルトの名無しさん2014/01/04(土) 12:23:36.78
>>325
まともな管理者ならDBの接続IDとサイトのログインIDを同じにするとは思えない。
>>325にDBの情報を教えなかったのならまともな管理者。ゆえにDBのIDとログインのIDは違うもの。
DBの接続に必要な情報はDBにアクセスするサーバ側のプログラムのソースコードに書かれているか、
またはサーバ側のプログラムから参照されてるはずよ。netstatで見えるのはサーバの状態。
DB <-> サーバ <-> クライアント
という形になるんでクライアントがやりとりするのはサーバ。
サーバの向こう側にあるDBはクライアントから見えない。
0332デフォルトの名無しさん2014/01/04(土) 12:42:08.74
867 名前:325 :2015/01/05(月) 13:46:36.00
年末のバッチ処理が管理外のセッションのロックでこけて大混乱になってクビにされた!!!
おまえらのせいだ!!! ぜったいにゆるさんぞ!!!!
0333デフォルトの名無しさん2014/01/04(土) 15:04:35.09
>>332
2015年の1月まで、一年間何もしなかった怠慢の結果だろ、クビになって当然。
未来が予想できるなら、対策しろ。
0334デフォルトの名無しさん2014/01/04(土) 15:10:01.15
>>332
「こけて」ってなに?
こういうまぎらわしい言葉の使い方はやめなさい。

[正しい使い方] (マラソンで)コケちゃいました。
0335デフォルトの名無しさん2014/01/04(土) 15:29:14.77
>>334
別に紛らわしくはないよね。揚げ足どりやめようよ。
0336デフォルトの名無しさん2014/01/04(土) 15:53:45.27
>>335
これが正しい用法だ。
http://www.youtube.com/watch?v=z8PbFRV287c
0337デフォルトの名無しさん2014/01/04(土) 16:12:51.03
正しい用法についてはもよりの日本語学校の先生にご相談ください
0338デフォルトの名無しさん2014/01/04(土) 16:53:32.53
プログラミング言語扱ってると自然言語にも厳しくなってしまうので気を付けないとね
0339デフォルトの名無しさん2014/01/04(土) 20:24:00.49
ここで諸君らに正月休みの宿題を出そう。
次の関数を作ってくれ。

・引数は3つ。すべてInteger。仮にx, y, zとする。

・戻り値は配列形式で、整数xから整数yまでの範囲の中の重複しないz個の乱数。
例えばx=10, y=20, z=5なら、返り値は11, 12, 16, 18, 20みたいな感じ。
不可能なx, y, zの組み合わせ(例えばx=10, y=12, z=5)なら返り値なしでMsgBox "アホ"でいい。

さあ時間だ。答えを聞こうる
0340デフォルトの名無しさん2014/01/04(土) 20:26:43.66
>>339
アホ
学校の宿題は自分でやれ
03413392014/01/04(土) 20:29:53.75
>>340
アホ。
宿題ではない。
このスレの住人のスキルをためしているんだ。
2分でレスがきたから2分で回答できたのかなと思ったら
アホとはなんだアホ。
0342デフォルトの名無しさん2014/01/05(日) 01:33:49.04
>>339
へい
friendpaste.com/ZYnwC5HKmO7uUdrIygMUr
0343デフォルトの名無しさん2014/01/05(日) 03:37:54.01
>>339
へい
>>1★1〜1★4
0344デフォルトの名無しさん2014/01/05(日) 09:56:45.34
エラーを人間に返してどうする
仕様がアホ
0345デフォルトの名無しさん2014/01/05(日) 12:20:51.84
>>339の回答を知りたいんだけど
z個の乱数をx〜yの範囲で発生させ
それらが同一のものが1つもないかどうか調べて (←このアルゴリズムも簡単ではないが)
なければそれで終了、あればまた最初からやりなおし、
という方法はどう?
もっといい方法ある?
0346デフォルトの名無しさん2014/01/05(日) 12:23:53.87
アホという人のほうがアホだと死んだばあちゃんが言っていました
0347デフォルトの名無しさん2014/01/05(日) 13:07:00.55
>>345
Excelと何の関係がある質問なのかが俺にはわからん
0348デフォルトの名無しさん2014/01/05(日) 13:16:30.45
というかその程度で簡単でないとか
0349デフォルトの名無しさん2014/01/05(日) 20:43:08.46
この前スレで話題になった
コードからFormのコントロールを貼り付けたときに
そのコントロールに対してのイベントプロシージャってどこに書けばいいのですか?
例えばコマンドボタンをx個(コードの時点では数は不特定)貼り付けたとき各ボタンを押したときの処理を書きたいとき。
0350デフォルトの名無しさん2014/01/05(日) 23:16:12.60
>>349
別に決まりはないんじゃないかな
03513492014/01/05(日) 23:23:09.77
じゃどこに書けばいいのかな?
そのオブジェクト名もまだ決まってないのよ
0352デフォルトの名無しさん2014/01/06(月) 00:31:50.25
前スレのどこ?
0353デフォルトの名無しさん2014/01/06(月) 09:21:30.74
>>351
クラスモジュールに書けばいいんじゃね?
03543492014/01/06(月) 10:49:35.66
>>353
具体的にはどうすればいいですか?
クラスというのは設計図と聞くけど
それをつかってコントロールを生成するには
どんな呪文をとなえればいいのでしょう?
03553492014/01/06(月) 10:50:52.64
あとクラスなんて使ったことないのですが
どんな書き方をすればいいですか?
単にコントロールボタンを置いてそれに1-2行の処理コードを書くだけのシンプルなものでいいのですが。
0356デフォルトの名無しさん2014/01/06(月) 11:12:25.62
シートのコピーごときで時間がかかってるのですが、これはなにが原因として考えられますか?
同じシートを10枚くらいとなりにコピーしてるだけなのですが。
0357デフォルトの名無しさん2014/01/06(月) 12:00:36.77
だからそういう時はその部分のコード晒せよ
03583562014/01/06(月) 12:12:32.18
>>357
Sub セシウムさん()
Dim i as Integer
For i=1 to 10
Sheets("ひみつのあっこちゃん.xls").Copy After:=Sheets(Sheets.Count)
Next i
End Sub
0359デフォルトの名無しさん2014/01/06(月) 12:45:47.60
>>354-355
そんなのはここで質問するよりググればいいよ
0360デフォルトの名無しさん2014/01/06(月) 23:26:08.03
>>358
ワークシート名がファイル名と一緒なん?
まぁほんとにそのコードで動いてるんなら、単にコピー元のシートが大きいだけじゃね。
どうしようもないなら描画抑制すれば?
0361デフォルトの名無しさん2014/01/07(火) 02:22:41.82
どのくらいの時間がかかってるのか知らんが
セルに外部参照とかあって再計算が遅いだけじゃないのか
それか単純に使ってるマシンが貧弱か
0362デフォルトの名無しさん2014/01/07(火) 10:00:26.33
クラスモジュールのメソッドを呼ぼうとすると、
インデックスが有効範囲にありませんとエラーになります。
メソッド名も間違ってないし、メソッドはPublicにしてるし、他に何の原因が考えられますか?
0363デフォルトの名無しさん2014/01/07(火) 12:10:13.78
>>362
シート名が間違ってる
ワークシートじゃなかった場合、コレクションを片っ端からチェック
0364デフォルトの名無しさん2014/01/07(火) 12:59:21.42
>>362
そういう時は現象が発生する最低限のコードで試すんだ
本当に呼んでるメソッドに問題がないなら、引数に問題があるんじゃね
0365デフォルトの名無しさん2014/01/07(火) 13:22:03.22
>>362
エラーメッセージは読まない主義?
0366デフォルトの名無しさん2014/01/07(火) 14:32:56.47
>>365
今までに見たエラーは忘れる主義?
覚えてたら「インデックスが有効範囲にありません」は正式なエラーメッセージだってわかるじゃん?
http://www.07ch.net/up2/src/lena10519.png
0367デフォルトの名無しさん2014/01/07(火) 14:59:55.51
VBAのアルゴリズムで
重複しない整数の乱数をx〜yの範囲でz個出力するにはどうすればいいですか?
0368デフォルトの名無しさん2014/01/07(火) 15:03:59.54
配列で要素数が決まってないものを使うときのルールを教えてくださいますか?

Variantで
Dim a as Variant
Dim a() as Variant
に違うはありますか?

Dim b() as String
の場合、b(1)=・・・、b(2)=・・・と代入しようとするとエラーがでてエラいこっちゃとなります(いま話題の「インデックスが有効範囲にありません」のエラー)。
それなら動的配列の意味ないじゃん?と思いますが。
0369デフォルトの名無しさん2014/01/07(火) 15:10:39.77
VBAのクラスモジュールの存在意義を教えてください。
これはどのVBAの本を読んでも載っていないんですよね。
他の言語では使われてるらしいけど(ちなみにわたしは他言語は全く知りません)。
0370デフォルトの名無しさん2014/01/07(火) 16:07:00.18
>>367
年末〜年始の授業が乱数、教師はここを含めて見てる
ここで教えてもらったの提出しても点数貰えないよ
2012年にも、ネットで得たのを、そのまま提出した生徒がいた
03713672014/01/07(火) 16:09:30.50
>>370
そんなこと言わず早く教えてくれよ。
あしたがしめきりなんだよ!
先生はこんなところ見るような人じゃないんで大丈夫だよ。
0372デフォルトの名無しさん2014/01/07(火) 16:29:51.49
>>368
>>369
さすがにggrks
03733682014/01/07(火) 18:04:42.24
>>372
そんなのイヤなこった、パンナコッタ。
0374デフォルトの名無しさん2014/01/07(火) 18:11:17.83
>>367 これでいい?
Dim ran() As Integer: Dim x As Integer: Dim y As Integer: Dim z As Integer
Dim n1 As Integer: Dim n2 As Integer: Dim m As Integer: Dim ck As Boolean
x = InputBox("x"): y = InputBox("y"): z = InputBox("z")
ReDim ran(y - x)
For n1 = 0 To z - 1
ck = False
m = Int(Rnd * (y - x + 1))
For n2 = m To y - x
If ran(n2) = 0 Then
ran(n2) = 1
ck = True
Exit For
End If
Next n2
If ck = False Then
For n2 = 0 To m - 1
If ran(n2) = 0 Then
ran(n2) = 1
ck = True
Exit For
End If
Next n2
End If
Next n1
Dim str As String
For n1 = 0 To y - x
If ran(n1) = 1 Then
str = str + CStr(n1 + x) + ","
End If
Next
MsgBox str
03753672014/01/07(火) 18:22:42.41
>>374
ありがとう。
ちょっと動作確認してみます。

あとx〜yの範囲よりzの個数が大きいときに「アホ」と出ずにすべての範囲の数字が表示されるというバグがあるぞ。
0376デフォルトの名無しさん2014/01/07(火) 18:47:58.46
>>367
この手法での回答は自分で考えてないと、先公にチクッとく
0377デフォルトの名無しさん2014/01/07(火) 19:00:29.61
>>375
簡単なことは自分でやってくれ。
あと19行目のck = Trueは余分だった、消してくれ。
0378デフォルトの名無しさん2014/01/07(火) 19:10:24.76
>>6
出番だぞ
0379デフォルトの名無しさん2014/01/07(火) 20:30:12.18
未だに悔しがってるの?
0380デフォルトの名無しさん2014/01/07(火) 20:59:23.37
>>1★5は解禁?
0381デフォルトの名無しさん2014/01/07(火) 21:24:14.13
ここで駄々こねて駄目って言ったらみんな次スレに行っちゃうから
泣き寝入りだろうな
0382デフォルトの名無しさん2014/01/07(火) 22:20:52.87
>>376
誰の何の先生なんだろう・・・かかりつけのお医者さんとか?おだいじにどうぞ
0383デフォルトの名無しさん2014/01/08(水) 20:42:14.12
フォーム利用してるとき、フォーム用のモジュールにUnload Meみたいに"Me"は使えますが
標準モジュールの宣言部分の変数を扱いときは、Me.iTestValueみたいに"Me"は使えないのはなぜですか?
0384デフォルトの名無しさん2014/01/08(水) 20:50:31.13
>>383
そのMeは何を指してるのか考えてみれば?

とは言えVBAではインスタンスって概念が解りにくいからなぁ
標準モジュールはインスタンス作成されないからインスタンスをあらわすMeは使えません
0385デフォルトの名無しさん2014/01/08(水) 21:03:54.67
>>384
なるほど、さっぱりわかりませんがありがとうございます。
インスタンスならMeが使えるということですか。
■ このスレッドは過去ログ倉庫に格納されています