Excel VBA 質問スレ Part61
■ このスレッドは過去ログ倉庫に格納されています
!extend:checked:vvvvv:1000:512 !extend:checked:vvvvv:1000:512 ExcelのVBAに関する質問スレです コード書き込みや作成依頼もOK ※前スレ Excel VBA 質問スレ Part60 https://mevius.5ch.net/test/read.cgi/tech/1552736349/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured >>384 >>385 意見に賛成だが少し付け加えます。 基本的にsubにしろfunctionにしろ長くだらだら作らない 出来るだけ意味のある汎用性のある処理はそのルーチンを呼び出すようにする その時に値を返せるfunctionの方が圧倒的に有利 初心者は同じようなルーチンをコピペで増殖させるが、後々メンテナンスに困る それらをライブラリーとして持つと自分の資産になるんだけどね、それが重要なんだよ >>384 ネタでしょ? モドリッチがない方が便利だなんて、そんな訳ないじゃん >>389 あーその説明で分かった ありがとう たしかに今までは、動けばいいやで作ってたからコードが長くなってた 顧客コードから各データを検索する時なんか、 Cells(i,2).value=Range(Z:Z).Find(Cells(i,1)).Offset(0,5).Value みたいなコードを10行とか書いてたわ OutlookのVBAもここで可でしょうか? 違ったら誘導お願いします 上司へ「承認お願いします」と言った趣旨のメールを送った際、上司がボタン1つで承認する旨のメールが送れるようにしたいです しかし複数いる上司全員にマクロの設定方法を教えるのは面倒です 私から送信するメール本文にマクロを組み込み、上司が受け取った際に本文にあるリンクを押せば(マクロを自分で設定していなくても)返信メールが自動作成されるような手法が取れればベストなのですが、そういったことは可能なのでしょうか? >>392 ウィルスメールの作成方法きいてる様なもんだなw >>392 まずは社内でOLのセキュリティ設定がどうなのか。 ザルならやりようはいくつもあるが、ガチガチなら選択肢は少ない >>392 まあ、バカ上司をサポートするのと バカ上司の影響をサポートするのと どちっがしたいんだ? >>388 VBA初心者にありがちな意見だね。 プログラムを組む時の考え方が全く違う。 組める奴なら最初から構造的に考える。 動きゃ良いなどと考える奴はいない。 >>392 マクロでやらなくても承認ボタンを追加する機能があった筈だが。 > VBA初心者にありがちな意見だね。 はい、きょうもマウント取りたい人が来ましたよ >>391 >>389 の言ってることは全くその通りなんだが、FunctionにしろSubにしろ、内容が汎用的なものをまとめる、同じような処理を纏める考え方をするようになると最初から構造的に組むようになる。 その方が圧倒的に楽だから。 あと、例に挙げてるコードは良くない。 ブックやシートの省略はバグの元。 >>398 マウントも何も、明らかに初心者なんだから仕方ないだろ > VBA初心者にありがちな意見だね。 この部分は必要なかったんだよなぁ >>402 君はそう書かないと回答できないのか、なるほど 興味深い >>386 >>387 話題を気にせずに、切り込んだ形で質問をしてしまいました。 ホントに困ってしまったのでココで質問をしてみましたが、割り込んだ形でご迷惑をおかけしました。 VBAなんでも質問スレで聞いてみます。 お邪魔しましたm( _ _ )m >>404 構造的に考えるべきという意味付けの為に必要。 初心者にありがちだということで、初心者からレベルアップした方が良いということになる。 >>405 別に迷惑でも何でも無い。 元々、初心者の質問に難癖を付けた奴が悪いと思ったから>>355 を書いたんだが、内容を見ずに変に絡んでくる奴が出てきただけのこと。 マウントしてると誤解を招くような 会話しかできない奴は能力低い奴多い 他人の意見も聞かないしね。 傲慢が後に返り討ちにあう >>397 こんなんあったんですね! 自分で作るなら他にも機能足してたかもしれないけど、これなら簡単で皆で使えるからこれでいきます ウイルスメールの作成方法……確かに…… >>410 誤解を招く前に、プライドに触ったのか碌に内容読まずに絡む奴の方がよっぽど問題だと思うが。 >>410 マウントしたい奴と思ったら絡むなよ 意味もなく伸びrだけ >>384 functionなら1行で書ける! と思ったけど、よく見たらどっちも2行かかるな。 Dim A A = function() Dim A sub(ByRef A) functionのメリットって何だろ? 1個しか返せないし。 >>415 教えてほしいなら教えてくれと言えば良い 君以外全員わかってるぞ >>416 容赦なくてワロタw >>415 If func(x) Then とか func1(func2(a), func3(b)) とか >>415 1個しか返せないといっても工夫の問題。 配列で返せば実質何個でも返せるし、Collectionで返すこともできる。 クラスインスタンスを返すなんてことも出来る。 どれも普通にやることだよ。 何を返せば使いやすいかを構造的に考えて人間にとってピンと来るように組めばメンテナンスも楽だし、プロシージャの内容も理解しやすい。 初心者のコードは何をする処理なのか全く分からないことも多いが上級者のコードは考えて組まれてるので理解しやすいんだ。 >>416 >>417 罵倒するだけで内容を書かないんじゃ君らのレベルも押して知るべしだな。 >>418 むしろ Function Hoge(Arg() As String) As String() の方が適切かな。 或いは Function Hoge(Arg() As String) As Collection とか。 >>419 AddressOf で関数を返すことすら出来るのだ IF Func() Then とか Loop Until Func() なんてのがSubでは代用しにくい使い方だな (できないとは言わないが) むしろ普通の数式で A = Func1() + Func2() + Func3() みたいに書きたい時の方が、Subに置き換えた時の無駄が多くなりそう 2年ぐらい前にもSubとFunctionに違いなんかないと言い張る粘着がいたのを思い出した ・Sub ・返り値のないFunction この違いは何ですか? 戻り値ないならsubでいいじゃんって話だと思うんだけど俺も一応はそう思う 昔はsubばかりで書いてた subは単体で実行できるけどfunctionは単体では実行できないという違いがある functionは他から呼び出さないと実行できないという意味でね。 ここからは俺の好みみたいなもんだけど、 ボタンに直結してるようなエントリーポイント的なものは subで書いて、それ以外、特に引数を受けとって処理するものは 単体では実行できないことを明確にする意味で全てfunctionにしてる そう論理的で整合性のある区分というわけではないんだけど。 >>428 単体で実行できるかどうかはSub/Function の差じゃなくて、引数を取る/取らないの差じゃなかったっけ? >>429 正解 Sub foo() '単体実行可能 End Sub Sub bar(baz) '単体実行は出来ない End Sub あと、実行可能かどうかはpublic/privateで切り分けるべきだろう セルに式として関数を入力して呼べるFunctionと呼べないSub >>432 あれ、じゃあ何のためにsubって存在するんだ return 0しなくていいってだけ? 基本はfunction スクリプトとして何かをさせたい時にだけsubで定義する。C言語で言うint main(){} 戻り値や引数のありなしでは切り分けない と考えると自然と思うんだけど、どうだろう この考えだと、private subは使うべきじゃないって事になる 別に良いんだよ何を使おうと、まあ好きにすればって程度 まあ、ただ論理的に考えずごみを量産するやつはいるな >>426 戻り値のないFunctionは存在しない 戻ってきた値を無視することができるだけ つまり戻り値を格納するためにメモリを必ず使うから、Subと比較して速度とメモリ効率の2点で不利になる >>433 今から40年以上前、それまでのシーケンシャルなプログラムでは能率が悪いから構造化しようという話しが出て、その時に提唱されたのが「手続き(Sub)」と「関数(Function)」という概念 しかし、教育用として作られたPascalという言語では忠実に実装されたけど、C言語には関数しか用意されなかったし、その後に登場したJavaも関数しかない 結局は言語を設計した人のリテラシーというか、単なる好みで決まったようなもん 今でもたくさんの言語が乱立してるのは、結局はみんな「ぼくの考えたさいきょうのげんご」が作りたいだけと思って、あながち間違いじゃない >>438 ネタじゃないよ リカーシブなプログラムを書いてみればすぐわかる VBAでもFunctionは呼び出すたびにヒープを最低4バイトずつ消費するから、再帰の最大回数が少ないのは簡単な実験ですぐに確認できる >>439 ありがとう!そういう事か sub便利だけど、便利過ぎてかなり変な事になってるね subから呼び出すのはfunctionと決めていれば良いんだろうけど、 でもsubからsub呼び出す事もあるから・・・ 結局subって意味なくね? C言語のsub無しが正解のような気がする。 >>441 なんでネタと思うんだ? 簡単な実験 Funcの方がメモリをたくさん消費するから繰り返せる回数が少ない データキャッシュも有限なリソースだから、どちらでもいい時はFuncの方が不利 Sub sub_test() test_sub (1) End Sub Sub func_test() test_func (1) End Sub Sub test_sub(n) n = n + 1 Debug.Print n; test_sub (n) End Sub Function test_func(n) n = n + 1 Debug.Print n; test_func (n) End Function Selenium+vbaを使って ChromeでWebページをPDF保存することは可能でしょうか? >>442 だから構造的に考えて意味的にFunctionが適するかSubが適するかを選択するんだ。 意味的にというのは人間の感覚にとって合った方を採用すべきということ。 Cだってvoidがあるじゃねーの。 無理矢理1を返すとかすれば戻り値が絶対に必要な言語設計だってできた筈。 なんでvoidがあるかといえば、やっぱり意味的に戻り値無しが人間にとってピッタリ来ることがあるからだと思うが。 処理結果をpublicで判断するよりは 値を返すほうが使いやすい プログラムを一人で作って自分だけが永遠に保守するなら好きなように作ればいい 大規模なアプリをチームで作ったり、他人が修正したりする時には間違いを起こさないようにルールを決める必要があって、 経験上、カプセル化した方が結果的に安全で能率がいいということになっている そのための手法の一つが変数のスコープを狭くすること、グローバル変数は使わないこと、なんだな だから結果はどこかの変数に入れるんじゃなくてFunctionで返すんだよ 複数の値を返したいなら設計を見直すべきで、構造体を使うか、1つずつFunctionを分けるか考える >>445 SeleniumではなくSeleniumBasic の間違えでした。 ごめんなさい。 グローバル汚染はマジでエグいからな 「name」「mail」この変使われてたら超めんどい >>449 Selenium使えばいいんじゃない seleniumってもう使い物にならなくなってなかったっけ >>452 それって日本昔話に載ってる? 今も気にすること? 使うスタック量によって再帰での有利不利って理屈の上ではあるだろうけど 現実的な意味ってあるの? 条件によってスタックオーバーフローする「かもしれない」プログラムに対して 引数や返り値を考慮とか再帰深度に気を使うとか、ちょっとVBAで考えられないんですけど >>454 SubとFunctionでメモリ効率の違い考慮するレベルなら >>454 別に気にしなくてもいいけど>>440 みたいなツッコミ入れるならちゃんと理解してないと恥をかく >>457 おれも、昔話書きたくなったレベル z80とか8080とかな8086なんて凄いよな ここできいていいのか分かりませんがマクロの組み方で教えてください 「=5月シートA1」 「=5月シートA2」 みたいに引っ張っているセルを 「=6月シートA1」 「=6月シートA2」 みたいに変えるマクロを組みたいんですが それを毎月自動で7月、8月、と月に合わせて変えるのはどうやるのですか? 理想としては、5月と書いてあるセルを6月と入力し、そのセルをコピペしていくマクロを組みたいのですが、その流れを作っても元の5月だけがコピペされてしまう状態です。 説明が下手ですみません。 今月=month(date) activesheet.range("a1").resize(5).formula="="&今月&"!a1" >>459 5月シートをコピーして6月シートにする。 5月を6月に文字列全置換え 処理日によって月を自動判定でもいいが、フォームで値を確認、修正後に実行の方がいいんじゃないかな >>460 すみません初心者なので詳しくは分かりませんが、今の月を参照するセルを作り、それをコピペするように組めばいい感じでしょうか。 間違ってたらすみません。 >>461 今まではそうやっていたのですが、それ以外にも、不要な場所を削除して、一番下の数値を一番上に持っていってみたいな作業があるので、その置き換えも合わせてマクロにしたいと思いまして。 >>462 今月の月を取得して、a1からa5までの数式を置き換えるイメージです。 携帯からなので試せていませんが・・・ >>464 文字列の検索や置換は数式にも有効 5月を6月に置換すればいい VBAは必要ない >>459 他の処理はともかく数式に関してはマクロいらない =INDIRECT(MONTH(NOW())&"月!A1") 間違えたわ、こうだわ =INDIRECT(MONTH(NOW())&"月!A"&ROW(A1)) なんか、今月にこだわる人多いが説明だと選んだ月のシートからデーターを 持ってきたいだけだろ、勿論INDIRECTを使うことでマクロを使う必要はない 例えば、値を参照するシートとのA1セルに入力規制で1月〜12月を選択して =INDIRECT($A$1 & "!A" & ROW(A1)) でいいだろ >>468 > それを毎月自動で7月、8月、と月に合わせて変えるのはどうやるのですか? >>469 自動だったらA1セルをNow()にして表示形式を 月だけにすればいいだけだろ 各セルに設定する関数は簡素に共通化する >>471 今月か選択なんてExcelをちょろって知ってればどっちでもいいんだよ 1っか所変えただけで要は1っか所を変えただけでその月に対応すればよいだけ こんなのマクロなんか書いたら笑えるレベル なんかVBA使わずにワークシート関数使えっていうコンセンサスでもあるの? 思い込みと違う? >>459 お題は >理想としては、5月と書いてあるセルを6月と入力し、そのセルをコピペしていくマクロを組みたいのですが、その流れを作っても元の5月だけがコピペされてしまう状態です。 だけどな、マクロを使わないと気が済まないやつっているのかな >>474 これでマクロを作るやつのマクロを参考にしたいな ぜひ作ってね >>474 数式だけならファイル形式をxlsxのままにできて安全 同じ機能なら数式で済ませた方が良いだろう 家計簿ならどっちでも良いのは間違いない まあなんだな、$A$1この書き方って絶対参照だが良くないんだよな 普通はそのセルに名前を付けてその名前で参照する 例えば「設定月」みたいな名前ね >>472 >>462 > それ以外にも、不要な場所を削除して、一番下の数値を一番上に持っていってみたいな作業があるので、その置き換えも合わせてマクロにしたいと思いまして。 シートを左のものからきっちり順に印刷する(印刷指示を出す)vbaありませんか? スプール云々はプリンターの詳細設定弄れなくなってるのでvbaでどうにかなればしたいのですが・・ Excelの関数や機能も知らん奴がVBAでマクロを作るか 少しは勉強しろよ、ってか 運転できないやつが、自動運転を作るみたいなもんか? ってか参照で十分なものを何でマクロ(笑) >>482 >>459 > 毎月自動で7月、8月、と月に合わせて変える >>468 > 今月にこだわる人多いが >>462 > その置き換えも合わせてマクロにしたい >>472 > こんなのマクロなんか書いたら笑えるレベル 一部読み飛ばして回答してしまうのはなんなのネタなの >>480 すまないが、そんなのどうして関数でできないと思うんだ? ちゃんと説明すれば?、今まで書いているのはあまりにも簡単な質問で 関数で十分なんだが 自動車つくれなくても、つくってもらって乗ればいいじゃん >>486 でも、企画があってな わけなわからん奴の作った自転車に 乗れるか? 責任は運転者だよ、関数は規格通りだな その自転車がすごきゃいいよ、単に危ないだけじゃな >>483 で、お前は何ができるんだ? 何が気に障った?(笑) >>483 VBAで提案できないやつが・・・・ ネタだよな・・関数なら即座なのに ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる