2017-03-02 100 views
0

親愛的SO超級大師!VBA檢查列中的空單元格和打印值

在J列中存在空行和行,其值等於選中的值。

我試圖寫一個VBA代碼,打印「未經檢查」,哪裏有一個空單元格,這個工程,但是當它擊中一個單元格的值(選中)它停止。並且不會進入下一個單元格,可能是因爲我在單元格中輸入了公式,如果不是全填充,但它仍然包含該公式。在我的情況下,我有空細胞,直到J7,然後再從J15開始。但是這可能會隨時關於源數據的變化。

我想這樣做的原因是因爲我在J列中有一個公式,已經打印了一些值,然後是一些VBA代碼,用於檢查不同列中的其他值並打印到J列。過濾器主列的排序。所以這是我必須這樣做的方式,我猜。

我的代碼現在的問題是,

Sub DoIfNotEmpty() 
    Dim ra As Range, re As Range 

    With ThisWorkbook.Worksheets("Sheet1") 
     Set ra = .Range("J:j25") 
     For Each re In ra 
      If IsEmpty(re.Value) Then 
       re.Value = "unchecked" 
      End If 
     Next re 
    End With 
End Sub 

我可以打印到空白單元格,如果單元格中包含在這種情況下,公式至極有如果未填寫聲明?

+0

你必須用'.Range(「J1:j25」)''改變'.Range(「J:j25」)'',但除了這個問題,我試過了你的代碼,它工作。你確定它不是25行之後存在的問題嗎? –

+0

Ahhaaa我想我找出了問題所在。因爲我在單元格中有一個公式,我認爲excel相信我在這些單元格中有價值。它在某些工作的原因是因爲我在某些時候刪除了這些單元格中的值。現在如果有解決方法,你們大家嗎? – DL1

+0

@DanneL看到我的回答 –

回答

2

除了從@Maxime門的指出它應該是.Range("J1:j25")我猜這些單元格只顯示爲空,但它們不是。

包含空字符串""的單元格不再爲空,但看起來像。在A1

  1. 在新的工作表寫:你可以這樣測試=""(存在之間沒有空格!)
  2. 複製A1和A1特殊粘貼值。 A1現在看起來是空的。
  3. 在VBA中運行Debug.Print IsEmpty(Range("A1").Value),您將得到FALSE

單元格A1不再是空的,因爲它包含一個空字符串。

你能做什麼?

Sub DoIfNotEmpty() 
    Dim ra As Range, re As Range 

    With ThisWorkbook.Worksheets("Sheet1") 
    Set ra = .Range("J1:J25") 
     For Each re In ra 
      If IsEmpty(re.Value) or re.Value = vbNullString Then 
       re.Value = "unchecked" 
      End If 
     Next re 
    End With 
End Sub 

這將標記僞空單元格爲「未選中」。但請注意,它也會殺死導致空字符串""的公式。

+0

就像老闆一樣工作!謝謝你!! – DL1

+1

只需要點''「= vbNullString',避免VBA編譯器爲每個'''''創建一個變量,從而提高性能! ;)@DanneL – R3uK

+1

有趣的是,將單元格的值設置爲'「」'將使單元格變爲Empty(例如'Cells(1,1).Value =「a」:Debug.Print IsEmpty(Cells(1,1) ):Cells(1,1).Value =「」:Debug.Print IsEmpty(Cells(1,1))') – YowE3K

2

你可以利用方法對象的RangeSpecialcells()

Sub DoIfNotEmpty()  
    ThisWorkbook.Worksheets("Sheet1").Range("J1:J25").SpecialCells(xlCellTypeBlanks).Value = "unchecked" 
End Sub 

,或者,如果你有公式返回空白,然後AutoFilter()「空白」細胞,並把它們寫

Sub DoIfNotEmpty() 
    With ThisWorkbook.Worksheets("Sheeet1").Range("J1:J25") '<--| reference your range (first row must be a "header") 
     .AutoFilter Field:=1, Criteria1:="" '<--| filter its empty cells 
     If Application.WorksheetFunction.Subtotal(103, .cells) > 1 Then .Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible).Value = "unchecked" '<--| if any cell filtered other than headers then write "unchecked" in them 
     .Parent.AutoFilterMode = False 
    End With 
End Sub 
+0

Ouh,在某些情況下,運行for/each循環比使用autofilter更快。我前一段時間在一個非常大的Excel工作表中嘗試過,並且每個都比自動過濾器快得多,然後關閉自動過濾器。這可能不是Range(「J1:J25」)中的問題,但是在大型數據表中。 –

+0

@Peh,這實際上是我第一次聽說'For Each Cell In Range'循環比'Autofilter()'快,而且根據我的經驗,它總是相反的...... – user3598756

+0

我沒有有一個最小的例子來證明我所說的。是的,在某些情況下,自動過濾器確實很快,但是我的Excel表單在計算過程中達到了32位Excel的極限(因爲RAM的使用),並且我們做了一些計算時間分析(因此我的論文是基於不在主觀感受),所以我們可以通過在某些情況下不使用3次過濾器來提高計算時間。 –