『Set FSO=Nothing って』(VBA初心者太郎) はじめまして。 最近ExcelVBAをやりはじめた勉強中の初心者です。 いろいろと参考書をみて真似したりしてるんですが Set FSO = CreateObject("Scripting.FileSystemObject") (この間いろいろ処理) Set FSO = Nothing というVBAで最後の「Set FSO = Nothing」は何をやってるんでしょうか? 参考書にはこの文言があったりなかったりで この部分に触れられてないのでよくわかりません。 どなたか教えていただけないでしょうか? < 使用 Excel:Excel2019、使用 OS:Windows10 > ---- Set FSO = CreateObject...でオブジェクト(のアドレス)を割り当てます Set FSO = Nothing...でそれを解除します(何も割り当てられていない状態にします) (ゆたか) 2024/01/18(木) 14:03:54 ---- 参考にどうぞ https://www.moug.net/tech/exvba/0150027.html (tkit) 2024/01/18(木) 14:05:57 ---- それを必要と考えるかどうかは流儀(人)によります。 [[20231130163948]] (ゆたか) 2024/01/18(木) 14:08:38 ---- みなさんありがとうございます。 過去にこの学校内で議論もあったんですね。 なんとなくの理解はできたつもりですが、 結局あってもなくてもいいんですかね? (VBA初心者太郎) 2024/01/18(木) 14:28:18 ---- >結局あってもなくてもいいんですかね? 普通、そう言うのは「なくていい」と言うんじゃないですかね? これは、End Subの直前に「プロシージャレベルのオブジェクト変数にNothingをSetする」に限定した話なんですよね? 直前なら、やる意味はないので、やったらお猿さんと呼ばれるかも。 何故、こんな議論があるかと言うと、昔、誰かがNothingを始めたが、 その理由が他者に正確に伝わらなかったのでしょう。 意味があると悟った者は、正しい状況下でNothingにした、 意味があるか分からない者は、書かない種族 と サルまね種族 に分かれた。 サルまね種族は少数派とも言えない状況にあるらしい。 周りがサルばかりだと、自分がサルと言う認識さえなくなる。むしろ居心地がいい。 「俺はサルじゃない、だってみんなやっているじゃないか」 でも意味が分からないコードを丸写しする人は「カーゴ・カルト・プログラマー」と呼ばれるんですけどねぇ。 昔、この問題を調べた時の私の結論:ADOオブジェクトとApplicationオブジェクトはやるべき 前者はバグ対策(Microsoftはバグ自体を認めていないので、当然、解消した旨のアナウンスを出すハズもなく、現実の状況は確かめようがない)、 後者はMicrosoftがそうするよう推奨していた(得体のしれないバグなんでしょうね。今となってはどんなドキュメントだったのか不明) (半平太) 2024/01/18(木) 20:35:58 ---- (半平太)s 、ありがとうございます。 >意味があるか分からない者は、書かない種族 と サルまね種族 に分かれた。 >昔、この問題を調べた時の私の結論:ADOオブジェクトとApplicationオブジェクトはやるべき なるほど、日本人は特に[ まね種族 ]な傾向がある気がします。 ADOオブジェクトと Applicationオブジェクトを使用する時は 注意します。( ちょっと、お利口になったかも^^; ) ホントに解ったんかい?って なんか簡単な、実験例欲しいな ( ボソ...独り言です ρω・ ) (あみな) 2024/01/18(木) 21:52:48 ---- あっあった^^; 上に、(tkit)さんのしてみよ (あみな) 2024/01/18(木) 22:04:16 ---- > なるほど、日本人は特に[ まね種族 ]な傾向がある気がします。 > ADOオブジェクトと Applicationオブジェクトを使用する時は > 注意します。( ちょっと、お利口になったかも^^; ) すみませーん。 私の個人的な見解です。 正解を知っているひとは、一人も居ないと思っています。 (半平太) 2024/01/18(木) 22:48:49 ---- 知らない間にお話が進んでるのに気づきませんでした。 すみません。 >「ADOオブジェクトとApplicationオブジェクトはやるべき」 詳しいことはよくわかりませんが、これだけ覚えときます。 ありがとうございました。 (VBA初心者太郎) 2024/01/24(水) 15:18:16 ---- こないだ、ちらみしてたやつですが まだ、目に止まっていなかったらですが 下が参考になるかなって思ってます。 VBAのあれこれ(雑記 https://qiita.com/UFOnian/items/21262bad94b092748b66 詳しくは、他の回答者の 意見を聞いてください。 (あみな) 2024/01/24(水) 15:38:44 ---- 補足 : なんでもかんでもってわけでは ないのでありますので注意してください。 たぶんね。下みたいな時に Dim App As Application Set App = Application App.ScreenUpdating = False App.CountIf 〇〇 App.Match 〇〇 App.ScreenUpdating = True Set App = Nothing ←こんなときは、いらんぽォ (あみな) 2024/01/24(水) 15:54:26 ---- あみなさんコメントありがとうございます。 URL参照しますね。 VBAってわからんことも多いですけど面白いですね。 (VBA初心者太郎) 2024/01/24(水) 17:00:41 ---- > VBAのあれこれ(雑記 >https://qiita.com/UFOnian/items/21262bad94b092748b66 私には何を言っているのか分からなかったです。 まぁ、まともに読んでいないですけど。。 今回の質問は、End Subの直前に「プロシージャレベルのオブジェクト変数にNothingをSetする」のは 意味があるかないかの話ですよね。 QuitとかCloseとかがやたらに出てきますが、 上のテーマにおいて、何か違いが出るとか言っているのでしょうか? (半平太) 2024/01/24(水) 19:10:58 ---- End Sub の直前の処理における全般のお話かと 思っているのですが、違ってたら未熟者の為 すいません。 [変数] Dim x As Excel.Application Dim x As Excel.Workbook Dim x As Excel.Worksheet [オブジェクト生成] Set x = CreateObject("Excel.Application") Set x = New Excel.Application (あみな) 2024/01/24(水) 20:08:38 ---- End Sub の直前にSet Nothingするお話だとすれば、 1.直前に書いた。 2.直前に何も書かなかった その2通りのコードを使って結果がどうなったか書いてくれればいいんじゃないですか? そもそも彼は不要論者ですよね。そんな実験やる気も無いんじゃないですか? 兎に角、何の為に、QuitとかCLOSEとか持ち出して来るのか分からないです。 今回のテーマとは無縁じゃないですか。 また、Applicationって、Excelだけかのような進行ですけども違和感を覚えます、 (半平太) 2024/01/24(水) 20:55:41 ---- いろんなパターンの想定のお話が記載して あったので、何かの時には参考になるかなと 思った次第です。不要であればすいません。 (あみな) 2024/01/24(水) 21:24:17 ---- 不要とは言っておりません。 記事の内容にコメントしただけです。 彼の言う通り、仕様上は直前Nothingは無意味でしかないでしょう。 それなのに、何故こんなバカな風習が広まったのか・・ そこに思いを馳せる必要がある気がします。 昔、このへんてこりんな風習が理解できない旨、Microsoft社の技術者がつぶやいた。 すると、実務家から猛烈な反発があった。 「得体の知れないトラブルに見舞われて途方に暮れていた時、  ADOオブジェクトにNothingをSetしまくったら嘘の様にトラブルが消えたんだよ」 「おまじないだとか言ってくれるが、それを言う前にMicrosoftは仕様通りに動くシステムを作れよ」 「無駄かも知れないが、トラブルで悩まされるよりマシだ。俺は保険の積りで書くね。その方が早帰りできる」 そんな事情もあるんで、仕様だけで割り切れないんですよねぇ・・私は・・基本不要論者なんですけど。 (半平太) 2024/01/25(木) 00:04:06 ---- >そもそも彼は不要論者ですよね。そんな実験やる気も無いんじゃないですか? 不要論者というわけではないんです。 当初の質問を見ていただけるとわかると思いますが、そもそも意味が理解できてなかったので、 Set FSO = Nothing がなにをやってるのか知りたかっただけなんです。 それがいつの間にかいる・いらないの話になってまして・・。 VBAについては経験も浅く、知識が乏しいのでいろいろ教えていただけてありがたいと 思っています。 End Subの直前に「プロシージャレベルのオブジェクト変数にNothingをSetする」のは無意味だが、 ADOオブジェクトとApplicationオブジェクトはやるべき。 という風に理解しました。 (VBA初心者太郎) 2024/01/25(木) 08:42:06 ---- 誤解があるようですが、「彼」とは「VBAのあれこれ(雑記」の記事の筆者です。 >End Subの直前に「プロシージャレベルのオブジェクト変数にNothingをSetする」のは無意味だが、 >ADOオブジェクトとApplicationオブジェクトはやるべき。 >という風に理解しました。 うーん、転ばぬ先の杖的な話なので、サル真似プログラマーと呼ばれたくなかったら、 先ずは、何も書かない方がいいかもです。(仕様に忠実なプログラマーとして振舞える) そして、何かの折にトラブり、その対策として直前Nothingが有効なケースがあると確信できたなら、 意味のあるコードが書ける「泣きの入ったプログラマー」になれたと言えるんじゃないですかね? (半平太) 2024/01/25(木) 09:52:40 ---- 半平太さんコメントありがとうございます。 誤解してたようで・・すみません ^-^;) まだまだプログラマー(サル真似でも)とは恐れ多い感じで・・。 徐々に勉強して「仕様に忠実なプログラマー」と呼ばれるようにがんばります! みなさん貴重な時間をありがとうございました! (VBA初心者太郎) 2024/01/25(木) 11:27:19