在动态创建用户表单布局时,在添加控件时,我发现语法需要" .1"在bstrProgId的末尾,作为以下代码中的字符串:
For loopthroughsteps = 0 To 0
For foodgroup_id = 0 To 6
'For vit = 2 To 18
For vit = 2 To 3
Dim listbox As Object
Set listbox = UserForm3.Controls.Add("Forms.Listbox.1", foodgroup_id & "-" & vit & "-" & loopthroughsteps, True)
With listbox
.Left = 35 * (vit - 1) + 205 * (vit - 2)
.Top = 25 + (foodgroup_id) * 50
.Height = 50
.Width = 205
End With
Next vit
Next foodgroup_id
Next loopthroughsteps
" .1"在Controls.Add("Forms.Listbox
之后做什么或意味着什么?
我在文档中找不到它,但我很好奇;
它是控件表单的索引,但为什么它(总是)1? 为什么它会成为字符串中的数字?
或者它是某种形式的指示,如果是这样的话?
答案 0 :(得分:1)
Add(ProgID, Name, Visible)
第一个参数progID
只是一个字符串,COM工厂解析并决定要创建的对象。它没有被指定为类的编程名称(即typename
),而是指定对象工厂映射到给定类的字符串。
为什么"Forms.Listbox.1"
而不是Forms.Listbox
? “.1”背后的原因与实施有关,很可能是由于开发和维护VBA的开发团队中的“版本控制”。开发人员只需使用UserForm.Add
方法中记录的指定字符串“progID”。
答案 1 :(得分:1)
除了其他好的答案之外还有一些文件(评论太多了)......
如果您使用Regedit.exe
专门针对CLASSES_ROOT \ CLSID配置单元在注册表中查找,那么您将看到类似这样的内容
[HKEY_CLASSES_ROOT\CLSID\{884e2013-217d-11da-b2a4-000e7bbb2b09}]
[HKEY_CLASSES_ROOT\CLSID\{884e2013-217d-11da-b2a4-000e7bbb2b09}\ProgID]
@="X509Enrollment.CAlternativeName.1"
[HKEY_CLASSES_ROOT\CLSID\{884e2013-217d-11da-b2a4-000e7bbb2b09}\VersionIndependentProgID]
@="X509Enrollment.CAlternativeName"
因此,人们可以看到ProgID
和VersionIndependentProgID
。有了这个,就可以控制想要实例化的控件的版本。
这是Microsoft文档链接 VersionIndependentProgID