2017-04-14 145 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

相关问题