[[20040923111802]] 『条件付き書式の表示』(たか) ページの最後に飛ぶ

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

 

『条件付き書式の表示』(たか)

各セルに設定した条件付き書式を一括に表示できないものでしょうか?
各セル一つ一つ表示させるしかないのでしょうか?
また、条件付き書式を印刷できますか?

98SE エクセル2000


 どのセルに「条件付き書式」を組み込んだかを知る「検索」までしか、
 出来ないような気がします。
 スクリプトみたいに出力ができるのかな〜? どなたか、+アドヴァイスを。
 (EUREKA)

 思いつきで、ちょっと作ってみたんですが、、
条件付き書式があったらコメントに表示する??
でも、数式の時とそうじゃないときもあるし、、
駄目かな??改良すればなんとかならないかな?
まぁ、一案ということで汗
範囲を選択してから実行
(SoulMan)
Sub Macro1()
Dim C As Range
Dim i As Long
Dim MyFormat() As Variant
    For Each C In Selection
        If C.FormatConditions.Count > 0 Then
            ReDim MyFormat(1 To 3)
            For i = 1 To C.FormatConditions.Count
                MyFormat(i) = C.FormatConditions.Item(i).Formula1
            Next
            If TypeName(C.Comment) = "Nothing" Then
                With C.AddComment
                    .Text Text:=CStr(MyFormat(1)) & Chr(10) & _
                                CStr(MyFormat(2)) & Chr(10) & _
                                CStr(MyFormat(3))
                End With
            Else
                With C.Comment
                    .Text Text:=CStr(MyFormat(1)) & Chr(10) & _
                                CStr(MyFormat(2)) & Chr(10) & _
                                CStr(MyFormat(3))
                End With
            End If
        Else
        If Not TypeName(C.Comment) = "Nothing" Then C.ClearComments
        End If
    Next
Erase MyFormat
End Sub
相対参照の式の時に上手く表示されませんね汗

 一応シートに書き出す場合も書いておきます。
同じく範囲を選択してから実行
シート2のA1から書き出します。
(SoulMan)
Sub おまけ()
Dim C As Range
Dim i As Long, j As Long
Dim MyFormat() As Variant
    For Each C In Selection
        If C.FormatConditions.Count > 0 Then
            j = j + 1
            For i = 1 To C.FormatConditions.Count
                ReDim Preserve MyFormat(1 To 4, 1 To j)
                    MyFormat(i + 1, j) = C.FormatConditions.Item(i).Formula1
            Next
                    MyFormat(1, j) = ActiveSheet.Name & C.Address(False, False)
        End If
    Next
With Sheet2
    With .Range("A1")
        .CurrentRegion.ClearContents
            If j = 0 Then Exit Sub
        .Resize(j, 3).Offset(1, 1).NumberFormatLocal = "@"
        .Resize(j, 4).Offset(1).Value = Application.WorksheetFunction.Transpose(MyFormat)
        .Value = "アドレス"
        .Range("B1").Value = "条件1"
        .Range("C1").Value = "条件2"
        .Range("D1").Value = "条件3"
        .CurrentRegion.Columns.AutoFit
     End With
End With
Erase MyFormat
End Sub


すみません。マクロは全くの素人なもので”範囲を選択”のところが理解できません。どこに範囲を入れればいいのでしょうか?
シート1D7〜D47に条件付き書式を設定してるんですけど。ちなみに数式は使用していません。(たか)

 たかさん!おはようございます。
上の二つのコードをAlt+F11でVBEを立ち上げて
標準モジュールを挿入して真っ白なところに貼り付けてください。
貼り付けたら、普通のエクセルに戻って
D7からD47を選択した状態で
ツール→マクロ→から
Macro1
おまけ
を実行してみてください。
でも、
 >数式は使用していません。
だったら、多分駄目かもね(^^;; ヒヤアセ
Formula1しか取得していないし、そっちの方は、パターンも色々あって
難しそうだから、、、σ(^◇^;)
でも、お試し程度で、これを機にマクロでも勉強して、後は適当に応用してください。
ではでは、v(=∩_∩=)v
(SoulMan)

SoulManさん早速の回答ありがとうございます。
なんとかマクロ実行できましたが、セルの値の条件が〜の間で以上、以下の場合はダメみたいですね。
まっマクロは色々便利に使えるみたいなのでまた質問するかもしれませんが宜しくおねがいしますね。(たか)

 SoulManさんの提示してくださったマクロをみて自分も勉強してみたっす。

 >セルの値の条件が〜の間で以上、以下の場合はダメみたいですね。
 
これについて、セルの値の条件については
C.FormatConditions.Item(i).Operator
の値を参照する事で判断できる。
Operator の値は、 XlFormatConditionOperator クラスにて定義されている定数。
ヘルプから引くと、 FormatCondition の Operator は以下の値を取る。
xlBetween xlNotBetween
xlEqual xlNotEqual
xlGreater xlLess
xlGreaterEqual xlLessEqual
 
この中で、Operator が xlBetween 又は xlNotBetween の場合には
Formula2 の値がセットされる。
 
その前に「数式が〜」なのか「セルの値が〜」なのかについては
C.FormatConditions.Item(i).Type
の値を参照する事で判断できる。
Type の値は xlFormatConditionType クラスにて定義されている定数。
ヘルプから引くと、 FormatCondition の Type は以下の値を取る。
xlCellValue xlExpression
 
以上を踏まえると、良い感じに。
ちなみに Windows2000 Excel2000
(ご近所PG)

 ありがとうございます。(^^;; ヒヤアセ
流石!ご近所PGさん。
そうなんですよねぇ。。数式だけだったら、意外と簡単なんですけど、
もう一つの方のことを考えると、σ(^◇^;)
でも、原型は出来てる?でしょ????
ここは一つ、たかさんの宿題?ということで??
それともぉ、、、、ご近所PGさんが、やってくれたりしてぇ???(^^;)
いずれにしても学校らしくいい課題が出来たような?
v(=∩_∩=)v
(SoulMan)

 自分では検証済みコードは作成済みなので誰かしらの要望があれば載せてみるっす。
 >いずれにしても学校らしくいい課題が出来たような?
と、自分も思ったので「こうやると良いんでない?」って
方向性だけとりあえず載せて見たっす。
 >でも、原型は出来てる?でしょ????
SoulManさんのマクロが無ければ自分だけでは思いつきもしなかったっす。
Excelむずいっす。
(ご近所PG)

 ご近所PGさんの話を(゚ー゚)(。_。)うんうんって聞いてたら、出来ちゃったです。(^^;; ヒヤアセ
(はじめからやれって?(^^;;;)
今日はこれから出かけるのでシート編はご近所PGさんにお願いするか
また、暇な時にね(^_^X)
とりあえずコメント編
v(=∩_∩=)v
(SoulMan)
一部訂正
2004/09/26 10:10
2004/09/26 10:30
2004/09/29 20:06
Sub 条件付き書式コメント編()
'*****************************
'変数の宣言
Dim C As Range
Dim i As Long
Dim MyFormat() As String
'画面更新の停止
Application.ScreenUpdating = False
'********************************
'あらかじめ選択された範囲に対してループのはじまり
For Each C In Selection
'相対参照ずれ防止
C.Select
    With C.FormatConditions
        '条件付き書式があったら
        If .Count > 0 Then
        '動的配列 MyFormat にメモリ領域の再割り当てを行う
        ReDim MyFormat(1 To 3)
            For i = 1 To .Count
                With .Item(i)
                    '条件付き書式の種類を判断
                    If .Type = xlCellValue Then
                        Select Case .Operator
                            Case xlBetween
                                MyFormat(i) = "次の値の間" & .Formula1 & "と" & .Formula2
                            Case xlNotBetween
                                MyFormat(i) = "の間以外" & .Formula1 & "と" & .Formula2
                            Case xlEqual
                                MyFormat(i) = "次の値に等しい" & .Formula1
                            Case xlNotEqual
                                MyFormat(i) = "次の値に等しくない" & .Formula1
                            Case xlGreater
                                MyFormat(i) = "次の値より大きい" & .Formula1
                            Case xlLess
                                MyFormat(i) = "次の値より小さい" & .Formula1
                            Case xlGreaterEqual
                                MyFormat(i) = "次の値以上" & .Formula1
                            Case xlLessEqual
                                MyFormat(i) = "次の値以下" & .Formula1
                        End Select
                    Else
                        MyFormat(i) = "数式が" & .Formula1
                    End If
                End With
            Next
            '****************************************
            'コメントがなかった場合
            If TypeName(C.Comment) = "Nothing" Then
                With C.AddComment
                    .Text Text:=MyFormat(1) & Chr(10) & _
                                MyFormat(2) & Chr(10) & _
                                MyFormat(3)
                End With
            Else
            'コメントがあった場合
                With C.Comment
                    .Text Text:=MyFormat(1) & Chr(10) & _
                                MyFormat(2) & Chr(10) & _
                                MyFormat(3)
                End With
            End If
        Else
            '条件付き書式がなくてコメントがあったらコメントをクリア
            If Not TypeName(C.Comment) = "Nothing" Then C.ClearComments
        End If
    End With
Next
'画面更新の解除
Application.ScreenUpdating = True
'配列の初期化
Erase MyFormat
End Sub

 >コードは作成済みなので
ありゃま、私がお願いします。v(=∩_∩=)v
(SoulMan)

 失礼!条件付き書式が無かった時に前のリストが残るので、
一部修正しました。m(__)m
2004/09/26 8:40
2004/09/26 10:10
2004/09/26 10:28
2004/09/29 20:07
Sub 条件付き書式シート編()
'************************
'変数の宣言
Dim C As Range
Dim i As Long, j As Long
Dim MyFormat() As String
'*************************
'画面の更新停止
Application.ScreenUpdating = False
'********************************
'あらかじめ選択された範囲に対してループのはじまり
For Each C In Selection
'相対参照ずれ防止
C.Select
    With C.FormatConditions
        '条件付き書式があったら
        If .Count > 0 Then
        j = j + 1
        '動的配列 MyFormat を要素が追加出来る様に行列を逆にして
        'メモリ領域の再割り当てを行う
        ReDim Preserve MyFormat(1 To 4, 1 To j)
            For i = 1 To .Count
                With .Item(i)
                    '条件付き書式の種類を判断
                    ' セルの値が「xlCellValue」数式が「xlExpression」
                    '今回は「xlCellValue」のみで判断している。
                    If .Type = xlCellValue Then
                        Select Case .Operator
                            'アドレスを追加できる様にプラス1している。
                            Case xlBetween
                                MyFormat(i + 1, j) = "次の値の間" & .Formula1 & "と" & .Formula2
                            Case xlNotBetween
                                MyFormat(i + 1, j) = "の間以外" & .Formula1 & "と" & .Formula2
                            Case xlEqual
                                MyFormat(i + 1, j) = "次の値に等しい" & .Formula1
                            Case xlNotEqual
                                MyFormat(i + 1, j) = "次の値に等しくない" & .Formula1
                            Case xlGreater
                                MyFormat(i + 1, j) = "次の値より大きい" & .Formula1
                            Case xlLess
                                MyFormat(i + 1, j) = "次の値より小さい" & .Formula1
                            Case xlGreaterEqual
                                MyFormat(i + 1, j) = "次の値以上" & .Formula1
                            Case xlLessEqual
                                MyFormat(i + 1, j) = "次の値以下" & .Formula1
                        End Select
                    Else
                        MyFormat(i + 1, j) = "数式が" & .Formula1
                    End If
                End With
            Next    '一つ空けたインデックスに「アドレス」を代入する。
                    MyFormat(1, j) = ActiveSheet.Name & C.Address(False, False)
        End If
    End With
Next
    '***************************************
    '転記先のシート2をクリアにする。
    Worksheets("Sheet2").Cells.ClearContents
    'カウンターがあったら
        If j > 0 Then
            With Worksheets("Sheet2")
                With .Range("A1")
                    .Value = "アドレス"
                    .Range("B1").Value = "条件1"
                    .Range("C1").Value = "条件2"
                    .Range("D1").Value = "条件3"
                    .Resize(j, 3).Offset(1, 1).NumberFormatLocal = "@"
                    'ワークシート関数 Transpose で行列を逆にしている。
                    .Resize(j, 4).Offset(1).Value = Application.WorksheetFunction.Transpose(MyFormat)
                    .CurrentRegion.Columns.AutoFit
                 End With
            End With
            '配列の初期化
            Erase MyFormat
        End If
'画面更新の解除
Application.ScreenUpdating = True
End Sub
コメントが出来たら中身を変えるだけでしたぁ(^^;; ヒヤアセ
ではでは、行ってきます。
v(=∩_∩=)v
おっと!署名忘れあいあむあ「SoulMan」v(=∩_∩=)v

 ほぼ一緒なので私の方では改めてコードは載せないっす。
一部だけ…動作には変わりない点だけど、

 >If .Type = 1 Then
「= 1」と固定値を使うよりはExcel定数 xlCellValue xlExpression を使用して判断した方が好ましいです。
コードから意味を読み取りやすくなるという点と、
(まず無いと思うが)今後定数値が変更された場合を考慮。

 >ReDim Preserve MyFormat(1 To 4, 1 To j)
の位置ですが、
 >j = j + 1
の直後でOKでしょう。For〜Nextの中にある必要は無いかな。

 >If j = 0 Then Erase MyFormat: Exit Sub
無理にここでErase 及び Exit Subを行うよりは素直に最後まで行った方が
処理的にも見栄え的にも好ましいかな。
    If j > 0 Then
        '書式があった時だけセット
    End If
とかで。
With でくくられた中から直接 Exit Sub で抜けてしまうのは避けたほうが無難です。
 
と、細かい所ばかり突っ込む。
(ご近所PG)

 ご近所PGさん!こんばんは!
今、飲み会から帰ってきましたぁ、、
いくつかのご指摘点、その通りだと思います。汗
というか、これって、ご近所PGさんの親心だったのかな?と思います。
というのは、最初に考えた時に性格的に投げちゃったのねσ(^◇^;)
今も解決されているかどうかわからないけど、相対参照の解決策に走っちゃたんです。
でも、出来なくて(;^_^A あせあせ・・・・
で、飲み会の時に考えていたのですが、「ご近所PGさんのコードは載ってるかなぁ??」って
で、多分載ってないなっと思いました。
申し訳ないですが、今は思考回路が完全に寸断されていますので、後日、ご指摘の点を
修正したいと思います。
特に、
 >If j = 0 Then Erase MyFormat: Exit Sub
は、ありえない処理かな(^^;; ヒヤアセ
今回は、大変勉強になりました。
ありがとうございました。
これからも、ご指導ご鞭撻のほどよろしくお願い致します。
ご近所PGさんのレスが無かったら、、あのままほり投げていたと思います。
また一つ大きな収穫を得た気がします。本当にありがとうございました。m(__)m
やっぱり、この学校は素晴らしいです。
ではでは、飲酒運転中ですが、これからもよろしくお願い致します。
あいあむあ(SoulMan)v(=∩_∩=)v

 おはようございます。
ご指摘の点を修正しました。(スレッドが長くなるので上のコードを修正しています。)
まだ、他にもありましたら、どんどん突っ込んじゃってください。(^^;; ヒヤアセ
よろしくお願い致します。m(__)m
ところで、トピ主のたかさんは、もう見てないかな???(^^;;;
ではでは、v(=∩_∩=)v
追伸!一つ前のレスでご近所PGさんの敬称が抜けておりました。
大変失礼いたしました。すみませんでした。ごめんなさいm(__)m
(SoulMan)

 本当は↓かな?と、ちょっこっと考えた時もありましたぁ。
Sub 表示()
    Application.Dialogs(xlDialogConditionalFormatting).Show
End Sub
v(=∩_∩=)v
(SoulMan)


これ数式のセル参照がずれませんか?

どうでもいいことですが、Dim MyFormat() As Variant
はStringでもよいような。

Worksheets("Sheet2").Range("A1").CurrentRegion.ClearContentsは
全部消していいなら
Worksheets("Sheet2").Cells.ClearContents

(ramrun)ぉはょぅ


 ramrunさま、おはようございます。m(._.)m ペコッ
 >これ数式のセル参照がずれませんか?
それなんですよ!それ!相対参照の時のことでしょ???
(違ってたら(×_×;)ぐしゅん)
それを、止められなくて、嫌になって(・_・ )ノ"    ゜ ポイッ
しちゃったんです。。( ̄□ ̄;)!!
止められませんか?
その他のご指摘の点は、訂正させていただきます。
ありがとうございました。m(__)m
v(=∩_∩=)v
(SoulMan)


For Each C In Selection の下に C.Select あたりが一番簡単だと思います。

"さま"付けでしたっけ(笑)。

(ramrun)


w(☆o◎)wおっおっおっおっおっおっおっおっ〜〜〜〜〜〜〜w(☆o◎)wどっひゃぁ〜〜〜

しっしっしっしっしっしっ師匠!!!!!!

ありがとうございましたぁm(__)m

 ↑これ以上の顔文字を知らない(×_×;)グシュン

 >"さま"付けでしたっけ(笑)。
いやだなぁ(^^;; ヒヤアセ
いつも、そうですよσ(^◇^;)
これからも、よろしくお願い致します。m(__)m
v(=∩_∩=)v
(SoulMan)

 色々改良された様子で。
正直言って私はこの学校で色々見るまで、
「条件付き書式」っていうものの存在を知りませんで(まて)
相対参照ってものがあるんすね。
いや〜Excelって本当に難しいものっすね。
 
せっかくここまで伸びたので、コーディング面で一つ。
コメントは出来るだけ入れた方がいいっす。
よく言われることに「一ヶ月前のコードは他人のコード」みたいなのがあるっす。
たとえ自分が作ったものでも一ヶ月経つと他人が作ったもののように訳が解らなくなる、
という意味っす。
私は「他人の為」というより「未来の自分の為」にコメントを細かく入れるように
心掛けているっす。
(とはいえ流石にそこまでこの公の場でやるのは難しい&個人又は管理者の判断か)
まぁ舅姑の老婆心から来る小言とでも思って適当に流してくださいっす。
 
あとどーでもいいのが一つ
 >"の間以外"
となってたのが無性に気になったので直したっす。
(ご近所PG)どうしても長話になるな…(笑)

皆さんありがとうございました。
おかげさまで作業が簡単に行えました。これかもよろしくいねがいします。(たか)

 僭越ではございますが、ご近所PGさんのせっかくのご提案ですので
コメントを入れさせていただきました。(^^;; ヒヤアセ
今後とも、ご指導ご鞭撻のほどよろしくお願い致します。m(__)m
あってる???かなぁ???
v(=∩_∩=)v
(SoulMan)

 解決済みのモノに更に時間をかけさせてしまったようで失礼。
コメント云々は自由だと思いますんで、適度に捕らえてください。
でもコメントが入ったおかげで「なるほどそう言う思考の流れなのか」
というのが見えやすくなりました。感謝。
 
今回のにコメントが入った事で知った事〜
 'ワークシート関数 Transpose で行列を逆にしている。
なるほどそういう意味だったのか、と、初めて知った私っす(笑)
(ご近所PG)

コメント返信:

[ 一覧(最新更新順) ]


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