[[20221122185414]] 『ExcelVBAについて。』(コルム) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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

では、この後のプログラムの説明をしますので、違っていたらご指導願います。
この後TRーAのシートを選択して、A1から選択します。
そして、このシートを貼り付けします。そのあと、オリジナルデータを選択します。
切り取ったものとは一致します。
でそれは、オリジナルデータから選択しました。
すみません。
Range(″B371″).Select を消すとどうなるのかでした。すみませんでした。
教えていただけると嬉しいです。
(コルム) 2022/11/22(火) 19:43:45

やってみたらどうですか?
結果に変化があるかどうか確認したらどうですか?
(abc) 2022/11/22(火) 20:08:31

 >Range(″B371″).Select を消すとどうなるのかでした。
 何の影響もないでしょう。

 >切り取ったものとは一致します。
   ↓
   切り取りモードを解除します。

 >Selection.AutoFilter
  ↑
  こう言う記述は、適切じゃない気がします。
  何をしようとしているのか分かりにくい。
  一般ユーザーは、RangeオブジェクトのAutofilterメソッドの仕様をよく知らないですからねぇ。
  私は、こう書いて、オートフィルタを積極的に解除した方がいいと思います。
      ↓
  ActiveSheet.AutoFilterMode = False

(半平太) 2022/11/22(火) 20:28:17


AutoFilter解除
Range("$A$1:$E$1000").AutoFilter
(意地悪) 2022/11/22(火) 21:10:55

半平太さん迅速な返信恐縮です。私の書いた説明で、それ以外は、合っていましたでしょうか?教えて頂けると嬉しいです。
(コルム) 2022/11/24(木) 09:47:32

ちなみにもし、trueになっていた場合は、解除の反対で、設定ということでしょうか?これについても教えて頂けると嬉しいです。
(コルム) 2022/11/24(木) 09:52:35

 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

半平太さんへ
引数を指定しないでというのは、どういう事でしょうか?
もしかして、=false などの事でしょうか?
それと、結果がそれに似ているだけですとはどういう事でしょうか?解除の機能はありません。のかっこの所です。
教えていただけると嬉しいです。
(コルム) 2022/11/25(金) 06:07:57

 >解除の機能はありません

 済みません。m(__)m

 再度、ヘルプを確認すると、この記述がありました。
              ↓
 >この引数をすべて省略すると、このメソッドでは、指定された範囲内の AutoFilter ドロップダウン矢印の表示を単に切り替えます。

 実際にやってみると、ドロップダウンの表示を単に切り替えるだけでなく、Filterの結果も解除される様でした。

 なので「引数をすべて省略して実行する」のは仕様の想定内であり、効果としてFilteも解除されるので、
 「解除する機能がある」と言っていいように思えました。失礼しました。 m(__)m

(半平太) 2022/11/25(金) 09:49:15


半平太さんへ
迅速な返信大変恐縮です。
とすると、私の説明で、切り取りを解除以外は、間違いはなかったということでしょうか?教えていただけると嬉しいです。
(コルム) 2022/11/25(金) 19:28:50

 >私の説明で、切り取りを解除以外は、間違いはなかったということでしょうか

 私からもほとんど1行ごとに説明しているので、
 それと見比べればいいような気がするんですが・・

 ご自分の説明に間違いがあったかどうか、逐一知りたいのであれば、
 1行ごとにそちらの説明を付けて貰えませんか?
 そうして貰えたら、お答えできると思います。

(半平太) 2022/11/25(金) 21:17:28


では、ここから1行ごとに改めて説明します。
Selection.Copy
A列からE列をコピーします。
Range("B371").Select
B 371を選択します。
Sheets("TR-A").Select
TRーAシートを選択します。
Range("A1").Select
A1を選択します。
ActiveSheet.Paste
TRーAシートに貼り付けた。
Sheets("オリジナルデータ").Select
オリジナルデータを選択する。
Application.CutCopyMode = False
切り取りを解除して、枠線も解除された。
Selection.AutoFilter
オートフィルターを解除した。
Sheets("オリジナルデータ").Select
オリジナルデータを選択した。
説明におかしな点があれば教えていただけると嬉しいです。
(コルム) 2022/11/26(土) 08:26:06

 >説明におかしな点があれば

 特段、おかしな点はありません。

(半平太) 2022/11/26(土) 14:38:38


もし、falseがtrueになっていたら、設定という意味になるのでしょうか?教えていただけると嬉しいです。
(コルム) 2022/11/27(日) 04:39:40

 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


でも、なぜB371を選んだのでしょうか?教えていただけると嬉しいです。すみません。
(コルム) 2022/11/27(日) 15:57:13

自分で選んでおいていて他人のせいにするな。アホ
(本当に馬鹿な人) 2022/11/27(日) 16:18:55

 多分、無意味なものでしょう。

 こちら、コードが何をするかは、分かっても、
 作成者が何をしたかったのかは、正確には分からないです。
 作成者に聞くしかないです。

 極端な話、Autofilterを掛けたのが間違いで、
 B371を選ぶだけで良かったのかも知れません。(あり得ないでしょうけど)

(半平太) 2022/11/27(日) 16:39:42


 Application.CutCopyMode = False の件はどうなりましたか?
 半平太さん(と私)のコメントは、どう受け止めましたか?
 Q&Aというのは会話ですから、返事をお願いします。
  
(γ) 2022/11/27(日) 16:56:27

自己解決しました。
ところで、Sheets("オリジナルデータ").Select
も無意味なのでしょうか?教えていただけると嬉しいです。
(コルム) 2022/11/27(日) 17:06:23

 どのように自己解決されたのでしょうか?
 あきらめた、ということですか?
  
(γ) 2022/11/27(日) 17:22:09

すみません。日本語に訳しながら自己解決しました。意訳の部分は、半平太さんが助けてくれましたけど。まあ、半自己解決ですね。
(コルム) 2022/11/27(日) 17:25:11

 >もし、falseがtrueになっていたら、設定という意味になるのでしょうか?
 >教えていただけると嬉しいです。
 という質問の件に対する回答について、どう受け止めたのですか?
 と尋ねています。 話が通じていますか?
  
(γ) 2022/11/27(日) 17:35:15

それは、あまり考えないことにしました。すみません。
(コルム) 2022/11/27(日) 17:39:04

 説明を受けたんだから、知らんふりしていたらダメだよ。常識だろ?
 自己解決じゃねえだろうが。
  
(γ) 2022/11/27(日) 20:02:27

冷静になれよy
話が通じる回答者でないことはわかってることだろう
あと、自分の回答が無視されたからってすねるなよ。短気。
半平太を見習え
(w) 2022/11/28(月) 09:10:51

 # 回答にはメリハリも必要です。目を覚ましてもらう必要も時にはあります。

 >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

迅速な返信大変恐縮です。所で、B371は、TRーAではないのですが、フィルターをかけて、TRーAを抽出した後にどうやってB371を選んだのでしょうか?教えていただけると嬉しいです。
(コルム) 2022/11/29(火) 20:09:20

以下のURLをダウンロードしていただけないでしょうか?この章のチャプター5です。
https://www.shuwasystem.co.jp/support/7980html/2606.html
(コルム) 2022/11/29(火) 20:38:25

 書籍にあるコードに関する質問であれば、
 まったく関係ない人に聞いても意味がない。
 しかも、無関係なコードだと回答しても信じないのだから、猶更です。

 直接、書籍の編集部に問い合わせしてください。
 問い合わせ窓口くらいあるでしょう。
 そして結果をこちらにも連携してください。
  
(γ) 2022/11/29(火) 21:07:43

 >この章のチャプター5です。
 シート上の抽出ボタンを押すとActiveSheet.Pasteでエラーになったぞ。

(qtd) 2022/11/29(火) 21:21:08


この書籍の編集部の問い合わせ窓口を教えていただけると嬉しいです。すみません。
(コルム) 2022/11/30(水) 06:47:24

 秀和システムのサイトを調べて下さい。
 自分のことは自分でしましょう。それはExcelの質問ではないです。
  
(γ) 2022/11/30(水) 07:03:50

相変わらず迷惑をかけているのだなwwwwwwwww
(口戯積分) 2022/12/03(土) 11:55:07

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.