2017-04-14 133 views
1

下面的代碼可以工作,但現在我需要它來處理列範圍而不是單個單元格範圍。 我需要替換:將單個單元格範圍更改爲列範圍

CJ3單元格到CJ列(從第3行開始);

CK3單細胞到CK列(從第3行開始);

CM3單細胞CM列(從第3行開始);

CN3單細胞到CN列(從第3行開始);

CO3單元格到CO列(從第3行開始)。

請任何人都可以幫忙嗎?

Option Explicit 
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    If Range("CJ3").Value = "FOLLOW UP" And Range("CM3").Value = "" And Range("CN3").Value = "" Then 
     Range("CO3").Value = "FOLLOW UP" 
    ElseIf Range("CJ3").Value = "FOLLOW UP" And Range("CM3").Value > 0 And Range("CN3").Value = "" Then 
     Range("CO3").Value = "AWAITING APPROVAL" 
    ElseIf Range("CJ3").Value = "FOLLOW UP" And Range("CM3").Value > 0 And Range("CN3").Value > 0 Then 
     Range("CO3").Value = "CLOSED" 
    ElseIf Range("CJ3").Value = "NO FOLLOW UP" And Range("CN3").Value = "" Then 
     Range("CO3").Value = "AWAITING APPROVAL" 
     Range("CK3:CM3").Value = "N/A" 
    ElseIf Range("CJ3").Value = "NO FOLLOW UP" And Range("CN3").Value > 0 Then 
     Range("CO3").Value = "CLOSED" 
     Range("CK3:CM3").Value = "N/A" 
    End If 
End Sub 
+1

您可能想要「遍歷列中的每個單元格」。這是一個非常常見的任務,初學者經常會問它的代碼。您可能會在谷歌搜索引號之間的術語。 – Variatus

+0

我嘗試過「通過列中的每個單元格循環」,但它減慢了表格的速度。例如:Dim i As Long For i = 1 To Rows.Count If Cells(i,88).Value =「FOLLOW UP」and Cells(i,91).Value =「」And Cells(i,92)。 Value =「」Then Cells(i,93).Value =「FOLLOW UP」 End If Next i End Sub – Zero

回答

0

我催促你指定你的代碼應該工作的工作表。它是默認的ActiveSheet。因此,我的代碼與您的代碼幾乎沒有區別。不同之處在於它是專門寫下來的,這將有助於你理解你自己的代碼,因此可以加快解決問題的速度(無論如何總是需要花費更多的時間來編寫代碼)。您也可以指定另一個工作表。例如,Set Ws = Worksheets("Sheet1")。這樣會好很多,因爲代碼無法在另一張紙上錯誤地做出它的魔法。

所以,這就是你的代碼現在看起來像的樣子。

Private Sub TryLoop() 

    Dim Ws As Worksheet 
    Dim Rl As Long        ' last row 
    Dim R As Long        ' row 

    Set Ws = ActiveSheet 
    With Ws 
     Rl = .Cells(.Rows.Count, 1).End(xlUp).Row 
     For R = 1 To Rl 
      If .Cells(R, 88).Value = "FOLLOW UP" And .Cells(R, 91).Value = "" And .Cells(R, 92).Value = "" Then 
       .Cells(R, 93).Value = "FOLLOW UP" 
      End If 
     Next R 
    End With 
End Sub 

Rows.Count返回行中的活性片的數量(或Ws如果指定的話)。取決於您使用的Excel版本至少有65,000行。是的,這需要一段時間才能完成。因此,上面的覆蓋範圍限制了對第1列中實際具有值的那些行(它是列「A」)的循環。你也可以這樣寫這條線,Rl = .Cells(.Rows.Count, "A").End(xlUp).Row

現在我認爲你的代碼是完美的。它不做什麼?

+0

謝謝您的信息。我會嘗試你的代碼。我的代碼是在私人小組Worksheet_SelectionChange(BYVAL目標作爲範圍)。每次我在該工作表中選擇一個不同的單元格時,都會一直持續下去。 – Zero

+0

您不希望代碼在您單擊某處時運行。這就是爲什麼你應該限制它的範圍。事件過程的「Target」參數保存被單擊的單元格。你可以說'如果Target.Column <> 88然後退出Sub'。或者使用'Application.Intersect'來達到同樣的目的。考慮使用Change事件而不是Selection_Change,如果您希望代碼僅在您進行更改時運行,然後根據更改發生在單元格中的相同方式來限制其操作,這對於「Follow Up」 。 – Variatus

+0

完美的作品!感謝您提供的所有好建議和善意幫助。在上面的代碼中,行「Rl = .Cells(.Rows.Count,1).End(xlUp).Row」我必須更改爲「Rl = Cells(Rows.Count,1).End(xlUp)。行「單元格和行之前沒有結束標點符號。 – Zero