[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ExcelVBAについて。』(コルム)
Sub データ抽出()
'
' データ抽出 Macro
'
'
Sheets("オリジナルデータ").Select
Range("A1").Select Selection.AutoFilter
ActiveSheet.Range("$A$1:$E$1000").AutoFilter Field:=2, Criteria1:="TR-A"
Columns("A:E").Select
Selection.Copy
Range("B371").Select
Sheets("TR-A").Select
Range("A1").Select
ActiveSheet.Paste
Sheets("オリジナルデータ").Select
Application.CutCopyMode = False
Selection.AutoFilter
Sheets("オリジナルデータ").Select
End Sub
で、Range(″B371″)がなくても良いのでしょうか?後、この後のプログラムを1行ずつ解説して頂けないでしょうか?教えていただけると嬉しいです。
< 使用 Excel:Office365、使用 OS:Windows10 >
>Range(″B371″)がなくても良いのでしょうか?
.Select
だけになりますのでおそらくコンパイルエラーになると思います。 というか、試したら一発でわかることです。 Q&Aサイトで聞くまでもないことです。
>後、この後のプログラムを1行ずつ解説して頂けないでしょうか?
これは、マクロの自動記録したものですよね? その時の作業した通りだと思いますが。 (通りすがり) 2022/11/22(火) 19:08:45
>Range(″B371″).Select を消すとどうなるのかでした。 何の影響もないでしょう。
>切り取ったものとは一致します。 ↓ 切り取りモードを解除します。
>Selection.AutoFilter ↑ こう言う記述は、適切じゃない気がします。 何をしようとしているのか分かりにくい。 一般ユーザーは、RangeオブジェクトのAutofilterメソッドの仕様をよく知らないですからねぇ。 私は、こう書いて、オートフィルタを積極的に解除した方がいいと思います。 ↓ ActiveSheet.AutoFilterMode = False
(半平太) 2022/11/22(火) 20:28:17
Sheets("TR-A").Select ※TR-Aシートを選択した
Range("A1").Select ※そのシートのA1セルを選択した。 手作業でやったので、その様にコードに記録されたが、本来は必要ない
ActiveSheet.Paste ※そのシートに、クリップボードのデータを貼付けた。 貼付け範囲を指定していないので、上述した「本来不要なA1セルの選択」が功を奏して A1セルを先頭に貼り付けが成功した。 本来は、 ActiveSheet.Paste Range("A1") と書くべきところではあった。 Sheets("オリジナルデータ").Select ※オリジナルデータシートを選択した
Application.CutCopyMode = False ※切り取りモードまたはコピー モードを解除し、点滅している枠線を取り除いた。
Selection.AutoFilter ※選択されているRangeのAutoFilterメソッドを「引数を指定しないで」実行した。
何故そんな命令をするのか分かりにくい。 Selection.AutoFilterに解除の機能はありません(結果がそれに似ているだけです)
オートフィルターを解除したいのであれば、 ActiveSheet.AutoFilterMode = False とするのが明快でしょう。
>ちなみにもし、trueになっていた場合は、解除の反対で、設定ということでしょうか? ここの話ですね? → Application.CutCopyMode = False
※ヘルプを読むと設定もできる、となっていますが、 私が実験したかぎりでは、設定はできなさそうでした。
(半平太) 2022/11/24(木) 19:11:22
Selection.AutoFilter ※選択されているRangeのAutoFilterメソッドを「引数を指定しないで」実行した。 何故そんな命令をするのか分かりにくい。 Selection.AutoFilterに解除の機能はありません(結果がそれに似ているだけです) ここの説明がわかりにくいです。 それと、最後の、Sheets("オリジナルデータ").Selectには、何か意味があるのでしょうか?教えていただけると嬉しいです。 (コルム) 2022/11/24(木) 20:15:25
>※選択されているRangeのAutoFilterメソッドを「引数を指定しないで」実行した。 >何故そんな命令をするのか
コルムさんが提示したコードですよ。 この何故に答えるのは、コルムさんであって、私は適任ではないと思えてしまうが。。
本来、Range.AutoFilter は、引数を与えて実行するものです。 フィルターすべき引数を与えないで、フィルターすることに何の意味があるんですか? それを考えてみてください。
唯一、意味がありそうなことは、フィルターを解除したようになることでしょうかね? でもそれは本来的な手段ではないでしょう。
他に方法がないなら、それも一案と言えるでしょうが、 この方法があるんですから、合理性に乏しい方法は避けた方がいいんじゃないですかねぇ・・ ↓ ActiveSheet.AutoFilterMode = False
>それと、最後の、Sheets("オリジナルデータ").Selectには、何か意味があるのでしょうか? 既に、オリジナルデータシートは選択された状態なので、 無意味と思われます。
(半平太) 2022/11/24(木) 20:49:11
>ここの話ですね? → Application.CutCopyMode = False AutoFilterMode のことではないのでしょうか。 (BOM ) 2022/11/24(木) 20:56:15
>解除の機能はありません
済みません。m(__)m
再度、ヘルプを確認すると、この記述がありました。 ↓ >この引数をすべて省略すると、このメソッドでは、指定された範囲内の AutoFilter ドロップダウン矢印の表示を単に切り替えます。
実際にやってみると、ドロップダウンの表示を単に切り替えるだけでなく、Filterの結果も解除される様でした。
なので「引数をすべて省略して実行する」のは仕様の想定内であり、効果としてFilteも解除されるので、 「解除する機能がある」と言っていいように思えました。失礼しました。 m(__)m
(半平太) 2022/11/25(金) 09:49:15
>私の説明で、切り取りを解除以外は、間違いはなかったということでしょうか
私からもほとんど1行ごとに説明しているので、 それと見比べればいいような気がするんですが・・
ご自分の説明に間違いがあったかどうか、逐一知りたいのであれば、 1行ごとにそちらの説明を付けて貰えませんか? そうして貰えたら、お答えできると思います。
(半平太) 2022/11/25(金) 21:17:28
>説明におかしな点があれば
特段、おかしな点はありません。
(半平太) 2022/11/26(土) 14:38:38
Application.CutCopyMode = False のことですか?
これは、セル範囲をコピーすると、その範囲の周囲の枠が点線で点滅するでしょう? そうした状態を解除するという意味です。 その効果としては、 ・点滅がされなくなります。 ・Windowsのクリップボードがクリアーされ、その後、貼り付け等はできなくなります の2点です。
Application.CutCopyMode = True といったコードは通常書きません。 仮に、効果として、= Falseと同様なものになったとしてもです。 コードというものは、作成者の意図を表すものなので、 そうした意味もないものは、混乱するだけなので、やめましょう。 また、いったん消えた点滅を、元に戻すといった効果もありません。
-------- 質問からはなれますが、参考までにコメントしておきます。
普通は、そうした冗長なコードをそのまま使うことは ありません。 一行ごとの意味が分かったら、それを元に、通常の書き方に進めることを 推奨します。 普通は、下記のような書き方をします。参考にしてください。 マクロ記録そのものよりも、意図が分かりやすいはずです。
Sub データ抽出() Dim ws1 As Worksheet, ws2 As Worksheet
Set ws1 = Sheets("オリジナルデータ") Set ws2 = Sheets("TR-A")
With ws1.Range("$A$1:$E$1000") .AutoFilter Field:=2, Criteria1:="TR-A" .Copy ws2.Range("A1") End With ws1.Range("A1").AutoFilter End Sub (γ) 2022/11/27(日) 08:21:15
CutCopyModeのヘルプは、↓となっています。
>設定値 説明 >False 切り取りモードまたはコピー モードを解除し、点滅している枠線を取り除きます。 >True 切り取りモードまたはコピー モードを開始し、点滅している枠線を表示します。
ただ、実際にTrueを設定しても、枠線は表示されないです。
そもそも、値はFalse、xlCopy、xlCutの3種類しかなく、Trueを設定すると、 xlCopy、xlCutのどちらかが最終的に決定されるのか説明がないです。
なので、一般ユーザーとしては、設定の仕様は不明(不可解?)と認識するしかないのでは?
また現実問題として、Trueを設定する必要を感じるシーンは、ちょっと思いつかないですし、 コピーまたは切り取りをすれば、必然的にFalse以外が設定されますので、 困ることはないと思います。
どうしても知りたいのであれば、マイクロソフトに照会するしかない気がします。
(半平太) 2022/11/27(日) 10:06:26
多分、無意味なものでしょう。
こちら、コードが何をするかは、分かっても、 作成者が何をしたかったのかは、正確には分からないです。 作成者に聞くしかないです。
極端な話、Autofilterを掛けたのが間違いで、 B371を選ぶだけで良かったのかも知れません。(あり得ないでしょうけど)
(半平太) 2022/11/27(日) 16:39:42
Application.CutCopyMode = False の件はどうなりましたか? 半平太さん(と私)のコメントは、どう受け止めましたか? Q&Aというのは会話ですから、返事をお願いします。 (γ) 2022/11/27(日) 16:56:27
どのように自己解決されたのでしょうか? あきらめた、ということですか? (γ) 2022/11/27(日) 17:22:09
>もし、falseがtrueになっていたら、設定という意味になるのでしょうか? >教えていただけると嬉しいです。 という質問の件に対する回答について、どう受け止めたのですか? と尋ねています。 話が通じていますか? (γ) 2022/11/27(日) 17:35:15
説明を受けたんだから、知らんふりしていたらダメだよ。常識だろ? 自己解決じゃねえだろうが。 (γ) 2022/11/27(日) 20:02:27
# 回答にはメリハリも必要です。目を覚ましてもらう必要も時にはあります。
>Sheets("オリジナルデータ").Select も無意味なのでしょうか? という質問に回答します。
提示されたコードには、複数個所で実行しています。 Sheets("オリジナルデータ").Select '(1) Application.CutCopyMode = False ' Selection.AutoFilter '(2) Sheets("オリジナルデータ").Select '(3)
(1)は、(2)の実行にあたって、どのシートかを特定するためのものでしょうから、 そうした種類の書き方では、シートをアクティブにする必要があるでしょう。 (3)は、処理終了後に特定のシートをアクティブにしておくという意味ですか? そういう意図なら必要と言えます。 (Application.Goto Sheets("オリジナルデータ").Range("A1") などと書くのが普通ですが。)
■ここからが本当は大事な話ですが、すぐに理解しにくいかもしれません。
大抵のコードでは、シートをSelectしないで済ますことができます。 それどころか、 (a)選択すると速度が遅くなるので、できるだけシートやセルの選択はしないほうがよい。 (b)そうしたほうが可読性が高くなります。 (シートをアクティブにして、シート指定を省略してセル範囲を操作する コードにしてしまうと、今、どのシートがアクティブかを常に考えながら コードを読む必要がある。 それよりも、どのシートを対象にした処理かを特定したコードのほうが 可読性が高い) といった理由から、シートを選択しない方針を積極的に取ることが多いでしょう。
2022/11/27(日) 08:21:15で示したコードが一例です。 シートやセルをの選択は、一切していません。
こうした書き方は、中級に進むには通らないといけない関門のような気がします。 手元にあるVBAに関する書籍があれば、きっと書かれている内容です。 (もし万一手元になければ、是非購入してください。 質問回答のやりとりでマスターできるような種類のものではありません。甘く見ないほうがいいです。) (γ) 2022/11/29(火) 07:03:30
書籍にあるコードに関する質問であれば、 まったく関係ない人に聞いても意味がない。 しかも、無関係なコードだと回答しても信じないのだから、猶更です。
直接、書籍の編集部に問い合わせしてください。 問い合わせ窓口くらいあるでしょう。 そして結果をこちらにも連携してください。 (γ) 2022/11/29(火) 21:07:43
>この章のチャプター5です。 シート上の抽出ボタンを押すとActiveSheet.Pasteでエラーになったぞ。
(qtd) 2022/11/29(火) 21:21:08
秀和システムのサイトを調べて下さい。 自分のことは自分でしましょう。それはExcelの質問ではないです。 (γ) 2022/11/30(水) 07:03:50
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.