如何用对象引用

时间:2012-06-29 17:29:42

标签: excel vba excel-vba excel-2007

如果我想要对象本身,而不是它的属性/方法,我如何引用我在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

+这里的术语是什么?我甚至不知道如何撰写谷歌查询,并得到一些有用的结果(因为with是一个常见的词)...

<小时/> 更新:澄清一下,我正在考虑使用python语法中的with ... as handle句柄,而不是面向对象的this关键字

3 个答案:

答案 0 :(得分: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

修改

  

你有关于“这个”不存在的任何信息吗? - deathApril 19分钟前

this基本上是来自C#的关键字,它指的是该类的当前实例。 VB中this的等效值为Me

Me关键字提供了一种方法来引用代码当前正在执行的类或结构的特定实例。例如,在Userform中,您可以使用

Me.textBox1.Text = "Blah Blah"

在VBA中,Me也可用于thisworkbook。例如,如果您将此代码粘贴到ThisWorkbook代码区域中,那么它将为您提供工作簿的名称

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

同样,当您从图纸代码区域运行上述代码时,您将获得图纸名称。

HTH

答案 1 :(得分:4)

首先不使用with怎么样?它使您的代码更具可读性,不再使用内存(因为with语句必须分配一个临时变量),并且不那么混乱。

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

在上面的代码中,总成本是一行额外的代码(DIM语句),总共减少了9次。 (DIM语句是19次击键,在三行中更改为WS是6次击键,但是你保存了with(4)和重复(30),节省了大约9击键。)

答案 2 :(得分:1)

使用.Cells.Parent。这仅适用于工作表,但对于其他一些对象也有类似的内容(对于可以使用的工作簿.Sheets.Parent

With ThisWorkbook.Sheets("MySheet")
    Call MySub(.Cells.Parent)
    .Range(...).Value2 = 1
    ...
End With