Excel VBA 質問スレ Part45 [無断転載禁止]©5ch.io
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2017/01/03(火) 02:51:16.56ID:9Y8iTik6コード書き込みや作成依頼も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/
0952デフォルトの名無しさん
2017/02/17(金) 18:45:06.96ID:6fUPUfvd楽に書きたいんだったらon error gotoで良いんじゃね
そんなんはvariantでやろうがなんだろうが一緒だろ
>>941の例なんかだと、ユーザー側が間違った記述してんだからエラー吐いて当然でしょ
それを許容して返り値で判断させる関数を求められてるならそういう作りにするだけ
0953デフォルトの名無しさん
2017/02/17(金) 18:45:55.53ID:57XKQRPM0954デフォルトの名無しさん
2017/02/17(金) 18:48:28.19ID:zgFjy358ある関数の前提条件を誰が担保するかの話をしてるんだけど
仮に呼び出し側が担保すべしというポリシーにしたとしても、間違った型の値は渡されうる
だって、書けちゃうんだから
だから、担保するなら呼ばれる方
0955デフォルトの名無しさん
2017/02/17(金) 18:52:31.72ID:6fUPUfvd何だか俺横槍がまずかったみたいだな
とりあえず俺のレスは取り下げで
0956デフォルトの名無しさん
2017/02/17(金) 19:00:12.08ID:fQ7GKGL6だから何で分からんの?バカなの?
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間違ってるな。
呼び足す側がコントロールできることは呼び足す側が責任をもつ。
処理過程で発生するエラーなどは呼びだされる側でしかコントロールできないから呼び出される側でチェックする。
「引数が正しい型か?」は呼び出し側で静的にチェックできること。
0958デフォルトの名無しさん
2017/02/17(金) 19:09:34.20ID:57XKQRPMそれを踏まえて、
同じアルゴリズムを違う型に適用するためコピペして関数名を変えて使うのは最低の行為だ。
0959デフォルトの名無しさん
2017/02/17(金) 19:21:54.70ID:fQ7GKGL6お前のやり方では使う方が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:DzGsmJeY0963デフォルトの名無しさん
2017/02/17(金) 19:44:57.51ID:DzGsmJeY0964デフォルトの名無しさん
2017/02/17(金) 19:45:19.30ID:loItl+7k人に使ってもらうマクロならその程度のチェックは当たり前にやるけど?
0965デフォルトの名無しさん
2017/02/17(金) 19:47:28.23ID:57XKQRPMそれは上流の話だな。下流では「謝った引数を入れたら結果は未定義」でok
0966デフォルトの名無しさん
2017/02/17(金) 19:54:46.13ID:57XKQRPM・エラーが起こる条件が明確
・その条件に当てはまるかどうか事前に確認できる
この二つを満たすように工夫してるし、実現できた場合はエラーチェックは「しない」
0967デフォルトの名無しさん
2017/02/17(金) 20:00:13.54ID:6fUPUfvd型が違うってのは結果が違うんだぞ?
上の例みたいに例外の場合emptyを返すって用件ならそりゃvariantだろうけども
少なくとも明示的にどんな値が返るのかわかるような関数じゃないと色々まずいだろ
0968デフォルトの名無しさん
2017/02/17(金) 20:01:41.42ID:h6UWdVSZユーザが使って業務がストップしたらまずくね?
いくらテストしてもバグがないことは証明出来ないよ
0969デフォルトの名無しさん
2017/02/17(金) 20:12:43.27ID:8qknrLBgユーザー定義関数なのに定義を追っていって中身を確認出来ない状況とか、
実行時エラーが会社の命運を決めるような事態を引き起こすとか、
そんなものをエクセルで動かす狂気の会社なんかあるわけないだろ。
・・・ないよな?
0970デフォルトの名無しさん
2017/02/17(金) 20:18:39.08ID:LyP8mvbq"Variant型を議論するスレ"
見たいなの作って そこでやって欲しい気分だな
0971デフォルトの名無しさん
2017/02/17(金) 20:34:36.32ID:0Mgboldtちゃうねん
関数とか他シートの参照とかでごちゃごちゃしたシートから
値だけ入ったシートを作るために四の五のしてからPasteSpecialのxlPasteValuesAndNumberFormatsを指定して貼り付けてるんだけど
そうすると何故か数値になってる部分が全部文字列扱いになるの…
なんか俺オプションの勘違いしてるかな
0972デフォルトの名無しさん
2017/02/17(金) 20:36:15.65ID:57XKQRPM型は静的に指定できるじゃないか。
'***この関数の引数と返り値の関係は以下の通りです***
'1次元配列→Long値
'2次元配列→長さ2の 1次元配列
'N次元配列→長さNの 1次元配列
'ただし見つからなかった場合は Empty
'配列の各要素とターゲットの値は = で比較可能であること
'**************+++++++++++
誰も困らないだろ
0973デフォルトの名無しさん
2017/02/17(金) 20:38:15.99ID:DzGsmJeY動的ですね
0974デフォルトの名無しさん
2017/02/17(金) 20:38:20.38ID:loItl+7k会社の命運はないと信じたいけど
今日はB子ちゃんとデート♪
これを処理してっと...
ピポッ
エラー 13 「型が一致しません。」
お前らの命運やいかに
0975デフォルトの名無しさん
2017/02/17(金) 20:41:06.37ID:57XKQRPM静的に「指定」できる
関数の挙動はそりゃ動的だよ。
でも引数と返り値の関係は静的。
0976デフォルトの名無しさん
2017/02/17(金) 20:44:59.92ID:3DJT3WqG例としてはA1をコピーして図のリンク貼り付け→A1〜A3を結合した図が出る
問題なく貼り付けられる場合もあるし・・・よく分からん
0977デフォルトの名無しさん
2017/02/17(金) 21:04:06.39ID:BVl9fCvEそもそもこんな関数作ってもありがたみない
2次元含めて多次元配列なんて滅多に必要ないし生産性を下げるだけ
2次元配列を使う人って多分シートというユーザーインターフェースに気が付かないうちに束縛されてるんだろうな
素人にはインターフェースとビジネスロジック分離は難しいからね
0978デフォルトの名無しさん
2017/02/17(金) 21:15:02.13ID:8qknrLBgギャグかな?
0979デフォルトの名無しさん
2017/02/17(金) 21:15:54.92ID:57XKQRPMん、ああ。 確かにそうだ。
多次元配列は酸っぱいからな。
0980デフォルトの名無しさん
2017/02/17(金) 21:20:54.24ID:W6pJInKuInputBox文の後に追加
↓
On Error GoTo myError
End Subの前に、入力エラー時の回避先を追加
↓
myError:
MsgBox "入力データの型が不正です。"
0981デフォルトの名無しさん
2017/02/17(金) 21:27:09.14ID:UWNS+iP1素晴らしい見識をお持ちだ。
是非方法論をお伺いしたい。
0982デフォルトの名無しさん
2017/02/17(金) 21:35:53.77ID:BVl9fCvEごく普通にオブジェクト指向でコードを書くだけ
自然と2次元以上の配列がコードから消え去る
VBAコーダーはクラスもまともに使えない人ばかりだからわからないだろうけどね
0983デフォルトの名無しさん
2017/02/17(金) 21:42:04.44ID:/Ik0xHA1ほほー
するとn次元配列と比較して
どういったメリットを得て
デメリットはどうなる?
ケーススタディはどうなるかな?
0984デフォルトの名無しさん
2017/02/17(金) 21:42:55.04ID:6fUPUfvd最近大量のエクセルデータ扱うツールも作ってないし
配列よりコレクション使った方が取り回し良いしな
ボリュームを決めなきゃいけないリストの場合は配列使うが
0985デフォルトの名無しさん
2017/02/17(金) 21:56:35.30ID:BVl9fCvE多次元配列という柔軟性のない使いにくいわかりにくい物理的な構造から解放されてモデリングが容易になる
優れたモデリングはプログラムの保守性や拡張性を向上するために必須って常識だよね
逆に疑問なんだがビジネスで多次元配列を多用するってどこの業界なんだ?
仕事しててもそういう話って聞かないから気になる
0986デフォルトの名無しさん
2017/02/17(金) 21:57:21.66ID:YWoqzdEN単独の便利クラスを作ったり使ったりするのはありなんだけど体系だったものを作るのは難しい。
というか使い捨てになってしまう。
複数のクラス体系に対応した共通のアルゴリズムというのを事前に構築することができないんだよ。
0987デフォルトの名無しさん
2017/02/17(金) 22:00:32.92ID:57XKQRPM配列は抽象度が低い←わかる
だがクラスオブジェクトの配列じゃ縦横に可変長という構造は作れない
0988デフォルトの名無しさん
2017/02/17(金) 22:01:19.36ID:Q0oePE6a0989デフォルトの名無しさん
2017/02/17(金) 22:03:31.40ID:DzGsmJeY二次元可変配列が必要となる状況が想像できない
0990デフォルトの名無しさん
2017/02/17(金) 22:09:04.09ID:8qknrLBg「二次元配列なんかいらねぇ!」って言い出すくらいなら、適切な開発環境の選定をもうちょっと真面目にやるべきだと思う。
0991デフォルトの名無しさん
2017/02/17(金) 22:11:59.19ID:BVl9fCvEそれは錯覚だな
例えばスパース行列とかはインターフェースはまるで2次元配列のようだけど中身は全然2次元配列じゃないクラスだよね
もちろん多次元配列っぽいインターフェースがそもそも必要になることは少ないが
0992デフォルトの名無しさん
2017/02/17(金) 22:21:00.23ID:57XKQRPMDim arr() As Object
ReDim arr(0 To m , 0 To n)
ってできるんだし。
0993デフォルトの名無しさん
2017/02/17(金) 22:21:15.87ID:BVl9fCvEこれがまさにスプレッドシートというユーザーインターフェースに束縛された状態
なるほど、確かにユーザーインターフェースはスプレッドシートだし、ぼんやり眺めるとバリアントの2次元配列のように見える
しかしながら、内部的な処理まで2次元配列で行う必要は本当にあるのだろうか
2次元配列のわかりにくいコードを書くよりも、型安全でオブジェクティブな構造に変換してから、手強いビジネスロジックに立ち向かったほうが、健全なコーディングができそうだ、とは思わないのだろうか
0994デフォルトの名無しさん
2017/02/17(金) 22:28:03.46ID:8qknrLBg処理結果をセルに保存しないならエクセルで処理する理由がないし、
セル一つ一つにアクセスして結果を保存してるならただの馬鹿なんだけど。
それとも最終的に二次元配列に加工する場合でも、
中間段階では二次元配列を使わないから「めったに使わない」と表現してるんだろうか。
0995デフォルトの名無しさん
2017/02/17(金) 22:29:19.82ID:57XKQRPMオブジェクトの1次元配列は作らないのか?
そこから条件に合致したオブジェクトを探すという操作は発生しないのか?
そのとき>>972のような関数がそのまま使えたら便利だとは思わないか?
(= で比較可能ってのはダメだが)
0996デフォルトの名無しさん
2017/02/17(金) 22:37:51.46ID:/Ik0xHA1長さnのn次元配列
意味が分からん。
なんの長さよ
0997デフォルトの名無しさん
2017/02/17(金) 22:44:58.32ID:BVl9fCvEセルに保存するだけしかしてないならそれこそ勿体無い馬鹿
それは遅いから配列取り出して書き込めってことか?
滅多に使わんというのはそういうことだよ
シートとの境界では仕方なく使うことはあるけど、そうじゃなきゃ滅多に使わんし、使う理由もない
0998デフォルトの名無しさん
2017/02/17(金) 22:49:38.85ID:57XKQRPM>>972のことか?
返り値だ。
N次元配列からのサーチ結果はターゲットが見つかったとしたら
(x1, x2, ..., xn)
という長さNの1次元配列になるということだ。
つまりインデックス長だ。
0999デフォルトの名無しさん
2017/02/17(金) 22:50:36.99ID:AYehqi+e1000デフォルトの名無しさん
2017/02/17(金) 22:50:55.49ID:AYehqi+e10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
life time: 45日 19時間 59分 39秒
10021002
Over 1000Thread運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
http://premium.2ch.net/
▼ 浪人ログインはこちら ▼
https://login.2ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。