Excel VBA 質問スレ Part32
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2013/10/07(月) 22:19:55.86★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/
0338デフォルトの名無しさん
2014/01/04(土) 16:53:32.530339デフォルトの名無しさん
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アホ
学校の宿題は自分でやれ
0341339
2014/01/04(土) 20:29:53.75アホ。
宿題ではない。
このスレの住人のスキルをためしているんだ。
2分でレスがきたから2分で回答できたのかなと思ったら
アホとはなんだアホ。
0342デフォルトの名無しさん
2014/01/05(日) 01:33:49.04へい
friendpaste.com/ZYnwC5HKmO7uUdrIygMUr
0343デフォルトの名無しさん
2014/01/05(日) 03:37:54.01へい
>>1★1〜1★4
0344デフォルトの名無しさん
2014/01/05(日) 09:56:45.34仕様がアホ
0345デフォルトの名無しさん
2014/01/05(日) 12:20:51.84z個の乱数をx〜yの範囲で発生させ
それらが同一のものが1つもないかどうか調べて (←このアルゴリズムも簡単ではないが)
なければそれで終了、あればまた最初からやりなおし、
という方法はどう?
もっといい方法ある?
0346デフォルトの名無しさん
2014/01/05(日) 12:23:53.870347デフォルトの名無しさん
2014/01/05(日) 13:07:00.55Excelと何の関係がある質問なのかが俺にはわからん
0348デフォルトの名無しさん
2014/01/05(日) 13:16:30.450349デフォルトの名無しさん
2014/01/05(日) 20:43:08.46コードからFormのコントロールを貼り付けたときに
そのコントロールに対してのイベントプロシージャってどこに書けばいいのですか?
例えばコマンドボタンをx個(コードの時点では数は不特定)貼り付けたとき各ボタンを押したときの処理を書きたいとき。
0350デフォルトの名無しさん
2014/01/05(日) 23:16:12.60別に決まりはないんじゃないかな
0351349
2014/01/05(日) 23:23:09.77そのオブジェクト名もまだ決まってないのよ
0352デフォルトの名無しさん
2014/01/06(月) 00:31:50.250353デフォルトの名無しさん
2014/01/06(月) 09:21:30.74クラスモジュールに書けばいいんじゃね?
0354349
2014/01/06(月) 10:49:35.66具体的にはどうすればいいですか?
クラスというのは設計図と聞くけど
それをつかってコントロールを生成するには
どんな呪文をとなえればいいのでしょう?
0355349
2014/01/06(月) 10:50:52.64どんな書き方をすればいいですか?
単にコントロールボタンを置いてそれに1-2行の処理コードを書くだけのシンプルなものでいいのですが。
0356デフォルトの名無しさん
2014/01/06(月) 11:12:25.62同じシートを10枚くらいとなりにコピーしてるだけなのですが。
0357デフォルトの名無しさん
2014/01/06(月) 12:00:36.770358356
2014/01/06(月) 12:12:32.18Sub セシウムさん()
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そんなのはここで質問するよりググればいいよ
0360デフォルトの名無しさん
2014/01/06(月) 23:26:08.03ワークシート名がファイル名と一緒なん?
まぁほんとにそのコードで動いてるんなら、単にコピー元のシートが大きいだけじゃね。
どうしようもないなら描画抑制すれば?
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シート名が間違ってる
ワークシートじゃなかった場合、コレクションを片っ端からチェック
0364デフォルトの名無しさん
2014/01/07(火) 12:59:21.42そういう時は現象が発生する最低限のコードで試すんだ
本当に呼んでるメソッドに問題がないなら、引数に問題があるんじゃね
0365デフォルトの名無しさん
2014/01/07(火) 13:22:03.22エラーメッセージは読まない主義?
0366デフォルトの名無しさん
2014/01/07(火) 14:32:56.47今までに見たエラーは忘れる主義?
覚えてたら「インデックスが有効範囲にありません」は正式なエラーメッセージだってわかるじゃん?
http://www.07ch.net/up2/src/lena10519.png
0367デフォルトの名無しさん
2014/01/07(火) 14:59:55.51重複しない整数の乱数をx〜yの範囲でz個出力するにはどうすればいいですか?
0368デフォルトの名無しさん
2014/01/07(火) 15:03:59.54Variantで
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の本を読んでも載っていないんですよね。
他の言語では使われてるらしいけど(ちなみにわたしは他言語は全く知りません)。
0370デフォルトの名無しさん
2014/01/07(火) 16:07:00.18年末〜年始の授業が乱数、教師はここを含めて見てる
ここで教えてもらったの提出しても点数貰えないよ
2012年にも、ネットで得たのを、そのまま提出した生徒がいた
0371367
2014/01/07(火) 16:09:30.50そんなこと言わず早く教えてくれよ。
あしたがしめきりなんだよ!
先生はこんなところ見るような人じゃないんで大丈夫だよ。
0372デフォルトの名無しさん
2014/01/07(火) 16:29:51.49>>369
さすがにggrks
0373368
2014/01/07(火) 18:04:42.24そんなのイヤなこった、パンナコッタ。
0374デフォルトの名無しさん
2014/01/07(火) 18:11:17.83Dim 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
0375367
2014/01/07(火) 18:22:42.41ありがとう。
ちょっと動作確認してみます。
あとx〜yの範囲よりzの個数が大きいときに「アホ」と出ずにすべての範囲の数字が表示されるというバグがあるぞ。
0376デフォルトの名無しさん
2014/01/07(火) 18:47:58.46この手法での回答は自分で考えてないと、先公にチクッとく
0377デフォルトの名無しさん
2014/01/07(火) 19:00:29.61簡単なことは自分でやってくれ。
あと19行目のck = Trueは余分だった、消してくれ。
0378デフォルトの名無しさん
2014/01/07(火) 19:10:24.76出番だぞ
0379デフォルトの名無しさん
2014/01/07(火) 20:30:12.180380デフォルトの名無しさん
2014/01/07(火) 20:59:23.370381デフォルトの名無しさん
2014/01/07(火) 21:24:14.13泣き寝入りだろうな
0382デフォルトの名無しさん
2014/01/07(火) 22:20:52.87誰の何の先生なんだろう・・・かかりつけのお医者さんとか?おだいじにどうぞ
0383デフォルトの名無しさん
2014/01/08(水) 20:42:14.12標準モジュールの宣言部分の変数を扱いときは、Me.iTestValueみたいに"Me"は使えないのはなぜですか?
0384デフォルトの名無しさん
2014/01/08(水) 20:50:31.13そのMeは何を指してるのか考えてみれば?
とは言えVBAではインスタンスって概念が解りにくいからなぁ
標準モジュールはインスタンス作成されないからインスタンスをあらわすMeは使えません
0385デフォルトの名無しさん
2014/01/08(水) 21:03:54.67なるほど、さっぱりわかりませんがありがとうございます。
インスタンスならMeが使えるということですか。
0386デフォルトの名無しさん
2014/01/08(水) 21:05:24.61Public iTest as Integer
とし、貼り付けたボタン押せばiTest=iTest+1としてるんですが
標準モジュールで書くiTestは別人となってるようなんです。
これはどういうことでしょうか?
0387デフォルトの名無しさん
2014/01/08(水) 21:15:33.34フォームと標準モジュールでそれぞれiTestを宣言したのか?
そりゃ宣言が二つあるんだからiTestは二つ(以上)あるだろ
0388デフォルトの名無しさん
2014/01/08(水) 21:17:12.77>標準モジュールで書くiTestは別人となってるようなんです。
これはどういうことでしょうか?
つまり、もっと詳しく。標準でDIMとかした人?
あと、ここは学校じゃないので、、、
たぶん今の君の疑問の殆どはインターネットを探せばいくらでも出てくると思うよ
0389386
2014/01/08(水) 21:25:42.19いえ、フォームモジュールだけでiTestを宣言したんですよ
0390デフォルトの名無しさん
2014/01/08(水) 21:26:13.560391デフォルトの名無しさん
2014/01/08(水) 21:26:43.800392デフォルトの名無しさん
2014/01/08(水) 21:29:48.75Option Explicitつけてるか?
つけないで標準モジュールで使ったiTestは、標準モジュールで宣言が省略されてるとみなされてる
0393デフォルトの名無しさん
2014/01/08(水) 21:32:05.400394デフォルトの名無しさん
2014/01/08(水) 21:33:40.51標準モジュールで使えないとおかしくないか?
0395デフォルトの名無しさん
2014/01/08(水) 21:57:07.64違うところで宣言されてる変数を使いたければ、どこの変数かも指定しないとダメ
標準モジュールで宣言されてるなら標準モジュールの名前
クラスやユーザフォームで宣言されてる変数なら、そのインスタンスへの参照
を変数の前に指定して.でつなぐ
インスタンスを意識しなくて標準モジュールで使うなら、たとえば
UserForm1.iTest = 0
みたいな感じ
0396デフォルトの名無しさん
2014/01/08(水) 22:21:49.80そうだったのですか!
ご丁寧な解説ありがとうございます。
各モジュールの中ではいいけどそうでなければ[モジュル名]と.でつなげばいいんですね。
ところで「インスタンスを意識しなくて標準モジュールで使う」の意味がさっぱりわからないけど
なんかこの概念はすごく重要そうな気がするんですが
どういうことなのでしょうか?
VBAでは完全にはオブジェクト指向でないから標準モジュールはもともとインスタンス(??)という意味でしょうか?
0397デフォルトの名無しさん
2014/01/09(木) 00:51:11.25標準モジュールはもともとインスタンス作成したりしない
インスタンスなしで実行できる
クラスは、使うためには自分でインスタンスを作成してそのインスタンスを使う
ユーザフォームはクラスの一種なんで、使うにはホントは自分でインスタンス作成しないとダメなんだが
いろんなしがらみによって自分で作成なくてもインスタンス(とそれへの参照)が用意されている
それが>>395のUserForm1見たいにユーザフォーム名で使えるやつ
これは実はUserForm1というフォーム(の定義、型)じゃなくて、暗黙のうちに作成されたUserForm1のインスタンスへの参照
標準モジュールはもともとインスタンス じゃなくて フォームは勝手にインスタンスが作られてる
が正解
0398396
2014/01/09(木) 01:16:40.59なるほどぉ。
・・・というのはウソで、さっぱり分かりませんわ。
勉強して出直してきます。
0399デフォルトの名無しさん
2014/01/10(金) 19:26:18.39たぶんほとんどの人が知らないでしょう。
普通の関数(VBAじゃない)では、大文字と小文字は区別しないのに
VBAの比較では、大文字と小文字は区別するんですよ。
これ、それぞれで別の方法で比較するにはどうすればいいですか?
0400399
2014/01/10(金) 19:29:17.35VBAで大文字と小文字を区別しない方法って普通はどうしてますか?ということです。
例えば、
If a = a.Offset(0, 1) Then
a.Offset(0, 2) = "O"
Else
a.Offset(0, 2) = "X"
End If
とすると、"ABC"と"aBc"を比べたとき別モノと判断するんですよ。
0401399
2014/01/10(金) 19:31:27.34・関数で全部大文字にしてから比較
という方法だけど、もっと手軽な方法があるかと思って。
0402デフォルトの名無しさん
2014/01/10(金) 19:42:47.150403399
2014/01/10(金) 19:47:23.740404デフォルトの名無しさん
2014/01/10(金) 19:56:04.73VBEで適当なところにoptionと入力してカーソル合わせてF1キー押して調べて教えて
0405デフォルトの名無しさん
2014/01/10(金) 20:19:55.330406デフォルトの名無しさん
2014/01/10(金) 20:46:23.15> たぶんほとんどの人が知らないでしょう。
いや、使ってみればわかるんだから、普通知ってるって
> 普通の関数(VBAじゃない)では、大文字と小文字は区別しないのに
まず「ワークシート関数」という名称を覚えましょう
そして大小文字を区別しないのは、ワークシート関数の仕様ではなく、ワークシート上での比較演算の仕様ね
つまり「=("ABC"="abc")」が、Trueを返すかFalseを返すかという問題
> これ、それぞれで別の方法で比較するにはどうすればいいですか?
ワークシート上の数式で大小文字を区別するならEXACT関数
VBAで大小文字を区別しないならOption Compare TextやStrCompや正規表現のIgnoreCase
0407デフォルトの名無しさん
2014/01/10(金) 20:53:34.650408デフォルトの名無しさん
2014/01/10(金) 21:29:56.07とか、ネタにマジレスするフリしてみるテスト
0409407
2014/01/10(金) 21:43:59.760410デフォルトの名無しさん
2014/01/10(金) 21:49:15.86女性においては塗れ具合
これが正規表現です
勘違いしがちですが露出は関係ありません
0411デフォルトの名無しさん
2014/01/10(金) 21:53:33.60携帯で見てて、3段改行の下に書かれてることに気付いてないとか?
0412デフォルトの名無しさん
2014/01/10(金) 22:00:57.260413デフォルトの名無しさん
2014/01/10(金) 23:48:36.66・Sleep関数
・DoEvents
の違いはなんでしょう?
OSに制御を渡すことと関係あるそうですが
そもそもOSのしくみとは?
OSはいろんなプログラムを順番に高速で実行させることによって見かけのマルチタスクを実現しているんですよね?
0414デフォルトの名無しさん
2014/01/11(土) 00:01:47.750415デフォルトの名無しさん
2014/01/11(土) 00:14:16.330416デフォルトの名無しさん
2014/01/11(土) 00:34:54.62あなたは(1)教えるのが下手か(2)いじわるの人
こんど発言するときは名前欄に(1)か(2)のご記入をお願い。
質問を変えよう。
どういうときにSleepを使って、どういうときにDoEventsを使いますか?
0417デフォルトの名無しさん
2014/01/11(土) 00:36:30.340418デフォルトの名無しさん
2014/01/11(土) 01:25:05.910419デフォルトの名無しさん
2014/01/11(土) 02:30:45.99あいつなら回答しそうだけど最近来ないしね
0420デフォルトの名無しさん
2014/01/11(土) 04:00:34.13横からごめんね、最近低レベルな質問してる人だよね
名前欄に低能とか初級とか、程度がわかる名前を入れておいてくれよ
0421デフォルトの名無しさん
2014/01/11(土) 04:44:36.37Sleepは、自主的にCPUの実行権を放棄して、
他のプロセスに、CPUのタイムスライスを与える
DoEventsはイベントキューから、
イベントをとって処理する?
0422デフォルトの名無しさん
2014/01/11(土) 07:17:37.53いちおうマジレスしとくけど
Sleep使うとき
スレッドをしばらく停止しておきたいとき
DoEvents使うとき
溜まってるメッセージキューを処理したいとき
まあ出来れば二度と来ないでください
0423低脳
2014/01/11(土) 11:19:55.48そのスレッドとかメッセージキューとは、どういう概念ですか?
0424デフォルトの名無しさん
2014/01/11(土) 12:08:58.66スレッドはプロセス内部で実行単位をさらに分割したもの
VBAなら1プロセス1スレッド
1CPUが割り当てられ4コアなら25%の力を引き出せる
他言語で1プロセスnスレッドが可能なものもある
やはり1スレッドに1CPUの割り当てとなるが4スレッド使えば4コアを100%使い切れる
メッセージはWindowsのGUIの仕組み
キーボード、マウスクリックその他イベントのトリガーは全てGUI部品に対するメッセージで実現されている
めんどくさいやめた
0425デフォルトの名無しさん
2014/01/11(土) 12:50:23.25DoEventsはユーザーの入力待ちに使う。他のアプリと連携するときに使うこともある
ある意味、関数内で隠しのアプリケーションを一つ立ち上げるのに近いので
使い方よりも内部を理解して注意点を把握することが大事
キーワードはイベントループ、メッセージポンプ、メッセージループ(呼び方はいろいろ)
もっと簡単に言うと学ぶ気のない奴は去れ
0426デフォルトの名無しさん
2014/01/11(土) 12:58:28.43低能で厚顔無恥はスルーだろjk
0427デフォルトの名無しさん
2014/01/11(土) 13:14:53.49お前はググらなければわからないってだけじゃ・・・
0428デフォルトの名無しさん
2014/01/11(土) 15:15:33.46その別ブックを閉じるとその変数を参照できません。
これを防ぐにはどうすればいいのでしょうか?
0429デフォルトの名無しさん
2014/01/11(土) 15:39:13.08オブジェクトの場合はセルの場所が記憶されるだけなのでブックを閉じるとセルの中身は見えなくなる
オブジェクトじゃない変数にセルの中身(値)を記憶しておけばいい
0430デフォルトの名無しさん
2014/01/11(土) 20:10:43.64その方法とは?
0431デフォルトの名無しさん
2014/01/11(土) 20:12:55.39設計書見せて
0432デフォルトの名無しさん
2014/01/11(土) 20:43:43.23構造体やクラスのように複数の子要素をもつ型を返すようにするのが基本じゃね?
まぁ他にも配列や連想配列を返すとか、グローバル変数を介するとか
いくらでも方法はあるけどね
0433デフォルトの名無しさん
2014/01/11(土) 22:05:29.031〜10の縦並びの表で、調査結果が飛び飛びに得られ、
データが得られなかった番号のみを抽出してそれのみの
新たな表を作成するVBAプログラムを作りたいのですが、
表番号 調査項目
1 xx
2 xx
3 xx
4 xx
・
・
10 xx
2,3,5,7,10 の調査結果が得られ調査結果が得られた順に結果のみの新たな表が別のブックに作成される.
↓
最初の表から未調査の1,4,6,8,9のみの表を作成しそれを元に再調査と言った流れです。
仮に10としてありますが実際の表は1000以上あり手で消すのは現実的ではありません
除外する方法を色々考えましたがすぐ出来そうで簡単にはできないようで行き詰まりました。
宜しくお願い致します。
0434デフォルトの名無しさん
2014/01/11(土) 22:10:53.29調査結果が得られたかどうかはどうやって判断するんだ?
つか、VBA使わんでも、その条件でフィルタかければ良いだけな気はするがな
0435デフォルトの名無しさん
2014/01/11(土) 22:19:02.70複数の戻り値っていうのが同じ方(例えば二つの数値とかだったら、
数値型の配列を返すとか。
0436433
2014/01/11(土) 22:19:05.56結果が得られた順に別ブックへ結果を記載して保存される仕組みになっています。
(調査結果(別ブック))
表番号 調査項目 調査結果
2 xx false xx
3 xx true xx
7 xx true xx
5 xx true xx
10 xx false xx
何気にこの状態から表番号を1〜10に補って並べ替えるのも方法が思いつきません、、
逆に1〜10から上の数値を間引く方法もわからない感じです、、
0437ピラフ
2014/01/11(土) 22:25:15.62/ \
/ ─ ─\
/ (●) (●) \
| (__人__) |
\ ` ⌒´ ,/
/ ::::i \
/ / ::::|_/
\/ ::|
| ::::| キュム
i \ ::::/ キュム
\ |::/
|\_//
\_/
0438433
2014/01/11(土) 22:48:47.30>>435
素人なりに1つだけ思いついた方法は
結果値の表番号を一つ一つサーチして該当する行を1行削除するを繰り返し
削除後にソートして寄せると完成しますが
数百回処理を繰り返す必要がり力業っぽい
のでこのやり方は違うかなと思いました
■ このスレッドは過去ログ倉庫に格納されています