【问题标题】:If cell Value Changed Then run different If statements如果单元格值已更改,则运行不同的 If 语句
【发布时间】:2016-07-29 10:32:46
【问题描述】:

我目前正在尝试制作一个可用于输入和存储大量数据的电子表格。加快数据输入过程的一种方法是从前一行复制数据。到目前为止,我所拥有的是:

 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() 在第一个 sub 之后运行,而无需执行任何其他操作。我们将不胜感激。

非常感谢

【问题讨论】:

  • 为什么不在第一个 sub 结束时调用它?

标签: excel vba if-statement onchange is-empty


【解决方案1】:

只需添加

Call FillBlanks

就在End SubWorksheet_Change 之前

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:

      Siva 在他的评论中所说的听起来是正确的,但我想举几个例子。缩进对于使代码可读和更容易理解发生的事情很重要。在下面的代码中,我按照 Siva 的建议缩进并添加了更新,以及一些 cmets 以帮助理解代码的作用。

      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
      

      嵌套的Ifs(通过缩进更清楚地看到)意味着,例如,F13-F14 FillBlank 只有在 all 之前的其他部分也为空时才会运行。

      我不确定这是执行此操作的最佳方式或您可能一直在尝试实现的目标。我想建议一些其他可能有帮助的选项:-

      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 如果要运行的语句是单行则可以省略的功能

      这可能有点过度代码审查,但希望它可以作为一种教育并回答问题。

      【讨论】:

        猜你喜欢
        • 2018-10-29
        • 1970-01-01
        • 1970-01-01
        • 2019-09-29
        • 2012-09-06
        • 1970-01-01
        • 1970-01-01
        • 2021-12-27
        • 1970-01-01
        相关资源
        最近更新 更多