SomeCallMeDave 发表于 2007-11-7 15:29:57

循环访问窗体和对象名称中的控件


,我可以循环访问窗体上的控件集合并获取我需要的控件类型,但有人可以帮助我执行字符串筛选器吗?
换句话说:例如,
如果我有20个命令按钮,并且被命名为CMBOrigname1,CMBOrigname2,CMBOrigname3等
,那么我想将它们更改为CMBNewname1,CMBNewname2,CMBNewname3等
,我想我需要某种Instr函数吗?
有了这个,我将能够希望做这样的事情
For Each Ctrl In Me.Controls
If TypeOf Ctrl Is CommandButton Then
   If Instr (Need help here) Then
      Ctrl.name = CMBNewname
End If
Next Ctrl

除了Instr函数,我可能需要一个查找和替换函数以及
任何想法,我该怎么做?
谢谢
马克
**** Hidden Message *****

SomeCallMeDave 发表于 2007-11-7 15:48:27

我不认为你可以做你想做的事。 您可以动态创建控件,
但我认为一旦
开始运行代码,就无法重命名它们

SomeCallMeDave 发表于 2007-11-7 16:52:13


不,CM,
你误解了我的意思;
我手动创建了这些控件,现在我决定给它们取不同的名称,我不想手动重命名它们。
所以我要说的是,根据您想要的控件类型循环遍历表单,并根据一个唯一的字符,能够更改控件名称。
例如
如果我有20个命令按钮:CMBItem1L - CMBItem20L
并且我想将它们重命名为CMBItem1R - CMBItem1R
我不希望必须手动完成此操作,而是通过代码来完成
因此,对于上面的代码(它获取控件类型),我们只需要说(Sudo代码)Instr ("L ")是否找到L并用R替换L
这有意义吗?因此,基本上我需要一些代码来搜索字符串中的唯一字符,然后提示我输入要替换的字符,并对所有实例进行更改。
我知道这是可以做到的,我大概也能做到,我只是希望有人能有所作为。谢谢马克

SomeCallMeDave 发表于 2007-11-7 16:55:33

是的,我明白你想要什么,我不认为它可以做到b / c,控件名称一旦创建就会只读,除非你手动重命名它

SomeCallMeDave 发表于 2007-11-7 16:58:40


嗯,这很有趣<让我们看看,好吗?      

SomeCallMeDave 发表于 2007-11-7 17:20:55

可以使用VBA扩展性重命名控件
添加对Microsoft Visual Basic for Applications Extensibility(在我的系统上为v5.3)的引用,然后尝试此代码

Option Explicit
Public Sub Test()
RenameControls "UserForm1"
End Sub
Public Sub RenameControls(pFormName As String)
Dim vb As VBE
Dim varComp As VBComponent
Dim varForm As VBComponent
Dim frmForm As UserForm
Dim cControl As Control
Dim i As Integer
i = 1
Set vb = ThisDrawing.Application.VBE
For Each varComp In vb.SelectedVBComponent.Collection
    If varComp.Name = pFormName Then
       Set varForm = varComp
    End If
      
   
Next
For Each cControl In varForm.Designer.controls
    cControl.Name = "Renamed" & i
    i = i + 1
Next
End Sub

您必须使用VB字符串函数来创建修改后的名称
我还没有完全测试过这个,所以使用它的风险自负
此外,如果已经有引用控件的代码,我想这些调用也必须更改。但您也可以使用VBE来实现这一点。

SomeCallMeDave 发表于 2007-11-7 19:18:44


嘿,一些<br>谢谢你,我有点理解你发布的代码,但我尝试了一些更简单的东西,比如:<br><pre>Dim SearchString As String, SearchChar As String, NewSearchChar As String
SearchString = "CMB*****L"   ' String to search in.
SearchChar = "L"    ' Search for Character
NewSearchChar = "R" ' Replace with New Character
For Each Ctrl In Userform1.Controls
If TypeOf Ctrl Is CommandButton Then
   If InStr(1, SearchString, SearchChar) Then
   Replace(SearchString, SearchChar, NewSearchChar) As String
   End If
End If
Next Ctrl

我可以抓取所有命令按钮,如果我只使用Instr功能;它将使用此搜索字符串返回所有命令按钮
但是,我无法使替换功能正常工作。有人能告诉我哪里出错了吗
CM很可能是正确的,因为名称是只读的,但我很好奇这是否有效
谢谢,
马克

SomeCallMeDave 发表于 2007-11-7 19:23:19

它可能通过VBE工作,但我的问题是值得吗?这是一个1次函数,您不会再次使用(可能在这个项目中)

SomeCallMeDave 发表于 2007-11-7 19:26:59


如果我必须使用可扩展性功能,那么可能不会
如果我能让它以我的方式工作,它将节省大量时间,因为我们已经进行了大量的表单编程。
CM,今天我不得不手动重命名80个控件。我并不介意,但是有很多其他的好理由说明为什么这个方法会很棒。
也就是说,如果您对控件使用正确的命名约定。
标记

SomeCallMeDave 发表于 2007-11-7 22:50:27

类似

Public Sub Test()
RenameControls "UserForm1"
End Sub
Public Sub RenameControls(pFormName As String)
Dim vb As VBE
Dim vbComBars As Object
Dim varComp As VBComponent
Dim varForm As VBComponent
Dim frmForm As UserForm
Dim cControl As Control

Dim SearchString As String, SearchChar As String, NewSearchChar As String
   SearchString = "CMB*****L"   ' String to search in.
   SearchChar = "L"    ' Search for Character
   NewSearchChar = "R" ' Replace with New Character
Set vb = ThisDrawing.Application.VBE
For Each varComp In vb.SelectedVBComponent.Collection
      If varComp.Name = pFormName Then
         Set varForm = varComp
      End If
Next
For Each cControl In varForm.Designer.controls
    If TypeOf cControl Is CommandButton Then
      If InStr(1, SearchString, SearchChar) Then
      'use the control name here, not a preset variable.Return of Replace function will be the new name
      cControl.Name = Replace(cControl.Name, SearchChar, NewSearchChar)
   End If
   End If
Next
End Sub

页: [1] 2
查看完整版本: 循环访问窗体和对象名称中的控件