2017-09-15 15 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是真的,則不需要檢查其他語句等。

如果您的意圖是要檢查三次,那麼如果每次檢查都需要單獨的語句,則需要單獨進行檢查,但是它仍然不會對您有太大的好處,因爲您使用相同的條件三次,所以如果一個條件爲真,那麼它們都是真實的。希望這是有道理的。