#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