2015-05-19 55 views
0

我正在清理Access數據庫的時間表,並且在清理數據時遇到問題。Excel 2013 - 基於行/單元格值填充零點

我有一個名單在第一列的時間表,然後所有列後,從C到M(或左右)有幾個小時。我試圖做到的是,當宏發現在第一列的名稱,它選擇行中的列,發現細胞無小時,並用零

Dim r As Integer 
Dim c As Range 

    For r = 2 To 15 Step 1 
     If Cells(r, 1).Value <> "" Then 
      Range(Cells(r, 3), Cells(r, 10)).Select 
     End If 
    Next 

    For Each c In Selection 
     If IsEmpty(c) Then 
      c.Value = 0 
     End If 
    Next 

我試圖將其填充循環並填充零行,基於其中已命名的單元格。我遇到的問題是單元格只填寫在電子表格的姓氏/行中。這個宏似乎只是跳過了最後一行。

我剛剛學習VBA,所以也許我只是缺少語法中的某些東西。

感謝您的幫助!

+0

你會有*零長度的字符串*由公式返回?這些並不算真正的空白,但可以得到補償。 – Jeeped

+0

第4行應該是'If Cells(r,1).Value'。單元格的內容在'.Value'屬性中可用。 – nhee

+0

@nhee,它仍然有同樣的問題。 Jeeped,第一列將始終有一個名稱/短文本,沒有別的。 – WUDA

回答

1

問題在於,在開始填充0之前,您正在進行下一個選擇,直到最後一行。嘗試對您的代碼進行以下修改:

Dim r As Integer 
Dim c As Range 

For r = 2 To 15 Step 1 
    If Cells(r, 1).Value <> "" Then 
     Range(Cells(r, 3), Cells(r, 10)).Select 
    End If 
    For Each c In Selection 
     If IsEmpty(c) Then 
      c.Value = 0 
     End If 
    Next c 
Next r 

使用此方法,在移至下一個選擇/行之前填寫0。

注意:我避免使用.select/Selection,因爲它可能會導致問題,所以我不確定在行不包含名稱時是否會收到錯誤消息。如果你想避免這種潛在錯誤,請嘗試以下:

Dim r As Integer 
Dim c As Range 
Dim c2 As Range 

For r = 2 To 15 Step 1 
    If Cells(r, 1).Value <> "" Then 
     Set c2 = Range(Cells(r, 3), Cells(r, 10)) 
    End If 
    For Each c In c2 
     If IsEmpty(c) Then 
      c.Value = 0 
     End If 
    Next c 
Next r 

順便說一句,你從Range(Cells(r, 3), Cells(r, 10))剔除的工作簿和工作表名稱,以便簡化您的文章?我很驚訝你能夠毫無錯誤地使用它。如果是這樣,你顯然必須把它們放回來,讓我的代碼才能工作。

+1

在沒有限定符的情況下使用,「Range」與「ActiveSheet.Range」相同,「Cells」與「ActiveSheet.Cells」相同。這使得代碼依賴於特定的表單處於活動狀態,從而增加了出錯的可能性。堅持限定對「範圍」和「細胞」的呼叫肯定更可取。 – barrowc

+0

這很好。謝謝! 我很難理解VBA語法,但是慢慢學習。我有時會對代碼塊感到困惑,並確保For具有Next和IF具有END IF。 – WUDA

+0

好,我很高興你有它! :) – puzzlepiece87

0

可能,

Sub Button1_Click() 
    Dim Rws As Long, Rng As Range 
    Rws = Cells(Rows.Count, "A").End(xlUp).Row 
    Set Rng = Range(Cells(2, 1), Cells(Rws, 1)).SpecialCells(xlCellTypeConstants) 
    Rng = 0 
End Sub 
0

你想要把所有的空白單元格,並把它們變成零。

Sub zeroed_hours() 
    Dim rw As Long 
    With Sheets("Sheet1") '<-set this worksheet reference properly! 
     For rw = 2 To .Cells(Rows.Count, 1).End(xlUp).Row 
      If CBool(Len(.Cells(rw, 1))) Then 'found a name! 
       'C:M on this row 
       .Cells(rw, 3).Resize(1, 11).Replace what:="", replacement:=0, lookat:=xlWhole 
      End If 
     Next rw 
    End With 
End Sub 

此循環通過在列A中的細胞如果它找到一個值(一些與長度大於零),那麼它替換C中的所有空白單元:M上用零該行。

+0

我只想在第一列中有名稱的特定行中的空單元格填充零。 – WUDA