Excel VBA 質問スレ Part39 [転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2015/11/27(金) 20:36:45.35ID:9HV+ag/s___
___ /____ヽ ____
/____\ | |´・ω・`| | /___ヽ
.l |´・ω・`| ニX二 . ̄ ̄ ̄ 二X二 |´・ω・`| l 俺たちに任せろ
!、 ̄ ̄ ̄ ヽ | | /  ̄ ̄ ̄/
ヽ_/ヽ、 ヽ__) \__/\_/. /_/ ノヽ_/
 ̄  ̄ ̄
このスレはコード書き込みOKです。
作成依頼もOKですが、作成依頼限定ではありません。
コードが嫌な人・作成依頼が嫌な人は別スレ建ててください。
※前スレ
Excel VBA 質問スレ Part38 [転載禁止]2ch.net
http://peace.2ch.net/test/read.cgi/tech/1441619979/
0135デフォルトの名無しさん
2015/12/22(火) 17:48:13.32ID:nxtSgXHpブロックレベル、というのが通じてないのかな?
つまりひとつの関数の中で、
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> ブロックレベル、というのが通じてないのかな?
いや、通じてるよ。
だからといって
> 結局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厳密には、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+iF7baVBAの変数宣言は記述を省略できるだけで、変数を使った時点でVariant型として自動的に宣言される
コードに書かなかった場合はシステムが代わりに宣言しといてくれるんだよ
このソースを実行してみればわかる
Sub Macro1()
a = 1 ' ← 変数を使おうとした時点で、書かなくても自動的に Dim a As Variant が実行される
Dim a As Variant '←宣言が重複するのでエラーになる
End Sub
0141デフォルトの名無しさん
2015/12/22(火) 19:54:40.62ID:7wWwuT9q> Option Explicitオフで
今時あり得ん
議論する価値もない
0142デフォルトの名無しさん
2015/12/22(火) 19:57:05.43ID:EK9FZmu1スコープを狭めるとかいうのは間違いで、スコープは言語によって定義されていて
宣言位置や方法なんかによってどのスコープか決定されるだけだ
VBAで一番狭いスコープはプロシジャレベルなので、どこで宣言しようがそれよりスコープが狭まることはない
狭まるのは利用可能範囲だけ
まあ、利用可能範囲をスコープというならそれでも良いかという気がしてきたからもうどうでもいいやw
0143デフォルトの名無しさん
2015/12/22(火) 20:04:19.43ID:nxtSgXHp0144デフォルトの名無しさん
2015/12/22(火) 20:10:47.37ID:nxtSgXHpならそんなものほとんどつける意味ないし無駄。
0145デフォルトの名無しさん
2015/12/23(水) 00:21:34.23ID:e7byjM9n必要の根拠しめせないけど、
意味ないし無駄という根拠示せる?(Option Explicitを付けないメリット)
煽りじゃないですよ。
0146デフォルトの名無しさん
2015/12/23(水) 00:41:23.47ID:M5GRmAfS自分の経験上、一度も役立ったことがないというのが根拠。
付けないことにメリットがあるとまでは言ってない。
エディタの設定でOption Explicitはついているのだが、これまで一度も「変数が定義されていません」のエラーを出したことはない。
つまりDimし忘れることなんて普通は起こらないし、それへの保険なんて任意保険で十分。やらないのはあり得んみたいな言説はおかしい。
0147デフォルトの名無しさん
2015/12/23(水) 05:36:21.78ID:zGgTg8AL変数宣言しなくてもエラーにならないなんて忘れてたわ。
田中さんはこんな風に言ってるな。
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つけて助かったことあるの?
結局Optiob Explicitなんてシートベルトの価値ではなくて、チャリンコの補助輪の価値しかないと思う。
デフォルトで付けいて放置してるけどさ。
0151デフォルトの名無しさん
2015/12/23(水) 12:18:30.14ID:QfnO5T+O0152デフォルトの名無しさん
2015/12/23(水) 12:29:09.66ID:MZJ58G0+VBAのConstは定数式を与えなきゃならないので使いにくい。
0153デフォルトの名無しさん
2015/12/23(水) 19:56:05.25ID:M5GRmAfS引数もByRef Const受けできればいい。
0154デフォルトの名無しさん
2015/12/24(木) 10:15:31.90ID:+bsSlAyH> 狭まるのは利用可能範囲だけ
それを一般には変数のスコープという。
「第3回 スコープを意識したプログラミング―その2 変数のスコープ」
http://gihyo.jp/dev/serial/01/code/000302
0155デフォルトの名無しさん
2015/12/24(木) 10:17:46.35ID:+bsSlAyH> エディタの設定でOption Explicitはついているのだが、これまで一度も「変数が定義されていません」のエラーを出したことはない。
> つまりDimし忘れることなんて普通は起こらないし、それへの保険なんて任意保険で十分。やらないのはあり得んみたいな言説はおかしい。
typoは検出できる。
これ重要。
0156デフォルトの名無しさん
2015/12/24(木) 10:33:42.93ID:acHF714F正しいが、スコープの始まりはコントロールできても終わりはプロシージャの最後までと決まってるのが惜しいところだね。
0157デフォルトの名無しさん
2015/12/24(木) 10:59:36.15ID:+bsSlAyH> MSがそう勧めてたこともあるので、VBAプログラマの多くは関数先頭宣言派だと思うぞ
これか。
「変数とメソッドのスコープ」
https://msdn.microsoft.com/ja-jp/library/ms973875.aspx
> プロシージャ レベル スコープ
>
> 変数を宣言するための最も一般的な場所は、プロシージャの先頭です。これらの変数は、
> プロシージャ全体で利用することができます。プロシージャの先頭に変数を置いておけば、
> どのプロシージャでも変数宣言を簡単に見つけることができます。すべての変数宣言を
> 先頭に置くという習慣を身に着けていないと、変数がどこで宣言されているかがわからず、
> 変数に関連するバグを追跡するのに余分な時間がかかる可能性があります。
2001年12月の記事だけど、今でもMSはこう思ってるんだろうか。
0158デフォルトの名無しさん
2015/12/24(木) 11:34:44.56ID:acHF714Fそう思う
>>155
そう思う
自分はtypoはその場ですぐ見つけたいので、Option Explicitだけじゃなく他の方法も取ってる。
>>157
記憶がおぼろだけど、ずっと昔のVBEは先頭でのDimしかできなかったよね?
0159デフォルトの名無しさん
2015/12/24(木) 15:57:20.63ID:ta6MMntYVBAにおいて推奨するスタイルが変わったって記事は見たことが無いから
たぶん今でも一応そのスタイルが推奨なんじゃね
言語が変わればまた話は変わるけどな
VBAはVB6とほぼ同じスタイルが推奨されてたけど
VB6のスタイルはVB.NETでは推奨されてない奴も多いし
>>158
おれの記憶ではVBAは当初からずっと、先頭以外でもDim出来たが
0160デフォルトの名無しさん
2015/12/24(木) 16:00:38.09ID:Xid/rDIR0161デフォルトの名無しさん
2015/12/24(木) 16:30:39.57ID:+bsSlAyH2001年の古い記事に従うこともないと思うがな。
0162デフォルトの名無しさん
2015/12/24(木) 17:04:02.10ID:acHF714Fそうだっけ?なら自分の記憶違いかな。
使用直前の宣言はもちろんいいんだけど、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>リテラル値、その他の定数、Is を除く算術演算子や論理演算子を組み合わせた式を指定します。
らしい
関数とか使わん単純な計算式しか書けないのね
まあ、定数なんだから関数とか呼ぶなってことか
0164デフォルトの名無しさん
2015/12/24(木) 22:14:19.63ID:ZMYfZV7G0165デフォルトの名無しさん
2015/12/25(金) 00:23:24.10ID:H9I2iCjo>結局Optiob Explicitなんてシートベルトの価値ではなくて、チャリンコの補助輪の価値しかないと思う。
Optiobなんて書き間違えるくらいだし
そっちにはチャリンコの補助輪程度でも必要なんじゃないの?
0166デフォルトの名無しさん
2015/12/25(金) 00:55:16.56ID:QRbvg4rg「補助輪なんていらねーよ」と言いながら実際は補助輪を外したことがないというオチがもう付いてるじゃないかw
0167デフォルトの名無しさん
2015/12/25(金) 01:04:21.93ID:VYJL9Hpsって宣言をして、プロシージャ内でその変数を使うときは "camelcase" ってタイプする。
その直後に "camelCase" になったらtypoしてないし、でなきゃypoがある。
いつのまにやらそういう癖がついた。
0168デフォルトの名無しさん
2015/12/25(金) 08:22:37.15ID:pG0WUl9G0169デフォルトの名無しさん
2015/12/25(金) 08:25:15.59ID:zlW/tpNm0170デフォルトの名無しさん
2015/12/25(金) 16:52:37.89ID:WI9GtdKx変数名が間違っててそれぞれ別の変数として判別されてたのはみた事がある
コードが短かったからすぐ気がついたけど
長いコードだったら気付かず見過ごしてたかもしれない
後自分で書いたコードでは Option Explicit は必ず付けてるんだけど、
配列変数の宣言は
Dim Hoge() As Long
みたいに動的に宣言して、後から
Redim Hoge(5)
みたいに要素数を再定義してた
そしたら Redim の所で変数名間違えてて
最初の変数が要素数不定のままでエラーになってしまい、
原因が分らずに悩んだ事があった
Redimだけでも変数宣言として認められちゃうから
Option Explicit 使ってても
こういうパターンの間違いだとエラーにならんのよね
0171デフォルトの名無しさん
2015/12/25(金) 19:17:09.01ID:zlW/tpNm0172デフォルトの名無しさん
2015/12/26(土) 07:11:55.98ID:4Qu0RrtJ.Netのインテリセンスのこと?
.Net暫くやってて久しぶりにVBAでコーディングすると
余りの入力補助の利かなさにメモ帳に書いてるんじゃないかと錯覚するときあるよね。
特に打ち掛けのとき、変数名とか忘れて離れたところからコピーで取ってこようとすると
「ぷりん」とか音たててエラーメッセージが出て、元の行に飛ばされるのにはカチンとくる。
0173デフォルトの名無しさん
2015/12/26(土) 07:39:57.84ID:c6cv0MwcDim list_1 という宣言に対しては、liST_1 とか入力するの。
慣れると小指が勝手にシフトキーを押すようになるw
0174デフォルトの名無しさん
2015/12/26(土) 18:14:13.26ID:0Oe8t7C6自動構文チェック外せよ
0175デフォルトの名無しさん
2015/12/28(月) 09:45:36.91ID:6hjtvMur0176デフォルトの名無しさん
2015/12/28(月) 10:05:26.91ID:aQp7bRaK処理が終わったらPCをスリープ状態にする方法を教えたまえ
0177デフォルトの名無しさん
2015/12/28(月) 10:39:16.43ID:FcSlXts61 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やってみましたがうまくいきません
0179デフォルトの名無しさん
2015/12/28(月) 12:15:06.34ID:ylUAFX7e0180デフォルトの名無しさん
2015/12/28(月) 13:10:18.21ID:ehrXe3tWDeclare定義してやれば 使えたよ
ちなみに(Windows8.1 + Excel2013)
0181デフォルトの名無しさん
2015/12/28(月) 13:16:09.60ID:ylUAFX7eじゃあSetSuspendstate使ってみれば?
仮想環境とかだと上手くいかないかもしれないが。
0182180
2015/12/28(月) 14:13:12.83ID:ehrXe3tW専ブラスレの騒動に見舞われたので詳しく書けないけど
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単語2つ目をひねり出すか…
そのままでも問題なさそうだけど
0185デフォルトの名無しさん
2015/12/29(火) 15:31:29.70ID:fz57zrCLふと思ったんだけど
[通常] の方は "どうする"+"何を" になってるけど
[問題] の方は "どうする" だけなんよね
だったらこっちも "どうする" + "何を"にすればよくね?
initializeData
initializeCell
とかとか
こう出来ない理由とかあるの?
0186デフォルトの名無しさん
2015/12/30(水) 14:22:33.58ID:WC2i3iyl一番最初のループだけ特別なコードを1行書きたいのですが
その判別はどうします?
ノーマルなFor i=1 to構文では、If i=1 Thenと単純ですが。
0187デフォルトの名無しさん
2015/12/30(水) 14:34:26.62ID:PBmz2gbU0188デフォルトの名無しさん
2015/12/30(水) 14:43:38.04ID:JPIixvGPだいたい同一処理を分かりやすくする為にEachがあるのであって、違う処理するならEachに含めちゃダメだろ。
0189デフォルトの名無しさん
2015/12/30(水) 15:23:36.66ID:yH9ydeBOforでやらない理由は?
0190デフォルトの名無しさん
2015/12/30(水) 15:37:44.87ID:WC2i3iylなにそれ?
>>188
For eachがわかりやすいので可能な限り絶対この構文を使っています(For i=1は古い)。
でもそんなときでも最初のループだけ実行したいステートメントがあるというのはVBAの経験の浅い人じゃなければよくあると思うのですが。
>>189
Forでやると言ってるのですが
0191デフォルトの名無しさん
2015/12/30(水) 15:42:53.87ID:WC2i3iylSet objTest = Nothing
という解放処理をするべきかどうかの議論がときどきありますが、
そもそもメモリ使用に関してこのSet objTest = Nothingはなにをやっているのでしょうか?
これがはっきり分かっていないままで議論しても意味がないと思うのですが。
基本的にオブジェクト変数の場合でもプロシージャ内の変数はプロシージャを抜けると役目を終えたということで消えますが
その参照先であるオブジェクトの実体はメモリに残ったままですよね?
Javaのガベージコレクションの機能があるという話はこのVBAで聞いたことが無いので
もしその実体をSet objTest = Nothingで消せるということなら
いかなるオブジェクト変数を使ったあとは必ずSet objTest = Nothingを書くべき、というのが(もし上の仮定が正しい場合)わたしの見解なのですが。
0192183
2015/12/30(水) 15:47:44.59ID:WC2i3iyl>>184
>>185
それはinitializeという英単語が引数を2つとる動詞、つまり1つ目の引数は「実行する主体」、2つ目の引数が「初期化される物」でうまくいきますが
例えば引数を1つしか取らない英単語、例えばrunだとかdieだとかappearの場合どうしたらいいのですか?
0193デフォルトの名無しさん
2015/12/30(水) 15:50:40.47ID:WC2i3iylinitializeの場合は、うんこをひねり出すかのごとく
initiializeDataやinitializeCellのようにDataやCellをひねり出すことができましたが
先にも書いたrunやdieやappearなどのときはどうしますか?
0194185
2015/12/30(水) 16:18:23.99ID:0l8puLjU全部英文で考えれば "何を"の君のゆう所の 実行主体 が付けれると思うが
・・・をrun 何を実行?(runProcess)
・・・をdie 何を殺す(が死ぬ)? (dieProcess)
・・・をappear 何が出る?(appearBigin)
※英単語の訳等の間違いはスルーして下さいね
これ以上 君に付き合うつもりは無いので あしからず(年末なんで)
0195デフォルトの名無しさん
2015/12/30(水) 16:27:23.62ID:Y9esFwyMFirstTime とかのフラグかな
0196デフォルトの名無しさん
2015/12/30(水) 18:39:36.91ID:PBmz2gbUFor i = 1 は古いって言われても、
m(i) = m1(i) + m2(i)
をどう実装するんですか?
0197デフォルトの名無しさん
2015/12/30(水) 18:58:26.89ID:JPIixvGP別の処理を施したいなら、別のForEach文なり、Do文なりを利用すべき。
そもそもForEachはオブジェクト型を扱わない場合は処理が重いので必要が無い限り極力使わない方がいい。
別の処理なら別のループとして分けられるはず。変なこだわりを持っているせいでややこしい事になっているだけ。
0198デフォルトの名無しさん
2015/12/30(水) 19:05:08.95ID:yH9ydeBO0199デフォルトの名無しさん
2015/12/30(水) 20:02:26.27ID:bRclVw7x何回目の処理かをループ内で知ることの出来る機能を持ったものがある
VBAは残念ながらそれがないから、自分でカウンタ変数を用意するか
一個目のデータに特有の項目があるならそれを判定するか、だろうね
0200デフォルトの名無しさん
2015/12/30(水) 22:00:46.01ID:yDP/mW46最初の時だけ何らかの値を計算してとっておくということであれば
Dim val As Variant として、ループの中で
If IsEmpty(val) Then val = ...
とやればいい。
余計なフラグなしにできるl。
0201デフォルトの名無しさん
2015/12/30(水) 23:44:51.92ID:RDoNJfseで
マクロ"更新"の最後にまた上のコード
以前教えてもらった1時間毎にマクロを起動するコードですが
23時になると狂って連続で"更新"マクロを繰り返してしまいます
23時から0時へは跨げないということでしょうか? 対策をお願いします
0202デフォルトの名無しさん
2015/12/31(木) 00:00:57.74ID:yJLj8/Bn対策をお願いします(キリッ
上から目線だなオイ
0203デフォルトの名無しさん
2015/12/31(木) 00:47:01.17ID:2YFGdsnlDim 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:EUZydMuqHourは、0〜23を返す。最後には、
23 + 1 = 24
これで値を見てみれば?
Debug.Print TimeSerial(24, 0, 0)
0205191
2015/12/31(木) 08:06:51.15ID:D5b/7JR8答は、For eachループに入る直前にその1回目の書きたかったコードを書けばいいだけでした。
0206186 (=191)
2015/12/31(木) 08:07:43.82ID:D5b/7JR80207デフォルトの名無しさん
2015/12/31(木) 08:13:13.18ID:xcpAmXWKひとつ目の値を使うんじゃないのか?それをどうやって取得するんだよ?
0208デフォルトの名無しさん
2015/12/31(木) 09:43:58.89ID:18DEmBMjもしかして「僕はVBAにとても詳しいんだ」ってプライドを崩されてへそ曲げたのか。
0209デフォルトの名無しさん
2015/12/31(木) 11:11:22.46ID:xcpAmXWKFor 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:3FCNx6UT1.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もうその通りだろうね。稚拙すぎて笑える
0212デフォルトの名無しさん
2015/12/31(木) 14:10:55.55ID:KhBichDlこんなかんじで指定するんじゃなかったっけ
Controls("TextBox" & i).Value
0213デフォルトの名無しさん
2015/12/31(木) 15:23:07.54ID:18DEmBMjFor 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使って判定すれば特定のものだけ除外できるし。
0214210
2015/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のように指定すればいいみたいだけど?
0216デフォルトの名無しさん
2016/01/01(金) 08:16:43.96ID:sVrrx3Fuプログラムが終了するまでずっと有効ですか?
ある区間だけ有効にしたい、あるいはずっと有効しておきたい、のように使い分けたいこともこれから出てくると思うのです。
0217デフォルトの名無しさん
2016/01/01(金) 08:18:12.65ID:sVrrx3Fu0218デフォルトの名無しさん
2016/01/01(金) 09:06:31.31ID:HVUfaNaTあけおめ
On Error はプロシージャ内のみ有効
Application.DisplayAlertsは Excel終了するまで継続のハズ
ちなみに
On Error Resume Next
は短い範囲でかつどうしても実行時エラーの可能性が排除できない
時のみ使う方が良いとおもうよ
ステートメント毎に Errオブジェクトを見てればいいけど
不具合発生してもスルーされるからどこでどんなエラーが発生したか分らなくなる
せめて
On Error Goto ラベル
でトラップ処理するなら別だけど
0219デフォルトの名無しさん
2016/01/01(金) 10:06:58.64ID:sVrrx3Fuどもあり、ことよろ。
そうなんですか、スッキリしました。これでこれから使い分けができそうです。
0220デフォルトの名無しさん
2016/01/01(金) 10:17:22.33ID:NO+H6ZMg> ある区間だけ有効にしたい、あるいはずっと有効しておきたい
On Error Goto 0
0221デフォルトの名無しさん
2016/01/01(金) 19:56:00.98ID:xpOY3CWT個人的にはErr.Raiseをthrowのように使いたいんだけどね
0222デフォルトの名無しさん
2016/01/01(金) 20:52:55.76ID:sVrrx3Fuなるへそありがとう。
0223デフォルトの名無しさん
2016/01/01(金) 20:55:39.83ID:sVrrx3Fuどこに書けばいいとか注意点はありますか?
自分で作ったクラスの中ででもその列挙型定数は使いたいです。
0224デフォルトの名無しさん
2016/01/01(金) 21:04:54.88ID:+cD+YD5u0225デフォルトの名無しさん
2016/01/01(金) 23:06:06.65ID:+cD+YD5u0226デフォルトの名無しさん
2016/01/02(土) 01:20:56.54ID:jWkoNf5r>自分で作ったクラスの中ででもその列挙型定数は使いたいです。
やめたほうがいいです。
ライブラリとして再利用する為なんじゃないの?
むしろ、そのクラスで使うならそのクラスに実装すべきで、他でも使いたいなら
公開すればいいだけ。
クラス以外で実装した列挙型をクラス内で使いたい場合は、クラスの中で再定義
するか、橋渡しするようなプロシージャを用意する必要があるかな。
めんどくさいけどね。
>>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素直にテキストに落としてみては?
0230デフォルトの名無しさん
2016/01/02(土) 09:58:15.99ID:vN/+lOC5確かクラスでパブリックな列挙体を指定すると、クラス.列挙体.列挙値の記述が出来ないはず。
そもそも列挙体はそのクラスから生成したインスタンスで挙動が変わるものでないので、クラスに記述すること自体が微妙。
VBAは.Netと違ってSheardがないので、標準モジュールに記述して使うのが変な挙動をしなくていいと思う。
VBAでクラスを使おうとすると、まだ考え方が確立され切れていないときの状態を引きずった言語だから使い方に戸惑うことが多いよね。
ユーザー定義型なんてもっと顕著にそう言うことが起こるよ。
0231デフォルトの名無しさん
2016/01/02(土) 21:54:01.64ID:MhjWcLlUどういう使いどころあるかな?
0232デフォルトの名無しさん
2016/01/04(月) 06:20:47.61ID:D+zYtfMVまとめて管理するとかもVariantの配列に突っ込めばいいし
もうちょと互換性があれば使ったかもしれないけど
0233デフォルトの名無しさん
2016/01/05(火) 00:10:29.99ID:USCQ6V11Activeってどうやって判断しますか?
UserForm_Click()だとボタンをクリックしたときにはそれが発動されないし。
0234デフォルトの名無しさん
2016/01/05(火) 02:05:35.42ID:Kvov8i6k■ このスレッドは過去ログ倉庫に格納されています