2017-09-15 59 views
0

我正在使用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 

回答

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

你忘了把currentRange这样的:

Set currentRange = data(k) 

你也跳过你的第一个范围在数组中。在0数组索引0,你应该开始你的循环,他们总是开始于其他0

For k = 0 To UBound(data) 

有一两件事,我不知道为什么你检查ISERROR(cell.Value)与三次相同的条件。用你当前的代码,如果单元格有错误,它只会在第一次被捕获。它永远不会达到其他两个检查。那就是如果ifelse语句的性质。如果A为真,则不需要检查其他语句,或者如果A是假,那么检查下一个语句,如果B是真的,则不需要检查其他语句等。

如果您的意图是要检查三次,那么如果每次检查都需要单独的语句,则需要单独进行检查,但是它仍然不会对您有太大的好处,因为您使用相同的条件三次,所以如果一个条件为真,那么它们都是真实的。希望这是有道理的。