• 締切済み

VBAを使って条件付書式のセルを保護したい

VBAを使って =A2<>0の条件付書式の入ったセルが 黒塗りのときをロックしたいと思い セルの状態を調べたいのですが FormatConditionsを使えばいいのかと想うのですが 使い方がイマイチわかりません。 たとえば 黒で塗りつぶしたセルを探そうと想ったときは locked_col = RGB(0, 0, 0) cell_col = Worksheets("Sheet1").Cells(j, i).Interior.Color 'セルが黒塗りの場合ロックする If Not cell_col = locked_col Then Cells(j, i).Locked = False End If っていう風にはできないのでしょうか? 知恵をおかしください

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 一応、想像の範囲ですが、条件付き書式そのものの中から探し出すよりも、そのVBA自体で処理してしまったほうが早いのではありませんか? =A2<>0の条件付書式 というのは、A列から、0でないものを探して、そのセルをロックするという方式で良いのでは? (言葉だけで書くと、理解しない方も多いようですから、コードをサンプルコードを入れておきます。) 条件付き書式自体は、黒にしてくれているのだと思います。ただ、それ自体は無視して、条件付き書式を設定したところから、条件に合うものを選び出して、Locked プロパティをTrue にするということです。イベントドリブン型にしたいところですが、シートの保護との組み合わせは、できなかったと思います。 なお、条件付き書式の色は、Range プロパティのInterior では取れません。 '------------------------------------------- Sub TestMacro1()   Dim rng As Range   Dim ur As Range   Dim c As Variant   '保護解除   ActiveSheet.Unprotect   ActiveSheet.UsedRange.Locked = False   On Error Resume Next   'A列のみ   Set rng = Columns(1).SpecialCells(xlCellTypeAllFormatConditions)   On Error GoTo 0   For Each c In rng     '自セルが0でないという条件     If c.Value <> 0 Then       If ur Is Nothing Then         Set ur = c       Else         Set ur = Union(c, ur)       End If     End If   Next c   If Not ur Is Nothing Then     ur.Locked = True   End If   '保護開始   ActiveSheet.Protect End Sub '-------------------------------------------

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.3

こんな感じかな? Sub test() Dim Rng As Range ActiveSheet.Unprotect For Each Rng In Cells.SpecialCells(xlCellTypeAllFormatConditions) If Rng.FormatConditions(1).Formula1 = "=$A$2<>0" _ And Evaluate(Rng.FormatConditions(1).Formula1) Then Rng.Locked = True End If Next Rng ActiveSheet.Protect End Sub 詳細が曖昧なので希望とは違うかもしれませんが 簡単な説明 シートのロック解除 条件付き書式の設定が有るセルを抽出し その中で、条件の1が「=$A$2<>0」で 尚且つ、その条件を満たしていれば セルをロックする これを抽出したすべてのセルに対し処理を行う シートの保護設定 以上 しかし、条件付き書式の処理を含むコードは難しいので コードで処理する方法を模索した方が良いと思います 参考まで

回答No.2

すいません。 質問を読み直したら、 見当違いの回答をしてしまったみたいです。

回答No.1

Worksheets(ActiveSheet.Name).Unprotect ' シートの保護解除 For i = 1 To 10 For j = 1 To 10 locked_col = RGB(0, 0, 0) cell_col = Worksheets("Sheet1").Cells(j, i).Interior.Color 'セルが黒塗りの場合ロックする If cell_col = locked_col Then Cells(j, i).Locked = True Else Cells(j, i).Locked = False End If Next j, i Worksheets(ActiveSheet.Name).Protect ' シートの保護解除 これでいいはずです。

関連するQ&A

  • 条件付書式をVBAでセルに設定するときのルール

    図のような列があります。 C列にこだわっているわけではないのですが、その左側にある列で計算をしているという意味で、A、B列はあけただけです。 で、IF文で計算してある条件に合致するとC列で「TRUE」を表示し、合致していない場合はそのときの計算結果を表示させています(IF文的に正しくないので、計算したままの値が計算結果として表示される)。 この結果の見せ方として、これまではC列に「条件付書式」を手動で設定し、文字がTRUEのとき字を青くする表示にしていたのですが、同様の処理を行うExcel Bookファイルが多いため、VBAで条件書式を設定しようとし、次のような記述を実行しました。 すると、図のような結果になりました。 ---------------------------------------------- Sub TestSample() Dim i As Long i = 20 '実際には最終行はBookによって異なるので、 ’行末検索させせていますが、とりあえずここでは20としておきます。 With ActiveSheet Range(Cells(2, 3), Cells(i, 3)).Select With Selection     FormatConditions.Add Type:=xlTextString, String:="TRUE", _     TextOperator:=xlContains     .FormatConditions(1).Font.Color = RGB(0, 50, 255) ’ーーA     .FormatConditions(1).Interior.TintAndShade = 0   ’ーーB End With End With End Sub ---------------------------------------------- 質問が2つあります。 1. 背景がいわゆる「色なし」ではなく白くなっていますが、背景「色なし」かつ「罫線でかこむ」には、どのような記述をすればよいでしょうか 2. FormatConditions.Add Type:~~~~ につづく別の行(Aのところ)に「FormatConditions.」と記述すると実行できません。 マクロで条件書式の自動記録をやって参考にしたところ、添値のような(1)が記録されることに気が付き、それを真似して FormatConditions(1). としたところ、動作しました。 最初だけFormatConditionsで、なぜAのところはFormatConditions(1).となるのか、またAとBはどちらも「FormatConditions(1).」でダブっているのに処理上エラーを返さないのか、理屈がわかりません。 (1)がつく意味と、AとBはどちらも(1)で(ダブっても)動作するのか(逆にいえば、なぜ最初のFormatConditionsだけ、番号がついていないのか、たぶんデフォルトで(0)の意味?) について、このへんの仕組みの解説をよろしくお願いします。

  • excel2000 条件付書式5つ

    A1~J10に100個の数値があり、 行ごとの1位~5位にそれぞれ書式を あたえます。 マクロの記録機能を使って1位~3位を。 その後別で4位・5位を記録し、くっつけて みました。 つけたい書式は 以下のマクロの通りのセルのパターン・フォントの色です。 以下は記録したものをくっつけてつくったマクロです。 動作しません。 Sub 条件付書式5つ() Selection.FormatConditions.Delete Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _ Formula1:="=LARGE($A1:$J1,1)" Selection.FormatConditions(1).Font.ColorIndex = 2 Selection.FormatConditions(1).Interior.ColorIndex = 1 Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _ Formula1:="=LARGE($A1:$J1,2)" Selection.FormatConditions(2).Font.ColorIndex = 2 Selection.FormatConditions(2).Interior.ColorIndex = 16 Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _ Formula1:="=LARGE($A1:$J1,3)" Selection.FormatConditions(3).Interior.ColorIndex = 15 Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _ Formula1:="=LARGE($A1:$J1,4)" Selection.FormatConditions(4).Font.ColorIndex = 2 Selection.FormatConditions(4).Interior.ColorIndex = 3 Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _ Formula1:="=LARGE($A1:$J1,5)" Selection.FormatConditions(5).Font.ColorIndex = xlAutomatic Selection.FormatConditions(5).Interior.ColorIndex = 38 End Sub 初心者のためどうしたらいいのかまったく わかりません。 どうぞお願いします。

  • 単一セルではなく範囲に対して条件付き書式を設定するとき

    条件付き書式について質問です。 A7:M15の範囲を「色範囲」と名前定義しているとして、 その範囲の中で「あ」から始まる文字列の場合、 フォントの色を赤色に設定したいのですが、 1つ1つのセルに対して条件付き書式を設定していくのであれば当然出来きるのはわかります。 Workbooks(book1).Sheets(sheet1).Cells("A7").FormatConditions.Add Type:=xlExpression, Formula1:= _ "=COUNTIF(A7,""あ*"")" .FormatConditions(1).interior.colorIndex = 6 Workbooks(book1).Sheets(sheet1).Cells("A8").FormatConditions.Add Type:=xlExpression, Formula1:= _ "=COUNTIF(A8,""あ*"")" .FormatConditions(1).interior.colorIndex = 6 ・・・ ・・・ ・・・ しかし、 範囲全てに対して下記の設定をしてVBAを起動 Workbooks(book1).Sheets(sheet1).Cells(色範囲).FormatConditions.Add Type:=xlExpression, Formula1:= _ "=COUNTIF(A7,""あ*"")" .FormatConditions(1).interior.colorIndex = 6 エクセル側でA8のセルの条件付き書式をみると、 =COUNTIF(A8,"あ*") と自動で行(列)が変わっているのかわかりません。 要は名前定義をした範囲選択、行番号選択、列番号選択どの場合でも、 左上に表示されたセル座標をCOUNTIFの文字列の引数に設定すればいいのでしょうか。 よろしくお願いいたします。

  • Excel2003 VBAにて条件付き書式のマクロを書きたいのですが、

    Excel2003 VBAにて条件付き書式のマクロを書きたいのですが、どうも上手くいきません。 1列おき(C列、E列、G列・・・)に条件付き書式を設定し、 条件は、 ・セルの値が”0”より大きい場合はフォント”赤”で表示。 ・セルの値が”0”より小さい場合はフォント”緑”で表示。 としたいと思いマクロを組んでみました。 Sub Color() Dim j, j0 Dim x Worksheets("sheet1").Active Application.ScreenUpdating = False j0 = 3 j = 300 For x = 3 To 100 Step 2 Range(.Cells(j0, x), .Cells(j, x)).Select Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlGreater, _ Formula1:="0" Selection.FormatConditions(1).Font.ColorIndex = 3 Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlLess, _ Formula1:="0" Selection.FormatConditions(2).Font.ColorIndex = 10 Next Application.ScreenUpdating = True End Sub デバックでステップインしていくと、ここで実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです。がでます。 Selection.FormatConditions(1).Font.ColorIndex = 3 -------------------------------------------------------------------------------------- Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlGreater, _ Formula1:="0" Selection.FormatConditions(1).Font.ColorIndex = 3 Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlLess, _ Formula1:="0" Selection.FormatConditions(2).Font.ColorIndex = 10 -------------------------------------------------------------------------------------- この間は、マクロの自動記録で書かれてるので間違ってはいないハズなのですが、、、 お知恵を下さい。 よろしくお願いします。

  • vba ;制御

    下記でhakkenn = 1 '******** のところから次は next iの直前にいくようにプログラムをランさせるにはどう記述すればよいか。 よろしくお願いします。 For i = 3 To d hakken = 0 For ui = CELL_S To (CELL_E - CELL_S + 1) If Worksheets("sheet2").Cells(i, "D") = Worksheets("user").Cells(ui, "A") Then Worksheets("user").Cells(ui, ichi) = "◎" hakkenn = 1 '******** Else End If Next ui If hakkenn = 1 Then Else Worksheets("user2").Cells(ui, "D") = Worksheets("sheet2").Cells(i, "D") End If Next i

  • VBAで条件付書式設定方法

    次の内容の件です Dim wArray As Variant Dim wI As Integer ' セルA3:K3の条件付書式設定 A3の設定:A3=B3は黒,A3<B3は緑,A3>B3は赤,以降同様に wArray = Array(, "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L") For wI = 1 To UBound(wArray) - 1    Sheets("Sheet1").Cells(3, wI).Select    Selection.FormatConditions.Delete    Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=$" & wArray(wI) & "3=$" & wArray(wI + 1) & "3"    With Selection.FormatConditions(1).Font      .Bold = False      .Italic = False      .ColorIndex = xlAutomatic    End With    Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=$" & wArray(wI) & "3<$" & wArray(wI + 1) & "3"    With Selection.FormatConditions(2).Font      .Bold = False      .Italic = False      .ColorIndex = 10    End With    Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=$" & wArray(wI) & "3>$" & wArray(wI + 1) & "3"    With Selection.FormatConditions(3).Font      .Bold = False      .Italic = False      .ColorIndex = 3    End With Next wI 実行時にアクティブセルにならないコーディング方法は? また、もっと合理的な、シンプルな方法はないでしょうか? いろいろと、やってみましたが、エラーとか行ズレとなり困っています よろしくご教示ください

  • EXCEL VBA 取得したセルの列の最終行

    お客さんからいただいたEXCELフォーマットに沿って、集計ツールを作成していますが 下記でつまってしまいました。 Wb.Worksheets("Sheet1").Cells.Find("実施日").Select Sel_Col = Selection.Column Last_Row = Wb.Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row ※1 For i = Last_Row To 2 Step -1 If Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Value = Day Then ※2 If Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Offset(-5).Value = "A" Then A_count = A_count + 1 ElseIf Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Offset(-5).Value = "B" Then B_count = B_count + 1 ElseIf Wb.Worksheets("Sheet1").Cells(Sel_Col, i).Offset(-5).Value = "C" Then C_count = C_count + 1 End If Else End If Next i まず※1の箇所ですが、Sheet1の実施日と入力されているセルの列番号を取得して その列の最終行を取得したいのですが、上記作成したものですと入力されている列全部の 中での最終行が取得されてしまいます。 この場合、Sel_Col をどのように使えばよろしいでしょうか? 次に※2ですが、※1で取得した列の最終行から1つずつ上に上がりながら 日付が今日であれば、そのセルから5つ左のセルのA、B、Cいずれかを カウントするという造りにしたいと思っています。 実行すると1004エラーでアプリケーション定義、オブジェクト定義のエラーと 出てしまいます。 Wbはset Wbとして開いたブックを定義しています。 DayはDay = Dateで今日の日付を取得しています。 独学で無茶苦茶なコードですが、 どなたか詳しい方、ご教示お願いいたします。

  • セルの色を変えたいのですが。

    セルの色を変えたいと思っています。 現状はマクロで Sub カラー1() i = 7 For j = 21 To 100 RESULT = Cells(j, i) If RESULT = "#N/A" Then Cells(j, i).Interior.ColorIndex = 3 End If Next j i = 17 For j = 21 To 100 RESULT = Cells(j, i) If RESULT = "#N/A" Then Cells(j, i).Interior.ColorIndex = 3 End If Next j End Sub とかいてあります。 "#N/A"ですがVLOOKUP関数で値が一致していない場合に でてくるのですが、この時にセルの色を変えて表示したいと思っています。 どうすればよいでしょうか、教えてください。

  • excel2010条件付き書式後にVBAにて処理

    VBAビギナーのmaruです Excel2010のワークシート上の範囲(Range(”E12:K120“))内の 各セルに条件付き書式(複数あり)にてフォント色を赤く(RGB 255,0,0) 変更したセル内のデータ(数字)のみ削除(””)するVBAを行いたいのですが 以下のコードでは、「セルの書式」で設定したフォント色で削除されてしまい 条件付き書式で変更された赤文字に反映されません ご教授お願い致します Private Sub CommandButton4_Click() 'データ入力セル内の赤文字の削除 Dim rd As Range For Each rd In Range("E12:K120") For i = 1 To rd.FormatConditions.Count If rd.FormatConditions(i).Font.Color = RGB(255, 0, 0) Then rd.Value = "" End If Next Next End Sub 以上、宜しくお願い致します

  • VBAで条件式について

    EXEL(VBA)で例えば、A列のデータが入っている行までの中で数値(x)が  x<2 ならばセルに色をぬる。そして空白セルと x>2ならば色をぬらない。 という条件式は、どうしたらいいのですか? Sub InteriorColor() For j= 5 to 21 worksheets(j).activate For i = 1 to 40 '30から40行ぐらい While cells(6+i,6)<>"" If(cells(6+i,6).value<2) Then ’6列7行目から  with selection.interior .Colorindex=45 .patern=xlsorid End with Wend End if Next i Next j End sub ということを連続していない列(5列ぐらい)に対してします。 同じ命令文になる部分もあるので簡潔にしたいという希望もあります。 上部の命令では無限ループの可能性があり実行が止まりません。 どのように記述したらいいのですか? また、同じブックのシート25枚のうち5枚目から21枚目に対して処理します。 5から21までのシートの間で関係ないシートが7枚目と10枚目と15枚目にあります。それを省いての処理もあれば教えてください。

専門家に質問してみよう