VBA копирование диапазона ячеек в диапазон в другой книге

#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