Как отключить автоматическое изменение ссылки на ячейку в Excel после копирования / вставки?

У меня есть огромная электронная таблица Excel 2003, над которой я работаю. Есть много очень больших формул с множеством ссылок на ячейки. Вот простой пример.

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

Большинство из них более сложные, но это дает хорошее представление о том, с чем я работаю. Некоторые из этих ссылок на ячейки являются абсолютными ($ s). Я хотел бы иметь возможность копировать эти ячейки в другое место без изменения ссылок на ячейки. Я знаю, что могу просто использовать f4, чтобы сделать ссылки абсолютными, но данных много, и мне может понадобиться использовать Fill позже. Есть ли способ временно отключить изменение ссылки на ячейку при копировании-вставке / заполнении, не делая ссылки абсолютными?

РЕДАКТИРОВАТЬ: Я только что узнал, что вы можете сделать это с помощью VBA, скопировав содержимое ячейки как текст, а не формулу. Я бы не хотел этого делать, потому что я хочу копировать сразу целые строки / столбцы. Есть ли простое решение, которое мне не хватает?


person Bat Masterson    schedule 12.07.2011    source источник
comment
Отличный вопрос! Может ли цикл в VBA не решить оставшуюся проблему?   -  person Jonas Heidelberg    schedule 12.07.2011


Ответы (13)


Из http://spreadsheetpage.com/index.php/tip/making_an_exact_copy_of_form_a_a_a_a_a_a_a

  1. Переведите Excel в режим просмотра формул. Самый простой способ сделать это - нажать Ctrl + ` (этот символ является« обратным апострофом »и обычно находится на той же клавише, что и ~ (тильда) .
  2. Выберите диапазон для копирования.
  3. Нажмите Ctrl + C
  4. Запустите Блокнот Windows
  5. Нажмите Ctrl + V, чтобы вставить скопированные данные в Блокнот.
  6. В Блокноте нажмите Ctrl + A, а затем Ctrl + C, чтобы скопировать текст.
  7. Активируйте Excel и активируйте левую верхнюю ячейку, в которую вы хотите вставить формулы. И убедитесь, что лист, на который вы копируете, находится в режиме просмотра формул.
  8. Нажмите Ctrl + V, чтобы вставить.
  9. Нажмите Ctrl + `, чтобы выйти из режима просмотра формул.

Примечание. Если операция вставки обратно в Excel работает некорректно, скорее всего, вы недавно использовали функцию преобразования текста в столбцы Excel, и Excel пытается помочь, вспомнив, как вы в последний раз анализировали свои данные. Вам нужно запустить мастер преобразования текста в столбцы. Выберите вариант с разделителями и нажмите Далее. Снимите все флажки в параметрах разделителя, кроме табуляции.

Или из http://spreadsheetpage.com/index.php/tip/making_an_exact_copy_of_formulas/range а>:

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
person Whit Kemmey    schedule 22.04.2013
comment
Похоже, вы можете вставить в лист, который не находится в режиме просмотра формул; не повредит следовать этому пункту, хотя все остальное строго необходимо. +1, так как это было очень полезно и легко следовать. Я не понимаю, почему Excel предполагает, что мы хотим сослаться на ячейку в другом файле, но, по крайней мере, есть хороший обходной путь. - person ZeroK; 01.10.2013
comment
Это замечательный ответ - я хотел бы принять его за оригинальный плакат. Я программист, поэтому VBA меня не пугает, но я не собираюсь использовать его только для копирования и вставки некоторых ячеек, если я могу этого избежать ... На самом деле должна быть вставка без обновления опции формулы, встроенной в Excel. - person JPhi1618; 16.05.2014
comment
@ JPhi1618 Да, именно так. Не знаю, почему не ставят Вставить без обновления формулы. Больше всего меня беспокоит то, что есть больше, чем поставщики электронных таблиц, MS Office, Google Sheet или WPS Office, и они просто повторяют друг друга. Я скучаю по тому времени, когда они были усовершенствованы с помощью технологий и функциональности. Они делают огромное улучшение с каждым выпуском. Но некоторых элементарных вещей просто не хватает. - person Mohammed Joraid; 14.05.2017

Очень простое решение - выбрать диапазон, который вы хотите скопировать, а затем найти и заменить (Ctrl + h), заменив = на другой символ, который не используется в вашей формуле (например, #) - таким образом, он не станет активной формулой.

Затем скопируйте и вставьте выбранный диапазон в новое место.

Наконец, найдите и замените, чтобы изменить # обратно на = как в исходном, так и в новом диапазоне, таким образом снова восстанавливая оба диапазона как формулы.

person Alistair Collins    schedule 25.04.2014
comment
Пока, к сожалению, это решение, которым я больше всего доволен. Было бы удобно использовать альтернативный ярлык, который просто делал бы это. - person Simon Shine; 24.10.2014

Я пришел на этот сайт в поисках простого способа копирования без изменения ссылок на ячейки. Но теперь я думаю, что мой собственный обходной путь проще, чем большинство из этих методов. Мой метод основан на том, что 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. Боб твой дядя.

Я проделал это с рядом ячеек, поэтому полагаю, что это будет работать практически с любым уровнем сложности. Вам просто нужна пустая площадка, чтобы припарковать скопированные клетки. И, конечно, вы должны помнить, где вы их оставили.

person JimH    schedule 13.08.2014
comment
Описание непростое :) Если вы хотите скопировать строку 1 (которая ссылается на строку 2) в строку 11, то: 1. Скопируйте ее в строку 11, тогда она будет ссылаться на строку 12. 2. Вырежьте и вставьте ее в строку 21 , тогда он по-прежнему будет ссылаться на строку 12. 3. Скопируйте его с 21 на 11, тогда он будет ссылаться на строку 2, как и нужно. - person alexkovelsky; 03.02.2015
comment
Мне это кажется простым, скопировать со смещением, переместить оригинал, скопировать смещение назад, удалить смещение. - person will; 19.05.2016
comment
Для меня это самый простой способ, так как я почти могу делать это, закрыв глаза руками на клавиатуре. Кроме того, вы можете обрабатывать целые области или строки за один раз: Ctrl + C - ›Ctrl + V, затем Ctrl + X -› Ctrl + V, повторяйте столько раз, сколько необходимо. Например. это лучший вариант для дублирования некоторых строк в таблице со ссылками за пределы таблицы: он обновляет ссылки внутри выделения, сохраняя ссылки вне выделения. - person Paul van Leeuwen; 09.02.2019

Этот простой трюк работает: копировать и вставлять. НЕ вырезать и вставлять. После вставки повторно выберите скопированную часть и перейдите к РЕДАКТИРОВАТЬ, сдвиньте вниз до ОЧИСТИТЬ и ОЧИСТИТЬ СОДЕРЖАНИЕ.

person Bob R    schedule 28.12.2015

Я думаю, что вы застряли с обходным путем, который вы упомянули в своем редактировании.

Я бы начал с преобразования каждой формулы на листе в текст примерно так:

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, тогда измените значение ZZZ в макросе VBA на что-то другое.

Когда перестановка будет завершена, я бы преобразовал текст обратно в формулу, подобную этой:

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 ошибок.

Было бы полезно работать над этим поэтапно и время от времени преобразовывать обратно в формулы, чтобы проверять, не произошло ли никаких катастроф.

person barrowc    schedule 12.07.2011

Обычно для отключения формул во время выполнения манипуляций используют поиск / замену. Например, копировать с транспонированием. Формула отключается, если перед ней помещается заполнитель (например, "$ ="). Найти замену можно, чтобы избавиться от них после завершения манипуляции.

Эта 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
person Chris    schedule 19.07.2016
comment
Не могли бы вы добавить больше деталей к этому посту? - person cdomination; 19.07.2016

Этот макрос выполняет всю работу.

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

Обратите внимание, что при создании нового выделения вы должны соответствовать размеру и форме исходного выделения.

person Bill Martz    schedule 28.02.2019

Я нашел это решение, которое автоматизирует решение @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
person eyadt4    schedule 01.07.2019

Простой обходной путь, который я использовал только что в похожей ситуации:

  1. Сделайте копию рабочего листа.
  2. Вырезать + Вставить ячейки с формулами из повторяющегося листа (например, Copy of Sheet1) в исходный лист.
  3. Удалите все вхождения имени дублирующего листа из вновь вставленных формул; например найти и заменить все вхождения поискового запроса 'Copy of Sheet1'! пустой строкой (т. е. пустой).
  4. Удалите повторяющийся лист для очистки.

Примечание: если в названии вашего листа отсутствуют пробелы, вам не нужно использовать одинарную кавычку / апостроф (').

Ваши ссылки на ячейки теперь копируются без изменений.

person dire    schedule 11.07.2018

Попробуйте следующее: щелкните вкладку левой кнопкой мыши, сделав копию всего листа, затем вырежьте ячейки, которые вы хотите сохранить, и вставьте их в исходный рабочий лист.

person Lisa    schedule 18.09.2015

Я нашел еще один очень простой обходной путь: 1. Вырежьте содержимое 2. Вставьте его в новое место 3. Скопируйте содержимое, которое вы только что вставили, в новое место, которое хотите. 4. Отмените операцию вырезания-вставки, вернув исходное содержимое на место. 5. Вставьте содержимое из буфера обмена в то же место. Это содержание будет иметь оригинальные ссылки.

Выглядит много, но работает очень быстро с сочетаниями клавиш: 1. Ctrl-x, 2. Ctrl-v, 3. Ctrl-c, 4. Ctrl-z, 5. Ctrl-v.

person Isaac    schedule 03.05.2016

Не проверял в Excel, но это работает в Libreoffice4:

Вся процедура перезаписи адресов происходит во время последовательного
(a1) вырезать
(a2) вставить

Вам нужно прервать последовательность, вставив что-то среднее:
(b1) вырезать
(b2) выбрать несколько пустых ячеек (более 1) и перетащить (переместить) их
(b3) вставить

Шаг (b2) - это когда ячейка, которая собирается обновиться, останавливает отслеживание. Быстро и просто.

person user1501439    schedule 30.06.2015
comment
Я считаю, что этот ответ неуместен, так как он даже не проверялся. - person Fjodr; 30.06.2015
comment
Фьодр, у меня нет excel. Не могли бы вы проверить это? Я ожидаю, что это сработает, и это звучит как самое простое из всех предложенных решений. Ответ, получивший наибольшее количество голосов, состоит из 9 шагов! Моя намного проще. Пожалуйста, попробуйте! - person user1501439; 29.01.2017

Щелкните ячейку, которую хотите скопировать. В строке формул выделите формулу.

Нажмите Ctrl C.

Нажмите escape (чтобы выйти из режима активного редактирования формулы).

Выберите новую ячейку. Ctrl V.

person Melinda Evans    schedule 04.05.2017