使用变量数组检查列中的值

时间:2017-09-15 15:14:51

标签: arrays vba variables

我在VBA工作并从数据库中获取数据。但是,有时数据缺少值。因此,我想知道什么时候缺少一个值。

我认为我有一个聪明的想法,我可以将每个列定义为自己的范围。然后创建这些列名称的数组,循环遍历它,然后循环遍历范围内的每个单元格,然后如果单元格为空,则取周围单元格的平均值。但是,我似乎并没有正确地定义我的“范围变量”,即我在第一个循环中使用的变量。 VBA说这是“没什么。”

Dim csheet as Worksheet
Set csheet  =ThisWorkbook.Sheets(“Sheet1”)
Dim name1, name2, name3, name4, name5, name6, name7, name8 As Range
Set name1 = csheet.Range("B4", "B25")
Set name2 = csheet.Range("C4", "C25")
Set name3= csheet.Range("D4", "D25")
Set name4= csheet.Range("E4", "E25")
Set name5= csheet.Range("F4", "F25")
Set name6= csheet.Range("G4", "G25")
Set name7= csheet.Range("H4", "H25")
Set name8 = csheet.Range("I4", "I25")

Dim data() As Variant
data = Array(name1, name2, name3, name4, name5, name6, name7, name8)
Dim currentRange As Range

For k = 1 To UBound(data)
    currentRange = data(k)
    For Each cell In currentRange
        If IsEmpty(cell.Value) = True Then
            cell.Value = Application.WorksheetFunction.Average(cell.Offset(1, 0).Value, cell.Offset(-1, 0).Value)
            If IsError(cell.Value) = True Then
                cell.Value = cell.Offset(-1, 0)
            ElseIf IsError(cell.Value) = True Then
                cell.Value = cell.Offset(1, 0)
            ElseIf IsError(cell.Value) = True Then
                cell.Value = 0
                MsgBox ("There is an error with the data. Please fix once done running. Thank you.")
            End If
        End If
    Next cell
Next

2 个答案:

答案 0 :(得分:1)

使用SET设置CurrentRange变量。像这样:

 Set currentRange = data(k)

完整代码:

Dim csheet As Worksheet
Set csheet = ThisWorkbook.Sheets("Sheet1")
Dim name1, name2, name3, name4, name5, name6, name7, name8 As Range
Set name1 = csheet.Range("B4", "B25")
Set name2 = csheet.Range("C4", "C25")
Set name3 = csheet.Range("D4", "D25")
Set name4 = csheet.Range("E4", "E25")
Set name5 = csheet.Range("F4", "F25")
Set name6 = csheet.Range("G4", "G25")
Set name7 = csheet.Range("H4", "H25")
Set name8 = csheet.Range("I4", "I25")
Dim k As Integer

Dim data() As Variant
data = Array(name1, name2, name3, name4, name5, name6, name7, name8)
Dim currentRange As Range

For k = 0 To UBound(data)
    Set currentRange = data(k)
    For Each cell In currentRange
        If IsEmpty(cell.Value) = True Then
            cell.Value = Application.WorksheetFunction.Average(cell.Offset(1, 0).Value, cell.Offset(-1, 0).Value)
            If IsError(cell.Value) = True Then
                cell.Value = cell.Offset(-1, 0)
            ElseIf IsError(cell.Value) = True Then
                cell.Value = cell.Offset(1, 0)
            ElseIf IsError(cell.Value) = True Then
                cell.Value = 0
                MsgBox ("There is an error with the data. Please fix once done running. Thank you.")
            End If
        End If
    Next cell
Next

答案 1 :(得分:1)

您忘记将currentRange设置为:

Set currentRange = data(k)

此外,您正在跳过阵列中的第一个范围。你应该在0开始循环。数组是0索引的,它们总是从0开始。

For k = 0 To UBound(data)

另外一件事,我不确定你为什么要用同样的条件检查IsError(cell.Value)三次。使用您当前的代码,如果单元格有错误,它将只在第一次捕获。它永远不会达到其他两个检查。这是if ifelse语句的本质。如果A为真,则无需检查其他if语句,或者如果A为假,则检查下一个语句,如果B为真,则无需检查其他语句等。

如果您打算三次检查,那么每次检查都需要单独的if语句,但它仍然不会对您有好处,因为您使用相同的条件三次,如果一个是真的他们都是真的。希望这是有道理的。