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

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

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

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

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

Ответы [ 13 ]

54 голосов
/ 22 апреля 2013

С 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 + ` для выхода из режима просмотра формул.

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

Или с 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
22 голосов
/ 25 апреля 2014

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

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

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

6 голосов
/ 13 августа 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. Ваш дядя Боб.

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

1 голос
/ 28 декабря 2015

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

0 голосов
/ 01 июля 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
0 голосов
/ 01 марта 2019

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

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

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

0 голосов
/ 11 июля 2018

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

  1. Сделать копию листа
  2. Вырезать + вставить из дубликата листа
  3. Удалить дубликат листа для очистки

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

0 голосов
/ 04 мая 2017

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

Нажмите Ctrl C.

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

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

0 голосов
/ 19 июля 2016

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

Этот 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
0 голосов
/ 03 мая 2016

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

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

...