トップページ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/
0134デフォルトの名無しさん2015/12/22(火) 17:24:02.60ID:1IjfeHrT
>>133
VBAの「変数のスコープ」は、宣言・定義した位置から下だよ。
だから、関数の先頭じゃなくてもっと狭められる。
0135デフォルトの名無しさん2015/12/22(火) 17:48:13.32ID:nxtSgXHp
>>134
ブロックレベル、というのが通じてないのかな?
つまりひとつの関数の中で、

For Each z ・・・
Dim tmp As Variant
・・・
Next z

For Each z ・・・
Dim tmp As String
・・・
Next z

というように変数tmpが2回宣言出来ればいいのに、それが出来ないことを嘆いている。
0136デフォルトの名無しさん2015/12/22(火) 17:50:28.23ID:1IjfeHrT
>>135
> ブロックレベル、というのが通じてないのかな?
いや、通じてるよ。

だからといって
> 結局1関数内に複数の処理があって、2箇所以上で使う変数は関数の先頭で宣言してる
とするのではなくて、もっと変数のスコープを狭めた方が良いといってるんだけど。
0137デフォルトの名無しさん2015/12/22(火) 17:57:48.82ID:1IjfeHrT
まとめると、

ローカル変数定義を関数の先頭で宣言する事を強制される言語(*1)は
しかたがないので変数の宣言は関数の先頭でするしかない。

*1) Ada由来言語とか。PL/SQLとか。

そうではない言語では、なるべく変数のスコープを狭めるのが良い。

・関数ブロック内のどこででも変数定義できるのなら、なるべく利用する直前で宣言する
・ブロックスコープが存在する言語では(C系とか)は、そのブロック内で宣言する

VBAはブロックスコープが存在しないが、関数ブロック内のどこででも変数定義できるので、
なるべく利用する直前で宣言するのが良い。

例外はJavascriptで、ホイスティングによりブロックスコープ内で宣言した変数のスコープは
関数スコープにまで拡大する。
それにより
・それでも利用する直前で宣言するよ派
・知らない人がいるかもしれないので、関数の先頭でまとめてするよ派
が存在する。
0138デフォルトの名無しさん2015/12/22(火) 18:50:23.05ID:EK9FZmu1
>>134
厳密には、VBAでは変数宣言(定義)は必須ではないので
変数定義の位置によってスコープが変更されるようなことはないだろう

Option Explicitオフで宣言前に変数を使用してた場合、エラーになるのは変数宣言の方
つまり変数宣言以前にそのスコープにその変数が存在している

まあ、Option Explicitはオンで使うべきではあるんだが

>>137
VBAではブロックスコープは存在しないので
「関数ブロック内のどこででも変数定義できる」(ただし利用は定義後のみ)

「なるべく利用する直前で宣言する」のではなく、関数の先頭で宣言する事が薦められていた

MSがそう勧めてたこともあるので、VBAプログラマの多くは関数先頭宣言派だと思うぞ

まあ俺は最近は使う直前宣言に改宗したがw
0139デフォルトの名無しさん2015/12/22(火) 19:27:38.21ID:nxtSgXHp
スコープを狭めたことには全然なってないので、俺はだいたい先頭で宣言するけど例外もある。
というかプロシージャの長さによるね。10行越えたらちょっと考える。
0140デフォルトの名無しさん2015/12/22(火) 19:41:14.20ID:eV+iF7ba
宣言しなくても使える、とはちょっと違うんだけどな
VBAの変数宣言は記述を省略できるだけで、変数を使った時点でVariant型として自動的に宣言される
コードに書かなかった場合はシステムが代わりに宣言しといてくれるんだよ
このソースを実行してみればわかる

Sub Macro1()
  a = 1  ' ← 変数を使おうとした時点で、書かなくても自動的に Dim a As Variant が実行される
  Dim a As Variant  '←宣言が重複するのでエラーになる
End Sub
0141デフォルトの名無しさん2015/12/22(火) 19:54:40.62ID:7wWwuT9q
>>138
> Option Explicitオフで

今時あり得ん
議論する価値もない
0142デフォルトの名無しさん2015/12/22(火) 19:57:05.43ID:EK9FZmu1
じゃあ言い方を変えてあげよう
スコープを狭めるとかいうのは間違いで、スコープは言語によって定義されていて
宣言位置や方法なんかによってどのスコープか決定されるだけだ
VBAで一番狭いスコープはプロシジャレベルなので、どこで宣言しようがそれよりスコープが狭まることはない
狭まるのは利用可能範囲だけ

まあ、利用可能範囲をスコープというならそれでも良いかという気がしてきたからもうどうでもいいやw
0143デフォルトの名無しさん2015/12/22(火) 20:04:19.43ID:nxtSgXHp
しかしVBAでタイプセーフとか言う気は起こらないのであった
0144デフォルトの名無しさん2015/12/22(火) 20:10:47.37ID:nxtSgXHp
ん、Option Explicitのことだったか。
ならそんなものほとんどつける意味ないし無駄。
0145デフォルトの名無しさん2015/12/23(水) 00:21:34.23ID:e7byjM9n
>>144
必要の根拠しめせないけど、
意味ないし無駄という根拠示せる?(Option Explicitを付けないメリット)
煽りじゃないですよ。
0146デフォルトの名無しさん2015/12/23(水) 00:41:23.47ID:M5GRmAfS
>>145
自分の経験上、一度も役立ったことがないというのが根拠。
付けないことにメリットがあるとまでは言ってない。
エディタの設定でOption Explicitはついているのだが、これまで一度も「変数が定義されていません」のエラーを出したことはない。
つまりDimし忘れることなんて普通は起こらないし、それへの保険なんて任意保険で十分。やらないのはあり得んみたいな言説はおかしい。
0147デフォルトの名無しさん2015/12/23(水) 05:36:21.78ID:zGgTg8AL
むしろ自分はOption Explicit付けないこと無かったから、
変数宣言しなくてもエラーにならないなんて忘れてたわ。

田中さんはこんな風に言ってるな。
http://officetanaka.net/excel/vba/beginner/11.htm

因みに余談だけど、.NetになるとOption Strictと言うのがあって、Option Explicitと一緒に書かれることが多い。
これは実行時バインディングで型が決まるものや、暗黙の変換を許可するかしないかを決めるものだけど、
型推論によって実行時バインディングで型を決めざるを得ないときもあるので、基本、付けると言うスタンスに留まることが多いかな。つまり、絶対ではない。

ただ、VBAであれ.Netであれ、Option Explicitに関しては今まで付けておいて困ったことはないな。
変数宣言も型も、明示的に設定していることが前提なら付けておいた方がいいだろな。
大丈夫な人は大丈夫なんだろうけど、それは「俺は今まで簡単なロジックでバグを出したことが無いから、
簡単なロジック部分のテストケースは作らない」と言ってるのと同じだな。
その人の信用性も有るんだろうけど、Option Explicitが付いていれば「ちゃんと変数宣言してますよ」と言うことの担保にもなる。

それでも、「いや、俺は絶対そんなミスは犯さないから付けない」と言うのであれば、もうそれ以上言うこと無いし。
最も大概の仕事場のコーディングルールでは付けることになっていると思うけどね。
0148デフォルトの名無しさん2015/12/23(水) 09:46:21.95ID:QfnO5T+O
「俺は忘れないから大丈夫」

若いっていいなあ
0149デフォルトの名無しさん2015/12/23(水) 10:49:34.08ID:e7byjM9n
んーいろいろ参考になった。
みなさんレスどうもです。
俺はつける派かなOption Explicit
0150デフォルトの名無しさん2015/12/23(水) 10:54:12.55ID:M5GRmAfS
>>148
つけて助かったことあるの?
結局Optiob Explicitなんてシートベルトの価値ではなくて、チャリンコの補助輪の価値しかないと思う。
デフォルトで付けいて放置してるけどさ。
0151デフォルトの名無しさん2015/12/23(水) 12:18:30.14ID:QfnO5T+O
なんだただのギャグか
0152デフォルトの名無しさん2015/12/23(水) 12:29:09.66ID:MZJ58G0+
スコープの話出てたけど、普通あるのにVBAになくて困るものとして定数(const)が欲しい。
VBAのConstは定数式を与えなきゃならないので使いにくい。
0153デフォルトの名無しさん2015/12/23(水) 19:56:05.25ID:M5GRmAfS
>>152
引数もByRef Const受けできればいい。
0154デフォルトの名無しさん2015/12/24(木) 10:15:31.90ID:+bsSlAyH
>>142
> 狭まるのは利用可能範囲だけ
それを一般には変数のスコープという。

「第3回 スコープを意識したプログラミング―その2 変数のスコープ」
http://gihyo.jp/dev/serial/01/code/000302
0155デフォルトの名無しさん2015/12/24(木) 10:17:46.35ID:+bsSlAyH
>>146
> エディタの設定でOption Explicitはついているのだが、これまで一度も「変数が定義されていません」のエラーを出したことはない。
> つまりDimし忘れることなんて普通は起こらないし、それへの保険なんて任意保険で十分。やらないのはあり得んみたいな言説はおかしい。
typoは検出できる。
これ重要。
0156デフォルトの名無しさん2015/12/24(木) 10:33:42.93ID:acHF714F
>>154
正しいが、スコープの始まりはコントロールできても終わりはプロシージャの最後までと決まってるのが惜しいところだね。
0157デフォルトの名無しさん2015/12/24(木) 10:59:36.15ID:+bsSlAyH
>>138
> MSがそう勧めてたこともあるので、VBAプログラマの多くは関数先頭宣言派だと思うぞ
これか。
「変数とメソッドのスコープ」
https://msdn.microsoft.com/ja-jp/library/ms973875.aspx

> プロシージャ レベル スコープ
>
> 変数を宣言するための最も一般的な場所は、プロシージャの先頭です。これらの変数は、
> プロシージャ全体で利用することができます。プロシージャの先頭に変数を置いておけば、
> どのプロシージャでも変数宣言を簡単に見つけることができます。すべての変数宣言を
> 先頭に置くという習慣を身に着けていないと、変数がどこで宣言されているかがわからず、
> 変数に関連するバグを追跡するのに余分な時間がかかる可能性があります。

2001年12月の記事だけど、今でもMSはこう思ってるんだろうか。
0158デフォルトの名無しさん2015/12/24(木) 11:34:44.56ID:acHF714F
>>152
そう思う

>>155
そう思う
自分はtypoはその場ですぐ見つけたいので、Option Explicitだけじゃなく他の方法も取ってる。

>>157
記憶がおぼろだけど、ずっと昔のVBEは先頭でのDimしかできなかったよね?
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()だとボタンをクリックしたときにはそれが発動されないし。
■ このスレッドは過去ログ倉庫に格納されています