В VBA для Excel зачем использовать activecell и activesheet при копировании и вставке информации, полученной на другом листе? - PullRequest
0 голосов
/ 02 апреля 2020

Я следую инструкциям на YouTube по VBA для Excel. В одном сегменте руководства цель состоит в том, чтобы скопировать информацию с одного листа и вставить ее в определенные ячейки c на другом листе в одной и той же книге. Правильный фрагмент кода для этого процесса, приведенный в этой части видео:

    Public Sub PopPandL()

Dim x As Integer
Dim sheet_title As String

For x = 1 To Worksheets.Count - 1

Worksheets(x).Select
sheet_title = ActiveSheet.Name
Sheets("P&L").Select

Selection.Offset(x * 5 + 2, 0).Select
Selection.Value = sheet_title
Worksheets(x).Select

Range("A1").Select
Selection.CurrentRegion.Copy
Sheets("P&L").Select

ActiveCell.Offset(1, 0).Select
ActiveSheet.Paste

Next x

End Sub

Мой вопрос касается компонентов activecell и activesheet этого кода. Для экспериментов, когда я пытаюсь использовать:

Selection.Offset(1, 0).Select
Selection.Paste

в качестве альтернативы, я получаю сообщение об ошибке, говорящее о том, что объект не поддерживает это свойство или метод. Почему это?

Ответы [ 2 ]

3 голосов
/ 02 апреля 2020

Как сказал @Bigben - видео на YouTube не гарантируется. Здесь нет ни ответов, ни форумов.

Как сказал @HTH (извините, я не совсем понял, к чему он клонил, пока я не попробовал).
Вставить - это метод рабочего листа, и вы пытаетесь использовать это в диапазоне на листе.
ActiveSheet.Paste вставит в выбранную ячейку на активном листе.

Говоря все это, я думаю, что это код, который вы ищете:

Public Sub PopPandL()
    Dim wrksht As Worksheet
    Dim PasteToRow As Long

    For Each wrksht In ThisWorkbook.Worksheets
        If wrksht.Name <> "P&L" Then
            PasteToRow = wrksht.Index * 5 + 2
            ThisWorkbook.Worksheets("P&L").Cells(PasteToRow, 1) = wrksht.Name
            wrksht.Range("A1").CurrentRegion.Copy _
                Destination:=ThisWorkbook.Worksheets("P&L").Cells(PasteToRow + 1, 1)
        End If
    Next wrksht
End Sub

На заметку, я бы не стал использовать CurrentRegion, так как это может привести к неверным результатам - либо используйте метод, чтобы найти последнюю ячейку на листе, содержащем данные (если это то, что вам нужно), либо, возможно, поместите ваши данные в таблицу и используйте ListObjects.

0 голосов
/ 02 апреля 2020

Это решение, которое я смоделировал для вас. Как сказано в комментарии, настоятельно рекомендуется не использовать Selection [или Activate, как в комментарии ниже]:

Обновленный код без Активировать

'Copy from A1 of the Active Sheet
Dim mySelection As Range
Set mySelection = Range("A1")
mySelection.CurrentRegion.Copy

'Goto Sheet P&L
Sheets("P&L").Activate

'Convert the current R
'Goto the Last Line of the Sheet P&L (That's the Offsite want to do)
Dim PLLastRow As Range
Set PLLastRow = Sheets("P&L").Range(Selection.Address).Offset(1, 0)

'Paste the Clipboard on that last Sheet
PLLastRow.PasteSpecial

Старый код ниже: 'Копировать из A1 активного диапазона листов ("A1"). Активировать Selection.CurrentRegion.Copy

'Goto Sheet P&L
Sheets("P&L").Activate

'Convert the current R
'Goto the Last Line of the Sheet P&L (That's the Offsite want to do)
Dim PLLastRow As Range
Set PLLastRow = Sheets("P&L").Range(Selection.Address).Offset(1, 0)

'Activate the Cell
PLLastRow.Activate

'Paste the Clipboard on that last Sheet
PLLastRow.PasteSpecial  '<--- Use PasteSpecial as Paste doesn't exist 

Надеюсь, что это будет помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...