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

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

レス数が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/
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を結合した図が出る

問題なく貼り付けられる場合もあるし・・・よく分からん
0977デフォルトの名無しさん2017/02/17(金) 21:04:06.39ID:BVl9fCvE
>>972
そもそもこんな関数作ってもありがたみない
2次元含めて多次元配列なんて滅多に必要ないし生産性を下げるだけ
2次元配列を使う人って多分シートというユーザーインターフェースに気が付かないうちに束縛されてるんだろうな
素人にはインターフェースとビジネスロジック分離は難しいからね
0978デフォルトの名無しさん2017/02/17(金) 21:15:02.13ID:8qknrLBg
>>977
ギャグかな?
0979デフォルトの名無しさん2017/02/17(金) 21:15:54.92ID:57XKQRPM
>>977
ん、ああ。 確かにそうだ。
多次元配列は酸っぱいからな。
0980デフォルトの名無しさん2017/02/17(金) 21:20:54.24ID:W6pJInKu
>>711
InputBox文の後に追加

On Error GoTo myError

End Subの前に、入力エラー時の回避先を追加

myError:
MsgBox "入力データの型が不正です。"
0981デフォルトの名無しさん2017/02/17(金) 21:27:09.14ID:UWNS+iP1
>>977
素晴らしい見識をお持ちだ。
是非方法論をお伺いしたい。
0982デフォルトの名無しさん2017/02/17(金) 21:35:53.77ID:BVl9fCvE
>>981
ごく普通にオブジェクト指向でコードを書くだけ
自然と2次元以上の配列がコードから消え去る
VBAコーダーはクラスもまともに使えない人ばかりだからわからないだろうけどね
0983デフォルトの名無しさん2017/02/17(金) 21:42:04.44ID:/Ik0xHA1
>>982
ほほー
するとn次元配列と比較して
どういったメリットを得て
デメリットはどうなる?

ケーススタディはどうなるかな?
0984デフォルトの名無しさん2017/02/17(金) 21:42:55.04ID:6fUPUfvd
確かにクラス使いはじめて二次元配列使うことは減ったな
最近大量のエクセルデータ扱うツールも作ってないし
配列よりコレクション使った方が取り回し良いしな
ボリュームを決めなきゃいけないリストの場合は配列使うが
0985デフォルトの名無しさん2017/02/17(金) 21:56:35.30ID:BVl9fCvE
>>983
多次元配列という柔軟性のない使いにくいわかりにくい物理的な構造から解放されてモデリングが容易になる
優れたモデリングはプログラムの保守性や拡張性を向上するために必須って常識だよね

逆に疑問なんだがビジネスで多次元配列を多用するってどこの業界なんだ?
仕事しててもそういう話って聞かないから気になる
0986デフォルトの名無しさん2017/02/17(金) 21:57:21.66ID:YWoqzdEN
VBAでクラス。。。
単独の便利クラスを作ったり使ったりするのはありなんだけど体系だったものを作るのは難しい。
というか使い捨てになってしまう。

複数のクラス体系に対応した共通のアルゴリズムというのを事前に構築することができないんだよ。
0987デフォルトの名無しさん2017/02/17(金) 22:00:32.92ID:57XKQRPM
>>985
配列は抽象度が低い←わかる

だがクラスオブジェクトの配列じゃ縦横に可変長という構造は作れない
0988デフォルトの名無しさん2017/02/17(金) 22:01:19.36ID:Q0oePE6a
Variantoの話には飽きて今度はまたまたおなじみのクラスがどうたらこうたらで続ける気か
0989デフォルトの名無しさん2017/02/17(金) 22:03:31.40ID:DzGsmJeY
>>987
二次元可変配列が必要となる状況が想像できない
0990デフォルトの名無しさん2017/02/17(金) 22:09:04.09ID:8qknrLBg
二次元配列をグラフィカルに表現するソフト上で走る為のコードを書くExcel VBAを取り扱うスレッドで、
「二次元配列なんかいらねぇ!」って言い出すくらいなら、適切な開発環境の選定をもうちょっと真面目にやるべきだと思う。
0991デフォルトの名無しさん2017/02/17(金) 22:11:59.19ID:BVl9fCvE
>>987
それは錯覚だな
例えばスパース行列とかはインターフェースはまるで2次元配列のようだけど中身は全然2次元配列じゃないクラスだよね
もちろん多次元配列っぽいインターフェースがそもそも必要になることは少ないが
0992デフォルトの名無しさん2017/02/17(金) 22:21:00.23ID:57XKQRPM
そもそも配列とクラスじゃ直交してて選択する話じゃないな。
Dim arr() As Object
ReDim arr(0 To m , 0 To n)
ってできるんだし。
0993デフォルトの名無しさん2017/02/17(金) 22:21:15.87ID:BVl9fCvE
>>990
これがまさにスプレッドシートというユーザーインターフェースに束縛された状態
なるほど、確かにユーザーインターフェースはスプレッドシートだし、ぼんやり眺めるとバリアントの2次元配列のように見える
しかしながら、内部的な処理まで2次元配列で行う必要は本当にあるのだろうか
2次元配列のわかりにくいコードを書くよりも、型安全でオブジェクティブな構造に変換してから、手強いビジネスロジックに立ち向かったほうが、健全なコーディングができそうだ、とは思わないのだろうか
0994デフォルトの名無しさん2017/02/17(金) 22:28:03.46ID:8qknrLBg
>>993
処理結果をセルに保存しないならエクセルで処理する理由がないし、
セル一つ一つにアクセスして結果を保存してるならただの馬鹿なんだけど。

それとも最終的に二次元配列に加工する場合でも、
中間段階では二次元配列を使わないから「めったに使わない」と表現してるんだろうか。
0995デフォルトの名無しさん2017/02/17(金) 22:29:19.82ID:57XKQRPM
>>993
オブジェクトの1次元配列は作らないのか?
そこから条件に合致したオブジェクトを探すという操作は発生しないのか?
そのとき>>972のような関数がそのまま使えたら便利だとは思わないか?
(= で比較可能ってのはダメだが)
0996デフォルトの名無しさん2017/02/17(金) 22:37:51.46ID:/Ik0xHA1
>>995
長さnのn次元配列
意味が分からん。
なんの長さよ
0997デフォルトの名無しさん2017/02/17(金) 22:44:58.32ID:BVl9fCvE
>>994
セルに保存するだけしかしてないならそれこそ勿体無い馬鹿

それは遅いから配列取り出して書き込めってことか?

滅多に使わんというのはそういうことだよ
シートとの境界では仕方なく使うことはあるけど、そうじゃなきゃ滅多に使わんし、使う理由もない
0998デフォルトの名無しさん2017/02/17(金) 22:49:38.85ID:57XKQRPM
>>996
>>972のことか?
返り値だ。
N次元配列からのサーチ結果はターゲットが見つかったとしたら
(x1, x2, ..., xn)
という長さNの1次元配列になるということだ。
つまりインデックス長だ。
0999デフォルトの名無しさん2017/02/17(金) 22:50:36.99ID:AYehqi+e
以上
1000デフォルトの名無しさん2017/02/17(金) 22:50:55.49ID:AYehqi+e
variantを使えないバカ達でした
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
life time: 45日 19時間 59分 39秒
10021002Over 1000Thread
2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
http://premium.2ch.net/

▼ 浪人ログインはこちら ▼
https://login.2ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。