Excel VBA 質問スレ Part53

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2018/04/27(金) 19:02:38.39ID:+ocy8bIv
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK


※前スレ
Excel VBA 質問スレ Part52
http://mevius.5ch.net/test/read.cgi/tech/1517052305/
2018/05/07(月) 07:51:50.63ID:ASE9lfG3
>>648
いや
excelを操作する場合でも他言語が有利
殆ど差がつかないような短い処理はあるけどそんな短い処理で比較してもなぁって感じ
2018/05/07(月) 08:12:53.75ID:mqdJhqhB
>>649
じゃ>>633のコードをSPで書いてみて。
殆ど差がつかないというなら1行からそんなに増える訳ではないという認識でいいんだよね?
2018/05/07(月) 08:14:03.54ID:UbBhnDZY
>>648
> EXCELが絡まない処理は他の言語が有利になることが多いし
>>538とかを見てもそう言い張るならもうなーんも言えねーわ w
2018/05/07(月) 08:20:16.16ID:UbBhnDZY
>>650
SPがなにものか知らんけどPowerShellのことかな?
PSにはThisWorkbookの概念はないから$Bookに入ってるとして
$Book.Sheets(1).Cells.Item(1,1).Value() = 'Hello World!'
って書くだけだよ
2018/05/07(月) 08:30:57.47ID:mqdJhqhB
>>652
へえ
Objectの生成も解放も要らないんだ
2018/05/07(月) 08:54:44.13ID:ASE9lfG3
vbaの方はsubもend subも要らないのか?
2018/05/07(月) 08:58:00.55ID:fXArPflS
this*やactive*を直接ロジックに持ち込む人はプログラミングセンスがない
2018/05/07(月) 09:21:28.09ID:4C462BWK
>>654
いるよ。それ入れて3行。
じゃその3行から大幅に変わらないって認識でいいんだよね?
PSでどうなるの?
2018/05/07(月) 09:46:41.71ID:wvkiQNF2
>>655
お、となると前に聞いた .FreezePanes は、PSではどう書けばいいんでしょうか。単純に知りたい。
2018/05/07(月) 09:49:14.89ID:EjUFI/+N
スレチだけどVBA開発者の意見を聞きたいです。
Salesforce導入したらExcel(VBA)の仕事がなくなる可能性はある?
2018/05/07(月) 10:15:10.01ID:iH5JTvso
>>655
一律にそう判断をする初心者が出てくるから言い方に注意すべきだよー
2018/05/07(月) 11:23:28.63ID:RkDBvZTA
>>658
んなもん、ここで聞かずSalesforceのサポート先にでも聞けよ。
2018/05/07(月) 11:39:56.42ID:LybNXku5
>>660
Salesforceを知らないんだね。
2018/05/07(月) 12:00:46.03ID:6Bvegpcl
Salesforceのサポート先にきいてもSalesforceは素晴らしいと言われるだけ。(確認済)
データ分析などをやってるVBA開発者は素データの取扱をよく知ってる。
Salesforce導入賛成した人はデータの取扱をよくわかってないこともある。
(システム構築の問題かな?)
Salesforce導入したら、VBA開発者としては困る事もある。
2018/05/07(月) 12:04:59.32ID:iH5JTvso
「便利なとこだけつまみ食い」ができないツールやフレームワークは迷惑
664デフォルトの名無しさん
垢版 |
2018/05/07(月) 12:06:01.39
何でもSalesforceで完結できるかというと、ライセンス費用との兼ね合いでそうもいかなかったりする
必要なところはVBAからSalesforceのAPIを使えるようにすれば問題なし(やったことないからできるか知らんけど)
2018/05/07(月) 12:29:01.64ID:UbBhnDZY
>>653
Excel.Application とか対象のブックを開く処理のことを言ってるならそれらは余分に必要
ただそのコードって>>538見ればわかるけど数行だから大変と言うほどのことはない

>>657
ここら辺はVBAと同様
なぜかActivateしないとダメなんだよね
改善してほしい
2018/05/07(月) 12:31:02.56ID:0Psz8IKZ
五年後、十年後を見据えることも大事
素晴らしいから実装 三年後に開発元が撤退 とかザラにある世界
グレシャムの法則はこの業界でも当てはまる
ポンコツでも安心して乗り続けられるかどうか

ピラミッドの上の方三分の一が対象か、底の方三分の一なのか
下の方はVBAでもいい  上の方相手に生涯ストレス溜め続けて生きてけばいいさ
2018/05/07(月) 12:46:54.80ID:bo9bZ07t
>>666
VBAのスレで何言ってんだかw
とても滑稽
2018/05/07(月) 12:48:25.32ID:fqL3E9j7
>>665
数行って3行が何行に膨れ上がるの?
大したことないかどうかはそれが出てからじゃないと判断つかないよね
2018/05/07(月) 12:51:09.04ID:UbBhnDZY
>>668
> 大したことないかどうかはそれが出てからじゃないと判断つかないよね
バカはこれだから... w
2018/05/07(月) 13:02:09.19ID:fqL3E9j7
>>669
だってそっちのコードはインスタンスの解放とか記述されてないし判断材料にならないよ。
で、どうなるの?
2018/05/07(月) 16:05:51.47ID:aAWzZZt9
>>124で質問した者です
色々試したところ、3行目だから問題があるのではなく半角カタカナが含まれている行があると、その次の行の冒頭の文字が削れるようでした
(半角カナと同じ文字数削れる?)

ADODB.streamをクリエイトオブジェクトして、CharsetにISO-2022-JPを指定して読み込んでいます。入力ファイルは、サクラエディタでJISを指定してポチポチ作成しています。

ちなみに、.ReadTextの引数に-2を与えて1行ずつ読み込むと発生しますが、-1を与えてファイル全体を一括読み込みするとこの現象は起こりません

入力ファイル内容
(スマホなので半角カナが打てないのですが、2行目のアイウエオは半角だと思ってください)
------------------------------------
01234567890123456789
アイウエオ
01234567890123456789
------------------------------------

1行ずつ読み込んでデバッグプリントした結果(スマホなので半角カナが打てないのですが、2行目のアイウエオは半角だと思ってください)
------------------------------------
01234567890123456789
アイウエオ
567890123456789
------------------------------------
2018/05/07(月) 16:11:17.74ID:iH5JTvso
ほうそれは興味深い
自分のプログラムも確認してみなきゃならん
673671
垢版 |
2018/05/07(月) 17:15:34.67ID:aAWzZZt9
スミマセン。事象だけを書いて質問をしていませんでした。

単純に、ISO-2022-JPが半角カナをフォローしてないから起きる問題だと思うのですが
半角カナが文字化けするのではなく次の行に影響を及ぼすという形で発現する理由が分からないので、そよあたり何が起きているのか心当たりある方いませんか?ということです。
VBA質問の範疇外でしたら申し訳ないです。
2018/05/07(月) 18:00:50.93ID:wAes3dqf
ADOの問題でEXCELもVBAも関係ないだろ
想像すると、2行目で10バイトのバッファを用意して読み込んでるんじゃね

なんにしても不正なファイル読んでるんだから結果に文句言うべきじゃない

つかその半角カナって文字コードどうなってるんだ
2018/05/07(月) 18:01:50.46ID:lTkuR+eK
excel開いてんならこれかな

[Runtime.InteropServices.Marshal]::BindToMoniker($bookPath).Sheets(1).Cells.Item(1, 1).Value() = "hello, world"

VBAは3行、PSは1行だったね
2018/05/07(月) 18:34:49.37ID:aDF35JTf
GW明けたらめっちゃスレ伸びてて笑う

>>397
晒した。3行は盛り過ぎだったわすまんな
http://codepad.org/vIuvxaqE

これじゃアレなんでもっと差が出るスクリプトも晒すわ
http://codepad.org/tCLxVNML
用意したリストに基づいて置換するスクリプト
よくある操作だけどこういう文字列操作をVBAじゃ絶対にやりたくない
2018/05/07(月) 18:54:03.74ID:PaBopj+J
VBAを否定する理由の一つに、正規表現があると。
なるほどなるほど。
2018/05/07(月) 19:26:19.17ID:UbBhnDZY
>>670
あの程度なら解放は明示しなくても大丈夫
2018/05/07(月) 19:31:19.81ID:UbBhnDZY
>>677
>>536でも使ってるけど正規表現は VBScript.RegExp 使えばいいので言うほど面倒でもない
むしろヒアドキュメントとか文字列中に結果を埋め込んだりするのが面倒
2018/05/07(月) 19:34:03.20ID:aDF35JTf
正規表現以外にも連想配列が貧弱だとかそもそも配列リテラルが無いからリストを扱う気にならないだとか文字列に対する関数が少なすぎるだとか色々
2018/05/07(月) 19:36:11.20ID:yKJe0Enc
は?
そんなん短く書けるように関数を自分で作ればいいだけだろ
なんでも与えられたものばかり使ってたらすぐに腕が落ちるぞ
2018/05/07(月) 19:48:01.62ID:aDF35JTf
僕はコードを書いて悦に浸りたいのではなく目的を達成したいだけなのでそういうのはいいです
2018/05/07(月) 19:51:25.78ID:hiYeL2zr
他の言語にあってVBAに足りないものあるいはVBAだと使いにくいもの

正規表現
コレクション
集合処理
シリアライズ
インターフェース
名前空間
パッケージ
ジェネリック
非同期処理
並列処理
メタプログラミング
ネットワーク
ディスクIO
ラムダ
return
モダン文法

挙げきれないなこれ

>>675
VBAさんまた負けたのか...
684デフォルトの名無しさん
垢版 |
2018/05/07(月) 20:29:03.81ID:vRUpm5v3
>>679
(肯定・否定の)後読みがないんだよなあ・・・
2018/05/07(月) 22:21:34.33ID:YSySr1F0
>>675
もう一度聞くけどPSでExcel操作を行う場合は
COMを使ってるわけではないの?
開きっぱなしのしか使えないカタワなロジックはまぁいいとして
メモリ解放をいつも全く記述していないのは何で?
2018/05/07(月) 22:22:36.97ID:G9Gl/19p
>>642
逆。
Excelに乗っかって処理するのがVBAでコード書く場合の普通だ。
だから乗っかって無いのは、そもそもイレギュラーなんだ。

で、VBAについて論じるなら、そういうイレギュラーをメインに論じられても困ると最初から言ってる。
2018/05/07(月) 22:24:20.81ID:G9Gl/19p
>>645
その実例が普通じゃないと言ってるんだが。
これだから日本語分からない奴は...
2018/05/07(月) 22:25:56.82ID:M2OABdlM
そんなんGCが勝手にやってくれるからだろタコスケ
頭の中何年前で止まってんだよ賞味期限切れてんじゃねえの
2018/05/07(月) 22:27:24.84ID:G9Gl/19p
>>649
Excelを操作するとは、Excelファイルを扱うだけなのは除外すべき。
そんな処理を普通ExcelVBAで書くことは無いからな。
2018/05/07(月) 22:29:22.09ID:M2OABdlM
>>689
>>676の2つ目みたいな処理についてどう思われますか?
2018/05/07(月) 22:31:37.26ID:YSySr1F0
ま、外部からEXCELでテトリス作って動かせるっていうなら興味もわくけど
どっちでも出来ることならどっちでもいい。
2018/05/07(月) 22:46:29.50ID:G9Gl/19p
>>676
アホらしいので内容も見ずに書くけど、そういう処理ってVBAで書くことが余り無い。
それに、多分どうでも良いレベルで長くなってるだけだろうと推測する。

昔、VB6での話だがデフォルトプリンタのポ−トを変更するプログラムを書いた時に物凄く面倒な処理になったがDelphiでは簡単なのを見てDelphiは良いなと思った。
VB6ではGetPrinterやSetPrinterとCopyMemory使ってPRINTER_INFO_2構造体を操作する必要があったがDelphiではTプリンタオブジェクトなるものでポートがそのまま変更できた。

こういう場合は確かにDelphiの利点だろう。
もっとも、それが言語の優劣に繋がるわけじゃ無いが。
693デフォルトの名無しさん
垢版 |
2018/05/07(月) 22:55:14.88ID:6opRZcm/
要するにおまえら大昔にperlでエクセルいじれるスゲーって言ってたおじいちゃん達の足跡を辿るおこちゃま達なんやなw
2018/05/07(月) 22:59:02.03ID:YSySr1F0
>>688
COM使ってるならGC幾ら呼び出したところで
解放されるわけないだろタコスケ
そんなかで捕まえてるブックやらシートやらいつ解放すんだよ
GCは参照先がなくなって初めて走ったときに解放されんだよ
2018/05/07(月) 23:00:24.60ID:M2OABdlM
>>692
「excel 置換 リスト」でググったら「マクロ」がサジェストされるぐらい沢山の人が人がVBAでマクロ作って公開してる処理なんですがそれは

長文書き散らしといて実際コード貼られたらよくわかんなーいとか馬鹿の極みだな

適切なオブジェクトが用意されてるのも思いっきり言語の優劣につながる話じゃねーか
2018/05/07(月) 23:11:55.30ID:M2OABdlM
>>694
PSだと.net使ってるから解放されないんだな

rubyとかpythonだとGC走った時にcomまで解放してくれるから知らんかったわ
2018/05/07(月) 23:35:14.94ID:J4V/A43+
おいおい解放されないとか嘘ついてまでVBAをよいしょしたいのかよ
.NETでCOMをインスタンス化するとRCWってプロキシが生成されんだよ
で、このRCWがCOMインスタンス本体の参照カウントの面倒見てくれんの
RCWはGCで回収されたら参照カウントを減らしてくれる
いちいち解放を書く必要はないんだわ
2018/05/07(月) 23:42:48.04ID:M2OABdlM
>>697
やっぱり解放されるんだ
最近の言語でその辺の面倒みないとかあり得ないよなと思いつつ調べ方悪くてわからんかった
ありがとう
2018/05/07(月) 23:51:38.06ID:J4V/A43+
>>686
VBAだったらExcelに乗っかるしかないのは当たり前
そういうことじゃない
何かの目的があってプログラムを書くときにそもそもExcelでやるべきなのか?と自問自答することが大事ということ
2018/05/08(火) 00:09:10.73ID:PzpTdCXD
>>698
つまりはこういうこと
http://jeanne.wankuma.com/tips/vb.net/programming/releasecom.html

まぁどっちが手間かは分からんけど
2018/05/08(火) 00:14:14.44ID:B6wkNjU9
>>698
Excelのプロセス終了条件は正しくQuitされてる事とCOMインスタンスが解放されてる事の2つ
GCでCOM参照がクリアされてもQuitされていなければExcelは生き続ける
その仕様を失念してハマったマヌケ達が.NETではCOMが自動で解放されないなどという悪質なデマを流したんだろうね
2018/05/08(火) 00:32:00.90ID:PzpTdCXD
その点VBAはそんなことなーんも考えなくていいから
らくちんだNE
703デフォルトの名無しさん
垢版 |
2018/05/08(火) 00:32:38.38ID:RahqJUTb
>>701
アホかwそもそもプロセス終了時にGCは動かんでw
2018/05/08(火) 05:52:33.72ID:X/JD7QJy
>>685
COMだよ
だからあの程度なら解放は明示しなくてもいいと言うだけの話
2018/05/08(火) 05:54:04.37ID:X/JD7QJy
>>687
お前が普通と思うかはどうでもいいよ w
2018/05/08(火) 06:02:55.46ID:X/JD7QJy
>>697
解放されないと言うか解放タイミングが予測できないのが問題なの
RCWってあまりいい仕組みじゃないよ
https://blogs.msdn.microsoft.com/office_client_development_support_blog/2012/02/28/office-3/
2018/05/08(火) 07:14:18.75ID:wTVQYHt7
>>706
面倒くさいねぇ
だから>>675はExcelが開いていることに言及してたのか
Excelを開いたら閉じることも想定されるから
閉じて終了させようとしてもObject捕まえっぱなしで
閉じて終了させられないことがバレちゃうもんねぇ
2018/05/08(火) 08:08:21.77ID:LVc4+FR0
>>707
お前リンク先の話なにも理解できてないだろ w
2018/05/08(火) 09:48:53.93ID:JB+YJbtj
>>708
そのリンク先のさらにPart1のリンク先見て見なよ
完璧に解放するにはここまでやらないといけないんだねぇ
ああ面倒くさい
2018/05/08(火) 12:02:14.08ID:8DKSnjuv
>>706
それが問題になるのは使用済インスタンスが長期間残る可能性が高いデスクトップアプリやサーバーアプリだな
スクリプトは最短距離で目的を達成して速やかにプロセスを終了するのが基本なので使い終わったらすぐにGCやWindowsにリソースをクリーンナップしてもらえるので問題ないんだわ
2018/05/08(火) 12:12:49.21ID:fJWr41VM
>>710
うんうんそれでスクリプト処理で開いたブックは
スクリプト内の処理で捕まったままになって
閉じられずにばんばん開きっぱなしになって残るんだねぇ

ああ恐ろしい
712デフォルトの名無しさん
垢版 |
2018/05/08(火) 12:14:31.83ID:q/XYqxRj
>>710
問題あるって話が書いてあるんやがw
おまえホンマに馬鹿やなw
2018/05/08(火) 12:18:23.76ID:iJTBAWwZ
VBAでもへんな落ち方するとタスク残ったままになるけど何が違うの?
2018/05/08(火) 12:24:26.03ID:LVc4+FR0
>>709, >>711-712
人の話を聞けない人?
>>538程度ならExcelが残ったりしない
あとブックとかのクローズとオブジェクトの解放とかは違う話だからごっちゃにしてる時点でなにもわかってないことがバレバレですよ w
715デフォルトの名無しさん
垢版 |
2018/05/08(火) 12:26:06.82ID:q/XYqxRj
正常に終了しても明示的に解放しない限りCOMへの参照が破棄される保証はない
とゆうおはなしやでw
2018/05/08(火) 12:28:02.90ID:OM34GclB
>>711
は?
スクリプトならQuitが基本だから残らんよ
>>675のように既存のインスタンスに接続したいかつとじたくないという要求があれば残す
それだけ

>>712
ホンモノのバカって検証しないんだよね
少なくとも俺はサーバーでExcel Automationを使うシステムを何度も経験してるが確実なQuitとGCのおかげでリンク先のようなトラブルに煩わされた事はない
何年も安定稼働している実績がある
2018/05/08(火) 12:38:19.90ID:fJWr41VM
>>714
>>716
うんうん
「〜によってファイルが開かれているため、操作を完了できません。」なんてエラーメッセージは
見たこともないんだろうねぇ

大層な10年間だねぇ
718デフォルトの名無しさん
垢版 |
2018/05/08(火) 12:55:25.46ID:q/XYqxRj
>>716
エクセルのインスタンスが残ってもメモリを圧迫するくらいやからな
おまえが気がついとらんだけやろw
そもそもプロセスの終了時にGCは動かんと言っておろうがw
2018/05/08(火) 13:10:03.51ID:iJTBAWwZ
>>717
rubyでExcel操作してるけど見たことない
2018/05/08(火) 13:13:01.29ID:fJWr41VM
これさぁ
よくある処理で読み込み終わったファイルは別フォルダに移動するときに解放されてなかったら一発で終わりだよねぇ

何年間もやっててそういうのに当たらなかったってラッキーだよねぇ
2018/05/08(火) 13:55:31.26ID:PZU+/yxW
こんなクソみたいな言い合いで流されていく質問がかわいそう
2018/05/08(火) 17:48:39.27ID:RLDOeZ1j
>>717, 720
そんなマヌケなエラーはExcel開きっぱなしVBAerの専売特許だろw

>>718
論外

>>721
ログを見るとわかるがVBAerは質問にろくな回答を変えしてない
PSerの方が解答率が高いという意味がわからない状況になってる
VBAerもっと頑張れよ
2018/05/08(火) 18:03:05.92ID:n71fT5S2
PSer VBAer

気色悪い造語まで作ってまぁ。
次は Rybyer か? C#er か?
2018/05/08(火) 18:23:15.70ID:8UeVEK10
PSer(笑)が居なければ皆 質問に答えてくれると思うんですがそれは…
2018/05/08(火) 18:47:27.59ID:0Wckg3pR
>>722
へー
自分がマヌケなのをVBAやってる人に転嫁してVBAやってる人に喧嘩売るんだぁ
VBA自体分からない人がいつまでこのスレで暴れ回って居座っていられるかねぇ
2018/05/08(火) 18:51:24.86ID:RLDOeZ1j
>>725
事実を述べただけなんだよなぁ
727デフォルトの名無しさん
垢版 |
2018/05/08(火) 19:12:51.48ID:xEIBE+xH
PSと言えばポストスクリプト
でも頭の中にあるのはパーフェクトソルジャー
2018/05/08(火) 19:50:54.67ID:nQl5yvJD
>>715
プロセス終了してるのにCOMへの参照?
お前COMの仕組みわかってないだろ w
2018/05/08(火) 19:51:44.12ID:26d0nyKi
築二十年の人ン家へ勝手に上がり込んで、トイレが遠いだのオール電化じゃないだの
床暖房じゃないだの言い募ってるのと一緒だな

ウォシュレットとかIHとかソーラーとかをつぶさに語る前に、自分が居座り強盗並みの行為を
してるのには気付けないのかな  勝手に上がり込んだのはマズイとは思わないのかな
2018/05/08(火) 19:51:54.02ID:nQl5yvJD
>>717
うん、ないよ
それ作り方がヘボいだけだし
2018/05/08(火) 19:55:04.51ID:nQl5yvJD
>>729
むしろトイレが遠くてもオール電化じゃなくても快適だもーん
ってやせ我慢してるだけにしか見えん w
2018/05/08(火) 19:57:51.93ID:rh4JdchR
そもそもお前の家じゃない
2018/05/08(火) 20:07:26.39ID:3X1kagHT
結局VBAの質問スレに何しに来てるんだろうなぁこいつら
所詮は本来のスレで変なことばっかり言って追い出されて
仕方なく居場所を求めて荒らし回ってる口だろうなぁ


ああ見苦しい
2018/05/08(火) 20:52:10.15ID:26d0nyKi
>>731
邪魔だ っつってんの 迷惑だと明言してる 喩えも判らんレベルか
わかりやすい例えにしたらガッツリ食い付いてくるんだな
グレードアップする時は自ら選びにいくわ 助言はその時に求めるわ、みずから
戦後の押し売りか トランクにゴム紐入れて売り歩く寅さんか
面白いこと言って見ろよ、ほら

思わず苦笑いするようなチャチャなら読み飛ばすが、連続居座りは御免被る
2018/05/08(火) 21:19:47.00ID:OdLjkejS
勝手にスレを私物化してるお前も十分迷惑だよ
わざわざ長文で反応してんじゃねえよてめぇも出てけ
2018/05/08(火) 21:44:06.06ID:J/XX4wKL
複数条件が重なるとどういった書き方をするのが良いのかわからず混乱してしまいます、何か良い方法がありましたら教えてください
例えば、変数x,y,zがありそれぞれ1-10までの数字が入る可能性があり、x,y,zそれぞれの値が違うと処理も違います
例えばx,y,zが1,1,1だと処理A 1,1,2だと処理B 1,2,1だと処理Kといった様子です
case文をネストして書いてしまっても良いんでしょうか?
2018/05/08(火) 21:59:14.00ID:SsMGLoTY
>>736
ネスとしてもいいし、if文の条件式のとこにandで複数条件書いてもいいんちゃう
738デフォルトの名無しさん
垢版 |
2018/05/08(火) 22:05:22.53ID:UggVkA90
>>736
言葉通りにとると1000通りの分岐になるけど、
そんなことはないんでしょ?
おおまかなパターンとしてはどうなってるの?
739デフォルトの名無しさん
垢版 |
2018/05/08(火) 22:10:52.74ID:RuTuN8AF
>>736
処理Xがx,y,zを変数として一般化できそうなら頑張って一般化して書く方法を考える

x,y,zによってどんな処理になるか論理的に決定できるなら
x,y,z -> 処理X を返すような関数を先に作って処理ごとにcaseで分岐

論理的に決定できない場合はkeyを"xyz"、valueが"処理X"みたいなDictionaryを用意する

x,y,zの組み合わせごとに処理が全部異なるなら、
index = 1000^(x-1) + 100^(y-1) + 10^(z-1)
みたいにindexを計算してindexごとにcaseで分岐させる
(10^3通りになってありえないケースだと思うけど)

思いつくのはこんなもん
caseネストするのは頭おかしなるで
740デフォルトの名無しさん
垢版 |
2018/05/08(火) 22:15:38.92ID:RuTuN8AF
最後のindex計算するのは意味ねえな忘れてくれ
2018/05/08(火) 22:19:59.22ID:fJWr41VM
>>736
後ろに続く処理次第だねぇ
一つの役割内で短く細かく纏まる分岐ならそれでいいし
分岐先がちょっと大きくて役割も違う処理だったら関数やメソッドにして呼んでやればいいし
根幹部分で大きな処理に沢山分かれるようなら
分岐を行うところも関数化して処理番号を返却するようにして
その番号に該当する関数名を前もってコレクションに突っ込んでおいて
引っ張り出してCallByNameで呼ぶ方法もあるよぉ

他にもあるけどVBAではこのくらいが丁度いいと思うなぁ
2018/05/08(火) 22:27:45.23ID:X/JD7QJy
>>734
> わかりやすい例えにしたらガッツリ食い付いてくるんだな
アホな喩えをバカにされてるだけだろ
743デフォルトの名無しさん
垢版 |
2018/05/08(火) 22:54:19.84
>>736
やりたい処理内容によるけど、こういう書き方をするとすっきり書けるかも

Dim sid As String

sid = CStr(x) & “-” & CStr(y) & “-” & CStr(z)

Select Case True
 Case sid Like “1-1-1”
  Call ProcA
 Case sid Like “1-1-2”
  Call ProcB
 Case sid Like “1-2-1”
  Call ProcK
 Case sid Like “1-3-*”
  Call ProcC
 Case sid Like “[4,5,6]-[!1,2,3]-*”
  Call ProcD
 Case Else
  Call ProcZ
End Select

パターンマッチングの記法はLike演算子のヘルプを見てね
744デフォルトの名無しさん
垢版 |
2018/05/08(火) 23:00:52.76
>>743
あとは、

> sid = CStr(x) & “-” & CStr(y) & “-” & CStr(z)

sid = Format(x, “00”) & “-” & Format(y, “00”) & “-” & Format(z, “00”)
にして
“01-02-03” の形式にしたほうが

sid Like “##-15-##”
sid Like “9#-##-##”

みたいに書けて、より扱いやすいかも
2018/05/08(火) 23:27:07.19ID:J/XX4wKL
皆さんありがとうございます
レス参考に考えてみます

後から小出しに条件変えるのはどうかと思ったんですが、例が少しアレだったのでもう少し状況説明します

x,y,z全て文字列型でxは4通り,yは12通り,zは18通り、後続処理はメール送信です
使用する既定の本文テンプレートのどれを使うかを変数で判定してます
テンプレート自体は8通りで変数の組み合わせによってはメール送信しない場合もあります
ただ規則性はほとんど無く、例ですが1[1-3]1はテンプレA。 1[4-6]1はテンプレB。 171は未送信。 181はテンプレAのようにごちゃごちゃしてます。

ただxが3.4の時は処理がそれぞれ固定の為、早期リターン?で処理を書き、xが1,2の場合は全部羅列しようかと思ってます
2018/05/08(火) 23:35:13.46ID:FrjuwbIK
>>695
いや、貼られたコード見てない。
アホらしいので。

>>699
正にその通り。
しかし、VBAが使われる場面を考えれば当然Excelでやるべき場面なわけ。
君がExcelである必要無いと言っても、仕事では他のExcel文書とやり取りしたり、その処理以外に関数とかExcelの便利機能も使うわけで。
組む処理以外の面でExcelであるべきということはたくさんある。

>>705
Excel起動せずにVBAを動かすのが普通か?

どれも共通してるのはPSやRubyの例はバッチ処理だろうけどVBAで想定されてるのはバッチ処理ではないということ。
あるいはバッチ処理もするけど、それ単体で使われることは想定されてない。
単体で使われる処理"も"書けるけど、Excel使った業務に沿って対応する処理を書けるのは有利だ。
それで、業務に沿ってExcel開いた状態で実行する処理についてはVBA以外だと不利じゃないの?ということ。

例えばADOでDBに繋げて取ってきたデータをそのExcel上でその場で見れるわけ。
もちろんC#とかでExcelを介在させないで組むなんてのもありだがExcelは会社のPCなら誰のPCにも入っているし、別のデータ(当然Excelのデータ)ともやり取りしやすい。
というか、開いた状態で、別のデータも表示されてる状態からのスタートだったりするからやり取りじゃないか。
2018/05/08(火) 23:42:26.20ID:FrjuwbIK
>>707
違う。そういう意味合いで開いた状態について言及したわけじゃない。
実際、VBAで書く処理はバッチ処理じゃなくて今表示されてる表に対しての処理だとか、バッチ処理でも今表示されてる表にバッチ処理の結果を組み合わせたりの場合が普通で、単純なバッチ処理なんて殆ど組むことが無い。
2018/05/09(水) 00:00:09.89ID:Yu+xGlRu
>>746
バッチ処理じゃねーよ
2週ぐらい理解が周回遅れだぞ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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