7

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是一个常用词)......


更新:澄清一下,我在考虑像with ... as handlepython语法这样的句柄,而不是面向对象的this关键字

4

3 回答 3

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

编辑

你有关于“这个”不存在的任何信息吗?– 死亡四月 19 分钟前

this基本上是 C# 中的一个关键字,它指的是类的当前实例。VB 中的等价物thisMe.

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

Me.textBox1.Text = "Blah Blah"

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

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

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

高温高压

于 2012-06-29T17:40:39.927 回答
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 次击键。)

于 2012-06-29T17:41:33.793 回答
2

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

With ThisWorkbook.Sheets("MySheet")
    Call MySub(.Cells.Parent)
    .Range(...).Value2 = 1
    ...
End With
于 2015-11-20T22:18:20.083 回答