循环范围检查类似的值

时间:2018-01-05 11:14:13

标签: excel vba excel-vba

大家欢呼!我写的代码不想做我需要的工作。我试着写的内容有以下含义:代码需要查看A,B,C和F列。下面是一个例子:

  

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

2 个答案:

答案 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,请在代码中的注释中查看相应的位置。

  1. 不需要第一个$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(); 。如果满足以下条件,那么这个条件永远不会。
  2. If将始终为空,因此我使用的是硬编码的Intersection。你应该适应这个。
  3. 始终鼓励使用辅助变量。
  4. 同样,这个Range将永远是空的,因此需要不同的东西。我使用的Intersection可能类似于您想要使用的内容。
  5. 颜色的替代定义。
  6. 虚假Range
  7. 您的逻辑和代码需要进行重大修改。 这个问题需要更好的定义/澄清。 但这可能会让你前进。

    一些注意事项:

    1. 在使用任何需要EndIf的函数之前,通常最好检查Range是否为Range(除非您对其进行硬编码,然后您知道它不为空) 。例如,将其用作Not Nothing的参数。
    2. Application.Sum