vba - 从Excel VBA中的控制按钮名称(名称属性)重命名

标签 vba excel

我使用了 vba 代码通过 A 列中的控制按钮添加了一个新行。

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

我试图在复制过程中更改按钮名称属性,但我不知道该怎么做?

例如,我正在复制一个名为“validate”的按钮,当它被复制到下一行时,我想将按钮的 Name 属性(而不是按钮文本)更改为“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.Count 找到索引最高的形状,然后您可以轻松地重命名它。

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

1 - 始终使用显式选项

因为如果您使用它,您会发现您的“lim,rng,sht”变量未定义。 Commas = ",' 不足以定义所有变量。您需要一一单独声明它们。因此,不要使用 Dim lim, rng, sht, btn As String使用Dim lim作为字符串,rng作为字符串,sht作为字符串,btn作为字符串

2 - 使用长整型而不是整数

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

3 - 永远不要假设工作表

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

The best practice is to always identify which worksheet to which your code refers:

所以在你的例子中:

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 - 使用描述性变量命名

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

这样你的代码会更加清晰和高效:

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

关于vba - 从Excel VBA中的控制按钮名称(名称属性)重命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44235221/

相关文章:

vba - 获取特定字体配置中文本的实际宽度?

vba - 用户窗体中命名范围 (Excel) 的变量给我一个错误

excel - 显示最小值

vba - 如何返回 2 个值并对它们进行四舍五入? Excel VBA

excel - 如何在 VBA 中将打开的 Excel 文件设置为工作簿对象

json - 将来自多个单元格的数据合并到一个 JSON 对象中

python - 如何将 Pandas 数据框附加到 Excel 工作表

java - 使用数据库连接创建 .xlsx

VBA - 数据验证空单元格

string - VBA Access 参数传递值