我在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
答案 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语句,但它仍然不会对您有好处,因为您使用相同的条件三次,如果一个是真的他们都是真的。希望这是有道理的。