如何使用variables在VBA中设置属性(Excel)

拿这个代码:

With ActiveSheet.Shapes.AddShape(msoShapeRectangle, x, y, w, h).TextFrame .Parent.Line.Visible = False .Parent.Fill.ForeColor.RGB = RGB(r, g, b) End With 

有没有任何VBA的方式来“执行”或“评估”就像可以在perl / python / …完成,使文本.Parent.Line.Visible可以从variables(或单元格值)绘制,而不是硬编码?

 ParentLine = ".Parent.Line.Visible" ParentLineValue = "False" With ActiveSheet.Shapes.AddShape(msoShapeRectangle, x, y, w, h).TextFrame **eval**(ParentLine & "=" & ParentLineValue) .Parent.Fill.ForeColor.RGB = RGB(r, g, b) End With 

编辑:我发现Access提到Eval的MSDN信息 ,但是当我执行我的代码它说:“未定义的子或function”,指向Eval(Excel似乎不知道这个function)。

编辑2:find最终(负面)的答案 。

编辑3:似乎有一个答案毕竟,因为我不是一个通用的解决scheme的任意代码执行。 感谢GSerg帮助使用CallByName。

解决scheme1。

使用CallByName

 Option Explicit Private Type Callable o As Object p As String End Type Public Sub SetProperty(ByVal path As String, ByVal Value As Variant, Optional ByVal RootObject As Object = Nothing) With GetObjectFromPath(RootObject, path) If IsObject(Value) Then CallByName .o, .p, VbSet, Value Else CallByName .o, .p, VbLet, Value End If End With End Sub Public Function GetProperty(ByVal path As String, Optional ByVal RootObject As Object = Nothing) As Variant With GetObjectFromPath(RootObject, path) GetProperty = CallByName(.o, .p, VbGet) End With End Function Public Function GetPropertyAsObject(ByVal path As String, Optional ByVal RootObject As Object = Nothing) As Object With GetObjectFromPath(RootObject, path) Set GetPropertyAsObject = CallByName(.o, .p, VbGet) End With End Function Private Function GetObjectFromPath(ByVal RootObject As Object, ByVal path As String) As Callable 'Returns the object that the last .property belongs to Dim s() As String Dim i As Long If RootObject Is Nothing Then Set RootObject = Application Set GetObjectFromPath.o = RootObject s = Split(path, ".") For i = LBound(s) To UBound(s) - 1 If Len(s(i)) > 0 Then Set GetObjectFromPath.o = CallByName(GetObjectFromPath.o, s(i), VbGet) End If Next GetObjectFromPath.p = s(UBound(s)) End Function 

用法:

 ? getproperty("activecell.interior.color") 16777215 SetProperty "activecell.interior.color", vbYellow 'Sets yellow background ? getproperty("names.count", application.ActiveWorkbook) 0 ? getproperty("names.count", GetPropertyAsObject("application.activeworkbook")) 0 

解决scheme2。

dynamic添加代码。
不要这样做。 这是错误的,它需要有“允许访问VB项目”设置。

添加对Microsoft Visual Basic for Applications Extensibility XX的引用。

创build一个名为ModuleForCrap的模块。

添加一个dynamic构造的子/function:

 ThisWorkbook.VBProject.VBComponents("ModuleForCrap").CodeModule.AddFromString _ "function foobar() as long" & vbNewLine & _ "foobar = 42" & vbNewLine & _ "end function"` 

叫它:

 msgbox application.run("ModuleForCrap.foobar") 

删除它:

 With ThisWorkbook.VBProject.VBComponents("ModuleForCrap").CodeModule .DeleteLines .ProcStartLine("foobar", vbext_pk_Proc), .ProcCountLines("foobar", vbext_pk_Proc) End With 

您可以尝试查看CallByName ,但我不认为它会按照您的要求进行操作(至less,如果您要评估多点对象/属性引用,则不容易)。

False评估为零。 你可以构造一个整数variables来等于零,并使其变成与False相同的方式。