[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『オートフィルタで絞り込んであるセルに色を付ける』(ま)
オートフィルタで絞り込まれているセルの色を変えるマクロを使っております (どこかからもらってきた記述)
Private Sub xlWsht_Calculate() Static MyRng As Range Dim i As Long If ActiveWorkbook.ActiveSheet.AutoFilterMode Then With ActiveWorkbook.ActiveSheet.AutoFilter Set MyRng = .Range For i = 1 To .Filters.Count If .Filters(i).On Then MyRng.Cells(i).Interior.ColorIndex = 3 Else MyRng.Cells(i).Interior.ColorIndex = xlNone End If Next i End With Else If Not MyRng Is Nothing Then For i = 1 To MyRng.Columns.Count MyRng.Cells(i).Interior.ColorIndex = xlNone Next i End If End If End Sub
1列ずつ絞り込みがあるか確認し、色を変えています このマクロを使っていると、 オートフィルタの行に元々色がついていた場合、 クリアされてしまいます
なので、 絞り込まれていなければ色をクリアにする というところを変えればよさそうなんですが
そうすると、絞り込まれていない場合の色が何色か 判断しておかないといけない などとなり…
考え方自体がよろしくないのかもしれませんが…^^;
何か良い方法はありましたら教えてください
< 使用 Excel:Excel2003、使用 OS:Windows7 >
で、元の色が消えてしまうとの事ですが、全ての列で同じ色になっているならば、xlNone にしている箇所を、他の色にすれば良いでしょう。または、絶対絞らない列の色と同じにするとか。
元の色が一色ではない場合、別のシートにタイトル部だけコピーしておき、その色に戻すとか。別シートを隠しておけば、邪魔にもならないでしょう。
(???) 2016/07/29(金) 13:30
条件付き書式でセットしてはいかがでしょう。
With ActiveSheet.AutoFilter Set myRng = .Range myRng.Rows(1).Cells.FormatConditions.Delete For i = 1 To .Filters.Count If .Filters(i).On Then myRng.Cells(i).FormatConditions.Add Type:=xlExpression, Formula1:="=1=1" With myRng.Cells(i).FormatConditions(1).Interior .PatternColorIndex = xlAutomatic .ColorIndex = 3 .TintAndShade = 0 End With End If Next End With
(β) 2016/07/29(金) 13:33
あとは、Worksheet_Calculate()にコードを書いておき、何でも良いから計算式が使われていれば、フィルタしただけで色が付くわけですね。ふむふむ。
(???) 2016/07/29(金) 13:58
Private Sub Worksheet_Calculate() Static MyRng As Range Dim i As Long
If AutoFilterMode = False Then Exit Sub
With AutoFilter Set MyRng = .Range MyRng.Rows(1).Cells.FormatConditions.Delete For i = 1 To .Filters.Count If .Filters(i).On Then MyRng.Cells(i).FormatConditions.Add Type:=xlExpression, Formula1:="=1=1" MyRng.Cells(i).FormatConditions(1).Interior.Color = Int(MyRng.Cells(i).Interior.Color / 2) MyRng.Cells(i).FormatConditions(1).Font.Color = RGB(255, 0, 0) End If Next End With End Sub (???) 2016/07/29(金) 14:29
???さん ごめんなさい どこからサンプルを頂いてきたのかと思っていました 失礼しました
βさん ありがとうございます 応用を使わさせてもらっております
Sheet1にVBAを追加する方法は 必要な結果が得られたのですが
このマクロをよく使っておりまして、 アドインに追加しようとして止まっています
頂いた記述を AddInsFile.xlaのThisWorkbookに追加しています
★の部分は追加しましたが、 △のAutoFilter で「変数が定義されていません」となります
Private Sub Worksheet_Calculate() Static MyRng As Range Dim i As Long
★↓ If ActiveSheet.AutoFilterMode = False Then Exit Sub
With AutoFilter ←△ Set MyRng = .Range MyRng.Rows(1).Cells.FormatConditions.Delete For i = 1 To .Filters.Count If .Filters(i).On Then MyRng.Cells(i).FormatConditions.Add Type:=xlExpression, Formula1:="=1=1" MyRng.Cells(i).FormatConditions(1).Interior.Color = Int(MyRng.Cells(i).Interior.Color / 2) MyRng.Cells(i).FormatConditions(1).Font.Color = RGB(255, 0, 0) End If Next End With End Sub
どう対応したらよいですか? (ま) 2016/08/01(月) 15:46
こうしたらできるとか、できないとか、そういう話の前に。
β自身はアドインは基本的に避けて通ってきました。 環境が自宅のプライベートなものなのか職場のある意味パブリックなものかにもよりますが アドインを設定するということは、その機能を使う、使わないにかかわらず、【エクセルを立ち上げると必ず組み込まれている】 ということになります。 なので、本当に、普遍的にアドインにしておけば有効だろうというものに限って設定。 (会社の業務で使う捺印だとか、カレンダー表示だとか)
仮に、今回の処理が無事にアドインされ、使うことができたとします。 そうすると、どんなエクセルブックであれ、開いて、そこに計算式があって、再計算されると このコードが実行されてしまいます。
それって、困りませんか?
ということで、すくなくとも、本件はアドインにはふさわしくないと思いますね。
ところで
>>AddInsFile.xlaのThisWorkbookに追加しています
AddInsFile.xlaのThisRorkBookモジュールに、このコードをコピペしたんですか? シートモジュールであれば、Autofiler という名前のプロパティの参照が可能ですけど ThisWorkbookモジュールや 標準モジュールでは、シートオブジェクト.AutoFilter と、シート修飾が必要です。
それいぜんに、ThisWorkbookモジュールにこのコードを貼り付けても動きませんよ。 シートモジュールとThisWorkbookモジュールのイベントプロシジャの名前は異なりますので。
で、さらに、イベントプロシジャの名前を正しくしたとしても、これは、AddInsFile.xla というブックの中で 再計算された場合のイベントですから、開いたブック側での再計算はキャッチされません。
開いたブックのイベントをキャッチする書き方はありますが、そうすることは、コメントしたように 適切ではないと思いますので、コード紹介はしません。
(β) 2016/08/01(月) 16:24
必要なブックだけ、ThisWorkbook にマクロを組み込むのが良いですねぇ。
(???) 2016/08/01(月) 17:15
>>必要なブックだけ、ThisWorkbook にマクロを組み込むのが良いですねぇ。
それが、まっとうな(?)方法だと思いますね。 そうすることで、このブックに関する再計算だけが処理されますから。
どうしても、別モジュールでということなら、(記述方法は、ちゃんとしたものにしておく必要はありますが) 参照設定でしょうかね。
(β) 2016/08/01(月) 17:28
βさん???さん 遅くなり&勉強不足ですみません
おかげさまでThisWorkbookの使い方は理解できました 今回は、アドインの追加はしないようにします
しかし…このマクロは使い勝手が良く、 とても気に入って使っていますので 汎用性があるようにできるといいなと思っています
そこで、βさんの書いて下さった 参照設定について調べてみました 参照設定をチェックをすることくらいは知っているのですが
実際はどのようにすればよいのでしょうか
上記に頂いたマクロファイルを作成し、(txtか何か?) 参照しにいくといった方法なのでしょうか
どこか確認できるようなページなどありましたら 教えていただけると助かります (ま) 2016/08/15(月) 15:04
(γ) 2016/08/15(月) 16:48
参照設定に関してはγさんからのレスの通りです。 ブックの形としては xlsmブックでもいいですし、あるいは xlamの形にしておいてもいいのですが いずれにしても、このマクロブックを参照設定すればいいんです。
ただし、参照設定をする際の約束事が1つ。 マクロブック内のマクロ全体をプロジェクトと呼び、このプロジェクトに名前が付いています。 何もしなければ VBAProject という名前になっています。
通常は VBAProjectのままでも支障はないのですが、参照設定をする場合は、このプロジェクト名がユニークである必要があります。 ですから、参照設定を目的にしたマクロブックの場合、VBA画面の左下のほうにあるプロパティ画面のオブジェクト名を なにかしらユニークなものに変更しておく必要があります。
そういうこともありますし、また以下のようなこともありますので、当面は、共通機能としての組み入れはしばらく延期されたほうが よろしいかと思いますよ。
たとえば新規ブックのThisWorkbookモジュールに以下を書き、いったん名前を付けて保存。
Private Sub Workbook_SheetCalculate(ByVal Sh As Object) MsgBox Sh.Parent.Name & vbLf & Sh.Name End Sub
このマクロブックがアドインなり参照設定なり、とにかく共通で使いたいものですよね。
・このブックを開いてください。 ・その上で、新規ブックを立ち上げるなり既存のブックを開くなりしてください。 ・その新規ブックなり既存のブック上で、何か計算式を入れてみてください。
まったく反応しませんよね。 先にレスした通り、このコードは、それが書かれたマクロブック内の再計算にしか反応しません。 これでは意味がないですね。
マクロブックのコードを消して、以下を貼り付けてください。
Dim WithEvents xlApp As Application
Private Sub Workbook_Open() Set xlApp = Application End Sub
Private Sub xlApp_SheetCalculate(ByVal Sh As Object) MsgBox Sh.Parent.Name & vbLf & Sh.Name End Sub
いったんマクロブックを保存し、再度開いたうえで、新規ブックを立ち上げるなり 既存ブックを開くなりして、それらの上で何か計算式をいれてみてください。
今度は反応しましたね。しかも、どのブックで再計算されたのかという情報も取得できます。
本件を、共通処理ツールとして組み入れるには、まず、このあたりの仕掛けを十分に理解してからにされたほうが よろしいかと思います。
(β) 2016/08/15(月) 19:38
念のため補足しておきます。
共通で使いたいマクロがあって、それを【単独のマクロブック】として保持しておいて それを、呼び出して使う、アドインにしておいて使う、参照設定して使う、いずれにしても エクセル区画内のマクロモジュールというポイントで眺めると
共通マクロブック ThisWorkbookモジュール Sheetモジュール UserFormモジュール Classモジュール 標準モジュール 通常ブック ThisWorkbookモジュール Sheetモジュール UserFormモジュール Classモジュール 標準モジュール
こうなっています。(当たり前ですけど) 決して
通常ブック ThisWorkbookモジュール <== 何も記述していないけど、別のどこかのThsWorkbookモジュールの内容を継承 Sheetモジュール <== 何も記述していないけど、別のどこかのSheetモジュールの内容を継承 UserFormモジュール <== 何も記述していないけど、別のどこかのUserFormモジュールの内容を継承 Classモジュール <== 何も記述していないけど、別のどこかのClassモジュールの内容を継承 標準モジュール <== 何も記述していないけど、別のどこかのT標準モジュールの内容を継承
という構造ではありません。 自ブックで、特定の処理をしたい場合は、あくまで自ブックのモジュール内に、別途、記述しておいたロジックなりプロシジャなりを コピペして【自ブック内に】取り込んでおくことが必要です。 別途の記述は、単なるコピペもとですから、エクセルブックのモジュールの形でストックしておいてもいいですし、 あるいは、テキストファイルのようなものでテキストとして保持しておいてもよろしいですが。
この構造ですから、わかりにくいかもしれませんが、ThisWorkbookモジュールやSheeetモジュールにおけるイベント処理を 共通ブックとして書いておいて利用するのは、使い方が、きわめて困難、相当に使い方に配慮したものにする必要があります。
★ですから、少なくともイベント処理に関しては、共通処理の別マクロブック仕立てという構造は もう少し慣れてからチャレンジされるテーマかなと思います。
(β) 2016/08/16(火) 08:41
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.