Excel VBA 質問スレ Part66

■ このスレッドは過去ログ倉庫に格納されています
11000
垢版 |
2020/05/10(日) 13:43:45.00ID:Nkoph0aj
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK

※前スレ
Excel VBA 質問スレ Part65
https://mevius.5ch.net/test/read.cgi/tech/1584430040/

※デフォルト設定
743582
垢版 |
2020/06/12(金) 08:34:43.74ID:KgwnUKnv
>>720
どっかのリボンにオブジェクトのリスト出せるボタンが有ったと思うが、表示されなかったっけ?
744582
垢版 |
2020/06/12(金) 08:36:08.69ID:KgwnUKnv
>>740
サイズ変わって見えなくなってるだけだよなあ。
2020/06/12(金) 12:46:47.02ID:HqN3pHW3
>>720
セルにあわせて移動やサイズ変更するかどうかの設定があったはずだが
2020/06/12(金) 13:13:42.59ID:1+2Rgw6z
>>745
バージョン2010以降「セルに合わせてサイズ変更や移動しない」の設定になっていても
サイズが変わってしまう事例を多数経験しています。(2007は経験なし)
ボタンだけでなく、コメントの位置も極端に移動すること多数。
2020/06/12(金) 13:14:30.95ID:hxFv/xna
>>742
ヘェ〜そんな関数あるんだ、IEオブジェクトだけかと思ってた、ありがとう
2020/06/12(金) 17:49:02.54ID:aQA9YYrW
>>740
エクセルに任せるんじゃなくてコード上で配置の指示だしておくってのは解決策になるのかもしれんね。ちっこくして非表示切り替えと関係ない安全な場所に退避させておくみたいな
>>743
それが「オブジェクトの選択と表示」
リストには出てるんだわ
>>745
まぁその辺もやってるんだけどね
むしろその辺でバグってるんだと思う
>>744
おれの書いた内容読んでないのかもしれんけど
VBAからサイズを再指定して表示させようとしてもバグってて指定を受け付けてくれないってことな
そもそもサイズの問題だけならシートコピーで他の正常なボタンと一緒にコピーされるはずじゃん
2020/06/12(金) 23:01:56.39ID:FlbnSBZd
Windows10に変えたら、クロマキー合成みたいなのが出来なくなっちゃったんだけど、
何か方法ない?
750デフォルトの名無しさん
垢版 |
2020/06/12(金) 23:29:11.20ID:KALz8/u9
また馬鹿が来た
2020/06/12(金) 23:57:17.59ID:FlbnSBZd
>>737
>>750
一体どんな無様な人生を送ったら、そんなコメントが出来るようになるのかな?
生きててつまんないだろう?
ここの住人にかまってもらえるのが唯一の楽しみかい?
2020/06/13(土) 00:29:59.36ID:0QXppYe5
クロマキーはWin7まで。
ていうかクロマキーて・・。
確かにクロマキーだが。
2020/06/13(土) 01:18:01.22ID:l5EmusQW
一旦あきらめて、真の目的を違う方法で達成することを考えましょう
754デフォルトの名無しさん
垢版 |
2020/06/13(土) 03:31:14.05ID:d/IEOBZf
>>751
自分が言われたという自覚があるんだ?
2020/06/13(土) 06:33:26.28ID:iOfV/qX/
>>750
実は自分もわかってないからここで勉強してるんだろ
でマウント取りたいからそのコメント
2020/06/13(土) 07:35:38.54ID:gm1IvgiV
質問スレなんてどこでも、マウントとって承認欲求を満たそうとする奴らばかりだよ。
特にVBAスレは、プログラミング板の他のスレでは相手にされないレベルの奴がここなら俺でもマウントとれるだろと集まってくる。
2020/06/13(土) 10:49:08.95ID:hwBvm+CU
VBA始めて1週間
結構できるようになったけど、俺ってすごい!?
2020/06/13(土) 11:02:28.88ID:iOfV/qX/
>>757
どうやって勉強した?どこまでできるようなった?
2020/06/13(土) 12:54:09.65ID:l5EmusQW
VBA完全に理解した

VBAなにもわからない

VBAチョットデキル
2020/06/13(土) 13:53:12.35ID:sXc2xmOg
何を以て「できる」と判断したのか?
2020/06/13(土) 13:57:01.18ID:k9PzEFx9
初心者の頃に書いたコードみるとマジナンだらけでチョベリバだわ
2020/06/13(土) 14:05:41.14ID:GFk/ON+H
編集ができるってことじゃね
763デフォルトの名無しさん
垢版 |
2020/06/13(土) 14:17:20.43ID:Ft3NByW3
 ダニングクルーガー効果とかいうやつじゃね
2020/06/13(土) 15:41:58.59ID:9rN9x/HV
VBAに限らないコーディング全般の話になるかと思うんですが、
For文のカウンタ変数に対してそのブロック内で加減算するのはいわゆる「お行儀が悪い」ものですか?

For i = min To min Step -1
  For j = i + 1 To max
    〜処理〜
    If 条件 Then
      〜処理〜
      Let i = i + 1 '←ココ
      〜処理〜
    Else
      〜処理〜
    End If
    〜処理〜
  Next j
  〜処理〜
Next i

前任者が使っていた20行にも満たないコードですが、1行目に違和感がありました。
Do While/Until文で書き直せるものの、単に自分の理解度が低いだけかもしれず・・・
2020/06/13(土) 15:59:50.04ID:sXc2xmOg
>>764
俺ならforにしないな
2020/06/13(土) 16:03:06.99ID:hwBvm+CU
データ用のシートからデータをコピーできるようになったぜ

ところでクラスモジュールにはどんなメリットがありますか?
functionの意味は分かりましたが、クラスとの違いなどがよく分からず
今本屋で色々探してきましたが、解説が見当たりませんでした。
2020/06/13(土) 16:04:33.27ID:HDBeOIwd
>>764
forにせずif文で条件抜けさせる方が読み手に伝わるし良いと思う…
stepで減算してるのに条件次第でi加算するのは処理の流れが分かりづらくなる
2020/06/13(土) 16:05:08.13ID:ll49+YlL
一般的に、for nextの方が理解しやすいから、for 文ありきで書いてるだけなんじゃないかな。
感覚的にも可読性やメンテナンス性からも、do loopなどで書く方が良いと思います。
2020/06/13(土) 16:14:12.41ID:lPN2rvMv
>>766
VBAのクラスはCOMとの相互運用のために存在する
普通に使う分には全く必要ない
というか並のVBAerのスキルではメンテ不能になるからむしろ有害
クラスを使いたくなるレベルの高度な抽象化が必要になるようなら、
そもそもそんなことをVBAでやらなければならないシステム設計が間違っていると考えるべき
2020/06/13(土) 16:49:04.82ID:9rN9x/HV
>>765, >>767-768
やはりそうですよね。Do〜に書き直そうと思います。ありがとうございました。
2020/06/13(土) 16:50:17.97ID:hwBvm+CU
>769
ありがとうございます。
そこまでの説明が探しきれなかったので助かります。
2020/06/13(土) 16:52:28.00ID:69sGe9cG
>>764
Forの使い方を間違ってる
途中で1足して、最後にまた1引くんなら、Do LoopとIfなどを使って条件をはっきり書くべき

プログラミング全般の話となると、コンパイラによっては最初にStep値で割り算して回数を求めてしまうコードを吐くやつもあるので、正常に動かなくなる
2020/06/13(土) 18:20:23.36ID:gmb5Wcnr
ブックのなかに、シートがたくさんあって、
マクロ利用者毎にマクロで動かしたいシートが違う。
だから、マクロの実行中に、利用者にシートを選択させて、それをactivesheetにさせたい。
そういうの、できる?
2020/06/13(土) 18:31:43.88ID:sXc2xmOg
できる
2020/06/13(土) 18:35:00.95ID:Q06gyfKt
>>773
ロジック的に変
Webページやスマホアプリでも最初にログインするのとかあるでしょ?
後から選択するくらいなら最初に分けた方が良いのでは?
2020/06/13(土) 18:38:57.44ID:gmb5Wcnr
>>775
できれば、そうしたんだけど。
何人もの利用者が共通で使っているブックなので、シートを分けられないんだ。

シートがゴチャゴチャの状態から特定シートを利用者に選ばせたい。
2020/06/13(土) 18:42:11.92ID:ejIEXNUq
>>773
https://qiita.com/rrryutaro/items/b8bdc6d16bdf8c66a190
この辺コピペしたら動くんじゃない?
2020/06/13(土) 18:54:40.10ID:Q06gyfKt
>>776
ごめん参りました_| ̄|○>>777
2020/06/13(土) 18:56:13.87ID:gmb5Wcnr
>>777
回答サンクス。
でも、もっとコードをシンプルにしたい。
2020/06/13(土) 18:56:56.64ID:gmb5Wcnr
>>779
マクロを途中で止めて、利用者にシートを選択させることによって(そのシートのどこかのセルを選択させる)、activesheetにさせたいんよ。
781デフォルトの名無しさん
垢版 |
2020/06/13(土) 19:11:25.34ID:Ft3NByW3
自分でシートを開いてその後マクロを実行する形じゃダメなの
2020/06/13(土) 19:20:55.22ID:gmb5Wcnr
>>781
今は、苦肉の策でそうしてるんだけどね。
諸事情により途中でactivesheet を選ばせたいんだ。
2020/06/13(土) 19:50:08.25ID:mObNCAEc
これでいい気がする
https://qiita.com/yosatonet/items/b7083d7c95d2d81b1ffa
2020/06/13(土) 20:02:21.69ID:gmb5Wcnr
>>783
サンクス
ありがとー。

でも、もっと簡単にできんかな。
どうやら、無理っぽいな。
2020/06/13(土) 20:08:18.16ID:Q06gyfKt
マクロの途中で>>777で作ったUserForm1.Showすりゃ良いでしょう
2020/06/13(土) 20:23:03.52ID:mObNCAEc
じゃあこれ
https://www.relief.jp/docs/excel-vba-select-cells-application-inputbox-methot.html
2020/06/13(土) 20:28:03.66ID:sXc2xmOg
>>780
途中でセル選択ダイアログでも表示すりゃいいじゃん
2020/06/13(土) 20:36:43.64ID:gmb5Wcnr
>>786
ありがと。

それやってみたけど、ちょっと面倒だった。
もう一回やってみる。
2020/06/13(土) 20:42:30.13ID:gmb5Wcnr
>>786
やっぱ、いけるかも。
2020/06/13(土) 20:42:48.59ID:gmb5Wcnr
>>787
ありがと。いけるかも。
2020/06/14(日) 08:41:44.12ID:ffGowWaR
>>788
よく分からんがモードレスにすりゃ良いんじゃねえの?
2020/06/14(日) 11:14:04.92ID:uWyGdyFQ
>>766
複数の自作関数をセットにして使いまわしたい時とか、
取得した値をプロパティとして保持しておきたい時とか、
自作関数でインテリセンスを使いたい時とか。
2020/06/14(日) 11:20:05.40ID:ZfTKHz7W
>>792
モジュールと構造体でいいよねそれ
794デフォルトの名無しさん
垢版 |
2020/06/14(日) 11:21:47.96ID:435IzS7y
VBA歴まだ1ヶ月
でtxtデータから全て数値をシートに引っ張り出す事は成功したけどそれをVBAで計算させるスキルはないからエクセル関数使ってる
もっとスキルが欲しい
2020/06/14(日) 12:36:35.03ID:PywPq9gj
関数でできることは関数でやりましょう(例外あり)
2020/06/14(日) 12:52:53.71ID:UBYu/Pyg
関数ばかりでもいかんですう
797デフォルトの名無しさん
垢版 |
2020/06/14(日) 13:01:56.80ID:435IzS7y
引っ張り出した数値を
ABS関数
ROUND関数
MAX、MIN関数
IF関数
でだんだんフィルターを通す感覚で
で本来の数値に対応させてる
VBAでそれをやる力を得るには5年はかかるな
俺じゃ
2020/06/14(日) 13:26:59.00ID:0qngbhsm
限定的な使い方になるが、連想配列でユーザ定義型使いたい時に代わりにクラスモジュール使うって手がある
2020/06/14(日) 13:44:32.79ID:attwzNFV
質問ですが、列が3つありそのうち2つが検索用ワードで
これを元に検索し3つ目のセルにあるワードを配列に収めていく処理を行いたいです。

例えば、こういったテーブルがあります。
すずき、いちろう、170
すずき、じろう、171
たなか、さぶろう、172

検索条件を1列目「すずき」2列目「条件なし」とした時、170,171を配列に収める
検索条件を1列目「すずき」2列目「いちろう」とした時、170を配列に収める

と、やろうとした時どういった処理が考えられるでしょうか。
2020/06/14(日) 13:51:33.71ID:nNGIeJAo
データベースのアンド検索クエリ覚えなはれ
2020/06/14(日) 13:52:24.03ID:0qngbhsm
>>799
オートフィルタで抽出して3列目を配列に格納
2020/06/14(日) 14:09:01.53ID:NfMb0cpJ
>>799
まず表の範囲をテーブル化
そしたらテーブル操作の処理使えて簡単
http://officetanaka.net/excel/vba/table/
2020/06/14(日) 14:16:14.71ID:UBYu/Pyg
>>799
逆にどういった処理も考えられないの?
2020/06/14(日) 14:28:07.65ID:attwzNFV
ありがとうございます。
テーブル化の方向で調べてみます。
2020/06/14(日) 17:08:34.92ID:zv9EPLCI
ユーザー定義関数をさ、AutoFill使って連続した複数セルに「=MyFunction()」みたいな感じで
代入していくじゃん
数式は正確に代入されてるのになぜか#VALUE!のエラーがでるんだよなぁ

計算対象になってるセルの1つをダブルクリックして値を入力するモードにしてから
そのまま何もしないでエンター押すと、さっきまで#VALUE!だったところが
再計算されて正常にセルに表示される

オートフィルに備えて連続セルの一番先頭にVBAから個別に代入しておいたセルがあるんだけど
ここはちゃんと計算結果がでてる
んで、このセルを始点にして手動でオートフィルかけて数式いれるとちゃんと計算される
手動オートフィルの結果代入された数式とVBAのAutoFill使って代入した数式を比較しても全く同じ
でもVBAのほうだけは#VALUE!ですわ

これ一体なんなのさ

一通り調べてわからんかったからAutoFillやめてForで回していれたった
やっぱ俺にはこういう原始人的なコードがあってるわ
2020/06/14(日) 17:36:38.72ID:0qngbhsm
>>805
計算対象のセルが更新された時自動で関数が処理される設定になってないから
2020/06/14(日) 17:49:03.80ID:AaZP5Hye
>>804
ワシのやり方を参考にするなら
Youtubeのチャンネル登録してな。
2020/06/14(日) 18:50:39.41ID:zv9EPLCI
>>806
手動・自動のやつでしょ
もちろん自動になってるわ
Forで回して数式代入したときは普通に計算されるから理由としてはいまいちじゃね
あと手動でオートフィルしてもいけるしね

表の右端に何列か並んでる数式は全部計算されるんだけど
下端にあるやつがだめなんだよね
どちらも全く同じパターンで代入してんだよね

まぁForでできるからいいんだけどな
2020/06/14(日) 19:19:38.26ID:0qngbhsm
>>808
シートじゃなくて関数の設定
volatire
2020/06/14(日) 20:00:28.24ID:Nip9LUw0
>>809
volatile (揮発性) じゃね?
2020/06/14(日) 20:18:20.66ID:95POjxnT
>>805
> =MyFunction()
みたいに引数がないと>>809が言うようにvolatile指定しないと再計算されない
引数にセルとか範囲を指定してあると指定されたセルや範囲の値が変更されたら再計算される
2020/06/14(日) 21:59:15.66ID:NTnc+gBz
>807
本人?。GW終わって更新控えめな気がする
2020/06/15(月) 00:54:28.92ID:otdT67Yk
フォームを開いている際にセルをクリックしようとしても阻止されるんですが、
この行動を行った際にフォームを閉じるという処理をすることはできますか?
2020/06/15(月) 00:59:25.05ID:AC0AKbql
ユーザーフォームのイベントで制御できなきゃ無理じゃね
一覧くらい見たんだろ
2020/06/15(月) 02:14:12.45ID:VIqxNPAl
>>812
この人はダメだね。
コメントでちょっと突っつかれただけで
コメント欄オフにするしプライドが高すぎ。
知識や経験が豊富で教え方も上手いとは思うけど
ユーチューバ―には向いてないと思うわ。
2020/06/15(月) 05:44:07.25ID:YCbdWLsV
>>809
>>811
Application.Volatile
入れてみた

結果だけど、やっぱボタン押して数式代入した直後はダメだった
変らず#VALUE!
変化があったのは計算対象になっているセルを1つ変更すると、
MyFunctionが入っているセルの全てが再計算されて正常値が表示されるっていう点ね
Volatile入れる前は、変更セルを計算対象としてるセル1つだけが再計算された

ちなみにMyFunction(rng As Range)です。すんません
あと、これ重くなりそうでちと考えてしまう
2020/06/15(月) 10:48:29.20ID:zn0xvlk+
>>816
ボタンのコードの後ろに、Application.Calculate とかを入れる
2020/06/15(月) 11:02:05.93ID:zn0xvlk+
>>813
フォームを閉じるにはUnload ステートメント、非表示にするだけなら hide メソッドを使う

セルクリックが目的なら、ShowModal=False か、フォームのShowメソッドで vbModeless を指定すれば、閉じなくてもいいよ
2020/06/15(月) 22:32:32.01ID:qQkMiS3I
>>816
よくわかってなくてすまぬが数式入ってるセル全部選択して
Selection.Value = Selection.Value
とか「=」を「=」に置換するとかして内容同じだけど編集したことにすると
全部計算される、ってのは根本的な解決方法じゃないけどそれは別の問題?
2020/06/15(月) 22:40:50.61ID:eWIek9um
>>819
代入で再計算させるなら formula = formula だぞ
821デフォルトの名無しさん
垢版 |
2020/06/15(月) 22:42:03.32ID:GtKitEiM
このスレの住民ってVBAエキスパートとか余裕な感じ?
2020/06/15(月) 22:58:28.87ID:MWB6z4Ac
余裕でダメだと思う。
運転歴20年のやつが、教習所の学科試験に通るかどうか。
2020/06/16(火) 01:37:43.85ID:vbVHH0Hs
練習問題を見た感じ、満点は無理だけど合格はできると思う
2020/06/16(火) 02:23:10.96ID:4czdKWOA
人によるだろう
2020/06/16(火) 08:13:35.35ID:4RAL3CE7
>>817
それ以前試してだめでしたわ
>>819
>>820
解決方法なのかどうかは置いておいて、面白い視点だなって思いました
Selection.Formula = Selection.Formula で、問題のあった2行のうち1行は行けました
この2行の違いを分析すると何か見えてくるかもしれないなぁ

似たような方法なんだけど、これはいけた

Dim ary
ary = Sheet1.Range("G11:AH11")
Sheet1.Range("G11:AH11") = ary

数式は表の最下部の行 G50:AH50 の各セルに入っていて、
例えばG50の数式はG11を引数の一部として使っている
計算の対象となっている値の一部を代入し直してみたってこと

Forで回して数式入れていくのは見た目ごちゃごちゃするから
わかりやすさっていう点ではこっちの方がいいのかな
2020/06/16(火) 12:20:48.09ID:6wBq1IET
>>822
運転歴20年の奴は余裕で通る。
というか、はっきり言ってVBAエキスパートは初心者と変わらんよ。
某掲示板で質問者にもっと勉強してね的なこと言ったら持ってたようだった。
2020/06/16(火) 19:13:50.26ID:Kui7C9E3
リストビューなるものを触ってみましたが2点分からないです。
@データを転記する際にwith文を使うとうまく出来て、使わないと一行ずつズレるのは?
Me.ListItems.Add
.Text = 111
.SubItems(1) = 222
.SubItems(2) = 333
End With
Addして追加だからズレるのだろうけど、withって単なる省略だから同じ意味じゃないの?

A転記したリストビュー全項目ループするにはどうしたいいですか?
2020/06/16(火) 20:14:01.04ID:v7FumBBx
Doしたらいい
2020/06/16(火) 21:46:13.61ID:aBdT/SFF
いや呼び方の問題とか、FormatだのStrComp関数だのあんまり使わんの出るから模試はやったほうがいいよ
2020/06/16(火) 21:52:16.10ID:aBdT/SFF
>>827
withはコード省略じゃなくて参照。
(増やす)ってメソッド処理は一回だけで、(増えた項目)って出力インスタンスを参照できる形になる
with 使わないと毎回(増やす+編集)の処理になる
2020/06/16(火) 21:57:13.61ID:aBdT/SFF
項目じゃなくてリストの間違いだった
2020/06/16(火) 22:40:42.45ID:woSalLPH
>>825
Selection.Calculate でもダメなんですよね?
2020/06/16(火) 23:47:36.73ID:cErksS8E
>>820
そうそう間違えました
表示形式が反映されないときに.Value使ったんでついそれ書いちゃいました
2020/06/17(水) 00:48:13.69ID:VnGmvv1H
>>833
表示形式反映させるなら.Formula = .Formula では
2020/06/17(水) 13:19:05.23ID:vz74rE0X
.Shimura = .Ushiro
2020/06/17(水) 15:24:21.32ID:3v2Pocgc
そのコマンド打ったら参照先が見つかりませんってエラーが出たんだが
2020/06/17(水) 15:55:47.59ID:F6Gn58oB
だめだこりゃ!
838デフォルトの名無しさん
垢版 |
2020/06/17(水) 17:19:39.75ID:AebhaO3Q
前スレの人達のくれた今の職場にいる限り永久に使える心臓部になるプロシージャ3つ
これのおかげで救われた
後はひたすら勉強しないといけない
ただそのせいで毎日夜中の2時とかまで強迫観念に捕らわれたように本やサイト見て体壊しかけてる
前スレの人達ありがとう
2020/06/17(水) 17:52:05.46ID:VnGmvv1H
独り言板へどうぞ
2020/06/17(水) 18:14:13.33ID:LyT08W7k
そこまで初心者の人がやらなきゃいけないのか…
専門の派遣でも雇えば…
2020/06/17(水) 18:25:49.09ID:1+VGIPZ0
>838
前スレのどれ?
2020/06/17(水) 19:41:41.88ID:3u8uTgOs
まあ嘘だろうけどな、そんなん
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。