Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 将复制的对象粘贴到同一位置的新图纸_Vba_Excel - Fatal编程技术网

Vba 将复制的对象粘贴到同一位置的新图纸

Vba 将复制的对象粘贴到同一位置的新图纸,vba,excel,Vba,Excel,我正在创建一个函数,在归档旧版本的同时创建整个工作表的新版本。到目前为止,它的工作,但我有困难的布局对象。本质上,它们都是以各种不同的不正确症状粘贴到新表上的 我想尝试找到一种方法,将复制的对象粘贴到新图纸上与旧图纸上复制的对象相同的位置 复制按钮过程是非常独立的,所以在这里它是完整的。(代码现已更新) 我可能不需要所有这些,一旦我有了我要寻找的功能,我会努力清理东西。我认为.Top(根据MS help文章,它是对象与单元格A1的偏移量)会有帮助,但实际上根本没有帮助 基本上,我试图使它成为这样

我正在创建一个函数,在归档旧版本的同时创建整个工作表的新版本。到目前为止,它的工作,但我有困难的布局对象。本质上,它们都是以各种不同的不正确症状粘贴到新表上的

我想尝试找到一种方法,将复制的对象粘贴到新图纸上与旧图纸上复制的对象相同的位置

复制按钮过程是非常独立的,所以在这里它是完整的。(代码现已更新)

我可能不需要所有这些,一旦我有了我要寻找的功能,我会努力清理东西。我认为.Top(根据MS help文章,它是对象与单元格A1的偏移量)会有帮助,但实际上根本没有帮助

基本上,我试图使它成为这样,如果原始按钮嵌入在原始表单的单元格D10中,新按钮将嵌入在Sht的单元格D10中

有人有什么想法吗

这篇文章现在更新了到目前为止提出的观点。这是一般的功能更新

当当前代码替换为注释代码时,按钮在源工作表(我从中复制的工作表)中重复,然后在我尝试将TopLeftCell设置为Sht.Range时失败(Sht对象的Range方法失败,因为找不到对象)

当使用当前代码时,粘贴作业会工作,但左上角的单元格地址似乎不会实际更改按钮所在位置的坐标

删除了额外的尝试代码,并清除了以下答案之一的尝试


我找到了一个似乎对我有用的答案。见下文

让我们试试这个。复制按钮,然后使用原始按钮的
.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