2017-02-13 5 views
0

私は約12枚のブックを持っています。条件付き書式設定とデータ検証を、2から6のシートのEからYへ交互に行おうとしています。Excel VBAループをいくつかのシートに渡しますが、すべてではありません

検証と書式設定は完全に機能していますが、シートループによって多くの問題が生じます。

ループはシート1に適用され続けますが、ヒットしないシートは変更されますが、シートが2から6までの各シートに適用されるとは限りません。

私は迷っています。コードの一部は、マクロの記録機能で作ったので、私はそれが非効率的とかさばるだが、ここのコードだと確信していました:

Sub ListCF() 
Dim i   As Integer 
Dim j   As Integer 
Dim k   As Integer 
Dim cl   As Variant 
Dim Row   As Variant 
Dim ws   As Worksheet 

For i = 2 To 6 

    With ThisWorkbook.Worksheets(i) 

     Worksheets(i).Activate 
     Cells.Select 
     Selection.FormatConditions.Delete 
     Selection.Validation.Delete 
     Selection.NumberFormat = "General" 

     For j = 5 To 23 Step 2 

      Range(Cells(2, j), Cells(50, j)).Select 

      With Selection.Validation 
       .Delete 
       .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
       xlBetween, Formula1:="=Reference!$A$2:$A$50" 
       .IgnoreBlank = True 
       .InCellDropdown = True 
       .InputTitle = "" 
       .ErrorTitle = "" 
       .InputMessage = "" 
       .ErrorMessage = "" 
       .ShowInput = True 
       .ShowError = True 
      End With 

     Next j 

     For k = 6 To 24 Step 2 

      cl = Mid(Cells(2, k).Address, 2, 1) 

      Range("$" & cl & 2, "$" & cl & 50).Select 

      Selection.NumberFormat = "m/d/yyyy" 

      'With Range(Cells(2, k), Cells(50, k)) 

       Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _ 
        "=$" & cl & 2 & ">(TODAY()-60)" 

       Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority 

       With Selection.FormatConditions(1).Font 
        .Bold = True 
        .Italic = False 
        .Color = -16776961 
        .TintAndShade = 0 
       End With 

       Selection.FormatConditions(1).StopIfTrue = False 

       Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _ 
        "=$" & cl & 2 & "<(TODAY()-60)" 

       Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority 

       With Selection.FormatConditions(1).Font 
        .Bold = False 
        .Italic = False 
        .ThemeColor = xlThemeColorLight1 
        .TintAndShade = 0 
       End With 

       Selection.FormatConditions(1).StopIfTrue = False 

      'End With 

      Range(Cells(2, k), Cells(50, k)).Select 
      Selection.NumberFormat = "m/d/yyyy" 

     Next k 

    End With 

Next i 
End Sub 
+1

お持ちすぎ '多くのSELECT'と' Selection' –

+1

'ThisWorkbook.Worksheets(I)'で - あなたがすべてでループ –

+0

'ワークシートでこれを使用していません( i)は、左から順にタブの順番で数えていくi番目のワークシートを指します。それはあなたが期待している注文ですか?または、 "Sheet2"、 "Sheet3"、 "Sheet4"、 "Sheet5"、 "Sheet6"という名前のシートにアクセスしようとしていますか? – YowE3K

答えて

0

これは、テストされていないですが、私が緩んでいなかった場合はどの.は完全に修飾しますws(ワークシートオブジェクト)の下にあるオブジェクトはすべてOKです。

すべてのワークシートをFor Each ws In ThisWorkbook.Worksheetsでループし、ワークシートのインデックスが2から6の間であることを確認します(Select Case ws.Index)。

コード

Sub ListCF() 

Dim i   As Integer 
Dim j   As Integer 
Dim k   As Integer 
Dim cl   As Variant 
Dim Row   As Variant 
Dim ws   As Worksheet 

For Each ws In ThisWorkbook.Worksheets 
    Select Case ws.Index 
    Case 2 To 6 ' if Worksheet.Index is 2 to 6 
     With ws   
      With .Cells 
       .FormatConditions.Delete 
       .Validation.Delete 
       .NumberFormat = "General" 
      End With 

      For j = 5 To 23 Step 2 
       With .Range(.Cells(2, j), .Cells(50, j)).Validation 
        .Delete 
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=Reference!$A$2:$A$50" 
        .IgnoreBlank = True 
        .InCellDropdown = True 
        .InputTitle = "" 
        .ErrorTitle = "" 
        .InputMessage = "" 
        .ErrorMessage = "" 
        .ShowInput = True 
        .ShowError = True 
       End With 
      Next j 

      For k = 6 To 24 Step 2 
       cl = Mid(.Cells(2, k).Address, 2, 1) 

       With .Range("$" & cl & 2, "$" & cl & 50) 
        .NumberFormat = "m/d/yyyy" 
        .FormatConditions.Add Type:=xlExpression, Formula1:="=$" & cl & 2 & ">(TODAY()-60)" 

        .FormatConditions(.FormatConditions.Count).SetFirstPriority 
        With .FormatConditions(1).Font 
         .Bold = True 
         .Italic = False 
         .Color = -16776961 
         .TintAndShade = 0 
        End With 

        .FormatConditions(1).StopIfTrue = False 
        .FormatConditions.Add Type:=xlExpression, Formula1:="=$" & cl & 2 & "<(TODAY()-60)" 
        .FormatConditions(.FormatConditions.Count).SetFirstPriority 
        With .FormatConditions(1).Font 
         .Bold = False 
         .Italic = False 
         .ThemeColor = xlThemeColorLight1 
         .TintAndShade = 0 
        End With 
        .FormatConditions(1).StopIfTrue = False 
       End With 

       .Range(Cells(2, k), Cells(50, k)).NumberFormat = "m/d/yyyy" 
      Next k 
     End With 
    End Select 
Next ws 

End Sub 
+0

氏ラドー、 私は終わりにこれを除去しなければならなかった:。 .Range(セル(2、k)は、細胞(50、K))のNumberFormat = "M/D/YYYY" を 、それが動作します完全に!どうもありがとうございます。 今私はそれを勉強して、どこが間違っているのか把握するだけです。 – jennar

+0

@jennarあなたは歓迎です。私の答えの横にある** V **をクリックすると、回答としてマークしてください(緑色になるはずです) –

+0

私はあなたがそれをどうやって行っているのか疑問に思いました。完了! – jennar

関連する問題