#excel #vba
#excel #vba
Вопрос:
Sub foo2()
Dim x As Workbook
Dim y As Workbook
'## Open both workbooks first:
Set x = Workbooks.Open("pathoffile.xlsx")
Set y = Workbooks.Open("pathoffile.xlsm")
'Now, transfer values from x to y:
y.Sheets("Main").Range("AH5:AH994").Value = x.Sheets("Database").Range("B2:B991")
'Close x:
x.Close
End Sub
Мой код выглядит следующим образом. Я пытаюсь скопировать диапазон данных из одной книги и поместить его в другую. Я не могу заставить это работать с диапазоном данных. Например, если я предоставлю диапазон AH5: AH994 для листа y и один диапазон B2 для листа x, он будет запущен и заполнит диапазон данными из B2. Возможно ли захватить весь диапазон, B2: B991 и скопировать его в AH5: AH994, учитывая, что они одинакового размера?
Комментарии:
1. Я бы добавил недостающее
.Value
в конце.Range("B2:B991")
… иначе это должно сработать.2. Если вы просто хотите работать
Range("B2")
, вы можетеResize
использовать то же количество строк и столбцов,Range("AH5:AH994")
что и .3. @BigBen не знал, что мне нужен тег .Value, работает сейчас. Ценю это! Поскольку я не могу принять ваш комментарий в качестве ответа, я приму другой ответ, чтобы закрыть эту тему.
Ответ №1:
x.Sheets("Database").Range("B2:B991").Copy Destination:=y.Sheets("Main").Range("AH5:AH994")
или, если вам нужны только значения:
x.Sheets("Database").Range("B2:B991").Copy
y.Sheets("Main").Range("AH5:AH994").PasteSpecial(xlPasteValues)
но передача значений должна работать и избегать буфера обмена:
y.Sheets("Main").Range("AH5:AH994").Value = x.Sheets("Database").Range("B2:B991").Value
Комментарии:
1. Спасибо за альтернативные решения, комментарий BigBen решил мою проблему, но я отмечу этот ответ для других, у кого может возникнуть аналогичная проблема.
2. Надеюсь, вы не возражаете, если я добавлю здесь перенос значений в качестве потенциального варианта. Таким образом, будущие читатели знают, как его использовать, и избегают буфера обмена.
3. Я согласен, что ответ BigBens лучше, но также я действительно думал, что использование метода copy с параметром Destination позволяет избежать использования буфера обмена, но после его тестирования на самом деле кажется, что он очищает буфер обмена… странно
Ответ №2:
Копирование диапазона столбцов в другую книгу
Настройка
- В одной книге находятся исходные данные в столбце
B
, начиная со 2-й строки (ячейкиB2
). Количество строк будет вычислено во время выполнения. - Цель состоит в том, чтобы скопировать данные (только значения) в диапазон столбцов, начинающийся с ячейки
AH5
в другой книге.
Результат
-
Например
sRng = .Range("B2:B5")
, после вычисленияtCell = .Range("AH5")
значения можно скопировать следующим образом:tCell.Resize(sRng.Rows.Count).Value = sRng.Value
Код
Option Explicit
Sub ValuesFromRangeToFirstCell()
Const sFirstCell As String = "B2"
Const tFirstCell As String = "AH5"
Dim src As Workbook
Set src = Workbooks.Open("pathoffile.xlsx")
With src.Sheets("Database")
' Define Source Column Number.
Dim sColumn As Long
sColumn = .Range(sFirstCell).Column
' Define Source Last Row Number.
Dim sLastRow As Long
sLastRow = .Cells(.Rows.Count, sColumn).End(xlUp).Row
' Define Source Column Range.
Dim sRng As Range
Set sRng = .Range(sFirstCell, .Cells(sLastRow, sColumn))
End With
Dim tgt As Workbook
Set tgt = Workbooks.Open("pathoffile.xlsm")
With tgt.Sheets("Main")
' Define Target First Cell Range.
Dim tCell As Range
Set tCell = .Range(tFirstCell)
End With
' Copy values from Source Column Range to Target Column Range.
tCell.Resize(sRng.Rows.Count).Value = sRng.Value
src.Close
End Sub