A5 = home; B5 =狗; C5 = cat且F5 = 50
A6 =家; B6 =狗; C6 = cat且F6 = 40
A7 =家; B7 =狗; C7 = cat且F7 = 20
因为我们在A,B和C列中有类似的值 - >列F总结了它们的值。在这种情况下,总值为110(50 + 40 + 20)> 100,细胞F5,F6和F7需要变红。
我使用范围的原因是人们会在上述列中复制粘贴值,我需要编码以检查所有单元格。谁能帮我这个?一切顺利!
提前致谢!
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range
For Each cell In Target
If Application.Intersect(cell, Range("f5:f5000")) Is Nothing Then
If Application.Intersect(cell, Range("a5:a5000")) And Application.Intersect(cell, Range("b5:b5000")) And Application.Intersect(cell, Range("c5:c5000")) Then
Sum = Application.Intersect(cell, Range("f5:f5000"))
If Sum > 100 Then
Application.Intersect(cell, Range("f5:f5000")).Interior.Color = RGB(255, 0, 0)
Else
Application.Intersect(cell, Range("f5:f5000")).Interior.Color = RGB(255, 255, 255)
End If
End If
Next
End If
End Sub
答案 0 :(得分:0)
好的,让我们把你的代码分开......
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range
您已将cell
声明为变量,但不是sum
,因此如果您遵循良好做法并拥有Option Explicit
,那么您将遇到的第一个问题在模块的顶部,您将获得变量未定义错误。
For Each cell In Target
接下来循环 - 当您更改单个单元格中的值时,将触发Change事件。目标将是单个单元格 - 尝试它:选择范围B1:B5
并输入第一个单元格。该事件将触发,Target.Address
将仅包含$B$1
。所以你的循环只能工作一次。
If Application.Intersect(cell, Range("f5:f5000")) Is Nothing Then
这只会在F5:F5000范围内检查您已更改的值是否。当然最好检查它是否在正确的范围内,否则你最好检查一下他们是否在XFD栏中输入了一个值,并且还列出了所有列之间的值。
If Application.Intersect(cell, Range("a5:a5000")) And Application.Intersect(cell, Range("b5:b5000")) And Application.Intersect(cell, Range("c5:c5000")) Then
这会抛出错误。在这种情况下,您需要检查它是否返回任何内容。 Application.Intersect(cell, Range("a5:a5000")) Is Nothing
- cell
不在或 NOT Application.Intersect(cell, Range("a5:a5000")) Is Nothing
范围内 - cell
在范围内。
也许最好使用NOT Application.Intersect(cell, Range("a5:c5000")) IS NOTHING
?
此外,cell
不能同时位于A,B和C列。
sum = Application.Intersect(cell, Range("f1:f5000"))
这将返回cell
和范围F1:F5000
交叉处的值。如果cell
不在该范围内,则会引发错误。您已在第一个IF
声明中确保它不在该范围内。
我不会提及sum>100
语句,因为如果代码可以到达那里,它会起作用 - 不确定如果sum
是文本会发生什么。
Application.Intersect(cell, Range("f5:f5000")).Interior.Color = RGB(255, 0, 0)
如果您的单元格位于F5:F5000
范围内(它不会成功),则将该单元格的背面颜色设置为红色,否则将其着色为白色。
现在已经不在了 - 代码如何知道A,B和A列中的类似值? C?为什么猫会像狗一样?很确定一只猫不同意。和家一样 - 我的房子用砖头做成,我的狗用爱,拥抱和粪便制成。
为什么列F = 50?
所以,希望我能帮助解释代码的错误 - 只是不知道你希望代码首先做什么。
答案 1 :(得分:0)
问题不仅在于Excel VBA命令的具体使用,而且更多的是在不同的点上使用代码的逻辑。
我发布的代码可以使用,但必须根据您的需要进行调整。 它在需要注意的每个点都被注释(向右滚动以查看注释)。 这里也列出了tems,请在代码中的注释中查看相应的位置。
$types = json_decode($request->type_list, true);
$parks = Park::whereHas('items', function($q) use ($types) {
$q->select('park_id', DB::raw('COUNT(park_id)'))
->whereIn('type', $types)
->groupBy('park_id')
->havingRaw('COUNT(park_id) = ?', [ count($types) ]);
})->get();
。如果满足以下条件,那么这个条件永远不会。If
将始终为空,因此我使用的是硬编码的Intersection
。你应该适应这个。Range
将永远是空的,因此需要不同的东西。我使用的Intersection
可能类似于您想要使用的内容。Range
。您的逻辑和代码需要进行重大修改。 这个问题需要更好的定义/澄清。 但这可能会让你前进。
一些注意事项:
EndIf
的函数之前,通常最好检查Range
是否为Range
(除非您对其进行硬编码,然后您知道它不为空) 。例如,将其用作Not Nothing
的参数。 Application.Sum