Excel VBA 質問スレ Part60

■ このスレッドは過去ログ倉庫に格納されています
2019/03/16(土) 20:39:09.64ID:6HWXzj9o
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※前スレ
Excel VBA 質問スレ Part59
https://mevius.5ch.net/test/read.cgi/tech/1549692750/
2019/04/08(月) 21:11:16.19ID:KL9iMO+X
>>549
???
それって、固定の名前でやるのに比べてどの程度メリットが有るの?

固定の名前でやる方がまだましだと思うんだが。
2019/04/08(月) 21:11:26.99ID:AlMdksUV
>>560
文字列型プロパティの比較判定は重い処理だし、オブジェクト命名の運用に処理結果が依存してしまう
組み込みの列挙定数やオブジェクトポインタで比較判定した方が安全なのは事実
2019/04/08(月) 21:13:41.55ID:ARCkkcA0
・プログラムとして危険
vs
・vbaだしどうでも良くね

ファイッ
2019/04/08(月) 21:15:36.62ID:KL9iMO+X
>>566
ほう。
画像が100個あった場合、
文字列で比較と比べてどれくらい速くなるの?

まったくアホらしいと思うんだが。
2019/04/08(月) 21:40:37.98ID:besmAe1s
なんでわざわざ名前で比較したがるの?
2019/04/08(月) 21:48:14.01ID:r03ED/xX
>>564
ありがとうございます

発狂する
2019/04/08(月) 21:48:31.68ID:besmAe1s
ぶっちゃけ1000回比較しても体感できる差は無いけど
ならどちらがいいかは完全にセンスの問題になるわけで

オブジェクトを比較したい場面でオブジェクトそのものを比較できるのにわざわざ名前みながら比べるとか

頭の中どうなってるの
2019/04/08(月) 22:07:24.49ID:4iOzxu9L
>>569
>>571
別に、名前で比較したいわけじゃ無い。
俺は最初から、こんなのどれでやっても良いだろ派だ。

最初からパフォ−マンスに大きな差が出ないと思ってたし、センスの問題はかなり気にする方だが、今回の問題ではどれでやってもセンスが悪いとも思わない。
2019/04/08(月) 22:17:03.71ID:besmAe1s
>>572
Is知らなかったからって取り繕わなくてもいいよ
2019/04/08(月) 22:26:49.07ID:4iOzxu9L
>>573
ハァ?
そんな初心者のわけねえだろ。

それに、
>>549って俺に言わせると名前でやってることになるんだがw

>>539で、「どうやって取得する?」って書いたのは、結局名前で取得することになるんじゃね?って意味で、名前でってのはApplication.Callerみたいに名前を取得したら結局同じじゃね?って意味なんだがw
2019/04/08(月) 22:36:44.56ID:lpvwS4NY
>>573
だから、それは対象のボタンオブジェクトが分かってる場合だろ
最初のお題と違ってボタンがいくつあるかも分からん条件で効率よくってはなし
俺はNameプロパティは変更出来るだろ
だからTypeプロパティだろって言っているだけ
2019/04/08(月) 23:06:03.11ID:AlMdksUV
質問者そっちのけ
2019/04/09(火) 00:18:47.52ID:8HUOoxmg
>>549はデバッグ時に疲れからかモジュールにカーソルをあわせてF5を押してしまう
2019/04/09(火) 00:44:23.79ID:cuTyECFJ
この中で一番重いのはShapes.Delete
それ以外をどんだけ工夫しても、逆にどんなタコなコーディングしても、体感できる差は出ないから
579デフォルトの名無しさん
垢版 |
2019/04/09(火) 01:51:44.81ID:flshAmjZ
【12日まで】500円を貰える春のばらまきキャンペーン開催中です 
     
@ スマホのApp Storeから「プリン(pring)」をインストールする  
A 会員登録を済ませる     
B 下図の通りに進む  
https://pbs.twimg.com/media/D3pRtQiUwAQLMUR.jpg    
C コードを登録 [5gAYSz]  

これで五百円を貰えます  
スマホでセブンATMからお金を下ろせたり(キャッシュカード不要)便利なアプリですのでよろしければご利用下さい
2019/04/09(火) 06:47:19.14ID:WguqqX2K
>>576
>>488-489で解決してるからいいんじゃん
あとはよくあるチンケな知識でのマウント合戦だからスルーでオケ
2019/04/09(火) 08:39:46.28ID:mg+oftxD
マウントやめたら色々な方法見れて役に立つんだけどな
何故一番になりたがるのだろう
582デフォルトの名無しさん
垢版 |
2019/04/09(火) 08:43:42.22ID:sTjNwrNP
そうさぼくらは世界にひとつだけの花
583デフォルトの名無しさん
垢版 |
2019/04/09(火) 08:45:37.14ID:sTjNwrNP
小さい花や大きな花
ひとつとして同じものはないから
No1にならなくてもいい
もともと特別なonly one
2019/04/09(火) 11:49:39.06ID:4ZugEZRH
まあ、なんだな久しぶりに実際に使ってみた
ルーチンの仕様
1.フォームコントロールとActiveXコントロールで作成したShapeオブジェクトは全て残す
2.それ以外のShapeオブジェクトは全て消す
3.対象ShapeオブジェクトはActiveSheetのみ
3.フォームコントロールとActiveXコントロールどちらでも動作する

Public Sub コントロール以外のイメージ削除()
Dim shape1 As Shape
For Each shape1 In ActiveSheet.Shapes
'MsgBox (shape1.Name & ":" & shape1.Type) 'これは確認用です・・・コメントアウト
If shape1.Type <> msoOLEControlObject And shape1.Type <> msoFormControl Then
shape1.Delete
End If
Next
End Sub

実際に作成してみて感じたこと
Nameプロパティは全て違うものが振られていく・・追番が付く
フォームコント―ロールを使ってる人がやっぱいるんだ・・俺はActiveXコントロールしか
普段は使わない
2019/04/09(火) 13:45:14.72ID:4ZugEZRH
追記しておくけど
目的・仕様をハッキリさせなきゃどんなルーチンも価値評価が難しいな
定義済み定数は定義名を使えよ普通に、ウォッチ式で確認できるから
>For Each x in ActiveSeet.Shapes
誤記スンナ ×ActiveSeet ○ActiveSheet
2019/04/09(火) 16:00:23.87ID:v/sKiq9O
>>480
俺がどうしてもexcel捨てられない理由が唯一
ピボットテーブルがあることなんだけどな
(その他のオフィス製品にも近ごろは
載っているようだが
VBAからの操作に慣れきってると
なかなか乗り換えきれない)

手放せなくなるまで使ってみてください
2019/04/09(火) 22:54:10.35ID:SAQnN0sI
>>569
hashCodeがないから
2019/04/10(水) 10:58:53.58ID:6J3r6J/I
全部プロシージャで集計と報告系のマクロ書いてるけどグラフ出力とか一部は指定サイトの結果取得とか機能増えすぎて9モジュール1800行とかになってる
なんちゃってプログラマの俺にはもうお辛い…
2019/04/10(水) 11:28:22.21ID:UESsnIOi
動きゃいいよ
要件がリッチになりすぎたなら、それはもう技術的に何とかしようとするより外部のSaaSを導入することを検討すべき
2019/04/10(水) 11:37:22.82ID:Y1e0LUUu
>>588
スマンが君の書いてる機能はマクロを使わずにできるものだが
>集計と報告系のマクロ書いてるけどグラフ出力とか一部は指定サイトの結果取得
集計と報告系・・・当然簡単だろ、場合によってはワードも利用する
>グラフ出力
ピボット使えよ、何が不足してるんだ?
>一部は指定サイトの結果取得
こんなのクエーリーの標準機で、起動時に読み込むとか、一定時間おきに読み込めよ

面白がってVBAにしないで、標準の機能で出来ることはExcel様に任せるよ
2019/04/10(水) 12:02:10.37ID:P1T0QVnr
そこまで作り込む能力があるなら素直にPS, Python, Ruby, node.jsあたり学んだほうが幸せになれるぞ
2019/04/10(水) 12:06:33.25ID:UESsnIOi
SIerすらメンテできないようなものを作ると後々自分の首を締めることになるよ
ずっとお守りに時間を奪われて出世は閉ざされ、そのうちシステム刷新でクビよ
2019/04/10(水) 12:13:08.23ID:Y1e0LUUu
ってか、Excelの標準機能も満足に使えないのに無理やりVBAを使うのは
やめた方が良い、標準機のでできることはコードにしないな
2019/04/10(水) 12:26:08.65ID:HiznTzOg
>>588
別に多くも無いだろ。
普通の量だよ。
2019/04/10(水) 12:36:37.12ID:UESsnIOi
規模的にスケールするような作り方を理解した上でなら全然大した量ではないけど、
なんちゃってプログラマのアドホックなコーディングはだいたい1000行を超えたあたりで限界が来る
俺は絶対お守りしたくない
2019/04/10(水) 12:43:15.27ID:HiznTzOg
>>595
そういうののお守りもしたことあるよ。
いやー大変だった。

基本、デバック実行で、何の処理をしているのかを類推することになる。
2019/04/10(水) 12:54:25.06ID:Y1e0LUUu
>>596
それ、楽しいだろ?
2019/04/10(水) 13:43:17.52ID:Fi06WKE0
>>593
そうなのか?
自分はほぼOffice共有マクロでやっていてExcel固有の機能とかは最低限しか使ってないな
599デフォルトの名無しさん
垢版 |
2019/04/10(水) 13:45:51.76ID:ZITKsaEc
>>592
開発者ならそうだろうけど
開発者じゃなくて業務をしてるだけ
みたいな人がついでに使うのがexcelvbaって感じだから
その人が首になる事はないんじゃないかなぁ?
それにそんな本格的なシステムを組むほど予算が無い
みたいな会社規模だとどのみちどうしようもないし
そういう界隈用って有る様で無いし
表計算
という点では予想外の使われ方だとは思うけど
なんかそういう小零細向けのアプリが有った気がしたけど
2019/04/10(水) 13:54:38.83ID:Y1e0LUUu
>>598
それが、組織内での共通認識ならいいんでないの
マクロは俺は基本的に避けるが、好みだよ
でも、「Excel固有の機能とかは最低限」じゃあExcel使う意味あるの?
2019/04/10(水) 14:02:44.70ID:Y1e0LUUu
まあ、勘違いするバカ多いんだよな
プログラムは自分で作ってるとか、俺が考えたとか(笑)
2019/04/10(水) 14:16:50.81ID:sSiaigIF
俺が育てた AA略
2019/04/10(水) 16:17:57.40ID:Fi06WKE0
>>600
ExcelはUIとしては優れていると思うよ。
操作するユーザーとのデータのやりとりとかグラフ出力とかね。
でもSQLでやるようなクエリーはもちろん不向きだし、途中段階のデータ加工処理にも不向きだと思うんだがね。
2019/04/10(水) 16:30:55.55ID:Y1e0LUUu
>>603
でも、そんなの君の好みだろ
不向き気なら使う必要ないな
ってか使えるとこだけうまく使うんだろ
なのに文句だけいゆうのな
2019/04/10(水) 16:34:40.21ID:Y1e0LUUu
まあ、何も使いこなせない奴って文句しかないんだよな
2019/04/10(水) 16:43:58.33ID:Y1e0LUUu
>>603
まぬけは返事も出来んか?
2019/04/10(水) 18:36:25.41ID:Fi06WKE0
>>604
文句なんか言ってないだろ?単に不向きなことはExcelにやらせてないというだけのことじゃないか
そもそも>>593がそっちの趣味主観から始まっているわけだしな
2019/04/10(水) 18:38:22.55ID:Fi06WKE0
>>606
そっちこそ俺の書いた

「SQLでやるようなクエリーはもちろん不向きだし、途中段階のデータ加工処理にも不向きだと思う」

に具体的な反論があるなら言ってみてはどうなのか
2019/04/10(水) 20:18:31.42ID:+T6khn6s
>>608
PowerPivotとPowerQuery使えば楽勝だぞ
2019/04/10(水) 22:29:11.86ID:Y1e0LUUu
>>608
>「SQLでやるようなクエリーはもちろん不向きだし、途中段階のデータ加工処理にも不向きだと思う」
>に具体的な反論
お前は不向きの内容も具体的に書き込んでないのにどのようなアドバイスが欲しいのかな?
処理速度かな?
2019/04/11(木) 00:47:10.88ID:tqqNlMCs
問題点がなにかも自覚しないから不満なだけで止まるんだよな
で、自分ではなくツールのせいにする楽なこった
2019/04/11(木) 00:55:46.53ID:7m5ZQ9KZ
老害的な様相を呈してる
2019/04/11(木) 12:26:22.18ID:flnPu98l
>>610
言いたかないが、それはレベルが低いだろ。
普通に考えれば分かることだ。
2019/04/11(木) 15:17:56.46ID:t6ZqSbU2
>>603
>でもSQLでやるようなクエリーはもちろん不向きだし、途中段階のデータ加工処理にも不向きだと思うんだがね。

工夫次第で普通にできる。別に不向きじゃないと思う
そういうのはAccessのほうが向いてると言われればその通りだと思うが
2019/04/11(木) 17:36:19.55ID:PzEny+LO
また不毛なマウントの取り合いしてる…
2019/04/11(木) 18:18:36.48ID:ekNCzMbf
不毛で悪いか
2019/04/11(木) 18:23:33.78ID:e8i1eyfO
また髪…
2019/04/11(木) 18:50:46.18ID:Vn+FQLol
やめろ
619デフォルトの名無しさん
垢版 |
2019/04/11(木) 20:16:57.24ID:v9KwxSkL
同時接続数の超えられない壁
2019/04/11(木) 20:48:03.35ID:flnPu98l
>>614
元々のVBAを使わずにExcelの機能を使うっていう話の観点で言えば、データが多くなるとExcel関数ではどうにもならないくらい遅くなるということがある。

銀行のデータ整合性チェックをしたことが有るんだが、10万以上のデータでSUMPRODUCTとか全くのアホなことやってたな。
その時はSQLじゃ無いけどVBAで組んだら一瞬になったけど。

今の仕事でも50カラムぐらいで40万件ぐらいのレコードをExcelに吐き出してるのを扱ってるがVBA使わずに関数とか正気の沙汰とは思えない。
2019/04/11(木) 21:06:30.96ID:JHOkJdt/
10万くらいなら関数でも楽勝だろ
自動計算切れば普通に動く
2019/04/11(木) 21:12:19.70ID:2g6t5Llw
数値だけなら楽勝だけど文字列のfindとかは結構キツイ
>10万以上のデータでSUMPRODUCT
これ列全体指定してたら多分計算終わらん
2019/04/11(木) 21:33:34.25ID:7m5ZQ9KZ
ワークシート関数は使い捨てならいいんだけど残して運用し続けるのはつらい
2019/04/11(木) 22:23:07.59ID:+qS75l5K
データベース的に使ってるエクセルテーブルで関数従属関係をワークシート関数で実現するのやめてほしいよな
2019/04/12(金) 01:26:49.44ID:L59U/aC1
Excelっていうか表計算ソフトは
ゼロから設計し直したほうが良いと思う

セルごとに個別の計算式が入っていて
どれか一つが間違っていても
簡単に気づくことが出来ないとか
一つのセルだけ修正し忘れとか
メンテナンス性が悪すぎる
626731
垢版 |
2019/04/12(金) 01:40:03.71ID:7vLuIMdD
>>625
え?
少なくとも後者は教えてくれるぞ?

前者は数式表示モードにするか、横にformulatextで表示しとけば?
2019/04/12(金) 05:49:04.40ID:V1CbV9zt
OpenTextFileとCreateTextFiledeのメソッドが返すTextStreamには双方でなにか違いがあるのでしょうか?
ファイルの書き出しにはTextStreamのWriteLineメソッドを利用しています。

FileSystemObjectを使ってテキストファイル(拡張子無し)を作成して、
書き込みを行う処理を実装したいのですが、
CreateTextFileを使うとError 5 となりファイルは作成されるのですが書き込みができないことがたまにあります。
発生頻度が少なすぎて原因を抑えられず、
自力ではここまでが限界のため、何か思い当たることがあればご意見を頂けますと助かります。


OpenTextFileのほうでは少なくとも確認できる限りではエラーが発生しませんでした。


CreateTextFile
https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/createtextfile-method
OpenTextFile
https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/opentextfile-method
2019/04/12(金) 06:48:58.09ID:jwc5+7Nd
>>625
その意見を支持する
2019/04/12(金) 08:12:24.74ID:cAaoTUDS
>>621
SUMPRODUCT知らないか、10万のデータでどういう使い方するのか想像出来ない奴は黙ってろ。
2019/04/12(金) 08:24:36.34ID:LhXUTlO1
>>629
SUMPRODUCTは所詮O(N)だから実質的な計算量はたかが知れてる
遅けりゃSUMPRODUCT使わないで一時セル使った単純な式に展開してもいい
2019/04/12(金) 08:49:24.60ID:wLs4Sov9
>所詮O(N)だから実質的な計算量はたかが知れてる
O(n2)以上だよ
めちゃくちゃ多い
2019/04/12(金) 09:00:04.80ID:xRzutCJ1
>>631
O(N^2)となる根拠は?
実装がヘボいのかもしれないけど、仮に手計算でやったとしたら基本的に計算量は行数に比例するだろう
それなら一時セル使えば確実にO(N)で済むよ
2019/04/12(金) 10:26:44.15ID:39D1tbGN
>>620
そりゃSUMPRODUCTとか使われたら話は違ってくるわな
>>630にあるように工夫すればいいってこと
2019/04/12(金) 10:47:24.57ID:cY6WK7UC
絶対参照の範囲と相対参照の範囲をSUMOTODUCTする場合は平気でO(n^2)になるよ
Excelでシミュレーションとかしてるとよく出てくる
2019/04/12(金) 11:44:00.15ID:LhXUTlO1
>>634
それこそ一時セル使えば済む話だろう
2019/04/12(金) 11:48:22.60ID:cY6WK7UC
>>635
済まないんだよ
想像力足りてないぞ
2019/04/12(金) 12:22:33.93ID:cAaoTUDS
元々無理矢理VBA使うのはって話から始まってるが、もはや無理矢理関数使うことになってる件w
2019/04/12(金) 13:20:22.74ID:L59U/aC1
>>625
> 前者は数式表示モードにするか、横にformulatextで表示しとけば?

それぞれが微妙に違ってる(セル座標のこと)画面からはみ出るぐらいの
長い数式が何十個も表示されていて、それがワークシートを
コピーするたびに量産されていくという状態で
全部見て間違いがないことを確認できるわけ無いだろ
2019/04/12(金) 13:41:42.81ID:cY6WK7UC
>>638
全然本質的な解決にはならないけどR1C1形式にすればセル参照含め同じ数式になって多少は見やすいぞ
2019/04/12(金) 19:58:52.20ID:BpmudOIO
>>638
その考え方が間違いだろ
フォーマットは統一しろよ
みて確認なんかしない
2019/04/12(金) 20:04:10.53ID:kdt5VzkQ
>>640
何を言ってるんだ?
一見してフォーマットが統一されているように見えていながら
誰かがミスして数式が壊れたり、修正が必要な時に漏れたりするから
問題だって言ってるんだろ。

フォーマットを統一するのに「人間がミスをしなければ」という
不可能な条件があるから、だめなんだよ
2019/04/12(金) 20:21:45.21ID:BpmudOIO
>>641
個別に修正なんかしない
そんな事するからミスをする
2019/04/12(金) 20:22:49.28ID:kdt5VzkQ
> 個別に修正なんかしない
シートにデータ入れる時点で修正するんだが?
2019/04/12(金) 20:24:13.41ID:kdt5VzkQ
そうそう。エクセルというか表計算は
データと処理(セルに入れる関数)と見た目(色等)が
一つに結合してしまっているという大きな欠点があったな。

分離されてないので、何かを修正する時に
別の何かまで変更してしまって、それに気づかない。
2019/04/12(金) 20:27:00.42ID:BpmudOIO
行でデータを作ったら
列には必ず同じ数式しか入れない
バカなことしてたら何時までも進歩しない
2019/04/12(金) 20:29:31.50ID:kdt5VzkQ
> 列には必ず同じ数式しか入れない

列には同じ数式入れるとかアホやろwww

DRYじゃない。同じ物は一つだけでいい
2019/04/12(金) 20:30:26.99ID:kdt5VzkQ
あ、DRYっていうのは同じことを何度も繰り返すなってことねw
わかりやすく言えば、コピペするなってこと。
2019/04/12(金) 20:31:21.74ID:BpmudOIO
バカに入力させるなら
式はロックしとけよ
2019/04/12(金) 20:39:29.55ID:kdt5VzkQ
「式をロック」したいだけなのに
そうすると今度はセルの幅などが変えられなくなる。

細かく設定すれば可能だが、面倒くさい。
メンテナンスする人はいちいち解除しないといけない

そして、どのセルがロックされているかわからない
頑張ればできるが・・・

どんどん無駄な頑張りが必要になる。
2019/04/12(金) 21:28:36.09ID:gNUIO5L9
accessや.netで作るとメンテナンスもっと面倒だよ
2019/04/12(金) 21:41:38.90ID:bJr/2B+h
>>627
そのエラーが出る部分のコードは?
2019/04/13(土) 11:19:08.13ID:D8o23bai
>>649
それ、単に考えが雑なだけだろなんにしても
計画性もなく適当に増殖させるから自分でも制御できなくなる
2019/04/13(土) 11:37:11.36ID:R4ZFT5Jg
セルロックは色々面倒くさくなるのは同意。ほぼ変更なしまで完成されてれば別だが。
なので、自分用とか、可能であれば、式セルに薄い色つけてる。
2019/04/13(土) 11:40:20.37ID:D8o23bai
まあ、ある程度データが大きくなったら、データーはテーブル&数式で処理して
表示、印刷はピボットを使うかフォーマットを定義したシートでまとめろよ
目的も、機能も行き当たりばったりってExcelのシートもVBAも負担なだけ
2019/04/13(土) 11:50:25.55ID:D8o23bai
>>653
コメント入れればいいんだよ、印刷しなければ問題ない
面倒くさいって、管理できればそんな必要はないけどな
2019/04/13(土) 12:09:21.02ID:6byp94bf
その管理が面倒くさいって話

修正でシート変更したとして、
今度から新しいシート使ってくださいとか言っても
間違えて古いシート使ってきて、でも見た上違いわかんねとかさ

エクセルファイルをコピーした分だけ
プログラム(セルに入れる関数のこと)が複製されるから管理不能。
一つのエクセルファイルを共有して使うとか

何人も人がいればやらんだろ?
それぞれ個別のエクセルファイル修正して提出とかだろ?
2019/04/13(土) 12:41:36.98ID:DFBgdaK8
削除や挿入でセルがずれない設定があればねぇ
今のところindirectしかない。indirect使うと数式が読みづらくて死ぬ
2019/04/13(土) 13:09:48.18ID:3yfR9cCP
offsetで大体逝ける
始点がずれるのはむしろ使いやすい
2019/04/13(土) 18:07:35.12ID:U599Z1h6
offsetか、滅多に使わないけどindirectよりは楽そうだ
2019/04/14(日) 09:28:16.57ID:WyY+5dun
>>657
わかりやすい名前を付けてそれを使えばズレないだろし分かりやすい
661デフォルトの名無しさん
垢版 |
2019/04/14(日) 09:40:00.62ID:C6oAesku
VBAの一番の欠点は情報が圧倒的に少ない
多言語の1億分の一くらいの情報量
質問してもアンサーが遅い
2019/04/14(日) 09:47:43.05ID:Q3MA08tK
Webで有用な情報を発信できるレベルの人間ならそもそもVBAなんて使いたがらないからね
2019/04/14(日) 11:20:06.68ID:CXJ+kocl
えー
少なくともの本後の情報は十分だろー
2019/04/14(日) 11:20:38.15ID:CXJ+kocl
の本後→日本語
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況