X



Excel VBA 質問スレ Part61

■ このスレッドは過去ログ倉庫に格納されています
0389デフォルトの名無しさん (ワッチョイ 07f9-IeET)
垢版 |
2019/05/28(火) 10:32:00.95ID:P/fMeUQp0
>>384
>>385意見に賛成だが少し付け加えます。
基本的にsubにしろfunctionにしろ長くだらだら作らない
出来るだけ意味のある汎用性のある処理はそのルーチンを呼び出すようにする
その時に値を返せるfunctionの方が圧倒的に有利
初心者は同じようなルーチンをコピペで増殖させるが、後々メンテナンスに困る
それらをライブラリーとして持つと自分の資産になるんだけどね、それが重要なんだよ
0391デフォルトの名無しさん (JP 0H4f-Ha6N)
垢版 |
2019/05/28(火) 11:26:30.05ID:CE2aKfrCH
>>389
あーその説明で分かった ありがとう

たしかに今までは、動けばいいやで作ってたからコードが長くなってた
顧客コードから各データを検索する時なんか、
Cells(i,2).value=Range(Z:Z).Find(Cells(i,1)).Offset(0,5).Value
みたいなコードを10行とか書いてたわ
0392デフォルトの名無しさん (アウアウウー Saab-DSaV)
垢版 |
2019/05/28(火) 12:23:13.41ID:1q3vxt7ga
OutlookのVBAもここで可でしょうか?
違ったら誘導お願いします

上司へ「承認お願いします」と言った趣旨のメールを送った際、上司がボタン1つで承認する旨のメールが送れるようにしたいです
しかし複数いる上司全員にマクロの設定方法を教えるのは面倒です
私から送信するメール本文にマクロを組み込み、上司が受け取った際に本文にあるリンクを押せば(マクロを自分で設定していなくても)返信メールが自動作成されるような手法が取れればベストなのですが、そういったことは可能なのでしょうか?
0399デフォルトの名無しさん (ワッチョイ 8791-cMWe)
垢版 |
2019/05/28(火) 14:01:27.19ID:8P1bQTIM0
>>391
>>389の言ってることは全くその通りなんだが、FunctionにしろSubにしろ、内容が汎用的なものをまとめる、同じような処理を纏める考え方をするようになると最初から構造的に組むようになる。
その方が圧倒的に楽だから。

あと、例に挙げてるコードは良くない。
ブックやシートの省略はバグの元。
0405デフォルトの名無しさん (ワッチョイ df71-x/mB)
垢版 |
2019/05/28(火) 15:57:40.29ID:JWvhlEsx0
>>386
>>387
話題を気にせずに、切り込んだ形で質問をしてしまいました。
ホントに困ってしまったのでココで質問をしてみましたが、割り込んだ形でご迷惑をおかけしました。

VBAなんでも質問スレで聞いてみます。
お邪魔しましたm( _ _ )m
0410デフォルトの名無しさん (JP 0Hcb-n9i6)
垢版 |
2019/05/28(火) 18:29:24.54ID:Bg5LHkgbH
マウントしてると誤解を招くような
会話しかできない奴は能力低い奴多い
他人の意見も聞かないしね。
傲慢が後に返り討ちにあう
0419デフォルトの名無しさん (スプッッ Sd7f-cMWe)
垢版 |
2019/05/28(火) 23:15:31.12ID:MN8nEIAEd
>>415
1個しか返せないといっても工夫の問題。
配列で返せば実質何個でも返せるし、Collectionで返すこともできる。
クラスインスタンスを返すなんてことも出来る。
どれも普通にやることだよ。

何を返せば使いやすいかを構造的に考えて人間にとってピンと来るように組めばメンテナンスも楽だし、プロシージャの内容も理解しやすい。
初心者のコードは何をする処理なのか全く分からないことも多いが上級者のコードは考えて組まれてるので理解しやすいんだ。

>>416
>>417
罵倒するだけで内容を書かないんじゃ君らのレベルも押して知るべしだな。
0422デフォルトの名無しさん (ワッチョイ c7ce-dCWx)
垢版 |
2019/05/28(火) 23:58:45.95ID:0rD99vo/0
IF Func() Then
とか
Loop Until Func()
なんてのがSubでは代用しにくい使い方だな (できないとは言わないが)

むしろ普通の数式で
A = Func1() + Func2() + Func3()
みたいに書きたい時の方が、Subに置き換えた時の無駄が多くなりそう
0426デフォルトの名無しさん (ブーイモ MMcf-e2Fz)
垢版 |
2019/05/29(水) 03:04:42.46ID:1woLKBVkM
・Sub
・返り値のないFunction
この違いは何ですか?
0428デフォルトの名無しさん (ワッチョイ df01-Fpyl)
垢版 |
2019/05/29(水) 05:02:37.42ID:E4T3mNp50
戻り値ないならsubでいいじゃんって話だと思うんだけど俺も一応はそう思う
昔はsubばかりで書いてた

subは単体で実行できるけどfunctionは単体では実行できないという違いがある
functionは他から呼び出さないと実行できないという意味でね。

ここからは俺の好みみたいなもんだけど、
ボタンに直結してるようなエントリーポイント的なものは
subで書いて、それ以外、特に引数を受けとって処理するものは
単体では実行できないことを明確にする意味で全てfunctionにしてる
そう論理的で整合性のある区分というわけではないんだけど。
0434デフォルトの名無しさん (ワッチョイ bf68-dCWx)
垢版 |
2019/05/29(水) 09:30:42.49ID:dT9QfEjx0
基本はfunction
スクリプトとして何かをさせたい時にだけsubで定義する。C言語で言うint main(){}
戻り値や引数のありなしでは切り分けない

と考えると自然と思うんだけど、どうだろう

この考えだと、private subは使うべきじゃないって事になる
0436デフォルトの名無しさん (ブーイモ MMcb-dCWx)
垢版 |
2019/05/29(水) 11:30:55.13ID:zbMbGE8SM
>>426
戻り値のないFunctionは存在しない
戻ってきた値を無視することができるだけ

つまり戻り値を格納するためにメモリを必ず使うから、Subと比較して速度とメモリ効率の2点で不利になる
0439デフォルトの名無しさん (ブーイモ MMcb-dCWx)
垢版 |
2019/05/29(水) 11:39:17.00ID:zbMbGE8SM
>>433
今から40年以上前、それまでのシーケンシャルなプログラムでは能率が悪いから構造化しようという話しが出て、その時に提唱されたのが「手続き(Sub)」と「関数(Function)」という概念
しかし、教育用として作られたPascalという言語では忠実に実装されたけど、C言語には関数しか用意されなかったし、その後に登場したJavaも関数しかない
結局は言語を設計した人のリテラシーというか、単なる好みで決まったようなもん

今でもたくさんの言語が乱立してるのは、結局はみんな「ぼくの考えたさいきょうのげんご」が作りたいだけと思って、あながち間違いじゃない
0440デフォルトの名無しさん (ブーイモ MMcb-dCWx)
垢版 |
2019/05/29(水) 11:41:11.71ID:zbMbGE8SM
>>438
ネタじゃないよ
リカーシブなプログラムを書いてみればすぐわかる
VBAでもFunctionは呼び出すたびにヒープを最低4バイトずつ消費するから、再帰の最大回数が少ないのは簡単な実験ですぐに確認できる
0442デフォルトの名無しさん (ワッチョイ bf68-dCWx)
垢版 |
2019/05/29(水) 11:53:59.73ID:dT9QfEjx0
>>439
ありがとう!そういう事か
sub便利だけど、便利過ぎてかなり変な事になってるね
subから呼び出すのはfunctionと決めていれば良いんだろうけど、
でもsubからsub呼び出す事もあるから・・・
結局subって意味なくね?

C言語のsub無しが正解のような気がする。

>>441
なんでネタと思うんだ?
0443デフォルトの名無しさん (ブーイモ MMcb-dCWx)
垢版 |
2019/05/29(水) 11:58:48.77ID:zbMbGE8SM
簡単な実験
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
0446デフォルトの名無しさん (スプッッ Sd7f-cMWe)
垢版 |
2019/05/29(水) 13:43:28.26ID:aQ2xiGWFd
>>442
だから構造的に考えて意味的にFunctionが適するかSubが適するかを選択するんだ。
意味的にというのは人間の感覚にとって合った方を採用すべきということ。

Cだってvoidがあるじゃねーの。
無理矢理1を返すとかすれば戻り値が絶対に必要な言語設計だってできた筈。
なんでvoidがあるかといえば、やっぱり意味的に戻り値無しが人間にとってピッタリ来ることがあるからだと思うが。
0448デフォルトの名無しさん (ワッチョイ c7ce-dCWx)
垢版 |
2019/05/29(水) 17:40:58.36ID:S0wmSPvZ0
プログラムを一人で作って自分だけが永遠に保守するなら好きなように作ればいい
大規模なアプリをチームで作ったり、他人が修正したりする時には間違いを起こさないようにルールを決める必要があって、
経験上、カプセル化した方が結果的に安全で能率がいいということになっている

そのための手法の一つが変数のスコープを狭くすること、グローバル変数は使わないこと、なんだな
だから結果はどこかの変数に入れるんじゃなくてFunctionで返すんだよ

複数の値を返したいなら設計を見直すべきで、構造体を使うか、1つずつFunctionを分けるか考える
0455デフォルトの名無しさん (ブーイモ MMd6-ERtf)
垢版 |
2019/05/30(木) 12:02:16.59ID:fCKFoHR/M
使うスタック量によって再帰での有利不利って理屈の上ではあるだろうけど
現実的な意味ってあるの?
条件によってスタックオーバーフローする「かもしれない」プログラムに対して
引数や返り値を考慮とか再帰深度に気を使うとか、ちょっとVBAで考えられないんですけど
0456デフォルトの名無しさん (オッペケ Sr33-NT0q)
垢版 |
2019/05/30(木) 12:25:00.74ID:0nKLhIYFr
>>454
SubとFunctionでメモリ効率の違い考慮するレベルなら
0459デフォルトの名無しさん (アウアウカー Sa7b-K02T)
垢版 |
2019/05/30(木) 18:56:24.47ID:86kk1xI3a
ここできいていいのか分かりませんがマクロの組み方で教えてください

「=5月シートA1」
「=5月シートA2」
みたいに引っ張っているセルを
「=6月シートA1」
「=6月シートA2」
みたいに変えるマクロを組みたいんですが

それを毎月自動で7月、8月、と月に合わせて変えるのはどうやるのですか?

理想としては、5月と書いてあるセルを6月と入力し、そのセルをコピペしていくマクロを組みたいのですが、その流れを作っても元の5月だけがコピペされてしまう状態です。

説明が下手ですみません。
0462デフォルトの名無しさん (アウアウカー Sa7b-K02T)
垢版 |
2019/05/30(木) 19:18:06.10ID:86kk1xI3a
>>460
すみません初心者なので詳しくは分かりませんが、今の月を参照するセルを作り、それをコピペするように組めばいい感じでしょうか。
間違ってたらすみません。

>>461
今まではそうやっていたのですが、それ以外にも、不要な場所を削除して、一番下の数値を一番上に持っていってみたいな作業があるので、その置き換えも合わせてマクロにしたいと思いまして。
0468デフォルトの名無しさん (ワッチョイ 3ff9-n0I8)
垢版 |
2019/05/31(金) 10:21:23.92ID:iXFRocgY0
なんか、今月にこだわる人多いが説明だと選んだ月のシートからデーターを
持ってきたいだけだろ、勿論INDIRECTを使うことでマクロを使う必要はない
例えば、値を参照するシートとのA1セルに入力規制で1月〜12月を選択して
=INDIRECT($A$1 & "!A" & ROW(A1))
でいいだろ
0472デフォルトの名無しさん (ワッチョイ 3ff9-n0I8)
垢版 |
2019/05/31(金) 11:34:43.20ID:iXFRocgY0
>>471
今月か選択なんてExcelをちょろって知ってればどっちでもいいんだよ
1っか所変えただけで要は1っか所を変えただけでその月に対応すればよいだけ
こんなのマクロなんか書いたら笑えるレベル
0475デフォルトの名無しさん (ワッチョイ 3ff9-n0I8)
垢版 |
2019/05/31(金) 11:53:29.26ID:iXFRocgY0
>>459
お題は
>理想としては、5月と書いてあるセルを6月と入力し、そのセルをコピペしていくマクロを組みたいのですが、その流れを作っても元の5月だけがコピペされてしまう状態です。
だけどな、マクロを使わないと気が済まないやつっているのかな
0481デフォルトの名無しさん (ササクッテロ Sp33-+KpA)
垢版 |
2019/05/31(金) 12:27:21.46ID:wdWzuIo7p
シートを左のものからきっちり順に印刷する(印刷指示を出す)vbaありませんか?
スプール云々はプリンターの詳細設定弄れなくなってるのでvbaでどうにかなればしたいのですが・・
0482デフォルトの名無しさん (ワッチョイ 3ff9-n0I8)
垢版 |
2019/05/31(金) 12:27:47.02ID:iXFRocgY0
Excelの関数や機能も知らん奴がVBAでマクロを作るか
少しは勉強しろよ、ってか
運転できないやつが、自動運転を作るみたいなもんか?
ってか参照で十分なものを何でマクロ(笑)
■ このスレッドは過去ログ倉庫に格納されています

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