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

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

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん2017/01/03(火) 02:51:16.56ID:9Y8iTik6
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK

※前スレ
Excel VBA 質問スレ Part44
http://echo.2ch.net/test/read.cgi/tech/1479421482/


※関連スレ
VBAなんでも質問スレ Part2
http://echo.2ch.net/test/read.cgi/tech/1432173164/
Access VBA 質問スレ Part1
http://echo.2ch.net/test/read.cgi/tech/1328536426/
Excel総合相談所 125
http://echo.2ch.net/test/read.cgi/bsoft/1481369538/
0851デフォルトの名無しさん2017/02/16(木) 19:31:36.39ID:eA7r2zui
>>846
職業プログラマ名乗るなら言語の特性も考慮してから発言してくれ
0852デフォルトの名無しさん2017/02/16(木) 19:32:28.92ID:INRkCvNU
>>848
何を言ってるのか論旨が不明なんだけど、既に>>813で書いた通りだよ
入力規則にせよユーザーフォームにせよ、不注意によるエラーを抑止するのが目的であって
それを意図的に改変されるような事にまで対処する気はないし必要も感じない。

だって、改変までするってことは過失じゃなくて故意だから。
まさか悪気もなく自分の行動の結果にも思い至ることがなく
ヤラカスんだったらもう救いようがないじゃん。
0853デフォルトの名無しさん2017/02/16(木) 19:39:30.06ID:C8BNWAf7
>>851
顧慮した上での結論だろ
VBAは割と簡単に型安全性を維持できる言語なのだからあえて型安全を破る理由はない
静的型付けがそもそも存在しないVBスクリプトとかなら仕方がないがそうじゃない
0854デフォルトの名無しさん2017/02/16(木) 19:41:25.77ID:fAEKNUKM
>>841
そうね。

典型的で単純な例は配列からのサーチかな
ある人は Long( )から数値を探す。べつの人は String( )から文字列を探す。次元も様々
Function searchFromAr(ByRef arr() As Variant, ByRef target As Variant) As Variant
って関数になると思うんだが。

返り値はarrが1次元なら最初に見つかった番号だから Long 値でいいけど、2次元の場合は(i, j)って形の配列返しになる。
どうしたって Variant だね。
プログラムの何割かはこういう汎用アルゴリズムが必要になるでしょ?
0855デフォルトの名無しさん2017/02/16(木) 19:42:01.60ID:+lEx52V9
>>852
お前がどう言おうと入力規則を解除する奴はいるし
コードまで改編する奴は見たことない
それなりの規模の会社で実務をやってりゃ普通に経験する
0856デフォルトの名無しさん2017/02/16(木) 19:45:20.46ID:+lEx52V9
>>854
> ある人は Long( )から数値を探す。べつの人は String( )から文字列を探す。
別々の関数にすればいいだけ

あと配列の次元って取得できるんだっけ?
0857デフォルトの名無しさん2017/02/16(木) 19:45:54.20ID:eA7r2zui
>>853
>普通に型付きで問題ないなら型付きを使う
これには同意するけど
それ以外を本気で言ってるならVBA使うのやめた方がいいよ
Dim x As Integer
x = x + "2"
Debug.Print x
VBAの型安全なんてこんなもんだよ
0858デフォルトの名無しさん2017/02/16(木) 19:50:00.85ID:MMs4mAvC
>>855
だね。コードなんかさっぱりわからんってのが大多数だから。

たまに気まぐれでメンドくせえ事を手入力で延々やってる同僚に
「これに入力してこのボタンを押すとすぐ終わるぞ、試してみろ」と作ってやる事があるが
まず間違いなく礼より「どこで拾ったの?」という反応が返ってくるw
実務で即使えるようなコードがネットで拾えるわけねえだろタコと思いながらも「あぁ、2ちゃんねるで」と答えてる。
0859デフォルトの名無しさん2017/02/16(木) 19:50:09.27ID:C8BNWAf7
>>857
その程度の認識かよ
クラス使ったことないのか?
0860デフォルトの名無しさん2017/02/16(木) 19:51:51.28ID:fAEKNUKM
>>856
それは絶対に我慢ならない。(ユーザーが)
その手の関数ぜんぶ組み込み型のバリエーション実装するなんてやってられない。
0861デフォルトの名無しさん2017/02/16(木) 19:55:01.54ID:fAEKNUKM
>>846
職業プログラマが、なんて悪い冗談はやめてくれ
0862デフォルトの名無しさん2017/02/16(木) 19:55:27.26ID:C8BNWAf7
>>860
コード生成すりゃいいじゃん
まあジェネリックがあれば何もしなくても解決する話だけどな
マイクロソフト仕事しろ
0863デフォルトの名無しさん2017/02/16(木) 19:57:00.26ID:mpwwbLVV
本当にVBAは進化がないな
0864デフォルトの名無しさん2017/02/16(木) 20:00:46.97ID:eA7r2zui
>>859
VBAはオブジェクト指向言語としては非常に不完全で、型安全も非常に弱い
クラス使おうがどうしようが変わらんよ
まあ、俺のVBAの認識がその程度だって言うならそれでいいけど
>ポリモーフェィックな動作が要求されているならインターフェースを使う
>Variantを強要するAPIを使うときにVariantから型付きに変換(あるいはラップ)するときにのみVariantを使う
>VBAは割と簡単に型安全性を維持できる
なんて主張するお前のVBAに対する認識の方が俺には疑問だわ

まあ、議論しても分かりあえなさそうだからレス要らないよ
0865デフォルトの名無しさん2017/02/16(木) 20:09:28.70ID:6YRpUZ/n
必要ならvariant使うのはそれはそれで当たり前だろ
それに議論の余地はねえよ
引数と返り値がvariantでも関数の内部まで全部variantで処理するのかって言うね
>Dim x As Integer
>x = x + "2"
>Debug.Print x
>VBAの型安全なんてこんなもんだよ
これなんかは、「こういうコードを書かない」って言うのが大事なんであって書けるからオーケーってのは美意識無さすぎだろう
例え変数がvariantでも足し算するならキャストするだろ
0866デフォルトの名無しさん2017/02/16(木) 20:10:59.51ID:+lEx52V9
>>858
そもそも普通の人は開発タブの存在も知らんだろうし
まあ >>792 の職場はパスワード保護も突破されるようなスーパーハッカーだらけなんだろう w
0867デフォルトの名無しさん2017/02/16(木) 20:11:24.07ID:INRkCvNU
>>855
君がどう言おうがって、俺は改変する人がいないなんて一言も言ってないよ。
ただし、コードを改変する人が居ないとも思わないけど。
そして、それは論点ではない、ということならもう何度か言ってるんだが。
0868デフォルトの名無しさん2017/02/16(木) 20:16:07.54ID:eA7r2zui
>>865
別人?
そう言うコードを書いてOKだとは言ってないよ
とうぜんそう言うコードは書くべきではなくて、ちゃんとキャストすべきだけど
それはVBAが比較的型に安全だっていう発言への反論だからな
そういうコードをチェック出来るのが型に安全だって事じゃないのかと
0869デフォルトの名無しさん2017/02/16(木) 20:16:28.83ID:+lEx52V9
>>860
> それは絶対に我慢ならない。(ユーザーが)
> その手の関数ぜんぶ組み込み型のバリエーション実装するなんてやってられない。
必要分だけ実装すりゃいいだろ
Currency 型なんて一生使わない奴の方が多いだろうし
わがまなユーザーなら型云々より文字型だけど数値として検索してくれ("123" で検索したら "0123" もヒットする)って言うような要望の方が多い気がする
0870デフォルトの名無しさん2017/02/16(木) 20:19:06.26ID:+lEx52V9
>>867
> そして、それは論点ではない、ということならもう何度か言ってるんだが。
論点でないと言うならレスしなきゃいいんじゃね?
俺は論点をお前に合わせる気はないし義務もないから
0871デフォルトの名無しさん2017/02/16(木) 20:21:29.95ID:7EemdXzw
不毛だなぁ
0872デフォルトの名無しさん2017/02/16(木) 20:22:44.58ID:+lEx52V9
>>868
完全じゃないってだけでしょ
程度問題なだけで他の言語にも似たような自動変換はあるし
0873デフォルトの名無しさん2017/02/16(木) 20:29:25.58ID:6YRpUZ/n
>>868
なんか横やりすまんな
型が安全じゃないからしっかり指定すべきってことが言いたい?
0874デフォルトの名無しさん2017/02/16(木) 20:30:36.77ID:eA7r2zui
>>872
完全じゃないのは当然
程度問題だけど、比較的安全か比較的危険かって話
暗黙の変換、それも縮小変換を実行前にチェックも禁止もできない以上、比較的危険だろって言うのが俺の主張だってだけ
0875デフォルトの名無しさん2017/02/16(木) 20:34:37.84ID:/2/7lRCG
>>874
もっとゆるゆるの言語もたくさんあるからそこに噛みついてもそれこそ不毛なだけだね
0876デフォルトの名無しさん2017/02/16(木) 20:37:09.91ID:GoZ0ZsyN
今回の流れでVariant型嫌いってのはIT系企業か何かの、いわば無菌室的な環境で出来上がるもんなんだろうってのが推測出来て面白いな。

周りに理解者のいない一人社内SEとかやってると本当に色んなヤツに遭遇する。
まじで「余地があれば絶対にやる」ってレベルで問題が起きるし、設計・開発・保守・拡張を一人で回すからコードの一つ一つに拘ってられない。
「とにかくデータをぶち込めば動いてくれる」という関数がないと追っつかない状況も生まれる。

ワークシートに挿入する際にVariant型以外だと表示形式が変わるなど余計な作用を生んだり、関数が文字列で入るなんて事もある。
だからマクロを濫造する上で、Variant型のままで運用し、それが及ぼす影響を理解しておく方が有利という環境もある事を覚えておいてほしい。
0877デフォルトの名無しさん2017/02/16(木) 20:42:31.73ID:/b6gNV/R
そもそも仕事の話をするなよ
0878デフォルトの名無しさん2017/02/16(木) 20:50:13.72ID:6YRpUZ/n
>>876
気の毒やね
0879デフォルトの名無しさん2017/02/16(木) 20:51:15.05ID:eA7r2zui
>>873
指定すべきがどうかは上で散々やってるけど、俺の意見としてはスタイルの問題でどっちでもいい
俺自身は俺の作るVBAプログラムで型を指定してないのは、手抜きだな
(Variant使うなって話じゃないよ。つかうなら原則As Variantで明示する)

ただ、意識して型指定するのはいいけど
指定したからといって言語側が型チェックをちゃんとやってくれると思うなよって話
0880デフォルトの名無しさん2017/02/16(木) 20:53:55.17ID:7EemdXzw
目的を果たせれば何だっていいんだよ
0881デフォルトの名無しさん2017/02/16(木) 20:54:30.77ID:INRkCvNU
>>870

いや、改変云々を論点にしたいならそれでもいいけどさ、
それでどうなるの?

マクロなら改変されなくて入力規則は改変されるっていうのは
個人の感想に過ぎないから証明のしようは無いよ。
このスレでアンケートでも取る?
ほぼ全員がVBA使ってるこのスレじゃ意味無いと思うけど。
0882デフォルトの名無しさん2017/02/16(木) 21:00:36.04ID:6YRpUZ/n
>>879
おっしゃる通りである
しかしまあ、変数に入れる値の型が明らかな場合はちゃんと指定すべきだと思うけどね
スタイルの差と言われたらそれまでだけども
>>880
保守が全くいらなければその通り
0883デフォルトの名無しさん2017/02/16(木) 21:04:42.50ID:GoZ0ZsyN
>>881
俺はマクロまで改変(というかデバッグボタンポチーからの黄色い行削除)された経験あるわ。
だから出来るだけ何も分からないユーザーの目の前に、マクロの挙動を左右する何かを差し出さない方がいい。

なので全ての入力はVariant型で受け取ってマクロ内で型チェックしてMsgboxで処理出来ない旨のメッセージを発行する。
間違っても実行時エラーのメッセージボックスとかそのまま表示させちゃダメ。
あと全員が全員やるってわけじゃないから作業者を限定するとかマクロ外での対処も有効。
0884デフォルトの名無しさん2017/02/16(木) 21:07:45.31ID:MMs4mAvC
>>876
>設計・開発・保守・拡張を一人で回すからコードの一つ一つに拘ってられない。
発狂しそうな環境ですねw
前に見たブログで「キナコ」と名乗っている自称事務系OLさんが書いているコードがもう、ありとあらゆるエラーを想定した
ものだったんだが、現場で実用になるコードってのはこういうもんか、俺にはちょっと無理だなと思ってしまった。
「非常用、押すな」と書いてあるボタンを押したがるバカでも安心して使える設計とか母性が無けりゃ無理なんじゃねえかなw
0885デフォルトの名無しさん2017/02/16(木) 21:16:50.35ID:eA7r2zui
>>882
思いついた俺が型指定したいのにVariant使う状況ちょろっと書いとくわ
For Eachで使うループ変数
Nullが必要な場合(DB連携なんか)
こいつらはどうしようもない

後はStatic変数とかで初期化チェックにNothing使うときとかも使うか

>>883
>デバッグボタンポチーからの黄色い行削除
あるねぇ
完璧な実行時エラー排除はなかなか難しい
ACCESSならmde(accde)で配布するからまだマシなんだけどねぇ
EXCELにVBAコンパイルしてコード除去するオプションとかないよな?
0886デフォルトの名無しさん2017/02/16(木) 21:19:33.55ID:W0y5+uWS
>>833
なにを主張したいコードなのか説明して
0887デフォルトの名無しさん2017/02/16(木) 21:39:42.51ID:YyV7ugT9
>>885
まあ設計に無理があるかミスしてるかだねえ
今作ってるツールでテキストボックスの名前で入力するのを指定してるんだが、命名ミスって仕方なく数値と文字受け入れるようにしてるわ
まあ別にVariant全否定するつもりはないから
「仕方ないとき」はあるからね
0888デフォルトの名無しさん2017/02/16(木) 21:42:12.62ID:YyV7ugT9
デバッグに飛ばないようにする努力はあらゆる場面で必要だろう
受け入れ緩くするのもありだが関数ごとにきっちりエラー処理するのが理想じゃね?
0889デフォルトの名無しさん2017/02/16(木) 22:14:54.98ID:W0y5+uWS
>>888
でおとしどこは?
0890デフォルトの名無しさん2017/02/16(木) 22:29:25.87ID:C8BNWAf7
>>876
それってさ雑な仕事してるから炎上するんだよね
手抜きのクソコードを書くとそのコードのせいでさらにクソコードを書くはめになる
クソコードはクソコードを呼ぶので加速度的にクソコードが増えていき生産性がガタ落ちになる
ようするに技術的負債ってやつだよ
借金は雪だるま式だ
0891デフォルトの名無しさん2017/02/16(木) 22:42:46.83ID:XCVAoIB6
使う人に、シート名変えないでね、とか、
全角入れないでね、とか言って渡せばいいんだよ。

変なエラー回避に時間かけてるから、
貴方の仕事は遅いのです。
0892デフォルトの名無しさん2017/02/16(木) 22:53:40.42ID:2OM8+5/j
そういう仕事の話はよそでやってほしいね
0893デフォルトの名無しさん2017/02/16(木) 22:56:48.57ID:K21kVzL8
このヨチヨチコード放談いつまで続くの?
0894デフォルトの名無しさん2017/02/16(木) 22:57:04.52ID:GoZ0ZsyN
>>890
別に炎上したなんて話してないし、むしろVariant型の挙動を利用して生産性第一で作業してるって話なんだけど。
なんかアンカー先間違えてないか。
0895デフォルトの名無しさん2017/02/16(木) 23:00:55.40ID:3jDFm3bn
>>881
程度問題ってだけの話
まあお前さんのところはスーパーハッカーの集団みたいだけど w
0896デフォルトの名無しさん2017/02/16(木) 23:02:47.89ID:3jDFm3bn
>>885
セルからデータ受けるときは基本 Variant で受けて型判定してるな
0897デフォルトの名無しさん2017/02/16(木) 23:03:10.14ID:YyV7ugT9
>>889
on error goto でエラートラップ
そんなに不安なら関数全部につけりゃ良い
チェックするのなんて入力の値だけで良いんだからそんな手間でもないだろ
0898デフォルトの名無しさん2017/02/16(木) 23:04:12.76ID:YyV7ugT9
>>893
VBAのスレである以上避けられないから新しい話題くれよ
0899デフォルトの名無しさん2017/02/16(木) 23:26:38.52ID:qi3MJmNL
質問というかただの疑問なんですが
excelのカメラ機能(図のリンク貼り付け)を使用している場合VBAを実行した際に明らかに速度が遅くなる現象の原因が分かる方っていらっしゃいますか?
またカメラ機能を使わない以外で上記の現象を回避されてる方はいますか?
0900デフォルトの名無しさん2017/02/16(木) 23:39:12.04ID:C8BNWAf7
>>894
でもそれって生産性あげたつもりになってるだけだよ
局所的に見て楽になったような気がするのかもしれないけど実際には問題を増やしてしまっている
こういう雑な積み重ねが保守不能なコードに化ける
Variantから脱却すれば今より仕事が早くなるから考えてみたら
0901デフォルトの名無しさん2017/02/16(木) 23:41:26.65ID:2OM8+5/j
その二人のコードを見たら大して違いはなく、自己評価の甘辛だけだったりして
0902デフォルトの名無しさん2017/02/16(木) 23:56:50.03ID:relaIxlm
>>900
いいんだよ
Variantで満足してる人は型を求めていない
求めていないものを押し付けても押し返されるだけだよ

さくっとしたマクロとしてもがっつりしたツールとしても使えるんだから用途に応じて使い分ければいい
同様に使う人も多様であっていいんだよ
0903デフォルトの名無しさん2017/02/17(金) 00:03:22.12ID:Egl82kKQ
>>899
全部の処理が終わってからカメラ機能を使う
0904デフォルトの名無しさん2017/02/17(金) 00:24:00.15ID:x+j5W1y3
>>903
なるほど、ありがとうございます。
ちなみに他ブックを同時に開いている場合に
その他ブックがカメラ機能を使用している場合の対処法は何かありますか?
0905デフォルトの名無しさん2017/02/17(金) 00:25:05.32ID:LNGtkd31
>>902
利用側はそうかもしれんけど作る側は潔癖であるべきじゃね?
なかなかできないけど
0906デフォルトの名無しさん2017/02/17(金) 00:35:35.78ID:ZUGFk9a/
Variantばかり使うのはゆとりの馬鹿と思って外れる確率はゼロに近い
0907デフォルトの名無しさん2017/02/17(金) 01:02:04.84ID:Yk2QF6YV
生産性を考えたらc#になった
0908デフォルトの名無しさん2017/02/17(金) 02:14:58.21ID:0Mgboldt
PasteSpecialで貼り付けをすると数値が文字列になっちゃうんだけど
これどうしたら良いの…?
0909デフォルトの名無しさん2017/02/17(金) 02:28:45.78ID:iYHKBeW3
>>908
xlPasteAllを指定する
0910デフォルトの名無しさん2017/02/17(金) 05:48:13.21ID:SExp+Ria
>>905
べき論はよくわかんないけど細かいルールはプロジェクト単位で決めればいいのよ
全ての人が統一したルールで開発とか無理がある

まずは目的を果たせればいいんだよ
0911デフォルトの名無しさん2017/02/17(金) 07:02:50.19ID:C9lFCZn0
大事なのはあくまでも自分用ツールとして他人に使わせないことだな
0912デフォルトの名無しさん2017/02/17(金) 07:06:32.57ID:YWoqzdEN
>>911
大多数のVBAプログラムはそうだし、ここでも暗黙にそういう前提だろうね
0913デフォルトの名無しさん2017/02/17(金) 07:22:23.36ID:zu1SJ23X
横槍で申し訳ないが、
なぜ「型はきちんと合わせて使う」とか
「Variantは極力使わない方が良い」とか言われているのかを
まずきちんと理解していないことには議論にもならないと思う。

逆を言えばそれさえ理解していれば後は作る側の部署なり個人なりの判断だろう。

Variantはほぼ何でも設定出来る便利な型だけど
メモリを圧迫したり暗黙の変換によって意図しない挙動を引き起こしたりする
使い方を知らないと非常に危険な型とも言える。

だから上で誰かが言っていた通り、使うべくして使うところで使うという考え方で良いと思う。

ただ、俺的には全て型宣言無しである程度の大きさのプログラムを組むような暴挙に出ることは
辞めておいた方が良いとは思うけどね。
0914デフォルトの名無しさん2017/02/17(金) 07:37:21.18ID:hoKx2dYD
自由とはコストやリスクがかかるもの

他人が関係しない小さい、狭い範囲内なら何やってもいいけど
0915デフォルトの名無しさん2017/02/17(金) 08:09:54.80ID:6fUPUfvd
>>910
限られた範囲内で可能なかぎり品質の良いコードを書く努力をすべきだ、という話
VBAだとメンテナンス性とか軽んじられるからね
うちの現場はコーディング規約もありゃしないからひどいもんよ
だから俺の場合は自己満だけどね
0916デフォルトの名無しさん2017/02/17(金) 08:37:35.15ID:57XKQRPM
>>913
「型宣言なし」の話は議論になってないよ。
0917デフォルトの名無しさん2017/02/17(金) 08:37:52.73ID:57XKQRPM
>>915

仕事の話はやめるべきだ。そもそもプロのプログラマが語り合う場じゃないし。
0918デフォルトの名無しさん2017/02/17(金) 09:21:29.04ID:4vjdAmpk
>>916
すべて型宣言なし = 全部variant
0919デフォルトの名無しさん2017/02/17(金) 10:01:59.38ID:/Ik0xHA1
>>917
えっ?
0920デフォルトの名無しさん2017/02/17(金) 10:34:33.71ID:iYHKBeW3
スレタイ

雑談スレはちゃんと別に用意されてる
0921デフォルトの名無しさん2017/02/17(金) 11:32:15.12ID:t6AZ1KOU
>>904
他ブックはデータソースですか?
だとしたら、そのブックでカメラ機能を使わないという選択はできますでしょうか。
見栄えを良くして重くなったファイルをデータソースにするのではなく、目的がデータ保存だけのファイルを作って、それを参照して見栄えの良いファイルを複数作るという考え方です。
0922デフォルトの名無しさん2017/02/17(金) 11:43:15.20ID:57XKQRPM
プログラマって自虐的なんだな

ここでの「仕事」つったらExcelを仕事に活用しているビジネスマンのやってる事だよ。
プロが現れて「プロならこうあるべき」なんて見たこともない。ドン引きそのものだ。ツイッターでやれ。
自分の職業をわざと貶めてるのか?
0923デフォルトの名無しさん2017/02/17(金) 12:52:58.35ID:loItl+7k
>>922
どの板に書いてるのかをよ〜く考えてからレスしなよ...
0924デフォルトの名無しさん2017/02/17(金) 12:58:20.11ID:57XKQRPM
>>923
音楽板にプロのミュージシャンは日常的に出てこないしスポーツ板にJ選手は出てこないしカメラ板にプロカメはこっそりしか出てこないわ。

奇異に感じねーのか?
0925デフォルトの名無しさん2017/02/17(金) 13:00:23.80ID:zgFjy358
dim a as variant
dim b as long
a = range("A1").value
' aが整数値であることのvalidationコード
b = a

みたいなコードを書いてるんですかね、このスレのプロ様は
0926デフォルトの名無しさん2017/02/17(金) 13:05:22.14ID:6fUPUfvd
>>924
所詮サラリーマン
0927デフォルトの名無しさん2017/02/17(金) 16:07:46.96ID:fQ7GKGL6
>>854
何言ってんだよ。
返り値が1次元だろうが2次元だろうが配列で返せる。

ただ、俺の例もそうだけど、こういう関数事態が糞関数だ。
引数が1次元でも2次元でもOKという時点で地雷臭がする。

こういうコード書く奴はエラー処理も碌にしないことが多い。
逆に型をきちんと指定する奴は、エラー処理の想定込みで指定する。
0928デフォルトの名無しさん2017/02/17(金) 16:19:46.97ID:loItl+7k
>>924
ん?
> ここでの「仕事」つったらExcelを仕事に活用しているビジネスマンのやってる事だよ。
に突っ込んでるんだが?
Excel の使い方の話ならよそでやってくれよ
0929デフォルトの名無しさん2017/02/17(金) 16:44:49.17ID:57XKQRPM
>>927
1次元ならLong値を返す、と書いてるじゃないか。

あとこれは完全に後出し(書き忘れた)なので根拠にはしないけど、見つからなかった場合はEmpty を返したい。

それとこういうライブラリ関数はあまり丁寧なエラー処理はしないよ。アプリに近い上流側でやるべき。
0930デフォルトの名無しさん2017/02/17(金) 17:24:57.59ID:fQ7GKGL6
>>929
だからそんな関数は作っちゃダメなんだよ。
設計してないからそんなことになってるんだろうけど。

だからエラー処理は受ける前にやるの。
変な引数自体受け取らないで済むように。
丁寧に作る時は両方でやることもある。
0931デフォルトの名無しさん2017/02/17(金) 17:33:56.58ID:fQ7GKGL6
それに、どうにも仕方無しにVariantになることもあるけど、そんなのはめったに無い。

どんな型でもOKな配列からサーチすることなんて殆ど有り得ない。
本来なら型指定の配列からサーチする関数でもOKな所を便利だからと使ってるだろうと推測する。
→それはどんな変数でもVariantにするのと全く同じ弊害を持つことになる。
0932デフォルトの名無しさん2017/02/17(金) 17:36:48.43ID:fQ7GKGL6
あとEmptyの話を書くからお里が知れる。
これだけでもレベルが分かる。
0933デフォルトの名無しさん2017/02/17(金) 17:40:48.67ID:zgFjy358
>>930
> だからエラー処理は受ける前にやるの。
> 変な引数自体受け取らないで済むように。
呼び出し側でエラーチェックするってことか?
プロ様は大変ですな
0934デフォルトの名無しさん2017/02/17(金) 17:52:20.28ID:57XKQRPM
>>930
エラー処理は渡す側の責務と受けとる側の責務に分けられるが、例えば平方根を求める関数でマイナス値のチェックなど普通はしない。
0935デフォルトの名無しさん2017/02/17(金) 18:05:05.67ID:fQ7GKGL6
>>933
全然大変じゃない。
インテリセンスからでも渡して良いものがわかるし、他の奴が使ってもおかしなことになりにくい。
他の奴が作ってても型指定してあれば使い方も分かりやすい。

むしろ何でも受け取るような関数作る方が後々大変なことになる。

Sub Test1()
Debug.Print LongToString("ABC")
End Sub
Function LongToString(varIn As Variant) As Variant
LongToString=varIn*3
End Function

Test1を書いてる時に"ABC"ではダメだと気付かない。
型指定してあればインテリセンスから"ABC"なんて入れることは有り得ない。
0936デフォルトの名無しさん2017/02/17(金) 18:06:26.44ID:6fUPUfvd
>>925
longがほしいならisnumericでセルの値を時かにチェックすればよろしくないか
どちらにしてもその値を処理するならどんな値かのチェックは必要だと思うんですが
0937デフォルトの名無しさん2017/02/17(金) 18:08:34.57ID:fQ7GKGL6
>>934
それは型指定しててもあり得るだろ。
引き数をVariantにした平方根を求める関数でマイナスをチェックするなら型指定しててもするだろう。
0938デフォルトの名無しさん2017/02/17(金) 18:10:40.07ID:57XKQRPM
あと>>854に間違いがあったので念のため訂正しとく。

Function searchFromAr(ByRef arr() As Variant, ByRef target As Variant) As Variant

ではなく、

Function searchFromAr(ByRef arr As Variant, ByRef target As Variant) As Variant
だ。

arr( ) じゃなくただの arr
0939デフォルトの名無しさん2017/02/17(金) 18:15:31.89ID:fQ7GKGL6
オブジェクトにおけるインターフェースの重要な役割が分かってれば型指定する筈なんだけどな。
そもそも他言語を知ってればVariantでOKという発想にはならんだろう。

もっともOKな奴がいるからVBが不評なんだけどな。
0940デフォルトの名無しさん2017/02/17(金) 18:18:49.17ID:6fUPUfvd
>>939
片付けがあやふやなんだから指定しなくてokってのがいるけど、そら逆でしょって思うわ
0941デフォルトの名無しさん2017/02/17(金) 18:25:09.55ID:zgFjy358
>>935
Function LongToString(varIn As Long) As Long
と定義しておこうが、
LongToString("ABC")
と書けちゃうし

dim a as variant
dim b as string
a = range("A1").value
' validation code here
b = LongToString(a)
とか書くのか
LongToStringを100箇所呼び出してると100箇所でやるのか
お疲れ様です
0942デフォルトの名無しさん2017/02/17(金) 18:26:21.82ID:fQ7GKGL6
>>938
そんなの見た瞬間から気付いてたが関数の中身が無いから一概に間違いとも言えない。
配列(Variant)を配列に入れることもある。
実際に俺も()付きの方の関数作ったことある。
Variantは普通は使わない方が良いが、例外の定番であるRangeをVariantで受けて高速化する方法でRangeが複数の場合がこれに該当した。
戻り値はVariantじゃ無かったけど。
0943デフォルトの名無しさん2017/02/17(金) 18:33:49.68ID:zgFjy358
>>936
取り得る戦略はいくつもあるし
型を明示する場合でも
dim a as long
a = range("a1")value
1. デフォルトのruntime errorでエラー検知のみ
2. on error gotoでエラートラップ
3. セル参照時に1個1個validation

毎回3やれとか言われても疲れるし
0944デフォルトの名無しさん2017/02/17(金) 18:34:02.47ID:TnLGa8QJ
>>899
ちょっと前に同じ現象ではまりました。困ったバグです。
カメラ機能の使用数に対し、等比級数的に処理時間が遅延。
オンメモリなら自/他ブックの区別なく影響を受けます。

要はカメラ機能を維持していることがNGなので、必要な時に更新して
機能を止めればいいです。
実はShapeオブジェクトに参照式が入っているだけなので、

 ソースセル内容編集
→ Shapes(1).DrawingObject.Formula=(参照範囲)
→ Calculate
→ Shapes(1).DrawingObject.Formula=""

これでShape内の画像は残り、リンクは切れてただの図形になります。
2〜3個あったカメラのリンクを切ったことで、数百秒に遅延した
シートイベントがmsecレベルに短縮されました。 ご参考まで。
ちなみにScreenupdatingの制御は逆に遅延の原因になることがある
ので注意して使うほうがよいです。
0945デフォルトの名無しさん2017/02/17(金) 18:35:34.78ID:57XKQRPM
>>930
ん?「受ける前にやる」って呼び出し側でやるって意味か?
0946デフォルトの名無しさん2017/02/17(金) 18:35:59.64ID:fQ7GKGL6
>>941
インテリセンス知らんのか?
書けても実際には書かれない。
分かる?初心者君。

100個所呼び出すって何だよww
ユーザ―インターフェースと関数を分離する意味が分からないなら関数作らずに全部イベントの所に書いてろw
0947デフォルトの名無しさん2017/02/17(金) 18:37:51.59ID:zgFjy358
>>945
実引数のチェックは100%やるべき
余裕があったら関数内でもやるけどね

って意味だと取った
ふつー逆でしょ
0948デフォルトの名無しさん2017/02/17(金) 18:40:11.45ID:57XKQRPM
>>941
いやそれは書けん(関数本体に入る前にエラー)だろ
0949デフォルトの名無しさん2017/02/17(金) 18:40:47.16ID:zgFjy358
>>946
> 書けても実際には書かれない。
またへんなこと言い出した

もしそうなら、実引数のチェックなんていらないよね
だって、間違った型の変数渡さない(書かない)ってことでしょ?
0950デフォルトの名無しさん2017/02/17(金) 18:42:27.09ID:zgFjy358
>>948
関数に入る前って実行時ってことでしょ?
書けてるじゃんw
0951デフォルトの名無しさん2017/02/17(金) 18:44:30.55ID:zgFjy358
>>946
> 100個所呼び出すって何だよww
何だよって、関数吐くったら呼び出すのは1回だけかよ

頭痛くなってきた
レス数が950を超えています。1000を超えると書き込みができなくなります。