VBA excel: For Each..Next 没有经过选定的范围?

VBA excel: For Each..Next doesn't go through the selected Range?

我正在尝试 运行 我的代码:

Sub Test()
    Dim vuosi As Integer
    Dim kk As Integer
    Dim cF As Range
    Dim c As String
    Dim cell As Range
    vuosi = Application.InputBox(Prompt:="Syötä vuosi, jota haluat tarkastella.")
    kk = Application.InputBox(Prompt:="Syötä kuukausi(1-12), jota haluat tarkastella.")
    If vuosi = 2014 Then
        c = "BU"
    ElseIf vuosi = 2015 Then
        c = "CG"
    ElseIf vuosi = 2016 Then
        c = "CS"
    End If
    ActiveSheet.Range("F11:F60").Select
    For Each cell In Selection
        Cells(ActiveCell.Row, c).Activate  
        Set cF = Range(ActiveCell.Offset(0, kk - 12), ActiveCell.Offset(0, kk)).Find(What:=1, LookIn:=xlFormulas, LookAT:=xlPart, SearchOrder:=xlByColumns, MatchCase:=False, SearchFormat:=False)
        If Not cF Is Nothing Then
            Cells(ActiveCell.Row, "F").Interior.ColorIndex = 6
        End If
    Next cell
End Sub

无法正常工作。 For Each 循环似乎只经过第一行。谁能告诉我为什么?

程序应遍历 F 列中的所有单元格。对于每一行,它检查特定单元格中是否存在值 1。如果是,则 F 列中的单元格应涂成黄色。 否则程序将继续,直到在 F 列中找到最后一个值。(在我的测试中,我只使用了 Range("F11:F60")

您在循环中更改了您的选择。每次 excel 达到 for each cell in selection 时,它都会再次评估选择,因此它只运行一次。
而不是

...
ActiveSheet.Range("F11:F60").Select
For Each cell In Selection
...

尝试

...
dim r as range
... 
set r = activesheet.range("F11:F60")
For Each cell In Selection.cells
...

This page 将解释 ActiveCell.Row 如何仅引用所选内容中的一行。

在这种情况下,您可以替换:

ActiveSheet.Range("F11:F60").Select
    For Each cell In Selection
        Cells(ActiveCell.Row, c).Activate

与:

Set rng = ActiveSheet.Range("F11:F60")
    For Each cell In rng
        Cells(cell.Row, c).Activate

此外,rng 应事先声明为 Range

对于嵌套的 If...End If 语句,确保在每个封闭的 If...End If 结构中都有一个正确匹配的 If...End If 结构。

Sub Test()
    Dim Vuosi As Integer
    Dim KK As Integer
    Dim CF As Range
    Dim C As String
    Dim cell As Range

    Vuosi = Application.InputBox(Prompt:="Enter the year you wish to view.")
    KK = Application.InputBox(Prompt:="Enter the month (1-12) you wish to view.")

    If Vuosi = 2014 Then
        C = "BU"
    Else
    If Vuosi = 2015 Then
        C = "CG"
    Else
    If Vuosi = 2016 Then
        C = "CS"
    End If

    ActiveSheet.Range("F11:F60").Select
        For Each cell In Selection
            Cells(ActiveCell.Row, C).Activate
            Set CF = Range(ActiveCell.Offset(0, KK - 12), _
            ActiveCell.Offset(0, KK)).Find(What:=1, _
            LookIn:=xlFormulas, LookAT:=xlPart, _
            SearchOrder:=xlByColumns, MatchCase:=False, SearchFormat:=False)
            If Not CF Is Nothing Then
                Cells(ActiveCell.Row, "F").Interior.ColorIndex = 6
            End If
        Next cell
    End If
    End If
End Sub

我对您的代码有一些看法。让我尝试介绍一下我注意到的所有内容。

A) 当处理 Excel 行时,避免将它们声明为 Integers。 Post Excel 2007,行已经上升到 1048576,这对于 Integer 来说太大了。您可以在使用列时逃脱,但在使用行时可能会遇到问题。将它们声明为 Long

是一个好习惯

B) 您假设用户总是在输入框中输入值。如果用户输入空白或按 Cancel 会怎样?陷阱那些实例。如果您只想在输入框中输入数字,请使用 Type:=1。有关详细信息,请阅读 Excel 帮助中的 Application.InputBox Method

C) 避免使用 .Select/.Activate 您的代码可以轻松 运行 而无需选择任何内容。你可能想看看 THIS

这是您正在尝试的吗? (未测试)

Sub Test()
    Dim vuosi As Integer, kk As Long
    Dim rng As Range, aCell As Range, rngToFind As Range, cF As Range
    Dim c As String
    Dim ws As Worksheet

    vuosi = Application.InputBox(Prompt:="Syötä vuosi, jota haluat tarkastella.", Type:=1)

    If vuosi < 1 Then Exit Sub

    kk = Application.InputBox(Prompt:="Syötä kuukausi(1-12), jota haluat tarkastella.", Type:=1)

    If kk < 1 Then Exit Sub

    If vuosi = 2014 Then c = "BU"
    If vuosi = 2015 Then c = "CG"
    If vuosi = 2016 Then c = "CS"

    Set ws = ThisWorkbook.Sheets("Sheet1")

    With ws
        Set rng = ws.Range("F11:F60")

        For Each aCell In rng
            Set rngToFind = .Range(aCell.Offset(0, kk - 12), aCell.Offset(0, kk))

            Set cF = rngToFind.Find(What:=1, LookIn:=xlFormulas, LookAT:=xlPart, _
                                    SearchOrder:=xlByColumns, MatchCase:=False, _
                                    SearchFormat:=False)

            If Not cF Is Nothing Then .Range("F" & aCell.Row).Interior.ColorIndex = 6
        Next cell
    End With
End Sub