Excel VBA 質問スレ Part61

■ このスレッドは過去ログ倉庫に格納されています
2019/04/25(木) 23:41:03.61ID:rni/4bMj0
!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
2019/05/28(火) 23:18:36.46ID:MN8nEIAEd
>>418
むしろ

Function Hoge(Arg() As String) As String()

の方が適切かな。

或いは
Function Hoge(Arg() As String) As Collection

とか。
2019/05/28(火) 23:45:10.83ID:sz8y6/Um0
>>419
AddressOf で関数を返すことすら出来るのだ
2019/05/28(火) 23:58:45.95ID:0rD99vo/0
IF Func() Then
とか
Loop Until Func()
なんてのがSubでは代用しにくい使い方だな (できないとは言わないが)

むしろ普通の数式で
A = Func1() + Func2() + Func3()
みたいに書きたい時の方が、Subに置き換えた時の無駄が多くなりそう
2019/05/29(水) 00:02:34.60ID:S0wmSPvZ0
2年ぐらい前にもSubとFunctionに違いなんかないと言い張る粘着がいたのを思い出した
2019/05/29(水) 00:03:33.14ID:6UUzdaAE0
BASICなんだからGOTOだけで十分
2019/05/29(水) 00:47:16.25ID:aQ2xiGWFd
>>421
おう、ここで初めて高度な話を見た。
426デフォルトの名無しさん (ブーイモ MMcf-e2Fz)
垢版 |
2019/05/29(水) 03:04:42.46ID:1woLKBVkM
・Sub
・返り値のないFunction
この違いは何ですか?
2019/05/29(水) 04:29:34.43ID:WducifPVa
subじゃ1個も値返せないじゃん
2019/05/29(水) 05:02:37.42ID:E4T3mNp50
戻り値ないならsubでいいじゃんって話だと思うんだけど俺も一応はそう思う
昔はsubばかりで書いてた

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

ここからは俺の好みみたいなもんだけど、
ボタンに直結してるようなエントリーポイント的なものは
subで書いて、それ以外、特に引数を受けとって処理するものは
単体では実行できないことを明確にする意味で全てfunctionにしてる
そう論理的で整合性のある区分というわけではないんだけど。
2019/05/29(水) 08:46:31.68ID:WZbm0MMEM
>>428
単体で実行できるかどうかはSub/Function の差じゃなくて、引数を取る/取らないの差じゃなかったっけ?
2019/05/29(水) 08:57:09.71ID:dT9QfEjx0
>>429
正解

Sub foo() '単体実行可能
End Sub

Sub bar(baz) '単体実行は出来ない
End Sub
2019/05/29(水) 08:58:24.42ID:dT9QfEjx0
あと、実行可能かどうかはpublic/privateで切り分けるべきだろう
2019/05/29(水) 09:10:25.71ID:QQeifizk0
セルに式として関数を入力して呼べるFunctionと呼べないSub
2019/05/29(水) 09:17:16.17ID:dT9QfEjx0
>>432
あれ、じゃあ何のためにsubって存在するんだ
return 0しなくていいってだけ?
2019/05/29(水) 09:30:42.49ID:dT9QfEjx0
基本はfunction
スクリプトとして何かをさせたい時にだけsubで定義する。C言語で言うint main(){}
戻り値や引数のありなしでは切り分けない

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

この考えだと、private subは使うべきじゃないって事になる
2019/05/29(水) 10:59:47.52ID:bJuQUiqr0
別に良いんだよ何を使おうと、まあ好きにすればって程度
まあ、ただ論理的に考えずごみを量産するやつはいるな
2019/05/29(水) 11:30:55.13ID:zbMbGE8SM
>>426
戻り値のないFunctionは存在しない
戻ってきた値を無視することができるだけ

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

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

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

>>441
なんでネタと思うんだ?
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
2019/05/29(水) 13:23:20.90ID:AfH1iVf/M
Selenium+vbaを使って
ChromeでWebページをPDF保存することは可能でしょうか?
2019/05/29(水) 13:29:26.76ID:dT9QfEjx0
>>444
vbaは不要っぽい
http://takuya-1st.hatenablog.jp/entry/2017/06/21/140000

記事が古いから一度試したほうが良いと思う
2019/05/29(水) 13:43:28.26ID:aQ2xiGWFd
>>442
だから構造的に考えて意味的にFunctionが適するかSubが適するかを選択するんだ。
意味的にというのは人間の感覚にとって合った方を採用すべきということ。

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

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

複数の値を返したいなら設計を見直すべきで、構造体を使うか、1つずつFunctionを分けるか考える
2019/05/29(水) 18:50:10.49ID:b/xKBA/BM
>>445

SeleniumではなくSeleniumBasic
の間違えでした。
ごめんなさい。
2019/05/29(水) 18:57:16.16ID:dT9QfEjx0
グローバル汚染はマジでエグいからな
「name」「mail」この変使われてたら超めんどい

>>449
Selenium使えばいいんじゃない
2019/05/29(水) 19:33:05.85ID:gbtQDfh8M
seleniumってもう使い物にならなくなってなかったっけ
2019/05/30(木) 00:50:17.75ID:oM5Ks3kV0
>>440
ヒープとスタックの違い理解してる?
2019/05/30(木) 03:19:10.04ID:1qsenVBka
byref もあるしな
2019/05/30(木) 08:21:00.17ID:oyMl0bcF0
>>452
それって日本昔話に載ってる?
今も気にすること?
2019/05/30(木) 12:02:16.59ID:fCKFoHR/M
使うスタック量によって再帰での有利不利って理屈の上ではあるだろうけど
現実的な意味ってあるの?
条件によってスタックオーバーフローする「かもしれない」プログラムに対して
引数や返り値を考慮とか再帰深度に気を使うとか、ちょっとVBAで考えられないんですけど
456デフォルトの名無しさん (オッペケ Sr33-NT0q)
垢版 |
2019/05/30(木) 12:25:00.74ID:0nKLhIYFr
>>454
SubとFunctionでメモリ効率の違い考慮するレベルなら
2019/05/30(木) 12:31:21.82ID:NTWA4E5yM
>>454
別に気にしなくてもいいけど>>440みたいなツッコミ入れるならちゃんと理解してないと恥をかく
2019/05/30(木) 15:33:21.51ID:oyMl0bcF0
>>457
おれも、昔話書きたくなったレベル
z80とか8080とかな8086なんて凄いよな
2019/05/30(木) 18:56:24.47ID:86kk1xI3a
ここできいていいのか分かりませんがマクロの組み方で教えてください

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

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

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

説明が下手ですみません。
2019/05/30(木) 19:04:11.68ID:1nLCMVmfr
今月=month(date)
activesheet.range("a1").resize(5).formula="="&今月&"!a1"
2019/05/30(木) 19:12:37.62ID:3bWSKYGBM
>>459
5月シートをコピーして6月シートにする。
5月を6月に文字列全置換え

処理日によって月を自動判定でもいいが、フォームで値を確認、修正後に実行の方がいいんじゃないかな
2019/05/30(木) 19:18:06.10ID:86kk1xI3a
>>460
すみません初心者なので詳しくは分かりませんが、今の月を参照するセルを作り、それをコピペするように組めばいい感じでしょうか。
間違ってたらすみません。

>>461
今まではそうやっていたのですが、それ以外にも、不要な場所を削除して、一番下の数値を一番上に持っていってみたいな作業があるので、その置き換えも合わせてマクロにしたいと思いまして。
2019/05/30(木) 19:37:14.94ID:/EJeltR2r
>>462
今月の月を取得して、a1からa5までの数式を置き換えるイメージです。
携帯からなので試せていませんが・・・
2019/05/30(木) 19:38:13.64ID:86kk1xI3a
>>463
ありがとうございます。
試してみます
2019/05/30(木) 19:41:48.72ID:S1ohEoHj0
>>464
文字列の検索や置換は数式にも有効
5月を6月に置換すればいい
VBAは必要ない
2019/05/30(木) 19:49:45.60ID:vA8HeCKe0
>>459
他の処理はともかく数式に関してはマクロいらない
=INDIRECT(MONTH(NOW())&"月!A1")
2019/05/30(木) 19:55:45.24ID:vA8HeCKe0
間違えたわ、こうだわ
=INDIRECT(MONTH(NOW())&"月!A"&ROW(A1))
2019/05/31(金) 10:21:23.92ID:iXFRocgY0
なんか、今月にこだわる人多いが説明だと選んだ月のシートからデーターを
持ってきたいだけだろ、勿論INDIRECTを使うことでマクロを使う必要はない
例えば、値を参照するシートとのA1セルに入力規制で1月〜12月を選択して
=INDIRECT($A$1 & "!A" & ROW(A1))
でいいだろ
2019/05/31(金) 10:48:51.98ID:xVkqny4q0
>>468
> それを毎月自動で7月、8月、と月に合わせて変えるのはどうやるのですか?
2019/05/31(金) 11:09:05.87ID:iXFRocgY0
>>469
自動だったらA1セルをNow()にして表示形式を
月だけにすればいいだけだろ
各セルに設定する関数は簡素に共通化する
2019/05/31(金) 11:20:16.63ID:xVkqny4q0
>>470
> なんか、今月にこだわる人多いが
2019/05/31(金) 11:34:43.20ID:iXFRocgY0
>>471
今月か選択なんてExcelをちょろって知ってればどっちでもいいんだよ
1っか所変えただけで要は1っか所を変えただけでその月に対応すればよいだけ
こんなのマクロなんか書いたら笑えるレベル
2019/05/31(金) 11:36:26.16ID:iXFRocgY0
あら〜ダブって入ったわ すまぬの
2019/05/31(金) 11:48:24.92ID:fWZN/ECyM
なんかVBA使わずにワークシート関数使えっていうコンセンサスでもあるの?
思い込みと違う?
2019/05/31(金) 11:53:29.26ID:iXFRocgY0
>>459
お題は
>理想としては、5月と書いてあるセルを6月と入力し、そのセルをコピペしていくマクロを組みたいのですが、その流れを作っても元の5月だけがコピペされてしまう状態です。
だけどな、マクロを使わないと気が済まないやつっているのかな
2019/05/31(金) 11:57:27.72ID:iXFRocgY0
>>474
これでマクロを作るやつのマクロを参考にしたいな
ぜひ作ってね
2019/05/31(金) 12:02:31.59ID:kMeHCJPt0
>>474
数式だけならファイル形式をxlsxのままにできて安全
同じ機能なら数式で済ませた方が良いだろう

家計簿ならどっちでも良いのは間違いない
2019/05/31(金) 12:17:34.40ID:iXFRocgY0
まあなんだな、$A$1この書き方って絶対参照だが良くないんだよな
普通はそのセルに名前を付けてその名前で参照する
例えば「設定月」みたいな名前ね
2019/05/31(金) 12:21:40.48ID:UKwhkiwBr
VBAのスレでマクロつかうなとか(笑)
2019/05/31(金) 12:23:22.93ID:xVkqny4q0
>>472
>>462 > それ以外にも、不要な場所を削除して、一番下の数値を一番上に持っていってみたいな作業があるので、その置き換えも合わせてマクロにしたいと思いまして。
2019/05/31(金) 12:27:21.46ID:wdWzuIo7p
シートを左のものからきっちり順に印刷する(印刷指示を出す)vbaありませんか?
スプール云々はプリンターの詳細設定弄れなくなってるのでvbaでどうにかなればしたいのですが・・
2019/05/31(金) 12:27:47.02ID:iXFRocgY0
Excelの関数や機能も知らん奴がVBAでマクロを作るか
少しは勉強しろよ、ってか
運転できないやつが、自動運転を作るみたいなもんか?
ってか参照で十分なものを何でマクロ(笑)
2019/05/31(金) 12:31:43.08ID:xVkqny4q0
>>482
>>459 > 毎月自動で7月、8月、と月に合わせて変える
 >>468 > 今月にこだわる人多いが
>>462 > その置き換えも合わせてマクロにしたい
 >>472 > こんなのマクロなんか書いたら笑えるレベル

一部読み飛ばして回答してしまうのはなんなのネタなの
2019/05/31(金) 12:32:47.94ID:iXFRocgY0
>>480
すまないが、そんなのどうして関数でできないと思うんだ?
ちゃんと説明すれば?、今まで書いているのはあまりにも簡単な質問で
関数で十分なんだが
2019/05/31(金) 12:37:34.60ID:iXFRocgY0
>>483
別に、マクロで提案してみたら
2019/05/31(金) 12:54:17.71ID:jiw85AG60
自動車つくれなくても、つくってもらって乗ればいいじゃん
2019/05/31(金) 13:01:15.44ID:iXFRocgY0
>>486
でも、企画があってな わけなわからん奴の作った自転車に
乗れるか?
責任は運転者だよ、関数は規格通りだな
その自転車がすごきゃいいよ、単に危ないだけじゃな
2019/05/31(金) 13:10:48.90ID:iXFRocgY0
>>483
で、お前は何ができるんだ?
何が気に障った?(笑)
2019/05/31(金) 13:26:58.37ID:iXFRocgY0
>>483
VBAで提案できないやつが・・・・
ネタだよな・・関数なら即座なのに
2019/05/31(金) 13:43:20.27ID:xVkqny4q0
>>489
今月にこだわっててもおかしくないし
一連の流れをマクロにしてその一部の質問してるわけでしょ
だから>>468>>472も的外れって話
訂正するわけでもないのに再アンカをしかも連投するってせっかちすぎない?
2019/05/31(金) 13:55:19.86ID:iXFRocgY0
>>490
今月とかどうでもいいんだよ
単に参照すればいいだけ、それで質問者の意図に対応できないか?
自分の主張じゃなく、何が正しいかで提案するんだよ
VBAで作れば何でもできるさ、でも単に絶対参照でいいものをこねくり回すなよ
2019/05/31(金) 14:07:14.86ID:xVkqny4q0
>>491
次は話ループさせんの?
「毎月自動、VBA」という質問の前提をこねくり回してるのはそっちでは?
2019/05/31(金) 14:14:55.01ID:kMeHCJPt0
普通のExcelスレはあんなに紳士的なのに・・・
2019/05/31(金) 14:31:03.11ID:iXFRocgY0
何だろうな、普通に絶対参照すればいいものをVBA・VBAって叫ぶの
怖いは
2019/05/31(金) 14:48:52.06ID:2f7ZWXQQ0
>>494
>>459>>462でマクロでやりたいと言ってるし、
マクロ以外の回答に対してノーリアクション
数式での回答を求めてないのだろう。結果を求めるだけじゃなく、マクロ自体を書きたいという質問者もいるわけだしな
あまり押し付けるのもどうかと思う

もちろん一般的な場合は君のやり方が正しいのは明らか
さすがにそれが分かってない人はいないだろう
2019/05/31(金) 15:04:15.42ID:jiw85AG60
>>462
削除等はマクロで、他シート参照は数式でいいんでないの
2019/05/31(金) 15:50:07.97ID:xVkqny4q0
元の前提無視して絶対参照・絶対参照って叫ぶの
怖いは
って言えばいいのかな
2019/05/31(金) 16:21:11.81ID:iXFRocgY0
>>496
削除が必要って単なる思い込みではないのかな
Excelの使い方もわからないのってVBAって魔法の玉手箱じゃないの
でなければ、質問者に対する最適の解をさっさとVBAで示せばいいんだよ
2019/05/31(金) 16:31:39.12ID:Q8fJ9KqCF
元々の質問を見る限り、詳細が無いのでVBAで解決すべきか数式で解決すべきか判断できん。

逆に言えばこれだけの情報でVBAを必要無いとか言ってしまえる人って初心者とまでは言わないけど大したスキルは無いんだろうなと思ってしまう。
2019/05/31(金) 16:43:05.14ID:agbDawORM
>>499
そうか 君はプロなんだね(笑)
2019/05/31(金) 17:06:59.36ID:Q8fJ9KqCF
>>500
初心者は自分の状況を上手く説明出来ないし、それはしようが無い。
一方回答する方も、初心者は自分の狭い土俵で回答しようとするんだよね。
2019/05/31(金) 17:12:13.76ID:agbDawORM
>>501
いまだにVBAでの回答すらないけどね
2019/05/31(金) 17:17:59.31ID:Q8fJ9KqCF
>>502
俺はこんな質問に回答しないよ。
何処の掲示板でもそうだけと面白いテーマじゃなきゃ回答しない。
俺が回答する必要も無いだろう。

>>460とかを見てどうにか頑張れば良いんじゃね?と思ってる。
2019/05/31(金) 17:21:09.14ID:Q8fJ9KqCF
技術レベルは大したことない問題だけど最近回答したのは>>284だな。
テーマとしては面白いから。
2019/05/31(金) 17:33:03.28ID:NquLpIx1r
てか>>464で終わっとるやろ…
2019/05/31(金) 17:36:44.72ID:xVkqny4q0
>>498
むしろ思い込み(というか自分の都合のいいように解釈)してるのはそっちなんだよなぁ
2019/05/31(金) 17:42:42.79ID:agbDawORM
>>503
君に、回答を求めてないよ
俺も、VBA の回答は基本的に出さない
まあヒントだけだな
いや〜これのマクロを作る奴見てみたい(笑)
2019/05/31(金) 17:43:17.34ID:2P/bRCUed
というか>>499に書いた通り、状況を判断する材料が少ない。
例えば月のシートが沢山あって、それぞれのシートの集計結果を集計シートで閲覧したいという状況なら数式の方が良さそうだ。(それでも情報が足りないから「良さそう」としか言えん。)
2019/05/31(金) 17:44:39.75ID:2P/bRCUed
>>507
じゃあ、俺に>>502のレスするんじゃね―よw
2019/05/31(金) 17:46:18.67ID:a67Z5WHaM
>>499
ほんそれ
ど真っ赤で力説してるのが滑稽やなw
2019/05/31(金) 18:08:13.80ID:agbDawORM
>>509
意識過剰だろ(笑)事実を書いただけ
2019/05/31(金) 19:20:39.09ID:frxzLdPfr
VBAでやるか数式でやるかの判断はこのスレでやる話じゃないだろ
ここはVBAのスレだぜ
2019/05/31(金) 19:22:19.42ID:2P/bRCUed
>>511
???

">>501"を付けるなと言ってる。
2019/05/31(金) 20:32:30.11ID:XAbM3vU30
>>481
dim ws as worksheet
for each ws as thisworkbook.worksheets
 ws.printout 〜
next
2019/05/31(金) 20:58:10.12ID:wdWzuIo7p
>>514
大荒れの中レスありがとう
来週試してみます
2019/05/31(金) 22:18:19.39ID:XAbM3vU30
>>515
ごめん for each ws in の書き間違い
2019/05/31(金) 22:31:58.82ID:aMsRRK9D0
ん?
全シート印刷じゃダメだったの?
2019/05/31(金) 22:40:38.73ID:agbDawORM
>>513
ふん、おれ500 お前が笑えるレスつけただけだろ
2019/06/01(土) 00:10:30.70ID:Re37ayj0p
>>517
もちろん全シート一括で印刷かけてるんですけど、スプール設定?の関係で重いシートの印刷が後回しになるので10ページ1ページ2ページの3シートのファイル印刷すると10ページのシートが一番最後に印刷されちゃって不便なんです
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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