Excel (VBA) |
![]() ![]() |
(Windows 11 Home : 指定なし)
第19回マクロ実行時の余計な画面を消すについて。
投稿日時: 22/10/24 12:16:43
投稿者: 佐藤武典
|
---|---|
エクセルの表にVBAのボタンを登録し実行しています。マクロは思った通りの作業をしてくれますが、VBAのコードが全画面を占領します。
|
![]() |
投稿日時: 22/10/24 12:54:24
投稿者: QooApp
|
---|---|
可能ならソースコードを貼っていただけるとわかります。
引用: これはVBを編集するMicrosoft Visual Basic for Applicationのウィンドウが出現するということですか? また、VBAのボタンを登録とありますが、開発タブの挿入→ボタン(フォームコントロール)のことでよろしいですか。 またはActiveXコントロールまたはその他でしょうか。 |
![]() |
投稿日時: 22/10/24 13:00:30
投稿者: QooApp
|
---|---|
すみません。もしかしてなんですけど、モーグ公式コラムの以下のことを指示しておりますか?
|
![]() |
投稿日時: 22/10/24 13:06:14
投稿者: QooApp
|
---|---|
なんどもすみません。
|
![]() |
投稿日時: 22/10/24 13:27:50
投稿者: Suzu
|
---|---|
ボタンを押した際、コード自体は希望通りの動作をし、終了しているのでしょうか?
|
![]() |
投稿日時: 22/10/24 22:31:48
投稿者: WinArrow
|
---|---|
私も、QooAppさん、レスの
|
![]() |
投稿日時: 22/10/25 22:23:21
投稿者: 佐藤武典
|
---|---|
私はこのファイル“辞書.xlsm”をNetで調べた単語の記録に使っています。
|
![]() |
投稿日時: 22/10/25 22:50:51
投稿者: simple
|
---|---|
確認します。
|
![]() |
投稿日時: 22/10/25 23:30:20
投稿者: 佐藤武典
|
---|---|
ご連絡有難うございます。以下回答致します。
|
![]() |
投稿日時: 22/10/26 09:27:42
投稿者: WinArrow
|
---|---|
佐藤武典 さんの引用: 回答に対すしてコメントします。 A1の「Application.ScreenUpdating = False/True」は、 VBA実行中(VBAでセル代入じにシート画面がチラつくことがる)に シートのチラツキを制御する命令で、VBE画面表示を制御するものではありません。 A2の「Application.Goto 」は、引数で指定したセルにk−ソルを移動する命令です。 > 「ホーム」→「セル」→「書式」→「行の高さの自動調整(A)」の操作が記録された内容其の侭です。 この操作をマクロの記録でコードを作成しても、「Application.Goto」は記録されません。 なにか勘違いしていませんか? |
![]() |
投稿日時: 22/10/26 09:39:53
投稿者: WinArrow
|
---|---|
そもそもですが、
|
![]() |
投稿日時: 22/10/26 10:13:05
投稿者: WinArrow
|
---|---|
もう一つの
|
![]() |
投稿日時: 22/10/26 10:20:19
投稿者: simple
|
---|---|
回答ありがとうございました。
|
![]() |
投稿日時: 22/10/26 11:03:02
投稿者: WinArrow
|
---|---|
simpleさんへ
|
![]() |
投稿日時: 22/10/26 11:29:09
投稿者: simple
|
---|---|
コメントありがとうございます。
引用:とあるように、 Selection.Rows.AutoFitで機能は果たされているんです。 しかし、 カーソルは、 Application.Goto Reference:="行高さ自動調整" によってそこに飛び、 しかも実行は、 Application.Goto Reference:="行高さ自動調整" の次の行から継続されるので、 実行結果にはなんら支障は起きないのです。 ただ、カーソルだけがVBEの行高さ自動調整に飛ぶことになるのです。 |
![]() |
投稿日時: 22/10/26 13:21:50
投稿者: 佐藤武典
|
---|---|
WinArrow様 以下回答致します。
|
![]() |
投稿日時: 22/10/26 14:25:00
投稿者: Suzu
|
---|---|
佐藤武典 さんの引用: simpleさんが 何度もおっしゃってくださっているのは、 Application.Goto Reference:="行高さ自動調整" 上記の命令の動作として、 『行高さ自動調整』と、名のついているオブジェクト 今回であれば、プロシージャ「行高さ自動調整」 の プロシージャ が含まれるモジュールを表示させなさい という命令なのです。 そのプロシージャを実行するのではなく、単に表示だけ。 VBEが開いていなければ、VBEを開き、「行高さ自動調整」を表示させます。 表示させたら、次の End With ' セルを折り返しに設定する 2021/5/20 With Selection .HorizontalAlignment = xlGeneral に進むのです。 ですから、プロシージャの動作には影響を与えません。 ※「行高さ自動調整」と言う名のプロシージャや、名前定義されたセルが 無ければ そんな名前のものが見つからないとエラーになります。 VBE画面を表示されているのが、その命令ですから Application.Goto Reference:="行高さ自動調整" を消すなり、コメントアウトすれば、VBE画面がアクティブになる事はありません。 |
![]() |
投稿日時: 22/10/26 14:40:15
投稿者: sk
|
---|---|
引用: 引用: (再現手順 1 ) ---------------------------------------------------- 1. 任意のセル範囲に対して "行高さ自動調整" という名前を あらかじめ定義しておく。 2. マクロの記録を開始する。 3. [ホーム]タブ -> [セル]グループ -> [書式] -> [行の高さの自動調整(A)]をクリックする。 4. 名前ボックス、もしくは[ジャンプ]機能を使用して 名前付き範囲[行高さ自動調整]にジャンプする。 5. マクロの記録を終了する。 ---------------------------------------------------- (再現手順 2 ) ---------------------------------------------------- 1. 標準モジュールに "行高さ自動調整" という名前の Sub プロシージャをあらかじめ作成しておく。 2. マクロの記録を開始する。 3. [ホーム]タブ -> [セル]グループ -> [書式] -> [行の高さの自動調整(A)]をクリックする。 4. [開発]タブ -> [コード]グループ -> [マクロ]を開き、 マクロリストから[行高さ自動調整]を選択して [編集]ボタンをクリックし、Visual Basic Editor を開く。 5. Excel のアプリケーションウィンドウを アクティブにして、マクロの記録を終了する。 ---------------------------------------------------- もし本当にマクロの記録によって Application.Goto メソッドが追記されたなら、 記録中に上記のいずれかと同様の操作が行なわれたこと以外の原因は考えられません。 引用: ワークシート上のボタンをクリックしてマクロを実行されたことによって VBE がアクティブになるならば、"行高さ自動調整" という名前を 付けられたセル範囲は存在しないが、"行高さ自動調整" という 名前を付けられたマクロは存在する、ということになるはず。 (両方とも存在する状況なら、前者へのジャンプが優先されるからです) 引用: 何故にそのような操作が行なわれたかについては 上記のコメントアウトされた箇所から何となく推測できますが、 いずれにしても「余計な Application.Goto メソッドを書くな」 という結論にしかならないでしょう。 |
![]() |
投稿日時: 22/10/26 15:41:49
投稿者: WinArrow
|
---|---|
skさん、丁寧なコメントありがとうございました。
|
![]() |
投稿日時: 22/10/26 16:00:45
投稿者: Suzu
|
---|---|
質問の内容とは関係ありませんが、
|
![]() |
投稿日時: 22/10/26 16:54:34
投稿者: WinArrow
|
---|---|
アドバイス
|
![]() |
投稿日時: 22/10/26 17:31:08
投稿者: sk
|
---|---|
WinArrow さんの引用: それは恐らく、そもそも佐藤武典さんが意図したものとは 異なる操作が行なわれた結果だからではないかと推測します。 引用: 引用: ・コメントの文脈を読み解いた限り、前者のコードが追加される前に [マクロの記録]機能によって生成されていたのが、コメントアウト された後者のコード(以下『修正前コード』と呼ぶ)と考えられる。 佐藤武典 さんの引用: ・『修正前コード』が[マクロの記録]機能によって生成されたものである とするならば、[行高さ自動調整]プロシージャはそのコードが生成される よりも前から、同じく[マクロの記録]機能によって作成されていたことになる。 佐藤武典 さんの引用: ・マクロの記録中の操作内容やプロシージャの命名意図から判断した限り、 [行高さ自動調整]プロシージャには Selection.Rows.AutoFit メソッドが 記述されている蓋然性が高い。 ・以上のことから、『修正前コード』の記録時に行なおうとしていたのは 「 C401 セルを選択し、[行高さ自動調整]プロシージャを実行して その行の高さを自動調整する」という操作であったと考えられる。 sk さんの引用: ・ところが、上記の手順において[実行]ボタンをクリックするべきところを 誤って[編集]ボタンがクリックしたことにより、Application.Run メソッドではなく Application.Goto メソッドが記録されることとなった。 ・更に佐藤武典さんご自身にもその自覚がなく、また記録された コードの意味も理解できていないため、そのまま流用される形となった。 ---------------------------------------------------------------------- ある程度納得のいきそうな筋書きをこじつけるとしたら 以上のような感じでしょうか。 |
![]() |
投稿日時: 22/10/26 19:59:15
投稿者: WinArrow
|
---|---|
skさん、さすがです。
|
![]() |
投稿日時: 22/10/26 20:10:16
投稿者: simple
|
---|---|
そうそう使うものではないでしょうね、ご指摘のとおりでしょう。
|
![]() |
投稿日時: 22/10/27 08:18:17
投稿者: simple
|
---|---|
結局のところ、回答を一言でいうなら、
引用:とのことでした。 ●「AutoFitメソッド」という言葉が珍しいようですが、補足説明します。 あなたの提示されたコードの中に、 Selection.Rows.AutoFitという記述がありますね。 ・Selection.Rowsは選択中のセルの行たちを表すRangeオブジェクト(セル範囲のこと)です。 ・それに .AutoFitと続けることで、 そのRangeオブジェクトが持っているAutoFitというメソッドを実行せよ というコードになっているわけです。 ・RangeオブジェクトのAutoFitメソッドのヘルプを読むと、 「範囲内の列の幅または範囲内の行の高さを変更して、最適な幅または高さにします。」 「Range オブジェクト は、行または行の範囲、または列または列の範囲である 必要があります。」 と説明されています。 ・この一行で、行高の調整がなされています。 ●マクロ記録はコード作成の材料に過ぎません。 これをブラックボックスとしてそのまま受け入れるのではなく、内容を理解するように してください。 Application.Goto Reference:="行高さ自動調整" とは何か、と不思議に思わなかったですか? (慣れないと難しかったかもしれないし、欲を言えばということかもしれないけど) また、マクロ記録をそのまま使うことはめったにありません。 大抵は冗長な記述を修正したりして使うことが多いです。よく吟味して使ってください。 参考になれば。 |
![]() |
投稿日時: 22/10/30 18:17:27
投稿者: 佐藤武典
|
---|---|
QooApp様、Suzu様、Win Arrow様、Simple様、sk様 色々アドバイスを頂き大変有難うございました。
|