2016-07-29 30 views
0

我正在嘗試製作可用於輸入和存儲大量數據的電子表格。加快數據輸入過程的一種方法是從前一行復制數據。到目前爲止,我所擁有的是:如果單元格值已更改然後運行不同If語句

Private Sub Worksheet_Change(ByVal Target As Range) 

If Target.Address = "$J$3" Then 

Call LD_Copy_Paste_Delete 

End If 

End Sub 

Sub FillBlanks() 

If Range("B13").Value = Empty Then 
    Range("B14").Selects 
    Selection.Copy 
    Range("B13").Select 
    ActiveSheet.Paste 
    Range("B13").Select 
    Application.CutCopyMode = False 

If Range("C13").Value = Empty Then 
    Range("C14").Select 
    Selection.Copy 
    Range("C13").Select 
    ActiveSheet.Paste 
    Range("C13").Select 
    Application.CutCopyMode = False 

If Range("D13").Value = Empty Then 
    Range("D14").Select 
    Selection.Copy 
    Range("D13").Select 
    ActiveSheet.Paste 
    Range("D13").Select 
    Application.CutCopyMode = False 


If Range("E13").Value = Empty Then 
    Range("E14").Select 
    Selection.Copy 
    Range("E13").Select 
    ActiveSheet.Paste 
    Range("E13").Select 
    Application.CutCopyMode = False 


If Range("F13").Value = Empty Then 
    Range("F14").Select 
    Selection.Copy 
    Range("F13").Select 
    ActiveSheet.Paste 
    Range("F13").Select 
    Application.CutCopyMode = False 

    End If 
    End If 
    End If 
    End If 
    End If 

End Sub 

我想對於FillBlanks()只是第一子後運行,而無需做任何事情更多。所有的幫助將不勝感激。

非常感謝

+2

爲什麼不在第一個子結束時調用它? – Siva

回答

0

只需添加

Call FillBlanks 

End SubWorksheet_Change

0
Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim cl as Range 

    If Target.Address = "$J$3" Then 
     Call LD_Copy_Paste_Delete 
    End If 

    For each cl in Range("B13:F13") 
     If cl = "" Then 
      cl = cl.Offset(1, 0) 
     End if 
    Next cl 
End Sub 
0

什麼溼婆在他的評論中指出聽起來正確之前,但我想舉例說明幾點超越它。縮進對於使代碼易讀並理解正在發生的事情更爲重要。在下面的代碼中,我縮進並添加了Siva建議的更新,以及一些評論以幫助理解代碼的作用。

Private Sub Worksheet_Change(ByVal Target As Range) 

'When the user changes the selection to cell J3 then do the work 
If Target.Address = "$J$3" Then 
    'Adding a line to run fill blanks as Siva suggested 
    FillBlanks 
    Call LD_Copy_Paste_Delete 
End If 

End Sub 

Sub FillBlanks() 

If Range("B13").Value = Empty Then 
    Range("B14").Select 'There was an extra 's' here that would never have worked 
    Selection.Copy 
    Range("B13").Select 
    ActiveSheet.Paste 
    Range("B13").Select 
    Application.CutCopyMode = False 

    If Range("C13").Value = Empty Then 
     Range("C14").Select 
     Selection.Copy 
     Range("C13").Select 
     ActiveSheet.Paste 
     Range("C13").Select 
     Application.CutCopyMode = False 

     If Range("D13").Value = Empty Then 
      Range("D14").Select 
      Selection.Copy 
      Range("D13").Select 
      ActiveSheet.Paste 
      Range("D13").Select 
      Application.CutCopyMode = False 

      If Range("E13").Value = Empty Then 
       Range("E14").Select 
       Selection.Copy 
       Range("E13").Select 
       ActiveSheet.Paste 
       Range("E13").Select 
       Application.CutCopyMode = False 

       If Range("F13").Value = Empty Then 
        Range("F14").Select 
        Selection.Copy 
        Range("F13").Select 
        ActiveSheet.Paste 
        Range("F13").Select 
        Application.CutCopyMode = False 
       End If 
      End If 
     End If 
    End If 
End If 

End Sub 

嵌套If秒(這是更清晰的看到與縮進)意味着,例如,F13-F14 FillBlank將只有所有在別人面前是空白以及運行。

我不確定這是做這件事的最好方法還是你可能試圖實現的。我想建議可能幫助一些其他的選項: -

1.複製所有,如果F13是空

Sub FillBlanks() 

If Range("F13")= "" Then 
    Range("B14:F14").Copy Range("B13:F13") 
End If 

End Sub 

2.複製只空的,不管周圍的人

Sub FillBlanks() 

If Range("B13") = "" Then Range("B14").Copy Range("B13") 
If Range("C13") = "" Then Range("C14").Copy Range("C13") 
If Range("D13") = "" Then Range("D14").Copy Range("D13") 
If Range("E13") = "" Then Range("E14").Copy Range("E13") 
If Range("F13") = "" Then Range("F14").Copy Range("F13") 

End Sub 

在我已經使用其中End If可以如果要運行的聲明可以省略該特徵的第二個是一個單一的線

這可能是一個輕微的代碼審查,但希望它已作爲教育和回答了這個問題。