Excel VBA 質問スレ Part45 [無断転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
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/
0697デフォルトの名無しさん
2017/02/14(火) 09:59:06.01ID:1O/6AsKpデイリーで処理してるから
速攻でバレるんよ。
もしマイクロソフトが対応してくれないと。
0698デフォルトの名無しさん
2017/02/14(火) 10:18:16.37ID:XQOX6frc和暦なんて最終的な表示部分だけでしょ?
アドホックな対応でごまかしながら待つしかないんじゃないかなあ。
0699デフォルトの名無しさん
2017/02/14(火) 10:20:17.77ID:1O/6AsKp処理が終わったところでイベント発生禁止にして上書き、んでイベント復活しかない?
0700デフォルトの名無しさん
2017/02/14(火) 21:19:12.87ID:zSFmfMPu昭和のときは三ヶ月掛かったけど
消費税もそうだけど、日付と名称(消費税なら率)が判明したらそこだけだもの、今回は瞬殺だろ
0701デフォルトの名無しさん
2017/02/14(火) 23:14:00.51ID:erEJytj9平成31年1月1日に生前退位が行われ新元号になるってのが決まってるんだから
その時まで不測の事態が起こらない限り事前の準備時間はある…?のかな
0702デフォルトの名無しさん
2017/02/14(火) 23:24:09.61ID:ev1pSY1G俺ならオブジェクト指原ってボケる。
>>701
既に次の年号が組み込まれていたら笑う。
0703デフォルトの名無しさん
2017/02/14(火) 23:27:43.38ID:UB3JXf9t0704デフォルトの名無しさん
2017/02/14(火) 23:52:21.37ID:fgjpd/Zj0705デフォルトの名無しさん
2017/02/15(水) 00:12:27.99ID:urFAvqLFそうでない場合は漏れが許されないんだぞ
0706デフォルトの名無しさん
2017/02/15(水) 03:50:35.87ID:vC8DQIA41月1日では他の宮中行事とカブってワチャワチャするからズラすとか言ってなかった?
まぁ事前にわかる事に変わりはないか。
0707デフォルトの名無しさん
2017/02/15(水) 08:20:59.18ID:uIQboeV9まじか…OSが持ってると思ってたよ…
会社のOfficeはそろそろ新しいのに買い換えないとな
0708デフォルトの名無しさん
2017/02/15(水) 12:27:48.68ID:wBM76KMmVBAとかで作ってる社内資料は殆ど和暦表示だから、今から考えると恐ろしいわ…
0709デフォルトの名無しさん
2017/02/15(水) 13:37:00.48ID:HgaCZlv60710デフォルトの名無しさん
2017/02/15(水) 13:47:11.11ID:6F4521pz0711デフォルトの名無しさん
2017/02/15(水) 14:58:51.71ID:5igOyxsI日付、時刻は上から下へと、時系列に並んでいます
日付・時刻・アイテム名の同時重複ありです
やりたいこと=「表示したい”行数を入力”して、その行数をシートの左上にして表示する」
Sub Lookup_Row()
' 使用済みの最終セルの選択
Dim MaxRow As Integer
With Range("A1").SpecialCells(xlLastCell)
MaxRow = .Row '最終セルの行
End With
' 表示したい行数を入力
Dim NumRow As Integer
NumRow = InputBox("表示したい行数を入力", Title:="行数入力", Default:=buf)
If NumRow > 0 And NumRow <= MaxRow Then
ActiveWindow.ScrollRow = NumRow
Else
MsgBox "行数が許容範囲を超えています =" & NumRow
End If
End Sub
入力ミスがあった場合
入力で-100 → If文でチェック → MsgBox "行数が許容範囲を超えています =" & NumRow
入力で1000000 → 実行時エラー オーバーフローしました。
入力でAAA → 実行時エラー オーバーフローしました。
となります、入力が整数型で1〜MaxRowなら実行、それ以外はMsgBoxでエラー表示させたいのですが
0712デフォルトの名無しさん
2017/02/15(水) 15:37:06.29ID:xVeThrOdOn Error使うか
Dim NumRow As Variant にして後で数値か? 許容範囲か? チェックしる
0713デフォルトの名無しさん
2017/02/15(水) 15:41:53.42ID:6lReDbAzそうなんですか。
ご苦労が多そうですが
養生なさってください。
0714デフォルトの名無しさん
2017/02/15(水) 17:50:36.24ID:uggMbaXG0715デフォルトの名無しさん
2017/02/15(水) 18:10:31.64ID:khJPh7n10716デフォルトの名無しさん
2017/02/15(水) 18:19:40.04ID:LgUU6dFz面倒なので迷ったらVariantですごめんなさい
0717デフォルトの名無しさん
2017/02/15(水) 18:58:10.50ID:MestFhjvこの場ではどんな使い方だとしても目的を果たせればいい
メンテナンス性を考えるならできあがってから考えても遅くないし
0718デフォルトの名無しさん
2017/02/15(水) 19:35:12.52ID:8P5JIAcqVariant 以外はあまり使いませんな。カウンタに Long を使うくらいか。
0719デフォルトの名無しさん
2017/02/15(水) 19:49:51.07ID:yaVm0IDevariantを使えない奴がクソ呼ばわりしてるだけだ
0720デフォルトの名無しさん
2017/02/15(水) 20:00:12.56ID:F/aHSwB0基本使うべきじゃない。
Rangeを配列で受ける時とか、特別な理由があるなら分かるけど。
0721デフォルトの名無しさん
2017/02/15(水) 20:15:18.98ID:8QtzDjS+揮発性関数を一切使ってないのに(マクロも外部データの参照も使っていません)
ブックを開いてすぐ閉じても変更を保存するか確認するダイアログボックスが出てきて困っています。
なんでこんな事になったのか心当たりが有りません。
揮発性関数以外にブックの保存を促す要素って何か有るのでしょうか?
0722デフォルトの名無しさん
2017/02/15(水) 20:34:50.87ID:khJPh7n1型が確定してないのとかチンポジずれてるみたいで気持ち悪い
0723デフォルトの名無しさん
2017/02/15(水) 20:46:48.47ID:wfPvVi6qマイクロソフトは早く拡張しろ
0724デフォルトの名無しさん
2017/02/15(水) 20:52:37.92ID:UwBeD5Zq0725デフォルトの名無しさん
2017/02/15(水) 20:52:53.63ID:je/ZAYb+ほとんどの場合引数の型が確定しないので結局Variantだらけになる
0726デフォルトの名無しさん
2017/02/15(水) 21:05:02.59ID:khJPh7n1でもあとからキャストするでしょ
0727デフォルトの名無しさん
2017/02/15(水) 21:09:13.63ID:F/aHSwB0はあ?
確定しないことなんて殆ど無いわ。
設計が悪いんだろう。
0728デフォルトの名無しさん
2017/02/15(水) 21:20:08.65ID:yaVm0IDeお前らどんだけプログラミングが下手なんだよ
0729デフォルトの名無しさん
2017/02/15(水) 21:21:34.66ID:OJCj5dj4馬鹿
0730デフォルトの名無しさん
2017/02/15(水) 21:22:18.43ID:khJPh7n1他になんか必要な場面あるかね
0731デフォルトの名無しさん
2017/02/15(水) 21:23:23.84ID:MestFhjv0732デフォルトの名無しさん
2017/02/15(水) 21:23:56.89ID:khJPh7n1variantで書けるから偉いのか?
全部variantで書いて処理速度が問題ない程度のプログラムしか書かないならそれでも良いんじゃない
0733デフォルトの名無しさん
2017/02/15(水) 21:25:00.63ID:yaVm0IDeは?なんでそうなるんだよ
variantで書けないから下手なんだよ
0734デフォルトの名無しさん
2017/02/15(水) 21:27:54.70ID:UwBeD5Zqそんなにvariantが好きならjsをオススメする
0735デフォルトの名無しさん
2017/02/15(水) 21:28:00.36ID:xVeThrOdDim b As Variant
For Each b In a
Next
とか
0736デフォルトの名無しさん
2017/02/15(水) 21:31:10.86ID:F/aHSwB0VB系のプログラマーが他から糞呼ばわりされるのが良く分かる。
俺に言わせればVBが糞なんじゃなく、そのプログラマーが糞なんだが、確かにVBAには糞コード書く奴が多いよな。
0737デフォルトの名無しさん
2017/02/15(水) 21:33:07.33ID:khJPh7n1いやね、variantで書けと言われれば書けるよ
書く必要がないし気持ち悪いし大抵遅くなるからやらないだけで
>>735
その書き方あんま見たことないけど普通のforに比べて速かったりするの?
0738デフォルトの名無しさん
2017/02/15(水) 21:35:18.88ID:vaCBxgQgコードはって
0739デフォルトの名無しさん
2017/02/15(水) 21:38:36.03ID:A9woeCde>マクロも外部データの参照も使っていません
って言ってるのに
>コードはって
とか言ってもな
0740デフォルトの名無しさん
2017/02/15(水) 21:38:42.30ID:yaVm0IDevariantの遅さなんてアルゴリズムの遅さに比べれば誤差にも届かんのだよ
つまり遅いのはvariantのせいではない
0741デフォルトの名無しさん
2017/02/15(水) 21:46:30.70ID:F/aHSwB0そういう問題じゃ無い。
そして、実際に遅い時点で糞コード。
メリットが無い安易な逃げだな。
技術力の無さを埋めるための。
まったく、動けば良いと思ってる奴が多すぎる。
0742デフォルトの名無しさん
2017/02/15(水) 21:49:04.70ID:khJPh7n1この人のプログラムは変数名もきっと適当であとから見たら何が何だかわからないだろうね
0743デフォルトの名無しさん
2017/02/15(水) 21:49:26.25ID:yaVm0IDeつまりお前がクソコード書いてるって事じゃないかw
何言ってんのお前w
0744デフォルトの名無しさん
2017/02/15(水) 21:50:42.27ID:UwBeD5Zq日本語でおk
0745デフォルトの名無しさん
2017/02/15(水) 22:05:34.61ID:je/ZAYb+確定しないことがほとんどさ
0746デフォルトの名無しさん
2017/02/15(水) 22:13:59.52ID:YhLDJr+cコードに表れないことばっかになると読む方が辛い
0747デフォルトの名無しさん
2017/02/15(水) 22:14:54.77ID:yaVm0IDevariantを使って分かりにくくなるのは型をコントロール出来ていないコードだから
重要なのは変数の型ではなく値の型
値の型が一貫してコントロール下にあるコードは全てvariantでも読みやすくバグも出にくい
本当に気を使うべきは値の型
0748デフォルトの名無しさん
2017/02/15(水) 22:15:25.45ID:je/ZAYb+As Variant 282個
As その他 102個
だった。
「ほとんど」というのは言い過ぎだったかも。
0749デフォルトの名無しさん
2017/02/15(水) 22:19:05.17ID:je/ZAYb+As Variant 238個
As その他 17個
だった。こっちは「ほとんど」と言える。
0750デフォルトの名無しさん
2017/02/15(水) 22:28:33.65ID:wfPvVi6qタイプセーフにすれば動作する前に型をコントロールできていることがはっきりする
0751デフォルトの名無しさん
2017/02/15(水) 22:31:45.05ID:m87qnWVq別途DLL、EXE、その他一切のファイルの使用は出来ません
Webサーバを立ててそっちにPOSTして解凍したファイルを送り返してもらう、
という案もだめでした(ネットワークに繋がっていなくても動ける必要アリ)
ZIPならApplication.Shellを使うという定番技があるんですが、gzファイルでも
同じように解凍出来ませんでしょうか?
.NETの System.IO.compressionが使えたりしないか試してみましたらCOMでは
ないようで駄目でした
0752デフォルトの名無しさん
2017/02/15(水) 22:37:18.33ID:khJPh7n1いや、最後にすんなやw
型をvariantにする必要性が全く見えてこない
少なくともVBAはコード側で型付けする言語だと思ってるんですが
.NETだったら全部Objectで処理するのか…?
0753デフォルトの名無しさん
2017/02/15(水) 22:38:45.19ID:F/aHSwB0だからそういう問題じゃない。
絶対にLong以外有り得ないのにVariantにするのはクソだ。
そして決まらないのは設計がクソだからだ。
というより設計して無いんじゃないか?
取りあえず動くようにしてるだけで。
「Variantでも」と言ってる時点で糞。
同等ではメリットになっていない。
そして実際にはデメリットに気付いて無いだけ。
0754デフォルトの名無しさん
2017/02/15(水) 22:46:22.73ID:je/ZAYb+値の型って何?
Variant変数に格納された値自体の型ってことなら、コントロールは難しいと思うよ。
0755デフォルトの名無しさん
2017/02/15(水) 22:46:54.44ID:J6VHa6KYウチの会社のエクセルは、神エクセルですから、
セルに「1/3個」とか平気で書いちゃうんですね。
だから、バリアントじゃないとエローになっちゃうんですね。
0756デフォルトの名無しさん
2017/02/15(水) 22:50:51.92ID:khJPh7n1バカかな?
0757デフォルトの名無しさん
2017/02/15(水) 22:51:02.74ID:BBx5ZcB8とりあえず動けばいいマクロを書く場面だって社内SEならよくあるだろうし、
逆に型指定しておく事でバグが発生しにくくなるとかマクロが使いやすくなるっていうなら積極的に型指定すべきだし。
いついかなる場合においてもVariant型は極力避けるべきであるって論調なら、ただ頭が固すぎる。
0758デフォルトの名無しさん
2017/02/15(水) 22:52:39.74ID:tPmatHBd0"個"
にしてあるのに「3個」って入力されて集計から漏れるのは防ぎようがない
VBA使っていいんなら勝手に「個」を消して、全角の数字も半角にして、オーをゼロに置換してやるんだけど
0759デフォルトの名無しさん
2017/02/15(水) 22:53:31.89ID:yaVm0IDeじゃあもう一回w
お前らプログラミングがヘタクソだから
variantでキレイなコードを書けるように練習しなよ
俺が言ってるのそういう事w
お前らの興味が向いている様な初心者のおまじないみたいな話は
ハナから問題にしてないw
0760デフォルトの名無しさん
2017/02/15(水) 23:06:54.66ID:khJPh7n1極論言えばだな
お前はループ用の変数までvariantで書くのか?
という話なんだよ
0761デフォルトの名無しさん
2017/02/15(水) 23:09:58.33ID:F/aHSwB0完全にアホ過ぎる。
Variantで書いても既にキレイなの。
分かる?
でもそれはきちんと型指定してもキレイなの。
0762デフォルトの名無しさん
2017/02/15(水) 23:13:41.64ID:BBx5ZcB8ループ用の変数はループに入る時点でロックされて型が決定するから、
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+ループ用の変数なんてどうでもいいから宣言もしてないな
結果variantになってるなw
0766デフォルトの名無しさん
2017/02/15(水) 23:17:28.43ID:je/ZAYb+それはエラーになるのが正解
というか自ら進んでエラーを出して止まるべき
俺のプログラムがほとんど As Variant だと言ったけど、それはVariantであるべきプログラムだから。
0767デフォルトの名無しさん
2017/02/15(水) 23:18:17.50ID:pcB8Xi3u0768デフォルトの名無しさん
2017/02/15(水) 23:19:42.16ID:khJPh7n1でもループ変数をvariantで書くやつなんかほとんどいない
なぜなら意味がないから
longで書くことには意味があるから
variantにすることに意味があるならする
処理速度的に意味がなくても明示的にこの変数はこの型ですよ、ってしてあげることで可読性は上がる
0769デフォルトの名無しさん
2017/02/15(水) 23:20:13.95ID:je/ZAYb+普通に考えると
Long <= Integer = Byte < Variant の順だと思う
0770デフォルトの名無しさん
2017/02/15(水) 23:24:33.53ID:F/aHSwB0いや、ここVBAのスレだろ。
で、"3個"をそのまま受け取るような処理を何も考えずに書くから糞なんだよ。
まず第1にそのまま受け取る処理が良いのかどうかを考えるべきだろ。
そして、そのまま受け取るのが良いと決まってから文字列で受け取るかVariantで受け取るかどちらが良いのかとかを考える。
その結果、Variantが良いとなるならVariantを使っても良いんだよ。
で、そういう考え方で設計してたら必然的にVariantは殆ど無くなるんだ。
0771デフォルトの名無しさん
2017/02/15(水) 23:27:25.23ID:khJPh7n1そもそもこの場合だってその可能性があるならまずstringで受け取ってから処理すりゃ良いだけのことだしな
variantである意味がほとんどない
0772デフォルトの名無しさん
2017/02/15(水) 23:28:28.84ID:F/aHSwB0そう、意味を考える。
一緒に速度も考える。
で、意味的に型決まってても速度のメリットを取ってVariantというのが配列をぶち込む定番の処理だろ。
0773デフォルトの名無しさん
2017/02/15(水) 23:30:58.50ID:je/ZAYb+よく考えて必然的に Variant が殆どになる場合もあるけどね
0774デフォルトの名無しさん
2017/02/15(水) 23:41:14.47ID:khJPh7n1セルをそのまま配列にぶちこむときはそうなるな
>>773
どういう場合だ?
あんまり経験ないんだがな
目的の処理をする場合処理したい対象の型は大抵決まってるし、返したい値も決まってるだろ
0775デフォルトの名無しさん
2017/02/15(水) 23:45:21.19ID:je/ZAYb+複数のユーザーが決める違う型の値を受け取る共通ライブラリを作る時。
0776デフォルトの名無しさん
2017/02/15(水) 23:50:27.16ID:khJPh7n1その手の処理をしたことないんだけど、受け取ったあとに型を確定はできないのか?
どういう結果を返すんだそりゃ
0777デフォルトの名無しさん
2017/02/15(水) 23:58:29.83ID:je/ZAYb+VarType で型を判別して分岐〜、なんてやってたら引数が複数の時は
組み合わせが爆発してしまうのでそれは(積極的には)やらない。
関数の単一目的性を守ってれば「処理できない型の値を入れたらエラーになる」という方針で破綻しないよ。
0778デフォルトの名無しさん
2017/02/16(木) 00:01:00.36ID:W0y5+uWSだからどうしたよ?
あーだコーダいうなら頭使えよ?
スレ名を大きな声で復唱してみなさい。
0779デフォルトの名無しさん
2017/02/16(木) 00:17:58.70ID:SiA9A9XVそういう馬鹿に限ってvariantを多用する
こういうことだよな
0780デフォルトの名無しさん
2017/02/16(木) 00:32:38.95ID:vlXKqRPMいやさ、variantで受け取ってvariantで返すのか?その関数
そもそもそんなたくさんの型不定の引数を受けとるような関数は欠陥じゃないのか?
どんな環境なのか想像できんわ
あんまりそれが一般的と思わぬよう
0781デフォルトの名無しさん
2017/02/16(木) 00:45:35.60ID:XCVAoIB6う〜ん、そこは3速じゃねえんだよなぁとかブツブツ言いながら、
自分で2速に入れてる感じ。
キモイのでやめましょう。
0782デフォルトの名無しさん
2017/02/16(木) 00:47:14.79ID:NIevlqDH0783デフォルトの名無しさん
2017/02/16(木) 00:55:11.61ID:l4RhA8QW0784デフォルトの名無しさん
2017/02/16(木) 00:57:14.89ID:XCVAoIB6あんたが使ってるのは、型指定しないと動かない変なExcel。(パチモン?)
俺が使ってるのは、型指定しなくても動くExcel。
これでいいだろ。
0785デフォルトの名無しさん
2017/02/16(木) 01:26:19.50ID:XCVAoIB6Longの方が0.003秒速いとか言ってると、多分モテない。
0786デフォルトの名無しさん
2017/02/16(木) 02:45:15.21ID:SiA9A9XV馬鹿の見本
0787デフォルトの名無しさん
2017/02/16(木) 02:58:29.09ID:7EemdXzw0788デフォルトの名無しさん
2017/02/16(木) 02:59:41.43ID:nVgOLTepきちんと設計すれば大抵は型が決まる。
積極的にVariantを使う特別な理由があって、分かっててVariantを使うこともあるが、普段からVariantを使うことは無い。
0789デフォルトの名無しさん
2017/02/16(木) 04:36:21.82ID:GoZ0ZsyN具体的には上流工程なのか下流工程なのかで変わってくる気がする。
下流工程では引数の型は決まっているし、決まった型で返却すれば責任を全うできるけど、
上流工程ではプリミティブ型にしていても実行時に避けられない不測の事態が山ほどあるし、
下手に型決めた方がエラー吐きまくるっていう面倒な事もあるから、On ErrorとVariant型でいいやってなる場合も多い。
そして「ここは絶対に数値型で入力してください」と散々注意しても無意味に終わるから、
結局は>>777の言うような「想定外の場合にはエラーで返す」という設計が最もユーザビリティに優れる事になる。
誰かがコード見た時も、ある特定の条件でエラーとして弾いておく方が何を想定して書いたか分かりやすいしね。
0790デフォルトの名無しさん
2017/02/16(木) 05:18:31.52ID:INRkCvNUユーザーフォーム用意しといてスピンボタンや
リストボックスからの選択しか出来ない様にするとか、
variantに頼らないやりようはあると思う。
俺は自分用のマクロしか作らないんでそんな厳密なことはやってないけど。
0791デフォルトの名無しさん
2017/02/16(木) 05:26:27.50ID:GoZ0ZsyNあるにはあるけど大人しく従ってくれると思ってはならない。
シートの書式だけを新しいブックにコピーして渡してくるくらいならまだマシで、
中途半端に機能を理解してると入力規則を消して入力した上にオリジナルに上書きしたりする馬鹿がいるからな。
俺たちの安全地帯は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入力書式とマクロじゃレベルが全然違うだろ
極論で論破したがる人なのか?
実際やってりゃ >>791 程度は普通にある
0795デフォルトの名無しさん
2017/02/16(木) 07:16:57.78ID:+lEx52V9アホとじゃれあってるだけだろ
2ちゃんではよく見る光景
0796デフォルトの名無しさん
2017/02/16(木) 07:44:12.74ID:K21kVzL8お前2ちゃん詳しいんだな、今度教えてくれよw
■ このスレッドは過去ログ倉庫に格納されています