トップページ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/
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回だけかよ

頭痛くなってきた
0952デフォルトの名無しさん2017/02/17(金) 18:45:06.96ID:6fUPUfvd
>>943
楽に書きたいんだったらon error gotoで良いんじゃね
そんなんはvariantでやろうがなんだろうが一緒だろ
>>941の例なんかだと、ユーザー側が間違った記述してんだからエラー吐いて当然でしょ
それを許容して返り値で判断させる関数を求められてるならそういう作りにするだけ
0953デフォルトの名無しさん2017/02/17(金) 18:45:55.53ID:57XKQRPM
エラーチェックはなるべく呼び足す側がやるってのは俺が>>929で書いたまさにそのことじゃんか。
0954デフォルトの名無しさん2017/02/17(金) 18:48:28.19ID:zgFjy358
>>952
ある関数の前提条件を誰が担保するかの話をしてるんだけど

仮に呼び出し側が担保すべしというポリシーにしたとしても、間違った型の値は渡されうる
だって、書けちゃうんだから

だから、担保するなら呼ばれる方
0955デフォルトの名無しさん2017/02/17(金) 18:52:31.72ID:6fUPUfvd
>>954
何だか俺横槍がまずかったみたいだな
とりあえず俺のレスは取り下げで
0956デフォルトの名無しさん2017/02/17(金) 19:00:12.08ID:fQ7GKGL6
>>949
だから何で分からんの?バカなの?

LongTοString(

までキー入力した時にvarInがLongだと分かるんだから"ABC"入れてもエラーになると分かるから書かれない。

For i=1 To 100
If IsNumeric(a) Then 'aの範囲気にする処理なら別のチェック
b=LongToString(a)
EndIf
Next i

とすればそもそも1度も呼び出されないこともある。
こんなのは関数の使われ方によって変わる。
場合によってはVariantで受けることも有るだろう。
そういう、状況を無視して100個所とか言うから笑われるんだよ。
0957デフォルトの名無しさん2017/02/17(金) 19:02:20.94ID:57XKQRPM
>>954
間違ってるな。

呼び足す側がコントロールできることは呼び足す側が責任をもつ。
処理過程で発生するエラーなどは呼びだされる側でしかコントロールできないから呼び出される側でチェックする。

「引数が正しい型か?」は呼び出し側で静的にチェックできること。
0958デフォルトの名無しさん2017/02/17(金) 19:09:34.20ID:57XKQRPM
あと前提として Variant でなければならない限り使うな、というのは正しいし、面倒だから Variant にするというのは望ましくない。

それを踏まえて、
同じアルゴリズムを違う型に適用するためコピペして関数名を変えて使うのは最低の行為だ。
0959デフォルトの名無しさん2017/02/17(金) 19:21:54.70ID:fQ7GKGL6
>>954
お前のやり方では使う方がvarInに"ABC"入れてダメなのかが分からない。
それで入れて実行時にエラー処理ではねられる。
というよりその関数の使い方が分かりにくい。
それだったら関数なんて作らない方が良い。
0960デフォルトの名無しさん2017/02/17(金) 19:27:49.71ID:fQ7GKGL6
ちゅうかね、関数先に作ったりするわけよ。
平方根求める関数ならどういう処理か分かるだろ。
別に後に作る場合でも関数がどうであるべきかを考えて実装する。

そもそも何でもVariantで良いなら型なんて必要無いだろ。
もしかしてVBScriptの方が正しいと思ってる?
0961デフォルトの名無しさん2017/02/17(金) 19:30:25.17ID:h6UWdVSZ
自分しか使わないなら呼び出された側でチェックする必要ないけど
悪意あるユーザがスタックオーバーフローとかインジェクションとか目的としてたらセキュリティ的にまずい事になる
0962デフォルトの名無しさん2017/02/17(金) 19:33:24.00ID:DzGsmJeY
Variantで受けることが標準なのだとしたらExcel標準の関数が型指定となってる理由は何なのだろうね
0963デフォルトの名無しさん2017/02/17(金) 19:44:57.51ID:DzGsmJeY
>>719以降が不毛な内容で埋まってるのはなかなかすごいことだと思った
0964デフォルトの名無しさん2017/02/17(金) 19:45:19.30ID:loItl+7k
>>925
人に使ってもらうマクロならその程度のチェックは当たり前にやるけど?
0965デフォルトの名無しさん2017/02/17(金) 19:47:28.23ID:57XKQRPM
>>961
それは上流の話だな。下流では「謝った引数を入れたら結果は未定義」でok
0966デフォルトの名無しさん2017/02/17(金) 19:54:46.13ID:57XKQRPM
呼び出される側の処理を書くときは

・エラーが起こる条件が明確
・その条件に当てはまるかどうか事前に確認できる

この二つを満たすように工夫してるし、実現できた場合はエラーチェックは「しない」
0967デフォルトの名無しさん2017/02/17(金) 20:00:13.54ID:6fUPUfvd
>>958
型が違うってのは結果が違うんだぞ?
上の例みたいに例外の場合emptyを返すって用件ならそりゃvariantだろうけども
少なくとも明示的にどんな値が返るのかわかるような関数じゃないと色々まずいだろ
0968デフォルトの名無しさん2017/02/17(金) 20:01:41.42ID:h6UWdVSZ
>>965
ユーザが使って業務がストップしたらまずくね?
いくらテストしてもバグがないことは証明出来ないよ
0969デフォルトの名無しさん2017/02/17(金) 20:12:43.27ID:8qknrLBg
なんかもうVBAの話してねぇな。

ユーザー定義関数なのに定義を追っていって中身を確認出来ない状況とか、
実行時エラーが会社の命運を決めるような事態を引き起こすとか、
そんなものをエクセルで動かす狂気の会社なんかあるわけないだろ。

・・・ないよな?
0970デフォルトの名無しさん2017/02/17(金) 20:18:39.08ID:LyP8mvbq
なんかそろそろ
"Variant型を議論するスレ"
見たいなの作って そこでやって欲しい気分だな
0971デフォルトの名無しさん2017/02/17(金) 20:34:36.32ID:0Mgboldt
>>909
ちゃうねん
関数とか他シートの参照とかでごちゃごちゃしたシートから
値だけ入ったシートを作るために四の五のしてからPasteSpecialのxlPasteValuesAndNumberFormatsを指定して貼り付けてるんだけど
そうすると何故か数値になってる部分が全部文字列扱いになるの…
なんか俺オプションの勘違いしてるかな
0972デフォルトの名無しさん2017/02/17(金) 20:36:15.65ID:57XKQRPM
>>967
型は静的に指定できるじゃないか。

'***この関数の引数と返り値の関係は以下の通りです***
'1次元配列→Long値
'2次元配列→長さ2の 1次元配列
'N次元配列→長さNの 1次元配列
'ただし見つからなかった場合は Empty
'配列の各要素とターゲットの値は = で比較可能であること
'**************+++++++++++

誰も困らないだろ
0973デフォルトの名無しさん2017/02/17(金) 20:38:15.99ID:DzGsmJeY
>>972
動的ですね
0974デフォルトの名無しさん2017/02/17(金) 20:38:20.38ID:loItl+7k
>>969
会社の命運はないと信じたいけど

今日はB子ちゃんとデート♪
これを処理してっと...

ピポッ
エラー 13 「型が一致しません。」

お前らの命運やいかに
0975デフォルトの名無しさん2017/02/17(金) 20:41:06.37ID:57XKQRPM
>>973
静的に「指定」できる
関数の挙動はそりゃ動的だよ。
でも引数と返り値の関係は静的。
0976デフォルトの名無しさん2017/02/17(金) 20:44:59.92ID:3DJT3WqG
シートのセルをコピーして別シートに図のリンク貼り付けすると、コピーしてないセルまで図化してしまうんだが・・・

例としてはA1をコピーして図のリンク貼り付け→A1〜A3を結合した図が出る

問題なく貼り付けられる場合もあるし・・・よく分からん
レス数が950を超えています。1000を超えると書き込みができなくなります。