2017-02-13 98 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(我)' - 你不是在所有的循環 –

+0

'工作表使用這個( i)'表示按照Tab鍵順序從左到右數的第i個工作表。這是你期望的順序嗎?或者您是否嘗試訪問名爲「Sheet2」,「Sheet3」,「Sheet4」,「Sheet5」和「Sheet6」的工作表? – YowE3K

回答

0

這是未經測試,但如果我沒有失去任何.完全限定所有在ws(工作表對象)下的對象,都應該可以。

您可以使用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 = 「米/ d/yyyy的」 和它的工作原理完美!非常感謝。 現在我只需要研究它並找出我出錯的地方。 – jennar

+0

@jennar歡迎您,請點擊我答案旁邊的** V **標記爲「答案」(它應該變成綠色) –

+0

我一直在想你是如何做到的。完成! – jennar

相關問題