[[20130524235349]] 『追加で教えてください』(ちぃさん) >>BOT

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

 

『追加で教えてください』(ちぃさん)

お世話になります。
[[20130524113630]] 
 ↑こちらにあるマクロコードを試してみまして凄く便利におもいました。

追加で....
現在あるコードでしたらシートをコピー移動後に一旦ほかのシートに変えてからもう一度コピー移動したにシートに戻った時に全て表示されているのですが
コピー移動した時点で全て表示させることは可能でしょうか?
もし可能でしたら教えてください。
宜しくお願いします

Windows 7、Excel2010 と Excel2003、WindowsXP で可能な環境が希望です。


 今のコードをアップしてもらえれば、もっとピンポイントで回答できると思うけど、とりあえず。
 以下のいずれが要件にマッチしているのか、あるいは、2つともに要件を誤解しているのか、そこは試して
 教えてね。

 Sub Sample1()
 'シートコピーした後、同時に、【コピー元のフィルタリングを解除】

    Dim sh As Worksheet

    Set sh = Sheets("Sheet1")  'コピー元シート

    sh.Copy After:=sh

    If sh.AutoFilterMode Then   'オートフィルター設定あり
        'もしフィルタリングがかかたままならフィルタリングを解除
        If sh.FilterMode Then sh.ShowAllData
    End If

 End Sub

 Sub Sample2()
 'シートコピーの前に、【コピー元のフィルタリングを解除】
 '従ってコピー先のシートもフィルタリングは解除されている。

    Dim sh As Worksheet

    Set sh = Sheets("Sheet1")  'コピー元シート

    If sh.AutoFilterMode Then   'オートフィルター設定あり
        'もしフィルタリングがかかたままならフィルタリングを解除
        If sh.FilterMode Then sh.ShowAllData
    End If

    sh.Copy After:=sh

 End Sub

 (ぶらっと)

おはようございます。
ぶらっとさん 回答ありがとうございます。
以前は大変お世話になりました。

マクロの事を理解できていない私ですが、またチャレンジしてみたくなり投稿いたしました。
またまた初心者すぎる発言をするかもしれないですがお許しください。

>今のコードをアップしてもらえれば、もっとピンポイントで回答できると思うけど、
お恥ずかしながら私の方で作ったものはございません。
[[20130524113630]]  に書いてあったものをそのまま使って便利に思いました。

処理希望は
> 'シートコピーした後、同時に、【コピー元のフィルタリングを解除】
こちらです。

現在はマクロコードをこのようにしてます。

Private Sub Workbook_SheetDeactivate(ByVal sh As Object)

 'シートコピーした後、同時に、【コピー元のフィルタリングを解除】

    Dim sh As Worksheet

    Set sh = Sheets("Sheet1")  'コピー元シート

    sh.Copy After:=sh

    If sh.AutoFilterMode Then   'オートフィルター設定あり
        'もしフィルタリングがかかたままならフィルタリングを解除
        If sh.FilterMode Then sh.ShowAllData
    End If

 End Sub

ですが私の扱いが悪いためエラーがでました。

「コンパイルエラー
 同じ適用範囲内で宣言が重複しています。」

夕方まで多忙のためコチラのページを見ることができないのですが未熟な私にご指導ください。
どうぞ宜しくお願いいたします。


 Private Sub Workbook_SheetDeactivate(ByVal sh As Object) 
 ↑のshと↓のshがダブっている、ってことです。
    Dim sh As Worksheet
 
Workbook_SheetDeactivateイベントマクロはブックの中のシートが
アクティブな状態でなくなったときに自動実行されるマクロです。
(このイベントマクロで処理すべきかどうかは疑問が残ります)
 
アクティブでなくなったシートが自動的にマクロの引数、
(ByVal sh As Object)のshに取得されます。
 
Sheets("Sheet1") に対する処理に限れば、
Dim sh As Worksheet の sh 、およびそれ以降の
変数を他のものに変更すれば良いとは思いますが。
 
ただ、別の問題も。
Sheet1をコピーして新規シートが追加されたとき、
新規シートがアクティブになってその前にアクティブだったシートがアクティブでなくなります。
すると、Workbook_SheetDeactivateイベント実行中にWorkbook_SheetDeactivate
イベントが実行され、そこでも同じ処理が実行されるので、またイベントが・・・
(再帰呼び出しと言います)
 
EnableEventsプロパティを制御することでこれはとめることはできますが、
先にも書いたとおり、マクロ実行のタイミングがSheetDeactivateが適当なのかどうかは
私には解りません。
組み合わせて使うと「それらしき動作」になることもありますが、
ある程度はご自身で追求してみる必要はあると思われます。
(みやほりん)


 コンパイルエラーと、もし、そのエラーを無くしたときに発生する問題点については
 みやほりんさんの指摘通り。

 今回、アップしたコードは単独で機能するものとして書いてあるので、その中でつかう変数 sh を規定。
 一方、SheetDeactivate は、それが発生するときにエクセルで渡される変数 sh がすでに規定されているので
 同じ変数名を使うことはできない。

 で、要件が、

 ・既存シートを、何らかの方法で、このブック内にコピー。
  (シートタブをクリックした上でドラッグして Ctrlキーを押しながらドロップ、あるいはシートタブを右クリックしてブック内でシートコピー)
 ・そのとき、もし、元のシートにオートフィルターが設定されていて、かつフィルタリング状態だったときに
  【新しくできあがるシート】は、そのままでいいけど、【元のシート】は、フィルタリング状態を解除したい。

 こういうことであれば、[[20130524113630]] のコードそのままで90%ぐらいはOKだと思うけど?
 90%ということは、具合が悪い場合もありうるということだけど、そのことを指摘しているのかな?
 実際に、あちらでアップしたコードをそのまま使って具合がわるかった点を教えてくれる?

 あるいは、【コピー元】ではなく、【コピー先】のフィルタリング状態を解除したいのかな?

 (ぶらっと)

 (ぶらっと)

(みやほりん)さん、(ぶらっと)さん回答ありがとうございます。
遅くなりました。
やっと時間がとれました。

> Private Sub Workbook_SheetDeactivate(ByVal sh As Object)
>↑のshと↓のshがダブっている、ってことです。
>Dim sh As Worksheet
(みやほりん)さん 初心者&未熟な私には大変ありがたい説明です。
納得しました。
アクティブな状態でなくなったときに処理をするということですね。
初めにアップされてたマクロの処理が他のシートを選択後まコピー移動したシートに戻ったときに処理されるわけですよね。
なるほどです。

> こういうことであれば、[[20130524113630]] のコードそのままで90%ぐらいはOKだと思うけど?
>90%ということは、具合が悪い場合もありうるということだけど、そのことを指摘しているのかな?
>実際に、あちらでアップしたコードをそのまま使って具合がわるかった点を教えてくれる?

(ぶらっと)さん 
>(このイベントマクロで処理すべきかどうかは疑問が残ります)
多分... (みやほりん)さん の投稿している↑の点が解消されれば私が望んでいるものになるように思います。
実際に、[[20130524113630]] でアップしていただいていたマクロを試した手順
@フィルターをかける
Aシートのタブにポインターをあわし左クリックでシートのタブを選択+Ctrlでシートを移動
Bコピーした元のシートのタブにをポインターをあわし左クリックでシートを選択
Cコピー移動シートのタブにポインターをあわし左クリックでシートを選択

上記Aの動作終了後にフィルターをかけていたものが全て表示されていなかったので上記BCという手順になりました。
上記Aの動作終了後フィルターをかけていたものが全て表示されるものが希望です。

この説明で解りますか?
わかりにくいようでしたら指摘ください。

(ちぃさん)


連続投稿失礼いたします。

>【コピー先】のフィルタリング状態を解除したいのかな?
はいそうです。

どうぞ宜しくお願いいたします。
(ちぃさん)


 コピー先のフィルター状況を解除したいなら Workbook_SheetDeactivate ではなく
 Workbook_SheetActivate で処理することで 90% ぐらいは大丈夫かな。

 'コピー先のシートのフィルター状況を解除するなら
 Private Sub Workbook_SheetActivate(ByVal sh As Object)
    If sh.AutoFilterMode Then   'オートフィルター設定あり
        'もしフィルタリングがかかたままならフィルタリングを解除
        If sh.FilterMode Then sh.ShowAllData
    End If
 End Sub

 なぜ完璧じゃないかというと、このコードは、シートが表示されたらフィルタリングを解除している。
 ということは、仮に、シートコピーには関係のないシートがあって、そこにフィルタリングがかかっていたとして
 別のシートを表示してから、そのシートを表示すると、そのフィルタリングが解除されてしまう。
 また、シートコピーの操作で言えば、コピー先は解除される、これはOKだろうけど、元のフィルタリングされていたシートを選択すると
 そのとたんに、元のフィルタリングも解除される。

 これはこまる!! ということなら、残り 10%の完璧を求めて、小細工はできるけどね。

 (ぶらっと)

(ぶらっと)さん 回答ありがとうございます。 

私の質問内容の回答は完璧です。

>なぜ完璧じゃないかというと、このコードは、シートが表示されたらフィルタリングを解除している。
なるほど。
いわれてみれば確かに。
現時点では私は今回、回答いただいた内容で十分ですが.....
>これはこまる!! ということなら、残り 10%の完璧を求めて、小細工はできるけどね。
なんか欲がでちゃいます。

今回コピー移動したシートのフィルタリング状態を解除を便利に思った理由は依頼書の使い回しをする際に毎回フィルタリング状態を手動で解除することが面倒におもったからです。

その依頼書の使用手順
(毎日依頼書を使います)
@BookのSheet1に全項目のあるシートがあります
AこのSheet1をシートのタブにポインターをあわし左クリックでシートのタブを選択+Ctrlでシートを移動(以後コピーとします)
Bコピーしたシートの中から必要項目に数を入力します
C数を入力したのちにフィルターをかけます。
D印刷範囲を設定します。
E印刷コピーをします。
Fこの印刷コピーした紙が依頼書となります。
GBookのSheet1の内容をコピーしたシートのタブは依頼日に変更します。
H翌日は前日のものをコピーし手順Aに戻ります。

>元のフィルタリングも解除される。
コピーした元になるものは保存デターとして残すので....
よく考えれば....
入力した数は消えないので絶対に困るということはないのですが残りの10%があったほうがいいです。

当初の内容から少し変わりますがもし迷惑でなければ今一度ご教示をお願いしてもいいでしょうか?

どうぞ宜しくお願いいたします。



名前忘れてました。
すみません。

(ちぃさん)


 ThisWorkbookモジュールを以下のようにすると、新しいシートが生成された時にのみフィルタリング解除。
 単に、フィルタリングがかかっているシートを表示した時には何もしない。

 WOrkbook_Open を使うので、一度閉じて、また開くか、面倒なら、Workbook_Open 内の任意の場所をクリックして F5 で実行させてから試してみて。

 Option Explicit

 Dim totPages As Long

 Private Sub Workbook_Open()
    totPages = Worksheets.Count
 End Sub

 'コピー先のシートのフィルター状況を解除するなら
 Private Sub Workbook_SheetActivate(ByVal sh As Object)
    'シートが1枚増えていれば
    If Worksheets.Count = totPages + 1 Then
        If sh.AutoFilterMode Then   'オートフィルター設定あり
            'もしフィルタリングがかかたままならフィルタリングを解除
            If sh.FilterMode Then sh.ShowAllData
        End If
    End If
    totPages = Worksheets.Count     '最新のシート数に置き換え
 End Sub

 (ぶらっと)

おはようございます。
(ぶらっと)サン 回答ありがとうがざいます。

ご教示いただきましたマクロコード試させていただきました。
満足度100%以上の回答です。
ご教示いただきましたマクロコードtest手順

@元シートをコピー移動
A数を入力
Bフィルターをかける
Cフィルターをかけたシートをコピー移動

私は Workbook_Open はBookを開いた時に処理内容が動くと思ってましたので
Cの時点でフィルタリングが解除されてまして驚きました。
コピー移動した元シートもフィルターがかかった状態ですし完璧です。

毎回思うのですがマクロ凄いです。
そのマクロを使いこなす皆様本当に凄いです。
私はご教示いただいたマクロコードをみて、そのコードをためしてコード内容をみて
「なるほど...totPagesがここに入って...なるほど...」
みたいな感じで関心し理解できているつもりで理解できていない。
コレを書いたから次にコレが必要ってことが自分ではできないです。
このようなレベルですのでコードが作れる皆様は私の憧れです。
毎日ココを見てますがマクロ本当に難しいです。
でも凄く勉強になります。

(ぶらっと)サン 質問内容が解決し凄くスッキリいたしました。
マクロはもちろんエクセル関数でさえ未熟な私です。
また解らない事、解決したい内容ができましたら質問にきたいです。
その際はまたお願いしたいです。
質問内容を解決していただきまして本当にありがとうございました。

(ちぃさん)

 


コメント返信:

[ 一覧(最新更新順) ]


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