トップページ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/
0756デフォルトの名無しさん2017/02/15(水) 22:50:51.92ID:khJPh7n1
>>755
バカかな?
0757デフォルトの名無しさん2017/02/15(水) 22:51:02.74ID:BBx5ZcB8
Variant型を積極的に使用するかどうかなんて状況によるだろ。
とりあえず動けばいいマクロを書く場面だって社内SEならよくあるだろうし、
逆に型指定しておく事でバグが発生しにくくなるとかマクロが使いやすくなるっていうなら積極的に型指定すべきだし。

いついかなる場合においてもVariant型は極力避けるべきであるって論調なら、ただ頭が固すぎる。
0758デフォルトの名無しさん2017/02/15(水) 22:52:39.74ID:tPmatHBd
セルの書式で
0"個"
にしてあるのに「3個」って入力されて集計から漏れるのは防ぎようがない
VBA使っていいんなら勝手に「個」を消して、全角の数字も半角にして、オーをゼロに置換してやるんだけど
0759デフォルトの名無しさん2017/02/15(水) 22:53:31.89ID:yaVm0IDe
>>752,753
じゃあもう一回w

お前らプログラミングがヘタクソだから
variantでキレイなコードを書けるように練習しなよ

俺が言ってるのそういう事w
お前らの興味が向いている様な初心者のおまじないみたいな話は
ハナから問題にしてないw
0760デフォルトの名無しさん2017/02/15(水) 23:06:54.66ID:khJPh7n1
>>759
極論言えばだな
お前はループ用の変数までvariantで書くのか?
という話なんだよ
0761デフォルトの名無しさん2017/02/15(水) 23:09:58.33ID:F/aHSwB0
>>759
完全にアホ過ぎる。
Variantで書いても既にキレイなの。
分かる?
でもそれはきちんと型指定してもキレイなの。
0762デフォルトの名無しさん2017/02/15(水) 23:13:41.64ID:BBx5ZcB8
>>760
ループ用の変数はループに入る時点でロックされて型が決定するから、
Variant型でやろうがLong型でやろうが大して差は開かなかったはず。

ただ変数型の違いよる処理時間はVariant = Long > Integer > Byteの順になってたはずだから、
ループ回数の上限が分かっているならIntegerやByteを使うのは有効。
0763デフォルトの名無しさん2017/02/15(水) 23:15:19.21ID:F/aHSwB0
設計思想が無いんだろうな。
キレイに書くのは当たり前。

>>757
取りあえずってのはそいつのコーディングスタイルというか、癖みたいなもんもあるからあり得るだろうな。
俺だってコメント全く無しで書くこともある。
その時だけのマクロとか。

でもそれをOKとは言わないだろ。
0764デフォルトの名無しさん2017/02/15(水) 23:15:24.29ID:khJPh7n1
型の指定が初心者のおまじないとか何を言ってるのかわからないよ
まあその程度のプログラムしか書いてないんだよ
worksheetとかrangeとかを全部objectで指定してるのと一緒だぞ
0765デフォルトの名無しさん2017/02/15(水) 23:16:47.40ID:aYEzhSy+
基本的に変数はdoubleなりなんなりで宣言する派だが
ループ用の変数なんてどうでもいいから宣言もしてないな
結果variantになってるなw
0766デフォルトの名無しさん2017/02/15(水) 23:17:28.43ID:je/ZAYb+
>>755
それはエラーになるのが正解
というか自ら進んでエラーを出して止まるべき

俺のプログラムがほとんど As Variant だと言ったけど、それはVariantであるべきプログラムだから。
0767デフォルトの名無しさん2017/02/15(水) 23:18:17.50ID:pcB8Xi3u
型わかってるのにVariant型じゃないと入れられないのとかあるじゃん
0768デフォルトの名無しさん2017/02/15(水) 23:19:42.16ID:khJPh7n1
>>762
でもループ変数をvariantで書くやつなんかほとんどいない
なぜなら意味がないから
longで書くことには意味があるから
variantにすることに意味があるならする
処理速度的に意味がなくても明示的にこの変数はこの型ですよ、ってしてあげることで可読性は上がる
0769デフォルトの名無しさん2017/02/15(水) 23:20:13.95ID:je/ZAYb+
>>762
普通に考えると
Long <= Integer = Byte < Variant の順だと思う
0770デフォルトの名無しさん2017/02/15(水) 23:24:33.53ID:F/aHSwB0
>>758
いや、ここVBAのスレだろ。
で、"3個"をそのまま受け取るような処理を何も考えずに書くから糞なんだよ。

まず第1にそのまま受け取る処理が良いのかどうかを考えるべきだろ。
そして、そのまま受け取るのが良いと決まってから文字列で受け取るかVariantで受け取るかどちらが良いのかとかを考える。
その結果、Variantが良いとなるならVariantを使っても良いんだよ。

で、そういう考え方で設計してたら必然的にVariantは殆ど無くなるんだ。
0771デフォルトの名無しさん2017/02/15(水) 23:27:25.23ID:khJPh7n1
>>770
そもそもこの場合だってその可能性があるならまずstringで受け取ってから処理すりゃ良いだけのことだしな
variantである意味がほとんどない
0772デフォルトの名無しさん2017/02/15(水) 23:28:28.84ID:F/aHSwB0
>>768
そう、意味を考える。
一緒に速度も考える。
で、意味的に型決まってても速度のメリットを取ってVariantというのが配列をぶち込む定番の処理だろ。
0773デフォルトの名無しさん2017/02/15(水) 23:30:58.50ID:je/ZAYb+
>>770
よく考えて必然的に Variant が殆どになる場合もあるけどね
0774デフォルトの名無しさん2017/02/15(水) 23:41:14.47ID:khJPh7n1
>>772
セルをそのまま配列にぶちこむときはそうなるな
>>773
どういう場合だ?
あんまり経験ないんだがな
目的の処理をする場合処理したい対象の型は大抵決まってるし、返したい値も決まってるだろ
0775デフォルトの名無しさん2017/02/15(水) 23:45:21.19ID:je/ZAYb+
>>774
複数のユーザーが決める違う型の値を受け取る共通ライブラリを作る時。
0776デフォルトの名無しさん2017/02/15(水) 23:50:27.16ID:khJPh7n1
>>775
その手の処理をしたことないんだけど、受け取ったあとに型を確定はできないのか?
どういう結果を返すんだそりゃ
0777デフォルトの名無しさん2017/02/15(水) 23:58:29.83ID:je/ZAYb+
>>776
VarType で型を判別して分岐〜、なんてやってたら引数が複数の時は
組み合わせが爆発してしまうのでそれは(積極的には)やらない。

関数の単一目的性を守ってれば「処理できない型の値を入れたらエラーになる」という方針で破綻しないよ。
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
お前がどう言おうと入力規則を解除する奴はいるし
コードまで改編する奴は見たことない
それなりの規模の会社で実務をやってりゃ普通に経験する
■ このスレッドは過去ログ倉庫に格納されています