如何验证多个单元并根据条件更改值?

时间:2019-06-17 19:46:38

标签: excel vba

我正在尝试使用此代码将分数转换为多个学生和多个科目的合格或不合格值;但是,由于某种原因,当我一次对一个单元格执行此操作时会起作用,但是当我使用范围时会引发错误。我知道这是一个非常简单的代码,但是任何帮助将不胜感激

box_size:5
**********
**********
**********
**********
**********

********
********
********
********

******
******
******

****
****

**
  

运行时错误13   类型不匹配

3 个答案:

答案 0 :(得分:1)

@RobertTodar的答案可以简化为:

For Each Cell In Target
    Cell = IIf(Cell < 35, "Fail", "Pass")
Next Cell

答案 1 :(得分:0)

您编写代码的方式将是递归编程的尝试,并且您无法在VBA中以这种方式进行。您的代码中需要一个简单的循环。

要循环生成Range,您需要一个具有Range数据类型的变量。我将其称为Cell

现在,在循环中,您可以使用Cell来检查它是否通过或失败,并且还可以更新其值。

Dim Target As Range
Set Target = Worksheets("sheet1").Range("B3:E7")

Dim Cell As Range
For Each Cell In Target
    If Cell.Value < 35 Then
        Cell.Value = "Fail"
    Else
        Cell.Value = "Pass"
    End If
Next Cell

您可能要看的另一件事是,在某些情况发生变化时,不要将Range("B3:E7")的范围硬编码为更大的动态范围。您可以执行类似在E列中查找最后使用的行的操作。这是获得该信息的示例:

Set Target = Worksheets("sheet1").Range("B3", Range("E" & Rows.Count).End(xlUp))

答案 2 :(得分:0)

Sheets("sheet1").Range("B3:E7").Value < 35在这一行中,您尝试比较整个范围,而这不太可能。

即使您要通过该行,通过或失败都会用其各自的值填充整个给定范围。

正如其他人所建议的那样,如果您想在VBA中执行此操作,则必须进行循环,尽管某些公式也可以完成类似的工作,或者如果您只想查看显示的结果,则可以使用条件格式。

查看代码中的更多注释,希望对您有所帮助:

Private Sub CommandButton1_Click()

Dim ws As Worksheet
Set ws = ActiveWorkbook.Sheets("Sheet5") 'declare and allocate the sheet to a variable

Dim lRow As Long
lRow = ws.Cells(Rows.Count, "A").End(xlUp).Row 'get last row at column A, assuming student names there

Dim arrData As Variant
arrData = ws.Range("B1:E" & lRow) 'declare and allocate your data to an array

Dim R As Long, C As Long
For R = LBound(arrData) + 2 To UBound(arrData) 'for each row in your data, starting at row 3
    For C = LBound(arrData, 2) To UBound(arrData, 2) 'for each column in your data
        If arrData(R, C) <> "" And IsNumeric(arrData(R, C)) Then 'only want a fail/pass for an actual number
            If arrData(R, C) < 34 Then
                arrData(R, C) = "Fail"
            ElseIf arrData(R, C) >= 35 Then
                arrData(R, C) = "Pass"
            End If
        End If
    Next C
Next R

ws.Range("B1:E" & lRow) = arrData 'allocate the data back to the sheet

End Sub

假设针对此特定需求,您没有很多数据,并且对于每个单元来说都可以,但是如果您有很多数据,这是比遍历每个单元更好的方法。

本质上,您与工作表的互动越少,效果越好。在上面,您将只访问工作表两次,一次是读取数据,一次是将数据写回,其他所有操作都在内存中完成。