如何在复制/粘贴后禁用Excel自动单元格引用更改?

时间:2011-07-12 17:25:48

标签: excel excel-formula reference cell copy-paste

我正在处理一个庞大的Excel 2003电子表格。有很多非常大的公式,有很多细胞参考。这是一个简单的例子。

='Sheet'!AC69+'Sheet'!AC52+'Sheet'!AC53)*$D$3+'Sheet'!AC49

其中大多数都比这更复杂,但这可以很好地了解我正在使用的内容。这些细胞参考中很少是绝对的($ s)。我希望能够将这些单元格复制到不同的位置,而不会更改单元格引用。我知道我可以简单地使用f4来使引用绝对,但是有很多数据我可能需要稍后使用Fill。有没有办法临时禁用单元格引用更改复制粘贴/填充而不使引用绝对?

编辑:我刚刚发现你可以通过将单元格内容复制为文本而不是公式来对VBA执行此操作。我不想这样做,因为我想一次复制整行/列。我缺少一个简单的解决方案吗?

13 个答案:

答案 0 :(得分:54)

来自http://spreadsheetpage.com/index.php/tip/making_an_exact_copy_of_a_range_of_formulas_take_2

  1. 将Excel置于公式视图模式中。最简单的方法是按 Ctrl + `(该字符是“向后撇号”,并且通常位于具有〜(代字号)的相同键上
  2. 选择要复制的范围。
  3. Ctrl + C
  4. 启动Windows记事本
  5. Ctrl + V 将复制的数据传递到记事本
  6. 在记事本中,按 Ctrl + A ,然后按 Ctrl + C 复制文本
  7. 激活Excel并激活要粘贴公式的左上角单元格。并且,确保要复制的工作表处于公式视图模式。
  8. Ctrl + V 进行粘贴。
  9. Ctrl + `切换出公式视图模式。
  10. 注意:如果粘贴操作返回Excel无法正常工作,则可能是您最近使用了Excel的文本到列功能,而Excel正在尝试通过记住您上次解析数据的方式来提供帮助。您需要启动“将文本转换为列向导”。选择“分隔”选项,然后单击“下一步”。清除除Tab。

    之外的所有Delimiter选项复选标记

    或者,来自http://spreadsheetpage.com/index.php/tip/making_an_exact_copy_of_a_range_of_formulas/

    If you're a VBA programmer, you can simply execute the following code: 
    With Sheets("Sheet1")
     .Range("A11:D20").Formula = .Range("A1:D10").Formula
    End With
    

答案 1 :(得分:22)

一个非常简单的解决方案是选择您要复制的范围,然后选择查找和替换(Ctrl + h),将=更改为公式中未使用的另一个符号(例如{{1} }) - 从而阻止它成为一个活跃的公式。

然后,将所选范围复制并粘贴到新位置。

最后,查找和替换将原始范围和新范围中的#更改回#,从而将这两个范围恢复为公式。

答案 2 :(得分:6)

我来到这个网站寻找一种简单的方法来复制,而无需更改单元格引用。但现在我认为我自己的解决方法比大多数这些方法简单。我的方法依赖于Copy更改引用但Move不会引用的事实。这是一个简单的例子。

假设您在A列和B列中有原始数据,在C中有公式(例如C = A + B),您希望F列中的公式相同,但从C到F的复制会导致F = D + E.

  1. 将C的内容复制到任何空的临时列,例如R.相对引用将更改为R = P + Q,但即使它被标记为错误,也会忽略它。
  2. 返回C并移动(不复制)它到F.公式应保持不变,因此F = A + B.
  3. 现在转到R并将其复制回C.相对参考将恢复为C = A + B
  4. 删除R中的临时公式。
  5. Bob是你的叔叔。
  6. 我已经用一系列单元格做到了这一点,所以我认为它几乎可以用于任何复杂程度。你只需要一个空的区域来停放coiped细胞。当然,你必须记住你离开他们的地方。

答案 3 :(得分:1)

这个简单的技巧有效:复制和粘贴。不要剪切和粘贴。粘贴后,重新选择复制的部分,然后转到编辑,向下滑动到清除,清除内容。

答案 4 :(得分:0)

我认为您坚持使用编辑中提到的解决方法。

我首先将表单上的每个公式转换为大致如下文字:

Dim r As Range

For Each r In Worksheets("Sheet1").UsedRange
    If (Left$(r.Formula, 1) = "=") Then
        r.Formula = "'ZZZ" & r.Formula
    End If
Next r

其中'ZZZ使用'表示文本值,ZZZ作为我们在将文本转换回公式时可以查找的值。显然,如果您的任何单元格实际上以文本ZZZ开头,那么将VBA宏中的ZZZ值更改为其他

当重新安排完成后,我会将文本转换回如下公式:

For Each r In Worksheets("Sheet1").UsedRange
    If (Left$(r.Formula, 3) = "ZZZ") Then
        r.Formula = Mid$(r.Formula, 4)
    End If
Next r

这种方法的一个真正缺点是,在重新安排时,您无法看到任何公式的结果。您可能会发现,当您从文本转换回公式时,您会遇到大量#REF错误。

分阶段进行这项工作并经常转换回公式以确定没有发生灾难可能是有益的

答案 5 :(得分:0)

在执行操作时使用find / replace来禁用公式很常见。例如,使用转置进行复制。通过在其前面放置一些占位符(例如" $ =")来禁用该公式。一旦操作完成,查找替换就可以摆脱这些。

此vba只会自动执行活动工作表的查找/替换。

' toggle forumlas on active sheet as active/ inactive
' by use of "$=" prefix

Sub toggle_active_formulas()
    Dim current_calc_method As String
    initial_calc_method = Application.Calculation
    Application.Calculation = xlCalculationManual
    Dim predominant As Integer
    Dim c As Range
    For Each c In ActiveSheet.UsedRange.Cells
        If c.HasFormula Then
            predominant = predominant + 1
        ElseIf "$=" = Left(c.Value, 2) Then
            predominant = predominant - 1
        End If
    Next c
    If predominant > 0 Then
        For Each c In ActiveSheet.UsedRange.Cells
            On Error Resume Next
            If c.HasFormula Then
                c.Value = "$" & c.Formula
            End If
        Next c
    Else
        For Each c In ActiveSheet.UsedRange.Cells
            On Error Resume Next
            If "$=" = Left(c.Value, 2) Then
                c.Formula = Right(c.Value, Len(c.Value) - 1)
            End If
        Next c
    End If
    Application.Calculation = initial_calc_method
End Sub

答案 6 :(得分:0)

此宏可以完成全部工作。

Sub Absolute_Reference_Copy_Paste()
'By changing "=" in formulas to "#" the content is no longer seen as a formula.
' C+S+e (my keyboard shortcut)

Dim Dummy As Range
Dim FirstSelection As Range
Dim SecondSelection As Range
Dim SheetFirst As Worksheet
Dim SheetSecond As Worksheet

On Error GoTo Whoa

Application.EnableEvents = False

' Set starting selection variable.
Set FirstSelection = Selection
Set SheetFirst = FirstSelection.Worksheet

' Reset the Find function so the scope of the search area is the current worksheet.
Set Dummy = Worksheets(1).Range("A1:A1").Find("Dummy", LookIn:=xlValues)

' Change "=" to "#" in selection.
Selection.Replace What:="=", Replacement:="#", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

' Select the area you want to paste the formulas; must be same size as original
  selection and outside of the original selection.
Set SecondSelection = Application.InputBox("Select a range", "Obtain Range Object", Type:=8)
Set SheetSecond = SecondSelection.Worksheet

' Copy the original selection and paste it into the newly selected area. The active
  selection remains FirstSelection.
FirstSelection.Copy SecondSelection

' Restore "=" in FirstSelection.
Selection.Replace What:="#", Replacement:="=", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

' Select SecondSelection.
SheetSecond.Activate
SecondSelection.Select

' Restore "=" in SecondSelection.
Selection.Replace What:="#", Replacement:="=", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

' Return active selection to the original area: FirstSelection.
SheetFirst.Activate
FirstSelection.Select

Application.EnableEvents = True

Exit Sub

Whoa:
' If something goes wrong after "=" has been changed in FirstSelection, restore "=".
FirstSelection.Select
Selection.Replace What:="#", Replacement:="=", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

End Sub

请注意,进行新选择时,必须与原始选择的大小和形状匹配。

答案 7 :(得分:0)

我找到了可以自动实现@Alistair Collins解决方案的解决方案。

基本上,您可以将任何公式中的=更改为*,然后粘贴,然后将其更改回

        Dim cell As Range

msgResult = MsgBox("Yes to lock" & vbNewLine & "No unlock ", vbYesNoCancel + vbQuestion, "Forumula locker")

If msgResult = vbNo Then
    For Each cell In Range("A1:i155")
        If InStr(1, cell.Value, "*") > 0 Then
            cell.Formula = Replace(cell.Formula, "*", "=")
        End If
    Next cell
ElseIf msgResult = vbYes Then
    For Each cell In Range("A1:i155")
        If cell.HasFormula = True Then
            cell.Formula = Replace(cell.Formula, "=", "*")
        End If
    Next cell
End If

答案 8 :(得分:-1)

Haven不在Excel中查看,但这适用于Libreoffice4:

地址重写的全部内容都是在连续的期间发生的 (a1)削减
(a2)粘贴

你需要通过在中间插入一些内容来中断连续性:
(b1)切 (b2)选择一些空单元格(大于1)并拖动(移动)它们 (b3)粘贴

步骤(b2)是即将更新的单元停止跟踪的地方。快速而简单。

答案 9 :(得分:-1)

试试这个: 左键单击选项卡,制作整个工作表的副本,然后剪切要保持相同的单元格并将其粘贴到原始工作表中。

答案 10 :(得分:-1)

我发现另一个非常简单的解决方法: 1.剪切内容 2.将它们粘贴到新位置 3.将刚粘贴的内容复制到所需的新位置。 4.撤消剪切粘贴操作,将原始内容放回到获得它们的位置。 5.将剪贴板中的内容粘贴到同一位置。这些内容将有原始参考。

看起来很多,但键盘快捷键超快: 1. Ctrl-x,2。Ctrl-v,3。Ctrl-c,4。Ctrl-z,5。Ctrl-v

答案 11 :(得分:-1)

单击要复制的单元格。在公式栏中,突出显示公式。

Ctrl C

按“退出”(让您不再主动编辑该公式)。

选择新细胞。 Ctrl V。

答案 12 :(得分:-1)

我刚才在类似情况下使用的简单解决方法:

  1. 复制工作表
  2. 从重复的工作表中剪切+粘贴
  3. 删除重复的工作表以进行清理

您的单元格引用现在已复制,无需更改。