【问题标题】:PasteSpecial (Format and Value)PasteSpecial(格式和值)
【发布时间】:2018-01-23 21:03:32
【问题描述】:

我有一个创建表格的 excel 程序/按钮。输入在工作表 1 上的单行/多列中。输出相同,但在工作表 2 上。两列工作表上的标题相同。在输入表上,其中一个列标题有一个下拉菜单,而其他列标题有公式。当我单击一个按钮时,该行被复制/粘贴到输出表。我可以通过从下拉框中选择不同的项目并按下按钮来运行程序以填充工作表 2 上的表格来重复该过程。问题是我只想复制和粘贴值。更改工作表 1 上的下拉框会将所有信息更改为工作表 2 上的同一项目。

代码如下:

Sub AddHardware()
    Range("b5:m6").Copy Sheets("MTO").Range("B" & rows.Count).End(xlUp).Offset(1, 0)                
End Sub

如何仅粘贴值和格式(无公式或下拉菜单)?

【问题讨论】:

  • 由于您要处理多个工作表,因此您可能希望显式使用每个工作簿,就像您对 Sheets("MTO").range 所做的那样,而不是使用 rows.count(这是 on活动表。)此外,您的“下拉”菜单是数据验证,过滤器,组合框,......
  • 这是一个数据验证列表。
  • 您不能简单地在两个单元格的 .Value 成员之间进行分配,或者如果它是一个范围则遍历它们?如果它是一个范围,你也可以使用 Copy 然后 PasteSpecial,但它使用剪贴板。

标签: excel vba copy paste


【解决方案1】:

这里有一个简单的方法来做到这一点。你可以做值,然后格式化。我使用了两个变量(可能是矫枉过正),但它将向您展示如何使用范围来设置复制/目标范围,这从长远来看会有所帮助。

Sub copy_val_format()
    Dim copyRng As Range
    Dim destRng As Range
    Set copyRng = Sheets("Sheet1").Range("B5:M6")
    Set destRng = Sheets("MTO").Range("B" & rows.Count).End(xlUp).Offset(1, 0)

    copyRng.Copy
    destRng.PasteSpecial (xlPasteValues)
    copyRng.Copy
    destRng.PasteSpecial (xlPasteFormats)

    Application.CutCopyMode = False
End Sub

或更简单的版本:

Sub simpler()
    Dim lastCell as Range
    Set lastCell = Sheets("MTO").Range("B" & Rows.Count).End(xlUp).Offset(1, 0)

    Sheets("Sheet1").Range("B5:M6").Copy
    lastCell.PasteSpecial (xlPasteValues)

    Sheets("Sheet1").Range("B5:M6").Copy
    lastCell.PasteSpecial (xlPasteFormats)
    Application.CutCopyMode = False
End Sub

【讨论】:

  • 谢谢,布鲁斯韦恩。这行得通。我有一些合并的单元格,但我修复了它。它执行复制和粘贴工作,但是当它复制边框时,它会将它们放在单元格中的值下方的一行。除了有比我需要的更多的无花果这一事实之外,单元格的值也很明显。这使用了更简单的版本。
  • @Mark - D'oh,看看我的编辑。它正在将格式添加到下面的一行,因为当您将数据添加到 MTO 工作表时,它会在 that 数据上重新运行 ...End(xlUp),因此有一个额外的行。它现在应该可以工作了。
  • 太棒了!谢谢!完美运行!
  • @Mark 很高兴它成功了!您可以通过单击帖子左侧向上/向下箭头下方的复选标记将其标记为答案。
【解决方案2】:

您可以将PasteSpecialxlPasteValuesAndNumberFormats 选项一起使用。

Range("B5:M6").Copy
Sheets("MTO").Range("B" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial _
                Paste:=xlPasteValuesAndNumberFormats, _
                Operation:=xlNone, SkipBlanks:=False, Transpose:=False

复制操作后,我有时想清除剪贴板,以免意外粘贴复制的范围。我使用这个程序:

Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function CloseClipboard Lib "user32" () As Long

Public Sub ClearClipboard()
    OpenClipboard (0&)
    EmptyClipboard
    CloseClipboard
End Sub

您可以将其添加到常规代码模块的顶部,然后使用这行代码从您的任何过程中调用它:

ClearClipboard

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多