【问题标题】:Excel VBA Copy Paste issueExcel VBA复制粘贴问题
【发布时间】:2017-12-28 23:22:29
【问题描述】:

我正在使用 Excel VBA 复制粘贴。单元格 R7 具有公式 =Max ("C77:AD81")

  • R7 = 本月最高值
  • F7 = 迄今为止的最高值
  • Q7 = 达到 F7 的日期

我想要实现的是如果R7 > F7,将 R7 值复制到 F7 并将 Q7 更改为 = 今天。

我所做的只是将 R7 更改为 ("C77:AD81") 的最大值,而其余代码不起作用。我的代码如下。

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim rng As Range, r As Range, rv As Long


    If Not Intersect(Target, Range("R7")) Is Nothing Then
        Set rng = Intersect(Target, Range("R7"))
        For Each r In rng
            'Change Best Peak Flow and Date Achieved
            Select Case r.Value
            Case Is > ("F7")
            Case Range("R7").Select
            Case Range("R7").Copy
            Case Range("F7").Select
            Case Range("F7").Paste
            Case ("R7") = ("F7")
            Case Range("Q5").Select
            Range("Q5") = Today()
            Application.CutCopyMode = False
            End Select
        Next r
    End If

End Sub

【问题讨论】:

  • 我想你误解了Select Case的用法。我一会儿看看你的代码。
  • 感谢您的任何帮助。

标签: vba excel


【解决方案1】:

我的建议是不要使用 .select。您可以在没有单个 .select 的情况下对所有内容进行编程。记录和分析宏是学习 VBA 的一个很好的起点,但有时它们太复杂了。我更喜欢简单的解决方案,所以试试看:

Private Sub Worksheet_Change(ByVal Target As Range)

If Range("F7") <> Range("R7") Then
    Range("F7") = Range("R7")
    Range("Q5") = Date
End If
End Sub

【讨论】:

    【解决方案2】:

    我解决了。
    这是我使用的代码。

    Private Sub Worksheet_Change(ByVal Target As Range)
    
    'Change Best Peak Flow and Date Achieved
    
    If Range("R7").Value > Range("F7").Value Then
        Range("R7").Select
        Selection.Copy
        Range("F7").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Range("Q5").Select
        Selection.Copy
        Range("K7").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Application.CutCopyMode = False
    End If
    End Sub
    

    【讨论】:

      【解决方案3】:

      所以,您的 rng 对象只有 1 个单元格,因为您指定了 R7 的 1 个目标范围。话虽如此,您的For Each...Next 声明是多余的。

      我什至根本不会使用Select Case,但如果你以后想用它来构建它,我会留下它。

      试一试

      Private Sub Worksheet_Change(ByVal Target As Range)
      
          On Error GoTo ErrHandler    'Important to ensure events are reenabled
          Application.EnableEvents = False
      
          Dim rng As Range, r As Range, rv As Long
          Set rng = Intersect(Target, Range("R7"))
          If Not rng Is Nothing Then
              'Change Best Peak Flow and Date Achieved
              Select Case True
              Case r.Value > Range("F7").Value
                  Range("F7") = Range("R7")
                  Range("Q5") = Date
              End Select
          End If
      
          Application.EnableEvents = True
          Exit Sub
      ErrHandler:
          Application.EnableEvents = True
          MsgBox Err.Number & vbNewLine & Err.Description
      
      End Sub
      

      【讨论】:

      • 代码仍然只更新(“R7”),(“F7”)和(“Q5”)不更新。
      • 好答案。确保在 Worksheet_Change 事件中禁用事件并在退出时重新启用它们。如果不这样做,更改单元格将触发对 Worksheet_Change 的递归调用。
      • 我认为R7需要复制到F7。
      • 感谢 Ioannis 和 SJR 的输入,你们都是正确的。 @FatherGoose 我已更新代码以反映出现的问题。
      • 代码更新问题,("R7")、("F7")、("Q5")不更新,依然存在。对不起,作为一个学习者,我显然写了一些糟糕的代码。
      猜你喜欢
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      相关资源
      最近更新 更多