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
我正在尝试 运行 我的代码:
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