1

Я понимаю, что лучше избегать использования каких-либо выделений в вашем коде, но это скорее из любопытства, чем что-либо еще. Если вы выберете ячейку, а затем измените свой лист, выбор в неактивном листе запоминается.

Показывать; если я сделаю что-то вроде

Sub schrodingers_copy()
Range("a1").Copy
Worksheets(2).Paste
End Sub

Затем я могу вставить ячейку А1 в активном листе в любой "выбранный" в настоящее время "выбранный" на неактивном листе

Есть ли способ получить или изменить этот "выбор"?

3 ответа3

3

Спектр.Клетки

Поскольку свойство Item является свойством по умолчанию для объекта Range, вы можете указать индекс строки и столбца сразу после ключевого слова Cells. Для получения дополнительной информации см. Свойство Item и примеры для этой темы.

Использование этого свойства без квалификатора объекта возвращает объект Range, который представляет все ячейки активной рабочей таблицы.

мой акцент


Вы не определяете свой диапазон, поэтому это происходит

Sub schrodingers_copy()
Range("a1").Copy
Worksheets(2).Paste
End Sub

Range("a1") относится к _GLOBAL.Range("a1") где _GLOBAL относится к Activesheet .

Если бы вы уточнили оригинал .Range с листа, это не произойдет. Неважно, если вы действительно используете .Select или нет.


Примеры

Запустите это, пока Sheet1 активен. Затем запустите его снова (Sheet2 будет активен)

Sub BadKitty()
    Sheet1.Cells(1, 1).Select
    MsgBox Selection.Parent.Name
    Sheet2.Activate
    Selection = "What sheet is this"
    MsgBox Selection.Parent.Name
End Sub

Выберите C3 на Sheet4, затем перейдите к Sheet3 и выберите A1. Тогда посмотрите, что здесь происходит

Sub DontOpenTheBox()
    Dim x As String
    Range("A1").Select
    Sheet2.Range("B2") = Selection.Address
    Selection = "what sheet is this? "
    Sheet4.Activate
    x = Selection.Parent.Name
    MsgBox x
    Sheet3.Range("B2") = Selection.Address
End Sub
2

Документация MSDN для Worksheet.Paste состояний относительно необязательного параметра Destination :

Объект Range, который указывает, куда следует вставить содержимое буфера обмена. Если этот аргумент опущен, используется текущий выбор.

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

Если вы не указали аргумент Destination, вы должны выбрать диапазон назначения, прежде чем использовать этот метод.

Этот метод может изменить выбор листа в зависимости от содержимого буфера обмена.

Так что ваш вопрос полностью сводится к тому, как Worksheet.Paste имеет дело с параметром Destination когда он опущен, а буфер обмена содержит объект Range .

Теперь, как говорилось в других ответах, неквалифицированный вызов Range неявно ссылается на ActiveSheet , поэтому ваш буфер обмена содержит ActiveSheet.Range("A1") после копирования:

Range("a1").Copy

Когда вы Paste , вы определяете место назначения - неявно; место назначения должно быть на том рабочем листе, на который ссылается Worksheets(2) , потому что это то, что вы называете .Paste против, и вы не указали параметр Destination.

Учти это:

Sheet1.Range("A1") = "test"
Sheet1.Range("A1").Copy

Sheet3.Paste 'destination is [Sheet3!A1]
Sheet3.Paste Sheet1.Range("A2") 'destination is [Sheet1!A2]

Поэтому, когда Destination , не имеет значения, с каким листом вы квалифицировали вызов Paste . Ты спрашиваешь:

Есть ли способ получить или изменить этот "выбор"?

Да: укажите значение для параметра Destination !

0

Если я понимаю ваш вопрос, будет ли такой метод работать:

Sub testSelection()
' This is to show how to work with .Selection, but not actually
' using .Select/.Selection.  We're going to take the value in
' Sheet1, SELECTION, and place that value in the selection of Sheet2, B2.

Dim theSelection As Range
Set theSelection = Selection
Debug.Print theSelection.Address

Sheets("Sheet2").Activate
Sheets("Sheet2").Cells(2, 2).Value = theSelection.Value

'Now, we want to move ONE CELL RIGHT of the Sheet1 selection
Set theSelection = theSelection.Offset(0, 1)
Debug.Print theSelection.Address

End Sub

Опять же, это лучшая практика, чтобы избежать .Select когда это возможно, чтобы как можно быстрее я установил для него диапазон.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .