it-swarm.com.ru

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

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

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

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

Правка: Я только что узнал, что вы можете сделать это с VBA, скопировав содержимое ячейки в виде текста вместо формулы. Я хотел бы не делать этого, потому что я хочу скопировать целые строки/столбцы сразу. Есть ли простое решение, которое мне не хватает?

42
Bat Masterson

От 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 Notepad
  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
54
Whit Kemmey

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

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

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

22
Alistair Collins

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

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

6
JimH

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

1
Bob R

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

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

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.

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

0
barrowc

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

Эта 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
Chris

Этот макрос делает всю работу.

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
Bill Martz