Копировать только значения вставки (xlPasteValues)

Я пытаюсь скопировать весь столбец с листа А на лист Б. В столбце листа А есть значения, сформированные с помощью формул. Я копирую значения столбца SheetA только с помощью xlPasteValues ​​. Но это не вставка значений на другой листB. Столбец на листе B пуст. Мой код 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
Использование метода передачи помог мне, когда я получал # Н / Д значений при обычной копировальной пасте   -  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

selection = selection.values

это делает вещи очень быстрым способом.

person HARSHUL    schedule 04.01.2018
comment
Пожалуйста, поясните, как это отвечает на исходный вопрос? - person roelofs; 04.01.2018
comment
Это интересный способ переопределить данные в выборке только значениями, но на самом деле не решает заданный вопрос. - person OSUZorba; 22.02.2020