我正在处理一个庞大的Excel 2003电子表格。有很多非常大的公式,有很多细胞参考。这是一个简单的例子。
='Sheet'!AC69+'Sheet'!AC52+'Sheet'!AC53)*$D$3+'Sheet'!AC49
其中大多数都比这更复杂,但这可以很好地了解我正在使用的内容。这些细胞参考中很少是绝对的($ s)。我希望能够将这些单元格复制到不同的位置,而不会更改单元格引用。我知道我可以简单地使用f4来使引用绝对,但是有很多数据我可能需要稍后使用Fill。有没有办法临时禁用单元格引用更改复制粘贴/填充而不使引用绝对?
编辑:我刚刚发现你可以通过将单元格内容复制为文本而不是公式来对VBA执行此操作。我不想这样做,因为我想一次复制整行/列。我缺少一个简单的解决方案吗?
答案 0 :(得分:54)
来自http://spreadsheetpage.com/index.php/tip/making_an_exact_copy_of_a_range_of_formulas_take_2:
注意:如果粘贴操作返回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.
我已经用一系列单元格做到了这一点,所以我认为它几乎可以用于任何复杂程度。你只需要一个空的区域来停放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)
我刚才在类似情况下使用的简单解决方法:
您的单元格引用现在已复制,无需更改。