首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从excel vba中的控件按钮名称(name属性)重命名

从excel vba中的控件按钮名称(name属性)重命名
EN

Stack Overflow用户
提问于 2017-05-29 05:34:53
回答 2查看 1.9K关注 0票数 3

我使用了一个vba代码,在A列中添加了一个新行,其中包含了from控件按钮。

代码运行良好,但有一个小问题。

我试图改变按钮名称属性在复制期间,但我不知道如何做呢?

例如,我正在复制一个名为"validate“的按钮,当它被复制到下一行时,我希望将按钮的name属性(而不是按钮文本)更改为"validate1”。

你能告诉我怎么做吗?

代码语言:javascript
运行
复制
Dim Lr As Integer
Dim newLr As Integer
Dim lim, rng, sht, btn As String

Lr = Range("B" & Rows.Count).End(xlUp).Row 'Searching last row in column A
newLr = Lr + 1
lim = "B" & newLr & ":" + "D" & newLr
rng = "A" & newLr
Rows(Lr).Copy
Rows(newLr).Insert
'Range(lim).ClearContents
sht = ActiveSheet.Name
btn = "validate" & newLr
    Application.ScreenUpdating = False
    Sheets(sht).Shapes("validate").Copy
    Sheets(sht).Activate
    Sheets(sht).Range(rng).Select
    Sheets(sht).Paste
    Sheets(sht).Shapes("validate").Select
    Selection.Characters.Text = btn
    Application.ScreenUpdating = True

图像链接: https://ibb.co/c0rFfv

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-29 05:52:33

粘贴形状后,只需在下面编写代码即可。

代码语言:javascript
运行
复制
Sheets(sht).Shapes(.Shapes.Count).Name = btn

因为当您添加新形状时,它的索引最高。因此,如果您通过.Shapes.Count找到最高的索引形状,那么您可以很容易地重命名它。

以及基于VBA最佳实践的其他一些建议:

1 -始终使用选项显式

因为如果您使用它,您将看到您的"lim,rng,sht"变量没有定义。Commas = ",'不足以定义所有变量。你需要一个一个地分别声明它们。所以不要使用Dim lim, rng, sht, btn As String,而要使用Dim lim as String, rng as String, sht as String, btn As String

2 -使用Long而不是Integer工作

因为Excel可能需要Integer来在较新版本的Excel中运行代码。一开始,您可以通过将变量定义为Long而不是Integer来避免这种情况。

3 -永远不要假设工作表

不要依赖ActiveWorkbook或ActiveSheet,因为它们可能会被用户更改。

最佳实践是始终确定代码引用的是哪个工作表:

所以在你的例子中:

代码语言:javascript
运行
复制
Dim wb as Workbook, ws as Worksheet
Set wb = ThisWorkbook
Set ws = wb.Sheet("Sheet1")
Lr = ws.Range("B" & Rows.Count).End(xlUp).Row

一种方法永远不会误导你。

4 -避免使用选择或激活

.Select()慢

.Select()不受约束

.Select()将触发侦听器

5 -使用描述性变量命名

代码中的描述性名称和结构有助于避免注释。

因此,这样您的代码就会更加清晰和高效:

代码语言:javascript
运行
复制
Option Explicit

Application.ScreenUpdating = False    
'It's better to switch off properties from starting of your macro
Dim wb as Workbook, ws as Worksheet
Dim Lr As Long
Dim newLr As Long
Dim sht as String, btn As String
Dim lim as Range, rng as Range  'Using these ones directly as a Range is better idea.

Set wb = ThisWorkbook
Set ws = wb.Sheets("Sheet1")

Lr = ws.Range("B" & Rows.Count).End(xlUp).Row 'Searching last row in column A 
'==> if you would like to count rows in A, then change your code. Now it's looking for "B".
newLr = Lr + 1
set lim = ws.Range("B" & newLr & ":" + "D" & newLr)
set rng = ws.Range("A" & newLr)
ws.Rows(Lr).Copy
ws.Rows(newLr).Insert
'Range(lim).ClearContents
sht = ws.Name
btn = "vaalidate" & newLr

    With Sheets(sht)
     .Shapes("validate").Copy
     .rng.Paste
     .Shapes(.Shapes.Count).Name = btn
    End With

Application.ScreenUpdating = True
票数 1
EN

Stack Overflow用户

发布于 2017-05-29 05:59:14

没有必要使用Sheets(sht).ActivateSheets(sht).Range(rng).Select --它只会减慢代码运行时的速度,而是使用完全限定的ShapesWorksheets,如下所示:

代码语言:javascript
运行
复制
With Sheets(sht)
    .Shapes("validate").Copy
    .Paste
    .Shapes(.Shapes.Count).Name = btn    
End With
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44235221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档