#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. Это интересный способ переопределения данных в выборке только значениями, но на самом деле он не отвечает на заданный вопрос.