VBA-скрипт для копирования и вставки последнего столбца данных на нескольких листах рабочей книги

#excel #vba

#excel #vba

Вопрос:

Мне нужен скрипт, который берет последний столбец данных в рабочей книге и копирует и вставляет эти данные в столбец сразу справа. Моя проблема в том, что мне нужно сделать это для нескольких определенных листов в рабочей книге, поэтому я пытаюсь использовать цикл, и я не могу понять код, чтобы заставить его работать. Любая помощь приветствуется.

 Sub CopyPaste()

Dim sArray
Dim lc As Long

Set sArray = Sheets(Array("sht3", "sht5", "sht7", "sht9", "sht11", "sht13", "sht15", "sht17" _
, "sht19", "sht21", "sht23", "sht25", "sht27", "sht29"))

For Each Sheet In sArray

lc = Cells(1, Columns.Count).End(xlToLeft).Column
Columns(lc).Copy
Cells(1, lc   1).PasteSpecial Paste:=xlPasteAll

Next

End Sub
  

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

1. Вам нужно вставлять его на каждый лист, кроме того, с которого вы копируете?

2. Нет копирования и вставки последнего столбца на каждом листе по отдельности. Другими словами, скопируйте и вставьте последний столбец на каждом листе и только на этом листе, а затем проделайте то же самое для каждого листа.

3. Я ответил вам циклом, который проходит через все листы в рабочей книге без необходимости их объявления.

Ответ №1:

Если я понял ваш вопрос, это должно решить его:

 Option Explicit
Sub CopyPaste()

    Dim ws As Worksheet
    Dim lc As Integer
    Dim sArray As Variant

    Set sArray = Sheets(Array("sht3", "sht5", "sht7", "sht9", "sht11", "sht13", "sht15", "sht17" _
                        , "sht19", "sht21", "sht23", "sht25", "sht27", "sht29"))

    For Each ws In sArray
        With ws
            lc = .Cells(1, .Columns.Count).End(xlToLeft).Column
            .Cells(1, lc).EntireColumn.Copy .Cells(1, lc   1)
        End With
    Next ws

End Sub
  

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

1. Как я могу адаптировать это, чтобы просматривать только определенные листы? Я не хочу, чтобы этот макрос выполнялся на каждом листе в рабочей книге

2. @SOJ3 попробуйте ответ от SJR, если не сработает, даст вам обходной путь.

3. Привет, Дамиан, не повезло с твоим, я получаю сообщение об ошибке в строке «next ws»

4. Привет, Дамиан, это очень близко, но он скопировал столбец A и вставил в столбец B, мне нужен скрипт для копирования и вставки в другой спектр, поэтому скопируйте последний столбец (не первый) и вставьте в столбец справа.

5. При этом используется последний столбец, предполагающий, что у вас есть данные в строке 1. если ваши данные начинаются с другой строки, измените 1 на .Cells(1. .Columns.Count) номер строки, в которой находятся ваши данные

Ответ №2:

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

 Sub CopyPaste()

Dim sArray
Dim lc As Long

Set sArray = Sheets(Array("sht3", "sht5", "sht7", "sht9", "sht11", "sht13", "sht15", "sht17" _
                    , "sht19", "sht21", "sht23", "sht25", "sht27", "sht29"))

For Each Sheet In sArray
    lc = Sheet.Cells(1, Columns.Count).End(xlToLeft).Column
    Sheet.Columns(lc).Copy
    Sheet.Cells(1, lc   1).PasteSpecial Paste:=xlPasteAll
Next

End Sub
  

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

1. Привет, SJR, кажется, это работает, но он копирует первый столбец на листе, мне нужно, чтобы скопировать последний столбец справа. Другими словами, последний столбец, содержащий данные, находится в столбце L, и мне нужно, чтобы он копировал и вставлял данные из столбца L в столбец M, но последний столбец с данными в нем отличается для каждого листа

2. используйте мой способ копирования и вставки @SOJ3

3. У вас есть данные в первой строке каждого листа?

4. Спасибо, SJR, я этого не сделал, что было моей проблемой. Спасибо за помощь!!

Ответ №3:

Ниже я предлагаю две альтернативы для перебора определенных листов, чтобы вы начали:

 Dim sht As Worksheet
For Each sht In ThisWorkbook.Worksheets
    If sht.Name = "Something" Or sht.Name = "Something else" Then 'and so on and so forth...
        'do something
    End If
Next sht
  

или

 Dim shtCollection As New Collection
Dim sht As Worksheet
With shtCollection
    .Add ThisWorkbook.Worksheets("Something")
    .Add ThisWorkbook.Worksheets("Something else")
    'and so on and so forth...
End With
For Each sht In shtCollection
    'do something
Next sht