2012-06-29 10 views
4

Как я могу обратиться к объекту, который я использую внутри With, если я хочу сам объект, а не его свойства/методы?Как обратиться к объекту

With ThisWorkbook.Sheets("MySheet") 
    Call MySub(ThisWorkbook.Sheets("MySheet")) ' works OK, but duplicated 
    Call MySub(this) ' does not works 
    .Range(...).Value2 = 1 
    ... 
End With 

+ что это за правильная терминология? я даже не знаю, как составить запрос Google для этого и получить некоторые результаты Usefull (с with общеупотребительное слово) ...


UPDATE: уточнить, я мыслил в терминах обрабатывать как with ... as handle от синтаксиса питона, а не об объектно-ориентированной this ключевое слово

+0

Почему вы хотите это сделать? . Таблицы («MySheet») не являются методом и ничего не будут делать. – Jesse

+0

Я хочу передать аргумент Worksheet моей подпрограмме (я хочу, если нужно, вызвать подпрограмму на разных листах) P.S .: Если это был метод, почему я хочу использовать его как аргумент 'with'? – Aprillion

+1

'.Cells (1) .Parent' ... но это просто ужасно –

ответ

4

Как насчет не используя with в первую очередь? Это делает ваш код более читабельным, не использует больше памяти (так как оператор with должен все равно распределять временную переменную), и он менее запутан.

Dim WS as WorkSheet 
WS = ThisWorkBook.Sheets("MySheet") 
Call vymaz_obrazky(WS) 
WS.Range(...).Value2 = 1 

В приведенном выше коде, общая стоимость одной дополнительной строки кода (The DIM заявление), и 9 меньше нажатий клавиш в целом. (The DIM заявление 19 нажатий клавиш, изменение в WS в трех строках 6 нажатий клавиш, но вы сохранили with (4) и дублирования (30), экономя около 9 нажатий клавиш.)

+0

Я предполагаю, что я просто использовался для '' 'python' (он автоматически обрабатывает код' finally', чтобы закрыть файлы, .. .), но если в VBA нет причин для этого. (BTW, я действительно не забочусь о нажатиях клавиш или строках, просто хочу избежать дублирования кода) – Aprillion

+0

Я знаю, что это было выбрано в качестве ответа, а в упрощенном примере кода, приведенном здесь, имеет смысл, но в более реалистичном сценарий, не используя С, не является вариантом. Мы используем With в VBA, потому что каждая точка стоит циклов и использует With уменьшает точки. – phrebh

+0

@phrebh: ерунда. * точки * не стоят циклов; циклы, необходимые для согласования свойства или метода, идентичны в любом случае с точками или без них, поскольку они все равно должны быть разрешены к экземпляру объекта. * с * просто вводит трудности и уменьшает нажатия клавиш. –

4

Попробуйте

Sub Sample() 
    Dim ws As Worksheet 

    Set ws = ThisWorkbook.Sheets("MySheet") 

    With ws 
     MySub ws 
     '~~> Rest of the code 
    End With 
End Sub 

или

Sub Sample() 
    Dim ws As Worksheet 

    Set ws = ThisWorkbook.Sheets("MySheet") 

    MySub ws 

    With ws  
     '~~> Rest of the code 
    End With 
End Sub 

Edit:

у вас есть информация о несуществовании "это"? - deathApril 19 мин. Назад

this в основном ключевое слово из C#, которое относится к текущему экземпляру класса. Эквивалент this в VB равен Me.

Ключевое слово Me предоставляет способ обращения к конкретному экземпляру класса или структуры, в которой код в настоящее время выполняет. Например, в UserForm вы можете использовать

Me.textBox1.Text = "Blah Blah" 

В VBA Me также может быть использован для thisworkbook. Например, если вставить этот код в ThisWorkbook коды области, то это даст вам имя книги

Sub Sample() 
    Debug.Print Me.Name 
End Sub 

Аналогично при запуске приведенный выше кода из листа Код зоны вы получите лист имя.

НТН

+0

+1 полезный, но не совсем то, что я спросил - есть ли у вас какая-либо информация о несуществовании« этого »? – Aprillion

+0

Обновление .. gimme несколько минут :) –

+0

Я обновил сообщение выше ... Редактировать: я вижу, у вас уже есть ответ :) –

1

Использование .Cells.Parent.Это работает только для рабочих листов, но есть подобные вещи для некоторых других объектов (для книги вы можете использовать .Sheets.Parent)

With ThisWorkbook.Sheets("MySheet") 
    Call MySub(.Cells.Parent) 
    .Range(...).Value2 = 1 
    ... 
End With 
Смежные вопросы