Как скопировать диапазон в другую рабочую таблицу для каждого цикла? - PullRequest
1 голос
/ 02 ноября 2019

Я хотел бы скопировать диапазон на другой лист и вставить перед ним 2 столбца на новом листе. Он не копирует исходный диапазон.

Это работает, если я копирую на тот же лист.

Set ws = ThisWorkbook.Sheets("Sh2")
Set ws2 = ThisWorkbook.Sheets("Sh3")
Set wb = ThisWorkbook

rowNum = ws.UsedRange.Rows.Count

For Each row In ws.Range("A1:A" & rowNum)
    ws2.Range("A1:A" & rowNum).Offset(0, 0).Value2 = wb.Name
    ws2.Range("A1:A" & rowNum).Offset(0, 1).Value2 = ws.Name
Next row

For Each cell In ws.UsedRange
    cell.Offset(10, 2).Value2 = cell.Value2
Next cell

Я ожидаю, что столбец "A" содержит имя активной книги,«B» - имя активной рабочей таблицы, остальные строки содержат исходное содержимое. Теперь имя файла и имя рабочего листа скопированы в новый рабочий лист, а содержимое нет.

1 Ответ

0 голосов
/ 03 ноября 2019

Направление вашего кода близко, надеюсь, этот пример поможет. Но сначала, пожалуйста, всегда используйте Option Explicit в вашем коде.

При настройке ваших начальных переменных для рабочих таблиц использование более описательных имен переменных делает более ясным, какая именно переменная предназначена для храненияопределенные данные. Мой пример настройки:

Dim wb As Workbook
Dim srcWS As Worksheet
Dim dstWS As Worksheet
Set wb = ThisWorkbook
Set srcWS = wb.Sheets("Sh2")
Set dstWS = wb.Sheets("Sh3")

Далее вы можете создать переменную для определения области диапазона ваших исходных данных:

Dim srcRange As Range
Set srcRange = srcWS.UsedRange

В случае, если вы хотите создать свойПервые два столбца содержат имена книг и рабочих таблиц, вам на самом деле не нужен цикл. Создав Range нужного вам размера, один оператор поместит одинаковое значение во все ячейки в этом диапазоне. Поэтому вы можете создать столбцы имен в двух операторах, используя

dstWS.Range("A1").Resize(srcRange.Rows.Count, 1) = wb.Name
dstWS.Range("B1").Resize(srcRange.Rows.Count, 1) = srcWS.Name

Я установлю целевой диапазон, который начинается в третьем столбце, справа от двух столбцов имен:

Dim dstRange As Range
Set dstRange = dstWS.Range("C1").Resize(srcRange.Rows.Count, _
                                        srcRange.Columns.Count)

Затем, с той же идеей, вы также можете скопировать весь исходный диапазон к месту назначения в одном выражении:

dstRange.Value = srcRange.Value

И все готово.

Вотвесь пример в одном блоке:

Option Explicit

Sub CopyMyRange()
    Dim wb As Workbook
    Dim srcWS As Worksheet
    Dim dstWS As Worksheet
    Set wb = ThisWorkbook
    Set srcWS = wb.Sheets("Sh2")
    Set dstWS = wb.Sheets("Sh3")

    Dim srcRange As Range
    Set srcRange = srcWS.UsedRange

    dstWS.Range("A1").Resize(srcRange.Rows.Count, 1) = wb.Name
    dstWS.Range("B1").Resize(srcRange.Rows.Count, 1) = srcWS.Name

    Dim dstRange As Range
    Set dstRange = dstWS.Range("C1").Resize(srcRange.Rows.Count, _
                                            srcRange.Columns.Count)
    dstRange.Value = srcRange.Value
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...