Отключить автоматическое изменение ссылки на ячейки Excel после копирования / вставки
У меня есть массивная электронная таблица Excel 2003, над которой я работаю. Там много очень больших формул с ссылками на ячейки. Вот простой пример.
='Sheet'!AC69+'Sheet'!AC52+'Sheet'!AC53)*$D+'Sheet'!AC49
большинство из них сложнее, чем это, но это дает хорошее представление о том, с чем я работаю. Некоторые из этих ссылок на ячейки являются абсолютными ($s). Я хотел бы иметь возможность копировать эти ячейки в другое место без изменения ссылок на ячейки. Я знаю, что могу просто использовать f4 для ссылок абсолютный, но есть много данных, и мне, возможно, придется использовать Fill позже. Есть ли способ временно отключить изменение ссылки на ячейку при копировании-вставке / заливке, не делая ссылки абсолютными?
EDIT: я только что узнал, что вы можете сделать это с VBA, скопировав содержимое ячейки в виде текста вместо формулы. Я хотел бы не делать этого, хотя, потому что я хочу скопировать целые строки/столбцы сразу. Есть ли простое решение, которого мне не хватает?
11 ответов
от http://spreadsheetpage.com/index.php/tip/making_an_exact_copy_of_a_range_of_formulas_take_2:
- поместите Excel в режим просмотра формул. Самый простой способ сделать это-нажать Ctrl+` (этот символ является "обратным Апострофом" и обычно находится на той же клавише, что и ~ (Тильда).
- выберите диапазон для копирования.
- Нажмите Ctrl + C
- Запустите Блокнот Windows
- нажмите Ctrl+V, чтобы передать скопированные данные в Блокнот
- в блокноте нажмите Ctrl+A, затем Ctrl+C, чтобы скопировать текст
- активировать Excel и активировать верхнюю левую ячейку, куда вы хотите вставить формулы. И убедитесь, что лист копируется в режиме просмотра формулы.
- нажмите Ctrl+V для вставки.
- нажмите Ctrl+`, чтобы выйти из режима просмотра формул.
Примечание: Если операция вставки обратно в Excel работает неправильно, скорее всего, вы использовали Excel Функция Text-to-Columns недавно, и 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
есть очень простое решение-выбрать диапазон, который вы хотите скопировать, а затем найти и заменить (Ctrl + h
), изменение =
к другому символу, который не используется в вашей формуле (например,#
) - таким образом, останавливая его от активной формулы.
затем скопируйте и вставьте выбранный диапазон в новое место.
наконец, найти и заменить, чтобы изменить #
на =
как в исходном, так и в новом диапазоне, таким образом, снова восстанавливая оба диапазона в формулы.
Я пришел на этот сайт в поисках простого способа копирования без изменения ссылок на ячейки. Но теперь я думаю, что мой собственный обходной путь проще, чем большинство этих методов. Мой метод основан на том, что копирование изменяет ссылки, но не перемещает. Вот простой пример.
предположим, что у вас есть необработанные данные в Столбцах A и B и формула в C (например, C=A+B), и вы хотите ту же формулу в столбце F, но копирование из C В F приводит к F=D+E.
- скопируйте содержимое C в любой пустой временный столбец, скажем R. относительные ссылки изменятся на R=P+Q, но игнорируют это, даже если он помечен как ошибка.
- вернитесь к C и переместите (не копировать) его в F. Формула должна быть неизменной, поэтому F=A+B.
- Теперь перейдите к R и скопируйте его обратно в C. Относительная ссылка вернется к C=A+B
- удалить временную формулу в R.
- Боб твой дядя.
Я сделал это с рядом ячеек, поэтому я думаю, что это будет работать с практически любой уровень сложности. Нужно просто пустое место для парковки coiped клеток. И конечно, ты должен помнить, где ты их оставил.
этот простой трюк работает: копировать и вставить. Не режьте и не вставляйте. После вставки выберите скопированную деталь и перейдите к редактированию, затем сдвиньте вниз, чтобы очистить и очистить содержимое.
Я думаю, что вы застряли с обходным путем, который вы упомянули в своем редактировании.
Я бы начал с преобразования каждой формулы на листе в текст примерно так:
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 для что-то другое!--9-->
когда перестановка будет завершена, я бы затем преобразовать текст обратно в формулу, как это:
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
ошибки, например.
было бы полезно работать над этим поэтапно и конвертировать обратно в формулы так часто, чтобы проверить что никаких катастроф не было!--9-->
обычно используется find / replace для отключения формул при выполнении манипуляций. Например, копировать с транспонированием. Формула отключается путем размещения перед ней некоторого заполнителя (например,"$="). 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
попробуйте это: Щелкните левой кнопкой мыши вкладку, сделав копию всего листа, затем вырежьте ячейки, которые хотите сохранить, и вставьте их в исходный лист.
Я нашел еще один обходной путь, который очень прост: 1. Вырезать содержимое 2. Вставить их в новое место 3. Скопируйте содержимое, которое вы только что вставили в новое место, которое вы хотите. 4. Отмените операцию вырезать-вставить, поместив исходное содержимое туда, где вы их получили. 5. Вставьте содержимое буфера обмена в то же место. Эти материалы будут иметь исходные ссылки.
Это выглядит много, но очень быстро с сочетаниями клавиш: 1. Ctrl-x, 2. Ctrl-v, 3. Ctrl-c, 4. Ctrl-z, 5. Ctrl " и " V
не проверяли Excel, но это работает в Libreoffice4:
все дело переписывания адресов происходит во время последовательного
(А1) вырезать
(А2) вставить
вам нужно прервать последовательность, поставив что-то между ними:
(В1) вырезать
(b2) выберите несколько пустых ячеек(более 1) и перетащите их
(Б3) вставить
шаг (b2), где ячейка, которая собирается обновить себя, останавливает отследить. Быстро и просто.
нажмите на ячейку, которую вы хотите скопировать. В строке формул выделите формулу.
пресс Ctrl C
.
нажмите escape (чтобы вывести вас из активного редактирования этой формулы).
выберите новую ячейку. Сочетание Клавиш Ctrl В.
простое решение я просто сейчас в подобной ситуации:
- сделайте дубликат рабочего листа
- "вырезать" + "вставить" из дубликата листа
- удалить дубликат рабочего листа для очистки
Ваши ссылки на ячейки скопированы без изменения.