乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 198|回复: 12

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

[复制链接]

3

主题

88

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2007-11-7 15:29:57 | 显示全部楼层 |阅读模式

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

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

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

3

主题

88

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2007-11-7 15:48:27 | 显示全部楼层
我不认为你可以做你想做的事。 您可以动态创建控件,
但我认为一旦
开始运行代码,就无法重命名它们
回复

使用道具 举报

3

主题

88

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2007-11-7 16:52:13 | 显示全部楼层

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

使用道具 举报

3

主题

88

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2007-11-7 16:55:33 | 显示全部楼层
是的,我明白你想要什么,我不认为它可以做到b / c,控件名称一旦创建就会只读,除非你手动重命名它
回复

使用道具 举报

3

主题

88

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2007-11-7 16:58:40 | 显示全部楼层

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

使用道具 举报

3

主题

88

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2007-11-7 17:20:55 | 显示全部楼层
可以使用VBA扩展性重命名控件
添加对Microsoft Visual Basic for Applications Extensibility(在我的系统上为v5.3)的引用,然后尝试此代码
  1. Option Explicit
  2. Public Sub Test()
  3.   RenameControls "UserForm1"
  4. End Sub
  5. Public Sub RenameControls(pFormName As String)
  6. Dim vb As VBE
  7. Dim varComp As VBComponent
  8. Dim varForm As VBComponent
  9. Dim frmForm As UserForm
  10. Dim cControl As Control
  11. Dim i As Integer
  12. i = 1
  13. Set vb = ThisDrawing.Application.VBE
  14. For Each varComp In vb.SelectedVBComponent.Collection
  15.     If varComp.Name = pFormName Then
  16.        Set varForm = varComp
  17.     End If
  18.         
  19.    
  20. Next
  21. For Each cControl In varForm.Designer.controls
  22.     cControl.Name = "Renamed" & i  
  23.     i = i + 1
  24. Next
  25. End Sub

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

使用道具 举报

3

主题

88

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2007-11-7 19:18:44 | 显示全部楼层

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

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

使用道具 举报

3

主题

88

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2007-11-7 19:23:19 | 显示全部楼层
它可能通过VBE工作,但我的问题是值得吗?这是一个1次函数,您不会再次使用(可能在这个项目中)
回复

使用道具 举报

3

主题

88

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2007-11-7 19:26:59 | 显示全部楼层

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

使用道具 举报

3

主题

88

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2007-11-7 22:50:27 | 显示全部楼层
类似
  1. Public Sub Test()
  2.   RenameControls "UserForm1"
  3. End Sub
  4. Public Sub RenameControls(pFormName As String)
  5.   Dim vb As VBE
  6.   Dim vbComBars As Object
  7.   Dim varComp As VBComponent
  8.   Dim varForm As VBComponent
  9.   Dim frmForm As UserForm
  10.   Dim cControl As Control
  11.   
  12.   Dim SearchString As String, SearchChar As String, NewSearchChar As String
  13.    SearchString = "CMB*****L"   ' String to search in.  
  14.    SearchChar = "L"    ' Search for Character
  15.    NewSearchChar = "R" ' Replace with New Character
  16.   Set vb = ThisDrawing.Application.VBE
  17.   For Each varComp In vb.SelectedVBComponent.Collection
  18.       If varComp.Name = pFormName Then
  19.          Set varForm = varComp
  20.       End If
  21.   Next
  22.   For Each cControl In varForm.Designer.controls
  23.     If TypeOf cControl Is CommandButton Then
  24.       If InStr(1, SearchString, SearchChar) Then
  25.         'use the control name here, not a preset variable.  Return of Replace function will be the new name
  26.         cControl.Name = Replace(cControl.Name, SearchChar, NewSearchChar)
  27.      End If
  28.    End If
  29. Next
  30. End Sub

回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-5 17:06 , Processed in 0.635975 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表