从excel vba中的控件button名称(名称属性)重命名

我已经使用了一个vba代码来添加一个新的行从列A中的控制button。

代码工作正常,但有一个小问题。

我正在尝试在复制过程中更改button的名称属性,但我不知道如何做到这一点?

例如,我复制了一个名为“validate”的button,当它将被复制到下一行时,我想将button的Name属性(不是button文本)更改为“validate1”。

你能告诉我怎么做吗?

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

粘贴形状后,只需编写下面的代码。

 Sheets(sht).Shapes(.Shapes.Count).Name = btn 

因为当你添加一个新的形状时,它具有最高的索引。 所以如果你通过.Shapes.Countfind最高的索引形状,那么你可以很容易地重新命名。

还有一些基于VBA最佳实践的build议:

1 – 始终使用Option Explicit

因为如果你使用它,你会发现你的"lim,rng,sht"variables没有被定义。 Commas = ",'不足以定义所有的variables,所以需要逐个声明它们,而不是Dim lim, rng, sht, btn As String使用Dim lim as String, rng as String, sht as String, btn As String

2 – 使用Long而不是Integer

因为Excel可能需要整型才能在较新版本的Excel中运行代码。 你可以简单地通过将你的variables定义为Long而不是Integer来避免它。

3 – 永远不要工作表

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

最好的做法是始终确定代码引用哪个工作表:

所以在你的例子中:

 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()是不守规矩的

.Select()将触发侦听器

5 – 使用描述性variables命名

代码中的描述性名称和结构有助于使注释变得不必要。

所以你的代码将会以这种方式更加清晰和高效:

 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 

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

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

Selection.Characters.Text = btn行之后,添加Selection.Name = btn