トップページtech
1002コメント383KB

Excel VBA 質問スレ Part39 [転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2015/11/27(金) 20:36:45.35ID:9HV+ag/s
ExcelのVBAに関する質問スレです

                   ___
       ___      /____ヽ      ____
      /____\    | |´・ω・`| |    /___ヽ
      .l |´・ω・`|  ニX二 . ̄ ̄ ̄  二X二  |´・ω・`| l 俺たちに任せろ
      !、 ̄ ̄ ̄  ヽ   |       |    /    ̄ ̄ ̄/
       ヽ_/ヽ、  ヽ__)  \__/\_/.   /_/  ノヽ_/
             ̄                ̄ ̄

このスレはコード書き込みOKです。
作成依頼もOKですが、作成依頼限定ではありません。

コードが嫌な人・作成依頼が嫌な人は別スレ建ててください。

※前スレ
Excel VBA 質問スレ Part38 [転載禁止]2ch.net
http://peace.2ch.net/test/read.cgi/tech/1441619979/
0159デフォルトの名無しさん2015/12/24(木) 15:57:20.63ID:ta6MMntY
>>157
VBAにおいて推奨するスタイルが変わったって記事は見たことが無いから
たぶん今でも一応そのスタイルが推奨なんじゃね

言語が変わればまた話は変わるけどな

VBAはVB6とほぼ同じスタイルが推奨されてたけど
VB6のスタイルはVB.NETでは推奨されてない奴も多いし

>>158
おれの記憶ではVBAは当初からずっと、先頭以外でもDim出来たが
0160デフォルトの名無しさん2015/12/24(木) 16:00:38.09ID:Xid/rDIR
言語仕様が変わってないから推奨される記述スタイルも変わってなさそう
0161デフォルトの名無しさん2015/12/24(木) 16:30:39.57ID:+bsSlAyH
まあ最近の流れは、どの言語でも使用する直前で変数宣言するのが推奨されてるから、
2001年の古い記事に従うこともないと思うがな。
0162デフォルトの名無しさん2015/12/24(木) 17:04:02.10ID:acHF714F
>>159
そうだっけ?なら自分の記憶違いかな。
使用直前の宣言はもちろんいいんだけど、VBAって初期化を同時にできないのがすごく残念だと思う。

Dim rootPai As Double = 2 * Atn(1#) ^ 0.5
って書きたいし、もっと言えば
Const rootPai As Double = 2 * Atn(1#) ^ 0.5
としたい。
0163デフォルトの名無しさん2015/12/24(木) 21:25:39.16ID:ta6MMntY
Const、式もかけたはずだと思ってしらべたけど
>リテラル値、その他の定数、Is を除く算術演算子や論理演算子を組み合わせた式を指定します。
らしい
関数とか使わん単純な計算式しか書けないのね
まあ、定数なんだから関数とか呼ぶなってことか
0164デフォルトの名無しさん2015/12/24(木) 22:14:19.63ID:ZMYfZV7G
VBAはコンパイラじゃないから・・・
0165デフォルトの名無しさん2015/12/25(金) 00:23:24.10ID:H9I2iCjo
>>150

>結局Optiob Explicitなんてシートベルトの価値ではなくて、チャリンコの補助輪の価値しかないと思う。

Optiobなんて書き間違えるくらいだし
そっちにはチャリンコの補助輪程度でも必要なんじゃないの?
0166デフォルトの名無しさん2015/12/25(金) 00:55:16.56ID:QRbvg4rg
もうほっときなよ
「補助輪なんていらねーよ」と言いながら実際は補助輪を外したことがないというオチがもう付いてるじゃないかw
0167デフォルトの名無しさん2015/12/25(金) 01:04:21.93ID:VYJL9Hps
Dim camelCase As Long
って宣言をして、プロシージャ内でその変数を使うときは "camelcase" ってタイプする。
その直後に "camelCase" になったらtypoしてないし、でなきゃypoがある。
いつのまにやらそういう癖がついた。
0168デフォルトの名無しさん2015/12/25(金) 08:22:37.15ID:pG0WUl9G
ypoしてますね
0169デフォルトの名無しさん2015/12/25(金) 08:25:15.59ID:zlW/tpNm
シャレか
0170デフォルトの名無しさん2015/12/25(金) 16:52:37.89ID:WI9GtdKx
他人の書いたOption Explicitを使ってないコードをデバッグしてて、
変数名が間違っててそれぞれ別の変数として判別されてたのはみた事がある

コードが短かったからすぐ気がついたけど
長いコードだったら気付かず見過ごしてたかもしれない

後自分で書いたコードでは Option Explicit は必ず付けてるんだけど、
配列変数の宣言は
Dim Hoge() As Long
みたいに動的に宣言して、後から
Redim Hoge(5)
みたいに要素数を再定義してた

そしたら Redim の所で変数名間違えてて
最初の変数が要素数不定のままでエラーになってしまい、
原因が分らずに悩んだ事があった

Redimだけでも変数宣言として認められちゃうから
Option Explicit 使ってても
こういうパターンの間違いだとエラーにならんのよね
0171デフォルトの名無しさん2015/12/25(金) 19:17:09.01ID:zlW/tpNm
やっぱり赤い波線がほしいな
0172デフォルトの名無しさん2015/12/26(土) 07:11:55.98ID:4Qu0RrtJ
>>171
.Netのインテリセンスのこと?
.Net暫くやってて久しぶりにVBAでコーディングすると
余りの入力補助の利かなさにメモ帳に書いてるんじゃないかと錯覚するときあるよね。

特に打ち掛けのとき、変数名とか忘れて離れたところからコピーで取ってこようとすると
「ぷりん」とか音たててエラーメッセージが出て、元の行に飛ばされるのにはカチンとくる。
0173デフォルトの名無しさん2015/12/26(土) 07:39:57.84ID:c6cv0Mwc
自分も>>167のやり方は実践している。
Dim list_1 という宣言に対しては、liST_1 とか入力するの。
慣れると小指が勝手にシフトキーを押すようになるw
0174デフォルトの名無しさん2015/12/26(土) 18:14:13.26ID:0Oe8t7C6
>>172
自動構文チェック外せよ
0175デフォルトの名無しさん2015/12/28(月) 09:45:36.91ID:6hjtvMur
処理が終わったらPCをスリープ状態にする方法を教えてください。
0176デフォルトの名無しさん2015/12/28(月) 10:05:26.91ID:aQp7bRaK
まだか?
処理が終わったらPCをスリープ状態にする方法を教えたまえ
0177デフォルトの名無しさん2015/12/28(月) 10:39:16.43ID:FcSlXts6
>>175
    1         2           3           4

.     __                       __             _
    ,i,_,i_        ,-,_         ,-i,_,l 、      :.. :. ≡=-i'__l,
    |  `i         /'-' `i         //l   l       iコ==ラ`'i ti
    | lヽi li,   →  | lヽl li   →   l i,,l   l |   →     ./  /l/
    | l-'l |,l       | | // l        `"|iコ=''         /  /
.    'Fヲ|,H      E三l_l_A         | .i .|         /  /
    ,i_| .| |                   | || |         i' /l .l,
     -'‐'                      | || |_       l l .ヽ,ヽ,
                          ‐' ' `‐'       -'-'  -'-'
    脱ぐ       たたむ      コーヒーを     砂糖と塩を
                         つくる      まちがえる。
0178デフォルトの名無しさん2015/12/28(月) 12:05:07.13ID:6hjtvMur
>>177
やってみましたがうまくいきません
0179デフォルトの名無しさん2015/12/28(月) 12:15:06.34ID:ylUAFX7e
ちょっと調べてみたが SetSuspendStateって使えるのかな?
0180デフォルトの名無しさん2015/12/28(月) 13:10:18.21ID:ehrXe3tW
>>179
Declare定義してやれば 使えたよ
ちなみに(Windows8.1 + Excel2013)
0181デフォルトの名無しさん2015/12/28(月) 13:16:09.60ID:ylUAFX7e
>>178
じゃあSetSuspendstate使ってみれば?
仮想環境とかだと上手くいかないかもしれないが。
01821802015/12/28(月) 14:13:12.83ID:ehrXe3tW
>>175,178
専ブラスレの騒動に見舞われたので詳しく書けないけど

https://msdn.microsoft.com/en-us/library/aa373201(VS.85).aspx
あたりが参考にならないかな?(VBAじゃないけどね)

あとは ぐぐって
0183デフォルトの名無しさん2015/12/29(火) 10:58:22.65ID:u34Ypxab
プロシージャ名/関数名はすべてラクダ型の文字列にしたいのですが
その夢がかなわない単語1つのときはどうしたらいいですか?

[通常]
createSheet
fillData

[問題]
initialize
0184デフォルトの名無しさん2015/12/29(火) 11:42:28.29ID:WJw28H2b
>>183
単語2つ目をひねり出すか…
そのままでも問題なさそうだけど
0185デフォルトの名無しさん2015/12/29(火) 15:31:29.70ID:fz57zrCL
>>183
ふと思ったんだけど
[通常] の方は "どうする"+"何を" になってるけど
[問題] の方は "どうする" だけなんよね

だったらこっちも "どうする" + "何を"にすればよくね?
initializeData
initializeCell
とかとか

こう出来ない理由とかあるの?
0186デフォルトの名無しさん2015/12/30(水) 14:22:33.58ID:WC2i3iyl
For each構文でループを回すとき、
一番最初のループだけ特別なコードを1行書きたいのですが
その判別はどうします?

ノーマルなFor i=1 to構文では、If i=1 Thenと単純ですが。
0187デフォルトの名無しさん2015/12/30(水) 14:34:26.62ID:PBmz2gbU
foldl1を使う。
0188デフォルトの名無しさん2015/12/30(水) 14:43:38.04ID:JPIixvGP
扱う物によって色々やり方があるだろ。
だいたい同一処理を分かりやすくする為にEachがあるのであって、違う処理するならEachに含めちゃダメだろ。
0189デフォルトの名無しさん2015/12/30(水) 15:23:36.66ID:yH9ydeBO
>>186
forでやらない理由は?
0190デフォルトの名無しさん2015/12/30(水) 15:37:44.87ID:WC2i3iyl
>>187
なにそれ?
>>188
For eachがわかりやすいので可能な限り絶対この構文を使っています(For i=1は古い)。
でもそんなときでも最初のループだけ実行したいステートメントがあるというのはVBAの経験の浅い人じゃなければよくあると思うのですが。
>>189
Forでやると言ってるのですが
0191デフォルトの名無しさん2015/12/30(水) 15:42:53.87ID:WC2i3iyl
オブジェクト変数で
Set objTest = Nothing
という解放処理をするべきかどうかの議論がときどきありますが、
そもそもメモリ使用に関してこのSet objTest = Nothingはなにをやっているのでしょうか?
これがはっきり分かっていないままで議論しても意味がないと思うのですが。

基本的にオブジェクト変数の場合でもプロシージャ内の変数はプロシージャを抜けると役目を終えたということで消えますが
その参照先であるオブジェクトの実体はメモリに残ったままですよね?
Javaのガベージコレクションの機能があるという話はこのVBAで聞いたことが無いので
もしその実体をSet objTest = Nothingで消せるということなら
いかなるオブジェクト変数を使ったあとは必ずSet objTest = Nothingを書くべき、というのが(もし上の仮定が正しい場合)わたしの見解なのですが。
01921832015/12/30(水) 15:47:44.59ID:WC2i3iyl
わたしは183でもありました。

>>184

>>185
それはinitializeという英単語が引数を2つとる動詞、つまり1つ目の引数は「実行する主体」、2つ目の引数が「初期化される物」でうまくいきますが
例えば引数を1つしか取らない英単語、例えばrunだとかdieだとかappearの場合どうしたらいいのですか?
0193デフォルトの名無しさん2015/12/30(水) 15:50:40.47ID:WC2i3iyl
>>184
initializeの場合は、うんこをひねり出すかのごとく
initiializeDataやinitializeCellのようにDataやCellをひねり出すことができましたが
先にも書いたrunやdieやappearなどのときはどうしますか?
01941852015/12/30(水) 16:18:23.99ID:0l8puLjU
>>192
全部英文で考えれば "何を"の君のゆう所の 実行主体 が付けれると思うが
・・・をrun   何を実行?(runProcess)
・・・をdie   何を殺す(が死ぬ)? (dieProcess)
・・・をappear  何が出る?(appearBigin)


※英単語の訳等の間違いはスルーして下さいね

これ以上 君に付き合うつもりは無いので あしからず(年末なんで)
0195デフォルトの名無しさん2015/12/30(水) 16:27:23.62ID:Y9esFwyM
>>186
FirstTime とかのフラグかな
0196デフォルトの名無しさん2015/12/30(水) 18:39:36.91ID:PBmz2gbU
>>190
For i = 1 は古いって言われても、
m(i) = m1(i) + m2(i)
をどう実装するんですか?
0197デフォルトの名無しさん2015/12/30(水) 18:58:26.89ID:JPIixvGP
>>190
別の処理を施したいなら、別のForEach文なり、Do文なりを利用すべき。
そもそもForEachはオブジェクト型を扱わない場合は処理が重いので必要が無い限り極力使わない方がいい。

別の処理なら別のループとして分けられるはず。変なこだわりを持っているせいでややこしい事になっているだけ。
0198デフォルトの名無しさん2015/12/30(水) 19:05:08.95ID:yH9ydeBO
パフォーマンス的にはfor>foreachなんだけどね。あと、flag使うとかやりようはいくらでもある。少し捻りが足りないんじゃないかな
0199デフォルトの名無しさん2015/12/30(水) 20:02:26.27ID:bRclVw7x
他言語だと、For Each的なループであっても
何回目の処理かをループ内で知ることの出来る機能を持ったものがある
VBAは残念ながらそれがないから、自分でカウンタ変数を用意するか
一個目のデータに特有の項目があるならそれを判定するか、だろうね
0200デフォルトの名無しさん2015/12/30(水) 22:00:46.01ID:yDP/mW46
>>186

最初の時だけ何らかの値を計算してとっておくということであれば
Dim val As Variant として、ループの中で
If IsEmpty(val) Then val = ...
とやればいい。
余計なフラグなしにできるl。
0201デフォルトの名無しさん2015/12/30(水) 23:44:51.92ID:RDoNJfse
Application.OnTime TimeSerial(Hour(Now()) + 1, 0, 0), "更新"



マクロ"更新"の最後にまた上のコード


以前教えてもらった1時間毎にマクロを起動するコードですが
23時になると狂って連続で"更新"マクロを繰り返してしまいます
23時から0時へは跨げないということでしょうか? 対策をお願いします
0202デフォルトの名無しさん2015/12/31(木) 00:00:57.74ID:yJLj8/Bn
>>201
対策をお願いします(キリッ

上から目線だなオイ
0203デフォルトの名無しさん2015/12/31(木) 00:47:01.17ID:2YFGdsnl
>>186
Dim user_list As Collection
Dim user As Collection
Set user_list = New Collection
Set user = New Collection
user.Add Key:="SEQ_NO", Item:=user_list.Count + 1
user.Add Key:="NAME", Item:="aaa"
user.Add Key:="PASSWORD", Item:="xxx"
user_list.Add user
Set user = New Collection
user.Add Key:="SEQ_NO", Item:=user_list.Count + 1
user.Add Key:="NAME", Item:="bbb"
user.Add Key:="PASSWORD", Item:="yyy"
user_list.Add user
Dim msg As String
For Each user In user_list
If user("SEQ_NO") <> 1 Then
msg = msg & ","
End If
msg = msg & user("NAME") & ":" & user("PASSWORD")
Next
MsgBox msg
0204デフォルトの名無しさん2015/12/31(木) 06:18:32.30ID:EUZydMuq
>>201
Hourは、0〜23を返す。最後には、
23 + 1 = 24

これで値を見てみれば?
Debug.Print TimeSerial(24, 0, 0)
02051912015/12/31(木) 08:06:51.15ID:D5b/7JR8
みなさん不正解。がんばった人もいるけど残念!
答は、For eachループに入る直前にその1回目の書きたかったコードを書けばいいだけでした。
0206186 (=191)2015/12/31(木) 08:07:43.82ID:D5b/7JR8
上は>>186でした。
0207デフォルトの名無しさん2015/12/31(木) 08:13:13.18ID:xcpAmXWK
>>205
ひとつ目の値を使うんじゃないのか?それをどうやって取得するんだよ?
0208デフォルトの名無しさん2015/12/31(木) 09:43:58.89ID:18DEmBMj
残念も何もそう指摘されてるだろうに。
もしかして「僕はVBAにとても詳しいんだ」ってプライドを崩されてへそ曲げたのか。
0209デフォルトの名無しさん2015/12/31(木) 11:11:22.46ID:xcpAmXWK
パフォーマンスに関しては他の人も言ってるけど、
For Each z in M 構文での z と、For i = 0 To 〜 での M(i) の違いとして、
z はM(i)のコピーでしかないという点がある。(Mが配列の場合)
M がジャグ配列で要素が再び大きな配列だったりしたら重い処理になりえるな。
それに、コピーだから z に何か代入しても M には反映されない。
For i = 1は古い、なんて決めつけてると(以下略
0210デフォルトの名無しさん2015/12/31(木) 12:11:06.57ID:3FCNx6UT
For i 〜の構文内での話なのですが・・・

1.iやjの変数の宣言がされてないとエラーが出ます。
2.下記の記述をしていますが、自分が想定したのと違う動きになります。
   For i = 1 To 9
For j = 1 To 9 - i
      If IsNumeric("TextBox" & (2 * (i - 1) + 2 * j + 7)) = False Then

テキストボックスを順にチェックしていきたかったのですが
なにか記述方法が間違っているのでしょうか?
ご指導のほど、よろしくお願いたします。
0211デフォルトの名無しさん2015/12/31(木) 12:21:48.92ID:e/tEw3yP
>>208
もうその通りだろうね。稚拙すぎて笑える
0212デフォルトの名無しさん2015/12/31(木) 14:10:55.55ID:KhBichDl
>>210
こんなかんじで指定するんじゃなかったっけ
Controls("TextBox" & i).Value
0213デフォルトの名無しさん2015/12/31(木) 15:23:07.54ID:18DEmBMj
>>210
For i = 1 to 9
For j = 1 to 9 - i
Next
Next

だけならエラー吐かないのでテキストボックスの問題だなぁ。
それ以上はどういう形か分からない以上調べようがないから何とも。

全部のテキストボックスを調べて良いなら

For Each x In Me.Cotrols
   If TypeName(x) = "TextBox" then
     ...
   End If
Next

とやると簡単。Tag使って判定すれば特定のものだけ除外できるし。
02142102015/12/31(木) 17:47:16.72ID:3FCNx6UT
いろいろ試したのですが、やはりテキストボックスの表記の問題のようです。
順番にチェックしていく関係でこのような記述をしました。
最初にテキストボックスの7-9、7-11、7-13、・・・・7-23、9と-11、9-13のようにしたかったのです。

For i = 1 To 9
For j = 1 To 9 - i
If Abs(("TextBox" & 2 * i + 5) - ("TextBox" & 2 * (i - 1) + 2 * j + 7)) <= 100 Then
          【処理内容】
End If
Next j
Next i

の記述をしたのですが・・・テキストボックスの記述方法がダメなのでしょうか?
0215デフォルトの名無しさん2015/12/31(木) 18:21:50.17ID:xcpAmXWK
ActiveSheet.OLEObjects("TextBox" & 1).Object.Value
のように指定すればいいみたいだけど?
0216デフォルトの名無しさん2016/01/01(金) 08:16:43.96ID:sVrrx3Fu
On Error Resume Nextってそれを実行した行のあとも
プログラムが終了するまでずっと有効ですか?
ある区間だけ有効にしたい、あるいはずっと有効しておきたい、のように使い分けたいこともこれから出てくると思うのです。
0217デフォルトの名無しさん2016/01/01(金) 08:18:12.65ID:sVrrx3Fu
Application.DisplayAlerts = Falseも、(以下同文)
0218デフォルトの名無しさん2016/01/01(金) 09:06:31.31ID:HVUfaNaT
>>216-217
あけおめ

On Error はプロシージャ内のみ有効
Application.DisplayAlertsは Excel終了するまで継続のハズ

ちなみに
On Error Resume Next
は短い範囲でかつどうしても実行時エラーの可能性が排除できない
時のみ使う方が良いとおもうよ
ステートメント毎に Errオブジェクトを見てればいいけど
不具合発生してもスルーされるからどこでどんなエラーが発生したか分らなくなる
せめて
On Error Goto ラベル
でトラップ処理するなら別だけど
0219デフォルトの名無しさん2016/01/01(金) 10:06:58.64ID:sVrrx3Fu
>>218
どもあり、ことよろ。

そうなんですか、スッキリしました。これでこれから使い分けができそうです。
0220デフォルトの名無しさん2016/01/01(金) 10:17:22.33ID:NO+H6ZMg
>>216
> ある区間だけ有効にしたい、あるいはずっと有効しておきたい
On Error Goto 0
0221デフォルトの名無しさん2016/01/01(金) 19:56:00.98ID:xpOY3CWT
手元にExcelがないから試せないけど、確かOn Errorは呼び出し先の関数内でも有効になるんだよね
個人的にはErr.Raiseをthrowのように使いたいんだけどね
0222デフォルトの名無しさん2016/01/01(金) 20:52:55.76ID:sVrrx3Fu
>>220-221
なるへそありがとう。
0223デフォルトの名無しさん2016/01/01(金) 20:55:39.83ID:sVrrx3Fu
自分で作った列挙型(Enum)ってその全体のマクロでどこででも参照して利用できるようにするには
どこに書けばいいとか注意点はありますか?
自分で作ったクラスの中ででもその列挙型定数は使いたいです。
0224デフォルトの名無しさん2016/01/01(金) 21:04:54.88ID:+cD+YD5u
イミディエイトウィンドウに出力された内容を取得する方法ってありませんでしょうか
0225デフォルトの名無しさん2016/01/01(金) 23:06:06.65ID:+cD+YD5u
あとマクロ開始時にイミディエイトウィンドウをクリアする記述ってありますでしょうか
0226デフォルトの名無しさん2016/01/02(土) 01:20:56.54ID:jWkoNf5r
>>223
>自分で作ったクラスの中ででもその列挙型定数は使いたいです。
やめたほうがいいです。
ライブラリとして再利用する為なんじゃないの?
むしろ、そのクラスで使うならそのクラスに実装すべきで、他でも使いたいなら
公開すればいいだけ。
クラス以外で実装した列挙型をクラス内で使いたい場合は、クラスの中で再定義
するか、橋渡しするようなプロシージャを用意する必要があるかな。
めんどくさいけどね。
>>224
コピペしかないと思うけど、
そもそもイミディエイトに出力ってDebug.Print使ってるって
ことなんだろうけど、そろそろテキストファイルに出力する方法も
覚えたらどう?
0227デフォルトの名無しさん2016/01/02(土) 09:24:31.29ID:Dnf2flaM
イミディエイトをシェルとして使って作業の大部分を完結させている自分としては、イミディエイト内での
「もとに戻す」と「繰り返し」をショートカットでできるようにしてほしい。
ついでに「繰り返し」はctrl + yに統一してくれ。
0228デフォルトの名無しさん2016/01/02(土) 09:44:03.17ID:Nffz1P8X
文字列をためこんどいて
マクロ終了直前にメモ帳を起動してその文字列をそこに入力させておくためのコードは
どう書けばいいですか?
0229デフォルトの名無しさん2016/01/02(土) 09:51:29.48ID:sxcdtv6m
>>228
素直にテキストに落としてみては?
0230デフォルトの名無しさん2016/01/02(土) 09:58:15.99ID:vN/+lOC5
>>223
確かクラスでパブリックな列挙体を指定すると、クラス.列挙体.列挙値の記述が出来ないはず。
そもそも列挙体はそのクラスから生成したインスタンスで挙動が変わるものでないので、クラスに記述すること自体が微妙。
VBAは.Netと違ってSheardがないので、標準モジュールに記述して使うのが変な挙動をしなくていいと思う。

VBAでクラスを使おうとすると、まだ考え方が確立され切れていないときの状態を引きずった言語だから使い方に戸惑うことが多いよね。

ユーザー定義型なんてもっと顕著にそう言うことが起こるよ。
0231デフォルトの名無しさん2016/01/02(土) 21:54:01.64ID:MhjWcLlU
ライブラリ作ってるけどユーザー定義クラス(型)は全然使ってない。
どういう使いどころあるかな?
0232デフォルトの名無しさん2016/01/04(月) 06:20:47.61ID:D+zYtfMV
vbsと相互に使うからわざわざ定義型なんて使ってないなあ
まとめて管理するとかもVariantの配列に突っ込めばいいし
もうちょと互換性があれば使ったかもしれないけど
0233デフォルトの名無しさん2016/01/05(火) 00:10:29.99ID:USCQ6V11
ユーザフォームをActiveにしたときにコードを書きたいのですが
Activeってどうやって判断しますか?

UserForm_Click()だとボタンをクリックしたときにはそれが発動されないし。
0234デフォルトの名無しさん2016/01/05(火) 02:05:35.42ID:Kvov8i6k
どう?
0235デフォルトの名無しさん2016/01/05(火) 02:25:02.47ID:Kvov8i6k
ユーザーフォームを使った場合、
コードはそのフォームモジュールだけにに書いて
標準モジュールは作りさえしないというやり方で良いでしょうか?
いまのところ標準モジュールを作る意図が見いだせないのですが。
0236デフォルトの名無しさん2016/01/05(火) 02:34:32.38ID:LNU3ZziC
そんな事 人に聞かなくても
作らなくても 動作上問題ないなら 作らんでいいんじゃね?
0237デフォルトの名無しさん2016/01/05(火) 03:15:29.83ID:mStzs5Tn
>>233
普通はそのまんまのActivateイベント使うんじゃないかね

>>235
じゃあそれでいいんじゃない
0238デフォルトの名無しさん2016/01/05(火) 03:22:29.47ID:cUCC3uaz
>>237
2013だとイベント拾えないなActivateイベント
フォームロード時には発生するんだが…
02392332016/01/05(火) 03:30:01.47ID:Kvov8i6k
>>237
そのActivateがくせもので
フォームが複数あったときにそのフォームがActivateになったときはそのイベントをひろうけど
フォームが1つだとmodelessで開いたとき普通のExcelワークシートからそのフォームにActiveが移動しても
Acticateに書いたコードは実行してくれず無反応なんですよ。
0240デフォルトの名無しさん2016/01/05(火) 12:34:15.92ID:Kvov8i6k
Javaに慣れてると
他のSub(例えば名前をAdditionの2つの引数を取るとします)を呼ぶときに
Addition(5 , 8)
が構文エラーとなるのが気持ち悪くてしかたがありません。

正しくは
Addition 5 , 8
Call Addition(5 , 8)
のいずれかにしなければなりません。

でもどうにかしてJavaのように
Addition(5 , 8)
のようにできる方法はありませんかね?
0241デフォルトの名無しさん2016/01/05(火) 12:36:58.68ID:LntnFA7d
>>240
無理だと思う。
Functionにはしたくないんだよね?
0242デフォルトの名無しさん2016/01/05(火) 12:41:34.28ID:Kvov8i6k
>>241
Functionにしてもいいですよ。
でも同様にできなそうです。
0243デフォルトの名無しさん2016/01/05(火) 12:45:32.43ID:33a1opJu
プログラマーとは多様性を受け入れるものだ
0244デフォルトの名無しさん2016/01/05(火) 12:51:11.49ID:Kvov8i6k
受け入れたら負けだと思っている。
0245デフォルトの名無しさん2016/01/05(火) 13:01:18.99ID:LntnFA7d
>>242
ああ、戻り値を捨てるってことか。それも無理だと思う。

Functionにして繋げてしまえば?
result = Func1(Func2(Func3(...Addition(5, 8))))
どこにも副作用がなく、無駄な戻り値も無いようにすればいい。
0246デフォルトの名無しさん2016/01/05(火) 13:02:44.78ID:LntnFA7d
>>242
Javaを捨てて関数型に移行するのだ。VBAならそれができる。
0247デフォルトの名無しさん2016/01/05(火) 13:16:48.58ID:YLBFKxeK
>>240
気持ち悪いのは君の勝手
言語には言語の流儀がある。それが嫌ならやらなきゃいいだけ。逆に、JavaでVBAっぽく
やりたいとかアホ抜かせって話。

そして、普通みなそういう言語毎に流儀は慣れる。気持ち悪いなんて言ってるような奴は
プログラマーとしては三流。
0248デフォルトの名無しさん2016/01/05(火) 13:56:27.25ID:LntnFA7d
Subの呼び出し方がFunctionと違うことのメリットがなにかひとつあったような気がするんだが、忘れてしまった。

>>247ってプログラマなの?
0249デフォルトの名無しさん2016/01/05(火) 16:31:17.21ID:mlWeSkma
>>248
非常にレアなケースでしかメリットが出てこないが、消費するヒープがSubの方が少ないから再帰の回数が多くできる
厳密には戻り値の変数エリアを初期化する手間がなくなるので実行速度も誤差程度には速い、はず
0250デフォルトの名無しさん2016/01/05(火) 19:25:18.04ID:LntnFA7d
>>249
なるほど

s/ヒープ/スタック/
だよね?
0251デフォルトの名無しさん2016/01/05(火) 20:12:50.80ID:KIPOXvA0
>>240
・プリプロセッサを作って変換する
・MSに入社してVBAの言語仕様書を書き換える
・MSを買い取ってVBJをサボートさせる
・…

ただ、こう言う本質的でないところに突っかかる奴はたいてい適性がないので、素直にマをやめた方が本人も周りも幸せになれる
0252デフォルトの名無しさん2016/01/06(水) 03:05:54.21ID:IHMGmJSj
たぶんだけど「いやぁ、おれJava使えるんすよぉ。皆さんは出来ないでしょ?」的な自慢なんじゃないの。
プログラムの覚え始めってインプリンティングみたいな愛着が湧くから、そんな時期なんでしょ。
0253デフォルトの名無しさん2016/01/06(水) 06:08:03.77ID:wTjSz+NM
>>252
逆を言えばそれしか出来ないんでしょ?wwwこんな程度で気持ち悪いとか吐いてる程度だから、Java自体のレベルも知れてる。
0254デフォルトの名無しさん2016/01/06(水) 09:24:36.49ID:qs2eqDcn
あけましておめでとうございます

Excel VBA(windows7 Excel2010 VBA7,0)で パソコンがミュート状態かどうかを
判定したいのですが・・・

ミュート状態だと if 〜 Else で処理(ミュート解除)させようと思っていますが
ミュートかどうかを判定する方法がわかりません

みなさんのお力をお借りしたく書き込みさせて
頂きました。

よろしくお願いします 22歳OL
0255デフォルトの名無しさん2016/01/06(水) 10:01:38.51ID:nVjV76XE
>>254
mixerGetControlDetailsを使う
0256デフォルトの名無しさん2016/01/06(水) 10:04:22.66ID:/XlzX9bH
>>254
MMDevice API とかでぐぐってみる
0257デフォルトの名無しさん2016/01/06(水) 10:36:47.15ID:qs2eqDcn
>>255
>>256
早速の返信ありがとうございます
質問する前にgoogle先生に質問して
mixerGetControlDetails や
API などを使うと出来そうな感じの事が書いてあったのですが・・・

最近VBAを独学で勉強しだした私には難しくどうしたらいいか
よくわからず・・・ここで質問させていただきました
また、お時間ある時でいいのでアドバイスお願いします

まだどうしtらいいかわからないです
22歳OL
0258デフォルトの名無しさん2016/01/06(水) 10:49:05.08ID:f2GjMEVM
>>257
最後の1行 なんかバカにされてる気がするぞ
■ このスレッドは過去ログ倉庫に格納されています