Копирование в Excel VBA

#excel #vba #windows

#excel #vba #Windows

Вопрос:

Я просмотрел код для копирования-вставки в VBA. Когда вы это делаете, .PasteSpecial есть ли какая-либо разница между Paste:= или () (просто используя круглые скобки); например:

Worksheets(1).Range("A2").PasteSpecial Paste=:xlPasteValues

или

Worksheets(1).Range("A2").PasteSpecial (xlPasteValues)

отличается ли это каким-либо образом?

Комментарии:

1. Я не думаю, что понимаю ваш запрос, но разница в двух операторах заключается в том, что: ваш оператор post или копирует данные в диапазон, ничего не помещая в буфер обмена. Ваша инструкция pre или копирует данные из буфера обмена в соответствии с указанными вами требованиями

Ответ №1:

Да, они разные

полная функция

 PasteSpecial([Paste As XlPasteType = xlPasteAll], [Operation As XlPasteSpecialOperation = xlPasteSpecialOperationNone], [SkipBlanks], [Transpose])
  

вы можете заметить, что все аргументы являются необязательными
это .PasteSpecial Paste=:xlPasteValues означает Set arg Paste to xlPasteValues

а также
.PasteSpecial SkipBlanks:=True, Paste:=xlPasteValues означает Set arg SkipBlanks to True and Set arg Paste to xlPasteValues

Но
.PasteSpecial (xlPasteValues) означает Set FIRST arg to xlPasteValues

Ответ №2:

Исследование копирования / вставки (PasteSpecial)

  • Поместите некоторые данные в диапазон A1:A10 и прокомментируйте те части кода, которые вам в данный момент не нужны, чтобы увидеть различия.

Код

 Option Explicit

Sub PSpecInv()

    Const wsID As Variant = 1 ' e.g. "Sheet1" or 1 or...
    Const srcAddress As String = "A1:A10"
    Const tgtAddress As String = "B1"
    
    Dim wb As Workbook: Set wb = ThisWorkbook
    Dim ws As Worksheet: Set ws = wb.Worksheets(wsID)
    Dim src As Range: Set src = ws.Range(srcAddress)
    Dim tgt As Range: Set tgt = ws.Range(tgtAddress)
    
' Copy/Paste

    ' Equivalents of a 'normal' copy/paste
    'The 'Selection' stays the same, 'CutCopyMode' is set to 'False'.
    src.Copy tgt
    src.Copy Destination:=tgt

' Copy/PasteSpecial

    ' After each of the following three code blocks, the 'Selection'
    ' on the worksheet becomes the Target Range ('B1:B10') and
    ' the 'CutCopyMode' gets set to 'True'.
    ' Equivalents of a 'PasteValues' copy/paste
    src.Copy
    tgt.PasteSpecial xlPasteValues
    tgt.PasteSpecial Paste:=xlPasteValues
    ' I don't know why the following line even works!
    tgt.PasteSpecial (xlPasteValues) ' works only if first argument (solo).
    'Application.CutCopyMode = False

' Copy/PasteSpecial: Two Ways

    ' You have to know the order of the arguments:
    src.Copy
    tgt.PasteSpecial xlPasteValues, , True
    'Application.CutCopyMode = False

    ' You don't care about the order of the arguments:
    src.Copy
    tgt.PasteSpecial SkipBlanks:=True, Paste:=xlPasteValues
    'Application.CutCopyMode = False
    
' The 'Assign' method (preferred)

    'The 'Selection' stays the same, 'CutCopyMode' stays the same.
    tgt.Resize(src.Rows.Count, src.Columns.Count).Value = src.Value

End Sub