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

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

■ このスレッドは過去ログ倉庫に格納されています
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/
0778デフォルトの名無しさん2017/02/16(木) 00:01:00.36ID:W0y5+uWS
>>739
だからどうしたよ?
あーだコーダいうなら頭使えよ?
スレ名を大きな声で復唱してみなさい。
0779デフォルトの名無しさん2017/02/16(木) 00:17:58.70ID:SiA9A9XV
馬鹿はメンテに困るコードを書く
そういう馬鹿に限ってvariantを多用する
こういうことだよな
0780デフォルトの名無しさん2017/02/16(木) 00:32:38.95ID:vlXKqRPM
>>777
いやさ、variantで受け取ってvariantで返すのか?その関数
そもそもそんなたくさんの型不定の引数を受けとるような関数は欠陥じゃないのか?

どんな環境なのか想像できんわ
あんまりそれが一般的と思わぬよう
0781デフォルトの名無しさん2017/02/16(木) 00:45:35.60ID:XCVAoIB6
AT車に乗って、コンピューターが3速だと判断したのに、
う〜ん、そこは3速じゃねえんだよなぁとかブツブツ言いながら、
自分で2速に入れてる感じ。
キモイのでやめましょう。
0782デフォルトの名無しさん2017/02/16(木) 00:47:14.79ID:NIevlqDH
まったく例えになってない
0783デフォルトの名無しさん2017/02/16(木) 00:55:11.61ID:l4RhA8QW
まだやってたのか・・・この人ら
0784デフォルトの名無しさん2017/02/16(木) 00:57:14.89ID:XCVAoIB6
分かったよ。
あんたが使ってるのは、型指定しないと動かない変なExcel。(パチモン?)
俺が使ってるのは、型指定しなくても動くExcel。
これでいいだろ。
0785デフォルトの名無しさん2017/02/16(木) 01:26:19.50ID:XCVAoIB6
男は黙ってVariant。

Longの方が0.003秒速いとか言ってると、多分モテない。
0786デフォルトの名無しさん2017/02/16(木) 02:45:15.21ID:SiA9A9XV
ID:XCVAoIB6

馬鹿の見本
0787デフォルトの名無しさん2017/02/16(木) 02:58:29.09ID:7EemdXzw
ど素人だからこそvariantを多用するんだよ
0788デフォルトの名無しさん2017/02/16(木) 02:59:41.43ID:nVgOLTep
基本、>>780の言ってることが正解。
きちんと設計すれば大抵は型が決まる。
積極的にVariantを使う特別な理由があって、分かっててVariantを使うこともあるが、普段からVariantを使うことは無い。
0789デフォルトの名無しさん2017/02/16(木) 04:36:21.82ID:GoZ0ZsyN
Variant型で意見が分かれるのは成果物の想定が違うんだろうな。
具体的には上流工程なのか下流工程なのかで変わってくる気がする。

下流工程では引数の型は決まっているし、決まった型で返却すれば責任を全うできるけど、
上流工程ではプリミティブ型にしていても実行時に避けられない不測の事態が山ほどあるし、
下手に型決めた方がエラー吐きまくるっていう面倒な事もあるから、On ErrorとVariant型でいいやってなる場合も多い。

そして「ここは絶対に数値型で入力してください」と散々注意しても無意味に終わるから、
結局は>>777の言うような「想定外の場合にはエラーで返す」という設計が最もユーザビリティに優れる事になる。
誰かがコード見た時も、ある特定の条件でエラーとして弾いておく方が何を想定して書いたか分かりやすいしね。
0790デフォルトの名無しさん2017/02/16(木) 05:18:31.52ID:INRkCvNU
入力する値の形まで指定するならセルの入力規則で制限するとか
ユーザーフォーム用意しといてスピンボタンや
リストボックスからの選択しか出来ない様にするとか、
variantに頼らないやりようはあると思う。
俺は自分用のマクロしか作らないんでそんな厳密なことはやってないけど。
0791デフォルトの名無しさん2017/02/16(木) 05:26:27.50ID:GoZ0ZsyN
>>790
あるにはあるけど大人しく従ってくれると思ってはならない。

シートの書式だけを新しいブックにコピーして渡してくるくらいならまだマシで、
中途半端に機能を理解してると入力規則を消して入力した上にオリジナルに上書きしたりする馬鹿がいるからな。
俺たちの安全地帯はVBEの中だけだ。
0792デフォルトの名無しさん2017/02/16(木) 05:57:40.21ID:INRkCvNU
そこまで言い出したらマクロのコードも改変されるだろうとか、
パスワードかけて保護しても解除されるだろうとか、キリがないよ。
0793デフォルトの名無しさん2017/02/16(木) 07:09:32.22ID:5l57RGAF
自分のマクロさえ管理できていれば他人のマクロの型なんてどうでもいいや
お前ら布教大変だな
0794デフォルトの名無しさん2017/02/16(木) 07:15:37.69ID:+lEx52V9
>>792
入力書式とマクロじゃレベルが全然違うだろ
極論で論破したがる人なのか?
実際やってりゃ >>791 程度は普通にある
0795デフォルトの名無しさん2017/02/16(木) 07:16:57.78ID:+lEx52V9
>>793
アホとじゃれあってるだけだろ
2ちゃんではよく見る光景
0796デフォルトの名無しさん2017/02/16(木) 07:44:12.74ID:K21kVzL8
>>795
お前2ちゃん詳しいんだな、今度教えてくれよw
0797デフォルトの名無しさん2017/02/16(木) 07:57:26.78ID:NIevlqDH
マクロの改変をチェックする方法ってあるの?自分自身で
0798デフォルトの名無しさん2017/02/16(木) 08:08:51.07ID:QDmfNxD1
単純に入力部分の不確定要素であればそれようの関数を作っておけば良いだけの話
関数の出力部分まで型が決まらないのはどういう意図かわからん
どんな分野のエクセルだとそうなるんだ
単純にそこが疑問
ちゃんと説明してもらえればスッキリするんだが
0799デフォルトの名無しさん2017/02/16(木) 08:24:10.85ID:fAEKNUKM
配列in配列outってことじゃないの?
0800デフォルトの名無しさん2017/02/16(木) 08:24:11.96ID:+lEx52V9
>>797
設定必要でいいなら自分自身をエクスポートしてチェックサム計算するとか
0801デフォルトの名無しさん2017/02/16(木) 08:27:39.22ID:Fvt7S/mt
なるほど、その手があるか
0802デフォルトの名無しさん2017/02/16(木) 08:27:41.57ID:7EemdXzw
>>799
ならば配列を型とすればいい
0803デフォルトの名無しさん2017/02/16(木) 08:29:01.86ID:INRkCvNU
>>794
レベルの違いって、
そんな大層なもんでもないでしょ

大体、根本的には
「入力規則やマクロのコードを書き換え出来るかどうか」っていうより、
「それやっちゃったら正常に動かなくなる可能性が有る」ってことに
思い至れないようなバカ相手なら、何を考慮した所で無駄だって話じゃないかな。
0804デフォルトの名無しさん2017/02/16(木) 09:25:36.88ID:QDmfNxD1
エクセルを入力フォーム的に使ってゴニョゴニョするようなツールなら入力時点でチェック入れるべきでしょ
違うのかな
0805デフォルトの名無しさん2017/02/16(木) 10:21:07.08ID:fAEKNUKM
>>802
生配列を持ったクラス Array_T を作って引数は As Array_T で宣言し、関数内では中身の配列を処理するってことか。
Array_T 自身のメソッドにするなら引数は要らないな。

それはありかも。
使う側は生配列を直接渡せず Array_T にラップしなけりゃならないけど。
0806デフォルトの名無しさん2017/02/16(木) 10:33:49.94ID:nVgOLTep
あのね、ユーザーが何を入力するかは分からんのは当然なのよ。
そんなことは分かりきってる。
だからと言ってVariantに逃げるのがおかしい。
入力されたものを最後までそのまま使おうとする神経が分からない。

その関数の引数が意味的にLongで受けるべきなら関数を呼び出すまでにLongにすべき。
ユーザーの入力が"3.25個"ならそこから3を取得してから、意味的にDoubleで受けるべきなら3.25を取得してから関数を呼び出すべきだ。
例えば平方根を求める関数なら整数以外の平方根も十分あり得る→Double、今作ろうとしている処理では絶対に整数以外になることは有り得ない→Longというように設計の段階で決めて行くべきだろ。
0807デフォルトの名無しさん2017/02/16(木) 10:41:23.53ID:squjHSRZ
>>751
自分で解答するコードを書けば可能。
でも、事実上無理でしょうね(スキル的に)。
0808デフォルトの名無しさん2017/02/16(木) 10:55:09.68ID:squjHSRZ
>>798
> 関数の出力部分まで型が決まらないのはどういう意図かわからん
ん?よくあることでしょ?
Function add(a, b)
  add = a + b
End Function

Sub foo()
  Debug.Print add(1, 2)
  Debug.Print add(1.2, 2.3)
End Sub

結果 =>
3
3.5
0809デフォルトの名無しさん2017/02/16(木) 11:22:29.10ID:+lEx52V9
>>803
いやいや、入力規則を変更できる奴はそこそこいるけど、マクロまでいじる奴はそんなにいないでしょ
そもそもマクロいじるような奴なら対処できてるんだろうし
0810デフォルトの名無しさん2017/02/16(木) 11:33:37.99ID:+lEx52V9
>>805
なんでそんなややこしいこと考えるかな
単に関数の戻り値の型を配列にするだけでしょ
VBA 配列を返す関数
でググれよ
0811デフォルトの名無しさん2017/02/16(木) 11:41:36.19ID:fAEKNUKM
>>810
だって>>802が「配列を型とせよ」って言うからさ。
Variantは配列専用ではないし、明示的な配列型を作れって意味に捉えた。
0812デフォルトの名無しさん2017/02/16(木) 12:18:13.14ID:7EemdXzw
>>811
俺のせいにされても困る
言いたいことは810の通りだよ
0813デフォルトの名無しさん2017/02/16(木) 12:25:37.98ID:INRkCvNU
>>809
議論の前提条件が食い違ってるんだけどさ、
肝心なのはいじれるいじれないの問題じゃなくていじって良いか悪いかっていう所であって
俺の想定している相手なら「結果がどうなるかわからないものはいじらない」のよ。
それがマクロであれ入力規則であれ。
もちろん、分かっててやるなら入力規則だろうがマクロだろうが好きにすればいいけど、
結果も分からずにいじっちゃうのはただのバカでしょ。

数値を要求するセルに誤って文字列を入れちゃうような人は不注意な人だけど、
故意ではないだろうから
そういう人の為に入力規則で間違った型の値を入れられないようにしておく
っていう所までが俺の言っている想定の範囲。

でもその入力規則を書き換えちゃうっていうのは不注意じゃなくて故意だから
そのレベルの相手が結果を考慮せずにやってるとしたらこっちがどんな対策したっていみないよね、っていってるの。
そこに相手のスキルレベルの差なんて大した問題ではないと思うんだ。
実際、俺の職場じゃvbeでの編集ぐらいは誰でも出来るけど、
他人の書いたコードなんて不用意にいじらないし、それは入力規則でも同様。
0814デフォルトの名無しさん2017/02/16(木) 12:26:10.91ID:DbYeWqRP
シートとか言う巨大なコンテキストをフル活用する限りコードの健全化にも限界がある

自分用に使うなら最終的に動けば良い、ただし他人の作ったマクロの引継だけは勘弁
0815デフォルトの名無しさん2017/02/16(木) 12:26:14.76ID:zFIbZFKZ
>>739
2ちゃんの恥は書き捨てw
0816デフォルトの名無しさん2017/02/16(木) 12:36:03.92ID:QDmfNxD1
>>808
普通にDoubleで返しちゃあかん理由あるの
0817デフォルトの名無しさん2017/02/16(木) 12:40:07.65ID:b6l+qNT8
>>725
それを確定するんが設計ちゃうんか?(´・ω・`)
0818デフォルトの名無しさん2017/02/16(木) 12:40:09.54ID:W0y5+uWS
>>808
この例はまさか整数と実数とかいうわけ?
説明して
0819デフォルトの名無しさん2017/02/16(木) 12:40:30.66ID:fAEKNUKM
>>812
ああ、「配列を型とせよ」ってのは単に「配列型とせよ」って意味か!悪い悪いw
0820デフォルトの名無しさん2017/02/16(木) 12:43:18.64ID:+lEx52V9
>>811
だから戻り値の型を配列にすればいいだろ
Function A() As Integer()
...
End Function
ってやるだけだぞ
0821デフォルトの名無しさん2017/02/16(木) 12:46:11.45ID:QDmfNxD1
そもそもセルに入力されてるものって無理矢理文字列で処理できるからvariantである必要もないように感じる
0822デフォルトの名無しさん2017/02/16(木) 12:46:17.95ID:fAEKNUKM
>>817
正しく設計するならGenericとかが必要になる。
3種類の型に対応する関数を3通り同じ名前で作れれば解決するけど、VBAではVariantになっちゃう。
0823デフォルトの名無しさん2017/02/16(木) 12:47:22.08ID:fAEKNUKM
>>820
>>819
0824デフォルトの名無しさん2017/02/16(木) 12:49:23.78ID:+lEx52V9
>>813
実際にやってみればわかる
>>791 みたいなのはわりと普通にいるけど VBE でコード改編する奴なんて見たことない
0825デフォルトの名無しさん2017/02/16(木) 12:50:48.75ID:7EemdXzw
>>822
単純なことを複雑に考えても良いこと無いよ
0826デフォルトの名無しさん2017/02/16(木) 13:00:41.88ID:fAEKNUKM
>>825
じゃあ引数 x が
・スカラー
・1次元配列
・2次元配列
で処理を分岐する関数をどう書く?

ByRef x As Variant とするしかないでしょ。
0827デフォルトの名無しさん2017/02/16(木) 13:07:57.39ID:QDmfNxD1
>>826
ひとつの関数にまとめてるのに無理があるんじゃね?
そこが設計なんじゃね?
0828デフォルトの名無しさん2017/02/16(木) 13:15:59.12ID:fAEKNUKM
>>827
内部で分岐した先の処理をPrivateな下請け関数3つに分けるのは正しいと思う。

でもユーザー(関数をライブラリとして呼び出すプログラマ)向けのPublic関数としてはひとつであって欲しいよね。
0829デフォルトの名無しさん2017/02/16(木) 13:20:17.99ID:QDmfNxD1
>>828
そういう要望というか、仕様としてそういうもの作れってことならそうなるね
でも苦肉の策であることは間違いないと思うが
返り値が違う→用途が違う、だろ?
0830デフォルトの名無しさん2017/02/16(木) 13:22:32.18ID:gZtBZE12
>>728
ど素人はそもそも変数定義せんのちゃう?
# 宣言無し許容がデフォルトやし
0831デフォルトの名無しさん2017/02/16(木) 13:22:32.42ID:INRkCvNU
>>824
君の周りの事なんて一般的な前提には出来ないっていうか、
俺だったらvbeでも改変する(勿論、全部分かった上でなら、というのが前提条件だけど。)し、
わからないのなら下手にいじらない。
0832デフォルトの名無しさん2017/02/16(木) 13:37:58.16ID:ha+qjoA8
>>826
???
ユーザー定義型配列とか普通によくあるだろ。
0833デフォルトの名無しさん2017/02/16(木) 13:41:53.03ID:squjHSRZ
>>818
なんの説明を求められているのかわからない。

それはともかく、ExcelのビルトインオブジェクトのプロパティがVariantだらけだから、
そもそもが、Variantを排除しようというのが無理筋。

むしろ、Variantがデフォルトで、型を明示しないと動かないようなときだけそうする
という流派もあってもいい。
0834デフォルトの名無しさん2017/02/16(木) 13:42:48.05ID:ha+qjoA8
入力規則を弄られることは考える。
それを含めて工ラ一処理作るだろ。
ただし、それはそのマクロの使用環境を考える。
広く一般的に使われることを想定するならきちんとエラー処理を作る。
でも俺の場合は殆どの場合、入力規則が無い前提でしかもVariantを使わないように作るね。
0835デフォルトの名無しさん2017/02/16(木) 13:45:06.19ID:+lEx52V9
>>831
> 君の周りの事なんて一般的な前提には出来ないっていうか、
そのまま返すよ
そもそも改変して何をするつもりなんだよ w
0836デフォルトの名無しさん2017/02/16(木) 13:58:35.66ID:INRkCvNU
>>835
だからこそその辺を論点にはしていない。
最初から言ってるように、
結果も把握できない改変を伴うような事をしでかす連中相手には
何をやっても無駄だと言っている。
0837デフォルトの名無しさん2017/02/16(木) 15:02:37.01ID:fAEKNUKM
>>832
???
ユーザー定義型配列を受け入れる関数なんてあらかじめ作っておくことはできないから
そんなもん対応範囲外だろ。
0838デフォルトの名無しさん2017/02/16(木) 16:46:11.40ID:ha+qjoA8
>>837
あのさあ、何言ってんの?
ユーザー定義型をググって来い。
Cとかで言われる構造体だよ。

話にならん。
0839デフォルトの名無しさん2017/02/16(木) 16:58:09.82ID:fAEKNUKM
>>838
ユーザー定義型と>>826の問題にいったい何の関係があるのかと
頭大丈夫?
0840デフォルトの名無しさん2017/02/16(木) 17:05:09.07ID:squjHSRZ
>>839
いいかげん、お前の「正しい設計論」は聞き飽きた
そろそろ黙ってくれる?
0841デフォルトの名無しさん2017/02/16(木) 17:36:38.86ID:ha+qjoA8
>>839
ああ、そもそもの>>826が意味不明だった。
ようやっと意味が分かった。
単純に引数×は配列でOKなのにできないようなこと言うからこんがらがる

Function Hoge(strFuga() As String) As String()

End Function

入れるものが配列でない場合は呼び出し側で1個の配列にする。

Dim strHoge(0) As String
Dim strRet() As String
strHoge(0)="hogehoge"
strRet=Hoge(strHoge)

だったかな。
スマホからだから少し違ってるかもしれんが、こんなん、普通にできるだろ。
0842デフォルトの名無しさん2017/02/16(木) 17:47:04.29ID:6YRpUZ/n
まあさ、必要ならVariantにするし不要なら型を指定するってことだろ、結論は
元はといえば全部Variantでやれないやつはプログラム組むのが下手とかよくわからんこと言うやつがいたのが発端だし論点ずれてきてるね
0843デフォルトの名無しさん2017/02/16(木) 18:31:43.04ID:SiA9A9XV
>>842
馬鹿は何でもかんでもVaruant
0844デフォルトの名無しさん2017/02/16(木) 18:41:29.77ID:7EemdXzw
申し訳ないが他人を馬鹿にするのはNG
0845デフォルトの名無しさん2017/02/16(木) 19:06:06.30ID:eA7r2zui
次の検索結果を表示しています: Variant
元の検索キーワード: Varuant

グーグル先生すげえw
0846デフォルトの名無しさん2017/02/16(木) 19:15:18.59ID:C8BNWAf7
普通に型付きで問題ないなら型付きを使う
ポリモーフェィックな動作が要求されているならインターフェースを使う
Variantを強要するAPIを使うときにVariantから型付きに変換(あるいはラップ)するときにのみVariantを使う

常識的な職業プログラマならこれが正解

品質を要求されないアマチュアならどうだっていいよ
ただし本職とは極力関わらないでくれ
0847デフォルトの名無しさん2017/02/16(木) 19:16:41.76ID:eA7r2zui
>>762
>ループ用の変数はループに入る時点でロックされて型が決定
どこ情報で、ロックってどういう事をいってるんだ
Sub test()
Dim i As Variant
For i = CInt(1) To 3
Debug.Print VarType(i), i
i = CLng(i)
Debug.Print VarType(i), i
i = CStr(i)
Debug.Print VarType(i), i
Next
End Sub
0848デフォルトの名無しさん2017/02/16(木) 19:17:03.10ID:+lEx52V9
>>836
なるほど >>790 の提案はお馬鹿だと言いたいのか w
0849デフォルトの名無しさん2017/02/16(木) 19:19:22.42ID:+lEx52V9
>>847
俺が言うのもなんだが相手するなよ...
0850デフォルトの名無しさん2017/02/16(木) 19:22:37.22ID:K21kVzL8
>>849
むしろお前以外に誰が言うんだよw
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
そもそも仕事の話をするなよ
■ このスレッドは過去ログ倉庫に格納されています