2015-05-22 2 views
2

Я хочу иметь макрос, который сначала активирует конкретный рабочий лист, а затем выбирает конкретную ячейку. Однако, когда я запускаю код ниже, я получаю следующее сообщение: «Ошибка времени выполнения:« 1004 »: выбор метода класса Range не удался». Что я делаю не так?Выбрать ячейки из функции в VBA

Function selectingCells(myWs As String, myCell As Range) 

    Sheets(myWs).Activate 
    myCell.Select 

End Function 



Sub callingFunction() 

    Call selectingCells("Data", Range("A1")) 
    Call selectingCells("Picklist", Range("A1")) 

End Sub 
+3

Вы должны стараться избегать использования выбора. Взгляните на это: [Как избежать использования выбора в макросах Excel VBA] (http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros) – RSinohara

+0

Почему вы хотите выбрать ячейки? –

ответ

3

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

Это будет работать для вас:

Function selectingCells(myWs As String, myCell As String) 
    Sheets(myWs).Activate 
    Range(myCell).Select 
End Function 

Sub callingFunction() 
    Call selectingCells("Data", "A1") 
    Call selectingCells("Picklist", "A1") 
End Sub 

Несколько примечаний:

  • Если это не наименьший случай воспроизводимая бит кода, нет никакой необходимости selectingCells быть Function так как оно ничего не возвращает. Вам будет лучше, если вы сделаете это
  • Нет необходимости в Call в callingFunction. Call является устаревшим и только поддерживается для обратной совместимости

Опять же, если не больше, чтобы ваш код, чем этот образец, callingFunction можно переписать в виде:

sub callingFunction() 
    Sheets("Data").Range("A1").select 
    Sheets("Picklist").Range("A1").select 
end sub 

и быть гораздо более эффективным

+0

Спасибо за помощь! – Victor

+1

Добро пожаловать. Кроме того, @Victor, пожалуйста, взгляните на [link] (http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros), рекомендованный [RSinohara] (http://stackoverflow.com/questions/30398010/select-cells-from-function-in-vba/30398190#comment48884234_30398010). Есть _very_ few случаях, когда использование '.select' необходимо, и эта ссылка покажет вам, как избежать использования и путаницы, с которой вы столкнулись. – FreeMan

3

Параметр myCell - это ссылка диапазона, которая существует на другом листе. Попробуйте переходящий в строковом значении адреса ячейки, которые вы хотите выбраны, как это:

Function selectingCells(myWs As String, myCell As String) 

Sheets(myWs).Activate 
Sheets(myWs).Range(myCell).Select 

End Function 

Sub callingFunction() 

Call selectingCells("Data", "A1") 
Call selectingCells("Picklist", "A1") 

End Sub 

Есть ли какая-то причина, почему selectingCells определяются как функция - это будет возвращать некоторое значение вызывающего кода? Если нет, вы можете определить его как процедуру.

+0

Jinx! что выглядит действительно знакомым ...: D – FreeMan

+0

Спасибо за помощь! – Victor

1

В разделе Sub вы определяете диапазоны для ActiveSheet. Поэтому, если вы выберете другой лист и попытаетесь выбрать диапазоны, он не работает.
Чтобы устранить эту проблему, определить диапазоны правильно:

Sub callingFunction() 

    Call selectingCells("Data", ThisWorkbook.Sheets("Data").Range("A1")) 
    Call selectingCells("Picklist", ThisWorkbook.Sheets("Picklist").Range("A1")) 

End Sub 
+0

Спасибо за помощь! – Victor

1

Потому что вы не имеете права ваш диапазон объекта ваши функции действуют так:

Call selectingCells("Data", Activesheet.Range("A1")) 
Call selectingCells("Picklist", Activesheet.Range("A1")) 

Если вы не на листе это так же, как диапазон, который вы пытаетесь выбрать, вы получаете ошибку, которую вы получаете. Вы меняете свою функцию на один параметр, если хотите, поскольку информация о листе включена в нее. Что-то вроде этого:

Function selectingCells(myCell As Range) 

    myCell.parent.Activate 
    myCell.Select 

End Function 

Sub callingFunction() 

    Call selectingCells(sheets("Data").Range("A1")) 
    Call selectingCells(sheets("Picklist").Range("A1")) 

End Sub 
+0

Спасибо за помощь! – Victor

0

попробовать:

Function selectingCells(myWs As String, myCell As Range) 

Set mysheet = Sheets(myWs) 
mysheet.Activate 
Set mySelectedCell = mysheet.Range(myCell.Address) 
mysheet.Activate 
mySelectedCell.Select 
End Function 
0

почему вы используете функцию для такой простой задачи?

использовать этот метод

Sub test() 
    Sheets("Data").[A1].Select 
    Sheets("Picklist").[A1].Select 
End sub 
Смежные вопросы