VBA Selection.Copy копирует совершенно другой диапазон при запуске моего кода - PullRequest
0 голосов
/ 24 июня 2019

Я потратил день, пытаясь понять, что происходит с моим Excel. Я запускаю какой-то код, который раньше работал нормально, я изменил его часть рано (но все еще работает отлично), а теперь и Selection. Копирование позже в коде перестало работать. Вот оно:

 Range("AE3").Select
 Range(Selection, Selection.End(xlDown)).Select
 Selection.Copy

Я использовал точки останова, чтобы найти проблему. После первых двух строк кода выбираются данные в столбце AE. Когда я перехожу к последней строке (Selection.Copy), выбираются не данные в AE, а столбцы AA и AB. Я пытался буквально все, что я могу придумать, чтобы попытаться это исправить, но ничего не могу найти ...

Если я запускаю код до этой точки кода и выполняю выделение и копирование вручную, он также копирует неправильные ячейки (он копирует AA и AB, как это делается с помощью vba)

Я бы выложил скриншоты, но вы не можете выложить здесь фотографии, кажется.

Спасибо за вашу помощь!

Решено:

Я шаг за шагом прошел через код и заметил, что ранее в коде я копировал данные из столбцов AA и AB в нижние столбцы. Для этого я выбрал столбцы, а затем скопировал их. Я изменил это так, что я выбрал только данные в столбцах, а не сами столбцы, и скопировал данные. Это изменение заставило мой код работать. Я не уверен, почему это оказало влияние на более позднюю Selection.Copy, но это было в некотором роде. Спасибо всем за помощь!

Ответы [ 3 ]

1 голос
/ 24 июня 2019

Как я уже говорил в своем комментарии, избегать использования .Select & Selection, обычно это плохая практика, и почти все можно сделать в VBA без необходимости их использования. Я понимаю, что это результат рекордера (который является хорошим местом, чтобы начать изучать, как делать определенные вещи в VBA), просто нужно научиться использовать код, сгенерированный рекордером.

Посмотрите, поможет ли это (см. Также комментарии в коде):

Sub copyRange()

Dim ws As Worksheet
Set ws = ActiveWorkbook.Sheets("Sheet1") 'use a variable for the sheet you want to use

Dim lRow As Long
lRow = ws.Cells(Rows.Count, "AE").End(xlUp).Row 'get the last row at the desired column

With ws
    .Range("AE3:AE" & lRow).Copy _
        Destination:=.Range("AE3:AE" & lRow).Offset(0, -10) 'destination offset 10 columns to the left
        'or alternatively specify the destination
        'Destination:=.Range("U3:U" & lRow)
End With

'ALTERNATIVE to the above - copy values only
With ws.Range("AE3:AE" & lRow)
    .Offset(0, -10).Value = .Value 'destination offset 10 columns to the left
        'or alternatively specify the destination
    'ws.Range("U3:U" & lRow).Value = .Value
End With

'2nd ALTERNATIVE to the above - copy values only
With ws.Range(ws.Cells(3, 31), ws.Cells(lRow, 31))
    .Offset(0, -10).Value = .Value 'destination offset 10 columns to the left
        'or alternatively specify the destination
    ws.Range(ws.Cells(3, 21), ws.Cells(lRow, 21)).Value = .Value
End With

End Sub

Обратите внимание на использование оператора With, .Range(...) отличается от Range(...).

0 голосов
/ 24 июня 2019

Вы можете попробовать:

Option Explicit

Sub test()

    Dim LastRow As Long
    'Create a with statement refer to the sheet where your data are
    With ThisWorkbook.Worksheets("Sheet1")
        'Find the LastRow of column AE
         LastRow = .Cells(.Rows.Count, "AE").End(xlUp).Row
         'Refer to the range starting from AE3 and ends at Lastrow
         .Range("AE3" & ":AE" & LastRow).Copy
    End With

End Sub

Результаты: enter image description here

0 голосов
/ 24 июня 2019

Если вы хотите скопировать все в столбце AE, попробуйте это:

Range("EA3:EA" & Range("EA" & Rows.Count).End(xlUp).Row)).Copy

А для вставки вы можете использовать:

Range("U3").PasteSpecial (xlPasteValues)

Кроме того, я настоятельно рекомендую вам прочитать:

Как избежать использования Select в Excel VBA

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