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

#excel #vba #excel-formula

Вопрос:

Я пытаюсь скопировать весь столбец листа в лист B. Столбец листа содержит значения, сформированные с помощью формул. Я копирую значения столбцов листа только с помощью xlPasteValues. Но это не вставка значений в другой лист. Столбец в таблице 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) amp; firstrowDB).PasteSpecial xlPasteValues
        End With
    Next
    Application.CutCopyMode = False

End Sub
 

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

1. Кажется, у меня все работает нормально. Вы получаете какие-либо ошибки?

2. Никаких ошибок. Столбец SheetB пуст

3. Вы пробовали пройти через код с главным окном рядом? Разбиение кода также может помочь найти вашу ошибку. Возможно, добавьте к нему некоторые .Select «ы», проходя через него, чтобы попытаться точно определить, что происходит, но, насколько я вижу, после запуска кода, насколько я могу судить, ничего не мешает коду работать, я больше ничего не могу предложить.

4. Использование метода переноса помогло мне, когда я получал значения #N/A при обычной копипасте

Ответ №1:

Если вы хотите просто скопировать весь столбец, вы можете значительно упростить код, сделав что-то вроде этого:

 Sub CopyCol()

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

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

End Sub
 

Или

 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
 

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

1. Я бы по возможности избегал использования буфера обмена для автоматизации. Если пользователь или другое приложение одновременно использует буфер обмена, данные могут оказаться в неожиданных местах. Это может привести к потере данных или даже утечке секретной информации.

Ответ №2:

поскольку вам нужны только скопированные значения, вы можете передавать значения arr1 непосредственно в arr2 и избегать копирования/вставки.

код внутри For цикла, внутри With блока, после lastrow вычисления:

 Sheets("SheetB").Range(arr2(i) amp; firstrowDB).Resize(lastrow).Value = .Range(arr1(i) amp; 1).Resize(lastrow).Value
 

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

1. Это должно быть ответом.

Ответ №3:

Лично я бы тоже немного сократил его, если все, что вам нужно, — это столбцы:

 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

Ответ №4:

Вы тоже можете использовать это

 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
 

Ответ №5:

У меня тоже была эта проблема раньше, и я думаю, что нашел ответ.

Если вы используете кнопку для запуска макроса, она, скорее всего, связана с другим макросом, возможно, сохраненной версией того, над чем вы сейчас работаете, и вы можете даже не осознавать этого. Попробуйте запустить макрос непосредственно из VBA (F5) вместо того, чтобы запускать его с помощью кнопки. Я предполагаю, что это сработает. Вам просто нужно переназначить макрос на кнопке на тот, который вы действительно хотите запустить.

Ответ №6:

вы можете использовать это:

 Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
 

Ответ №7:

выбор=выбор.значения

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

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

1. Пожалуйста, поясните, как это отвечает на первоначальный вопрос?

2. Это интересный способ переопределения данных в выборке только значениями, но на самом деле он не отвечает на заданный вопрос.