我已经使用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 as String, rng as String, sht as String, btn As String
2-使用Long而不是Integer
因为Excel可能需要Integer to Long才能在较新版本的Excel中运行代码。首先,可以通过将变量定义为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()将触发监听器
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句