Копиране и поставяне само на стойности (xlPasteValues)

Опитвам се да копирам цялата колона в sheetA в Sheet B. Колоната sheetA има стойности, формирани с формули. Копирам стойности на колона SheetA само с помощта на xlPasteValues. Но не поставя стойностите в друг листB. Колоната в sheetB е празна. Моят VBA код

    Public Sub CopyrangeA()

    Dim firstrowDB As Long, lastrow As Long
    Dim arr1, arr2, i As Integer

    firstrowDB = 1
    arr1 = Array("BJ", "BK")
    arr2 = Array("A", "B")

         For i = LBound(arr1) To UBound(arr1)
        With Sheets("SheetA")
           lastrow = Application.Max(3, .Cells(.Rows.Count, arr1(i)).End(xlUp).Row)
           .Range(.Cells(1, arr1(i)), .Cells(lastrow, arr1(i))).Copy
           Sheets("SheetB").Range(arr2(i) & firstrowDB).PasteSpecial xlPasteValues
        End With
    Next
    Application.CutCopyMode = False

End Sub

person sam    schedule 29.05.2014    source източник
comment
Изглежда, че работи добре за мен. Получавате ли грешки?   -  person bmgh1985    schedule 29.05.2014
comment
Без грешки. Колоната SheetB е празна   -  person sam    schedule 29.05.2014
comment
Опитахте ли да преминете през кода с главния прозорец до него? Разбиването на кода може да помогне да откриете и вашата грешка. Може да добавите някои .Select към него, докато преминавате, за да се опитате да определите какво се случва, но тъй като изглежда, че няма нищо, което да спира работата на кода, доколкото мога да видя, след като го стартирах сам, няма много друго, което мога да предложа.   -  person bmgh1985    schedule 29.05.2014
comment
Използване на метода за прехвърляне ми помогна, когато получавах стойности #N/A при обикновено копиране   -  person William Humphries    schedule 06.03.2020


Отговори (7)


Ако искате просто да копирате цялата колона, можете да опростите много кода, като направите нещо подобно:

Sub CopyCol()

    Sheets("Sheet1").Columns(1).Copy

    Sheets("Sheet2").Columns(2).PasteSpecial xlPasteValues

End Sub

Or

Sub CopyCol()

    Sheets("Sheet1").Columns("A").Copy

    Sheets("Sheet2").Columns("B").PasteSpecial xlPasteValues

End Sub

Или ако искате да запазите цикъла

Public Sub CopyrangeA()

    Dim firstrowDB As Long, lastrow As Long
    Dim arr1, arr2, i As Integer

    firstrowDB = 1
    arr1 = Array("BJ", "BK")
    arr2 = Array("A", "B")

    For i = LBound(arr1) To UBound(arr1)

        Sheets("Sheet1").Columns(arr1(i)).Copy

        Sheets("Sheet2").Columns(arr2(i)).PasteSpecial xlPasteValues

    Next
    Application.CutCopyMode = False

End Sub
person OSUZorba    schedule 29.05.2014
comment
Бих избягвал да използвам клипборда за автоматизация, когато е възможно. Ако потребителят или друго приложение използва клипборда едновременно, данните може да попаднат на неочаквани места. Това може да причини загуба на данни или дори изтичане на класифицирана информация. - person jumxozizi; 02.02.2016

тъй като искате да се копират само стойности, можете да предадете стойностите на arr1 директно на arr2 и да избегнете копиране/поставяне. код вътре в цикъла:

      Sheets("SheetB").Range(arr2(i) & firstrowDB).Resize(lastrow, 1).Value = .Range(.Cells(1, arr1(i)), .Cells(lastrow, arr1(i))).Value
person robotik    schedule 22.01.2015
comment
Това трябва да е отговорът. - person wotter; 26.05.2020

Лично аз също бих го съкратил, ако всичко, от което се нуждаете, са колоните:

For i = LBound(arr1) To UBound(arr1)
    Sheets("SheetA").Columns(arr1(i)).Copy
    Sheets("SheetB").Columns(arr2(i)).PasteSpecial xlPasteValues
    Application.CutCopyMode = False
Next

тъй като от този кодов фрагмент, няма много смисъл в lastrow или firstrowDB

person bmgh1985    schedule 29.05.2014

Може да използвате и това

Sub CopyPaste()
Sheet1.Range("A:A").Copy

Sheet2.Activate
col = 1
Do Until Sheet2.Cells(1, col) = ""
    col = col + 1
Loop

Sheet2.Cells(1, col).PasteSpecial xlPasteValues
End Sub
person nishit dey    schedule 21.07.2017

И аз съм имал този проблем преди и мисля, че намерих отговора.

Ако използвате бутон за стартиране на макроса, той вероятно е свързан с друг макрос, може би запазена като версия на това, с което работите в момента, и може дори да не го осъзнавате. Опитайте да стартирате макроса директно от VBA (F5), вместо да го стартирате с бутона. Предполагам, че ще свърши работа. Просто трябва да преназначите макроса на бутона към този, който всъщност искате да стартирате.

person Blake Turner    schedule 30.07.2018

можете да използвате това:

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
person akallali    schedule 21.05.2015

селекция=селекция.стойности

това прави нещата по много бърз начин.

person HARSHUL    schedule 04.01.2018
comment
Моля, изяснете как това отговаря на първоначалния въпрос? - person roelofs; 04.01.2018
comment
Това е интересен начин за замяна на данни в селекция само със стойности, но всъщност не отговаря на зададения въпрос. - person OSUZorba; 22.02.2020