2016-07-29 71 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可以如果要运行的声明可以省略该特征的第二个是一个单一的线

这可能是一个轻微的代码审查,但希望它已作为教育和回答了这个问题。