复制Excel工作表并在公式中维护相对单元格引用


40

Excel中的另一个复制问题:

如何在不复制的工作表仍引用WorkbookA.xlsx的情况下将工作表从WorkbookA.xlsx复制到WorkbookB.xlsx,例如,公式在复制时=B!23变为=[WorkbookA.xlsx]!B!23

我想维护“相对”单元格引用而不是“绝对”单元格引用(如果尚不存在,我将在Excel世界中发明此术语)。

我无法使其正常工作的另一个可能选择是仅粘贴单元格“值”的选项。Excel将“值”视为计算值,而不是单元格中的实际公式。如果我选择粘贴公式,它仍然提供绝对引用。

关于我为什么需要的更多信息: 我有一个生产xlsx用于日常操作。我们经常需要对该xlsx进行“升级”,因此一个人可以在一张纸上创建一份副本及其更改。同时,另一个人也可能正在更改另一张纸。假设这些工作表在其他工作表上没有从属单元格,例如摘要报告,那么我们希望将这些工作表复制并合并回原始xlsx。但是“绝对”引用带来了很多麻烦。


我有点困惑。您想要将工作表1从WBA复制到WBB,并且希望它相对于WBB而不是WBA复制公式。除非 WBB工作表2与WBA工作表2相同,否则这是不可能的。此外,如果只需要,则可以将工作表复制为select all - copy - paste special - values仅包含值。如果您想在复制期间完成所有操作,而不是依赖最终用户执行这些步骤,那么我一直在努力。让我们确切地知道您希望WorkbookA(或1)和WBB(2)以及工作表编号如何运行
Raystafarian 2012年

我已经在上一段中进行了解释,但是我仍然不清楚。是的,WBA和WBB对WBA的期望相同。在WBA中设计该工作表时,所有单元格引用均应相对于工作表的工作簿而言。复制工作表函数将所有单元格公式附加到WBA,使其变为“绝对”,我不希望这样做。
2012年

粘贴特殊值仅粘贴计算出的值。我需要在不添加WBA.xls的情况下复制公式。
2012年

好吧,我很清楚。如果/当我弄明白我会发布一个答案
Raystafarian

您是否可以只复制整个工作簿,然后从新副本中删除不需要的内容?
dwolters 2012年

Answers:


21

尝试使用Ctrl+ ~显示公式。然后使用Ctrl+ A选择所有内容,将其复制,然后将其粘贴到记事本中。

最后,将其复制出记事本,然后粘贴到其他工作簿中。


1
@Jake:但是您已经说过您的工作簿包含按钮,下拉菜单等;和命名范围。这种技术不会复制它们(或像格式化这样的世俗事物)-您如何/为什么认为它可以接受?
斯科特

在一个较大的工作表上,“编辑链接/更改源”技术很慢,但是很快。
Tony Pulokas

23

在许多情况下,我发现更容易执行以下操作:

  • 将工作表复制到新工作簿
  • 激活新工作簿中的新工作表
  • 全选(Ctrl+ A
  • 查找/替换
    • 找: [WorkbookA.xlsx]!
    • 替换:<留空>
  • 全部替换

11

这个答案下面的未签名答案是为我工作的答案,但有很小的变化。

  1. 创建并保存目标电子表格。

  2. 使用“移动”,“复制”或将带有公式的页面拖到新的电子表格中。这会将公式保留在新页面上,指向旧工作表。然后,将新电子表格保存在与旧工作表相同的位置。

  3. 然后转到数据标签>单击编辑链接。除非页面中有链接,否则该选项将无效。

  4. 在出现的对话框中,选择源文件的名称,然后单击“更改源”。

  5. 在接下来出现的打开文件对话框中,选择新电子表格的名称。

单击关闭,完成操作。


9

或简单地执行以下操作:

转换为:

=database_feed!A1

对此:

=INDIRECT("database_feed!A1")

在工作表之间进行复制时,对引用的更改没有更多更改。

如果您没有引用过多的图纸,则另一种替代方法是使用

=INDIRECT("'"&B1&"'!A1")

并在单元格B1中输入参考表的名称。现在,复制到新电子表格后,只有一个单元格可以更新。


1
好主意,如果您有一个带有公式的模板表,并且将其复制到带有VBA的新工作簿中,则可以使用。我发现您需要将引用保留在引号之间,并添加TRUE以保留A1类型引用。例如。= INDIRECT(“'Sheet1'!A1”,TRUE)
RogerB

2
INDIRECT是一个易变的公式,因此每次(而不是仅在编辑时)都会重新计算,这确实会减慢更复杂的工作簿的速度,因此请谨慎使用
Andy Terra

3

下面的代码可以适应您的需求。它从工作表中提取所有公式wb1,并将它们应用于新工作簿中的工作表。公式应用为Strings,因此不会插入对原始工作簿的引用。而且,此代码非常快,因为它不使用剪贴板,并且不需要任何循环通过单元格。

Sub copyformulas()

Dim wb1 As Workbook, wb2 As Workbook
Dim s1 As Worksheet, s2 As Worksheet
Dim formArr() As Variant

Set wb1 = ThisWorkbook
Set s1 = wb1.Sheets("Sheet1")
Set wb2 = Workbooks.Add
Set s2 = wb2.Sheets("Sheet1")

formArr = s1.UsedRange.Formula
s2.Range("A1").Resize(UBound(formArr, 1), UBound(formArr, 2)).Formula = formArr

End Sub

3

由于99%的回答甚至都没有解决原始问题,因此这是正确的回答。

  1. 照常将工作表从原始文件(Original.xlsx)复制到新的Excel文件(New.xlsx)。通常,我右键单击名称,然后选择“移动或复制...”。

  2. 保存第二个-新创建的文件(New.xlsx)。

  3. 在新文件的“数据”下,单击“编辑链接”

  4. 在弹出窗口中,选择“更改源...”

  5. 找到文件(New.xlsx),然后单击“打开”。

所有对原始文件(Original.xlsx)的引用都将被删除。

完成!


应该在答案列表中更高
sabre23t

2
  • 将工作表复制到“ WorkbookB.xlsx”
  • 在新文件中打开工作表
  • 全选
  • 转到菜单数据,单击编辑链接
  • 编辑链接,以便到旧文件的链接现在是到当前打开文件的链接

这对我有用。


0

这两个工作簿都必须打开才能起作用。您运行此宏,它将复制workbookA!sheet1到workbookB!sheet1,然后替换所有workbookA引用。这很粗糙,但是行得通。您显然可以更改代码以使其与WorkbookA.xlsx名称匹配,但要确保它们具有正确的扩展名并保留在引号中。

哦,要创建一个宏(如果您不知道的话),请单击alt + F11以显示Visual Basic编辑器。然后右键单击WBA,insert - module然后将以下代码复制并粘贴到模块中。然后点击F5运行宏。如果宏不运行,可能是因为未启用宏,所以继续保存并重新打开,并在提示启用宏时启用它们。

Sub copysheetremoveWBref()

    Application.ScreenUpdating = False

    'activate WBA
    Application.Workbooks("workbooka.xlsx").Activate
    'Select WBA Sheet1
    Application.Workbooks("workbooka.xlsx").Sheets("Sheet1").Select
    'copy WBA!sheet1 to WBB!sheet1
    Sheets("Sheet1").copy Before:=Workbooks("WorkbookB.xlsx").Sheets("sheet2")
    'find WBA references and remove them
    Cells.Replace What:="=[workbookA.xlsx]", Replacement:="=", LookAt:=xlPart _
        , SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False

    Application.ScreenUpdating = True


End Sub

1
一个简单的例程就像我现在手动操作一样好CTRL+H,但是所有这些都不能解决控件的引用问题,例如按钮,下拉菜单等。和命名范围。
2012年

0

我通过将单元格正常复制到新工作表中,然后进行查找替换以删除公式中的旧文件路径来实现此目的。

例如,如果第一个公式为,则=J2变为=[filepath]J2,则只需查找并替换整个新电子表格即可,[filepath]而无需进行任何替换。这将其删除并将公式恢复为=J2

不需要VB!


遗憾的是,当在公式:/中查找子字符串时,excel似乎只能间歇性地工作。它似乎也找不到单引号的内容。
道格拉斯·加斯凯尔

0

我有一个类似的问题。将公式粘贴到WBA的链接的原因是,我在WBA中使用的选项卡(工作表)的名称与WBB中的名称不同。对我来说,它始终是“最后一张纸”,但一个被命名为“ MinFlow”,另一个被命名为“ NormalFlow”。我将两者都重命名为“结果”,并且复制/粘贴按我的意愿进行了工作-“相对粘贴”。


0

选择要移动的单元格。现在尝试通过将n拖放到不同的工作表(不同的选项卡)来移动它们。

我知道,它滚动。这是棘手的部分:只需按cmd(mac)或alt(win),它将使您将单元格拖放到另一个选项卡。


您能扩大一点答案吗?不清楚在拖动时如何/在何处放置在另一个选项卡上。谢谢。
fixer1234 2015年

0

您好,这里是解决此问题的简单方法:

  1. 照常复制单元格。
  2. 在公式中,选择并将其链接到上一个工作簿[WorkbookA.xlsx]的文本复制。
  3. 选择要更改的所有单元格,然后按,CTRL+F然后选择替换选项卡。
  4. 将[WorkbookA.xlsx]替换为空白(也不要在Replace with字段中写任何东西,请按Replace All

瞧-完成了。


0

另一个“技巧”-在复制源工作表之前,将所有公式限定符替换=为其他字符集(例如###=)。

复制工作表,然后在复制后,将公式限定符放回原处(替换###==)。

确保在形式表中引用的所有工作表也都复制到参考表之前的新工作表中。


0
  1. 照常复制表。(右键单击选项卡,然后转到“移动或复制”)这是用于格式化。

  2. 复制原始工作表中的所有单元格(使用Ctrl+ A或左上角的三角形和Ctrl+ C

  3. 将值粘贴到新工作簿中(在“步骤1”工作表上方)(粘贴选项> 123)


0

如果由于要在VBA程序中放入图纸而需要自动执行此操作。用这个:

Public Sub ChangeSource()
'
' ChangeSource Macro
' Edit the links to point to the current workbook.
'
    Dim allLinks As Variant
    allLinks = ThisWorkbook.LinkSources(xlExcelLinks)
    If Not IsEmpty(allLinks) Then
        Dim eachLink As Long
        For eachLink = 1 To UBound(allLinks)
            If InStr(3, "String found in source book name.", allLinks(eachLink)) Then
                ThisWorkbook.ChangeLink Name:=allLinks(eachLink), NewName:=ThisWorkbook.FullName, Type:=xlExcelLinks
            End If
        Next eachLink
    End If
End Sub

只需更改“在源书名称中找到的字符串”。匹配您要替换的旧链接。如果要替换所有链接,可以删除if块。


-1

打开两个工作簿。在源工作簿(WorkbookA.xlsx)中,选择要复制的工作表。右键单击工作表选项卡,然后选择“移动或复制...”。在“移动或复制”对话框中,在“至书”下拉菜单中选择“ WorkbookB.xlsx”,选择要在书中放置的位置,然后选中“创建副本”。(然后单击“确定”。)


-1

制作要从中移动图纸的图纸副本,这种情况是WorkbookA.xlsx。重命名为“ WorkbookA.xlsx的副本”。现在,打开此新工作簿以及要将工作表移动到的工作簿,本例中为WorkbookB.xlsx。右键单击您创建的复制工作簿中的工作表,即WorkbookA.xlsx的副本,然后选择“移动或复制”,然后将这些工作表移动到WorkbookB.xlsx。大功告成!


目前尚不清楚您的答案如何解决问题。为什么移动会以不同于复制的方式起作用?
朱塔什(MátéJuhász)2015年

我尝试了您提出的解决方案,但它不起作用。复制和移动整张纸没有区别。
nixda 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.