Vba 将复制的对象粘贴到同一位置的新图纸
我正在创建一个函数,在归档旧版本的同时创建整个工作表的新版本。到目前为止,它的工作,但我有困难的布局对象。本质上,它们都是以各种不同的不正确症状粘贴到新表上的 我想尝试找到一种方法,将复制的对象粘贴到新图纸上与旧图纸上复制的对象相同的位置 复制按钮过程是非常独立的,所以在这里它是完整的。(代码现已更新) 我可能不需要所有这些,一旦我有了我要寻找的功能,我会努力清理东西。我认为.Top(根据MS help文章,它是对象与单元格A1的偏移量)会有帮助,但实际上根本没有帮助 基本上,我试图使它成为这样,如果原始按钮嵌入在原始表单的单元格D10中,新按钮将嵌入在Sht的单元格D10中 有人有什么想法吗 这篇文章现在更新了到目前为止提出的观点。这是一般的功能更新 当当前代码替换为注释代码时,按钮在源工作表(我从中复制的工作表)中重复,然后在我尝试将TopLeftCell设置为Sht.Range时失败(Sht对象的Range方法失败,因为找不到对象) 当使用当前代码时,粘贴作业会工作,但左上角的单元格地址似乎不会实际更改按钮所在位置的坐标 删除了额外的尝试代码,并清除了以下答案之一的尝试Vba 将复制的对象粘贴到同一位置的新图纸,vba,excel,Vba,Excel,我正在创建一个函数,在归档旧版本的同时创建整个工作表的新版本。到目前为止,它的工作,但我有困难的布局对象。本质上,它们都是以各种不同的不正确症状粘贴到新表上的 我想尝试找到一种方法,将复制的对象粘贴到新图纸上与旧图纸上复制的对象相同的位置 复制按钮过程是非常独立的,所以在这里它是完整的。(代码现已更新) 我可能不需要所有这些,一旦我有了我要寻找的功能,我会努力清理东西。我认为.Top(根据MS help文章,它是对象与单元格A1的偏移量)会有帮助,但实际上根本没有帮助 基本上,我试图使它成为这样
我找到了一个似乎对我有用的答案。见下文 让我们试试这个。复制按钮,然后使用原始按钮的
.TopLeftCell
的相对.Address
。逻辑是:.TopLeftCell
返回一个范围
类型对象,该对象具有.Address
属性。您可以将该地址限定为sht
参数,如下所示:
Sub CopyButton(btn As OLEObject, sht As Worksheet)
Dim newButton As OLEObject
Set newButton = btn.Duplicate
newButton.Cut
With sht
.Paste
Set newButton = .OLEObjects(.OLEObjects.Count)
newButton.TopLeftCell = .Range(btn.TopLeftCell.Address)
End With
End Sub
这同样有效,根本不依赖于Cut
或Paste
。因此,它的效率要高一点
Sub CopyButton2(btn As OLEObject, sht As Worksheet)
Dim newButton As OLEObject
Set newButton = btn.Duplicate
With newButton
.TopLeftCell = sht.Range(btn.TopLeftCell.Address)
.Name = btn.Name
End With
End Sub
我得到了一些似乎对我有用的东西 下面是copybutton过程的调用:
For Each b In OldSht.OLEObjects
Call CopyButton(b, NewSht)
NewSht.Rows.AutoFit
Next b
我添加了autofit,因为我使用的方法是根据按钮与图纸顶部和左侧的距离(excel的距离测量)来定位按钮,这意味着当它将按钮粘贴到新图纸中时,可能会改变目标图纸行大小(列似乎不受影响)
以下是实际的按钮复制代码:
Sub CopyButton(Button As OLEObject, Sht As Worksheet)
Dim NewButton As OLEObject
Dim NewButtonName As String
NewButtonName = Button.Name
Set NewButton = Button.Duplicate
NewButton.Cut
With Sht
.Paste
.OLEObjects(.OLEObjects.Count).Name = NewButtonName
With .OLEObjects(NewButtonName)
.Top = Button.Top
.Left = Button.Left
End With
End With
End Sub
这成功地将所有200多个按钮从源工作表复制到目标工作表,并使它们在新工作表中占据相同位置。我不确定TopLeftCell为什么不起作用,但这种方法适用于文档上的绝对位置。如果你想找一个更间接的定位,这是行不通的
这意味着,虽然这看起来是可行的,但两个工作表的格式都是完整的,必须小心管理,以保持工作正常 该按钮应具有返回范围对象的
TopLeftCell
属性。你应该能够使用它。我试过了,它似乎没有什么区别(试过它来代替.Top和.Top之外的内容)好的,所以它看起来可能在.Paste(目的地)中,我需要放置我的本地范围。但是,我可以从Button对象中提取的每个范围对象都是一个直接范围引用(Sheet!range),而且我似乎无法使其仅成为相对单元格引用。另外,当我将Button.TopLeftCell分配给字符串时,它的值为“”。请使用Address
属性,并将其限定为另一个工作表:)对,这可能有效。谢谢当我使用sht.Range(btn.TopLeftCell.Address)时,它会将第一个重复的按钮放在btn工作表中,而不是sht工作表中,因为范围变为“bntSheet!$btnRange”。我似乎无法调用按钮范围而不将其工作表附加到它。sht.range(btn.TopLeftCell.Address)
应该只返回地址部分,而不是工作表名称。如果它返回工作表名称,我预计会出现1004错误,因为该操作可能无法执行。考虑修改你的Q来显示你现在想要使用的代码。原来的按钮(复制的一个)设置在<代码>名称<代码>范围内吗?如果是这样的话(我不知道你是怎么做到的),但请尝试:.TopLeftCell=sht.Range(btn.TopLeftCell.Name.referestorange.Address)
当我创建一个字符串并将其值设置为Button.TopLeftCell.Address时,第一个按钮的字符串值为“$E$10”(在第一页的120个按钮中)。我真的不知道为什么在设置新按钮地址时会出现1004错误。我现在正在尝试将新按钮topleftcell设置为字符串值。目标工作表是受保护的还是被锁定的?这是1004错误的常见原因。
Sub CopyButton(Button As OLEObject, Sht As Worksheet)
Dim NewButton As OLEObject
Dim NewButtonName As String
NewButtonName = Button.Name
Set NewButton = Button.Duplicate
NewButton.Cut
With Sht
.Paste
.OLEObjects(.OLEObjects.Count).Name = NewButtonName
With .OLEObjects(NewButtonName)
.Top = Button.Top
.Left = Button.Left
End With
End With
End Sub