代码之家  ›  专栏  ›  技术社区  ›  Mark

PasteSpecial(格式和值)

  •  0
  • Mark  · 技术社区  · 7 年前

    我有一个创建表格的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
    

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

    2 回复  |  直到 7 年前
        1
  •  1
  •   ChrisB    7 年前

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

    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
    
        2
  •  -1
  •   ChrisB    7 年前

    您可以使用 PasteSpecial 使用 xlPasteValuesAndNumberFormats 选项

    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