Скопируйте таблицу Excel и сохраните относительную ссылку на ячейку в формулах

41

Еще одна проблема копирования в Excel:

Как я могу скопировать рабочую таблицу из WorkbookA.xlsx в WorkbookB.xlsx без того, чтобы скопированная рабочая таблица все еще ссылалась на WorkbookA.xlsx, например, формула =B!23становится =[WorkbookA.xlsx]!B!23при копировании.

Я хочу сохранить «относительные» ссылки на ячейки вместо «абсолютных» ссылок на ячейки (я придумаю эту терминологию в мире Excel, если она еще не существует).

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

Подробнее о том, зачем мне это нужно: у меня есть рабочий xlsx для ежедневных операций. Нам постоянно нужно «обновлять» этот xlsx, и поэтому один человек может создать копию и свои изменения для одного листа. Одновременно другой человек может также вносить изменения в другой лист. Учитывая, что эти листы не имеют зависимых ячеек на других листах , как, например, сводный отчет, нам желательно просто скопировать и объединить листы обратно в исходный xlsx. Но «абсолютные» ссылки дают много хлопот.

Джейк
источник
Я в некотором замешательстве. Вы хотите скопировать лист 1 из WBA в WBB, и вы хотите, чтобы он копировал формулы относительно WBB, а не WBA. Это невозможно, если только лист WBB 2 не идентичен листу WBA 2. Так ли это? Кроме того, если вы просто хотите значения, вы можете скопировать лист, select all - copy - paste special - valuesчтобы иметь только значения. Если вы хотите сделать все это во время копирования, а не полагаться на конечного пользователя для выполнения этих шагов, я уже работал над этим. Сообщите нам точно, как вы хотите, чтобы это было с точки зрения WorkbookA (или 1) и WBB (2) и листа #s
Raystafarian
Я уже пытался объяснить в своем последнем абзаце, но я думаю, что это все еще не ясно. Да, WBA и WBB идентичны для одного листа в WBA. При разработке этого листа в WBA предполагается, что все ссылки на ячейки должны быть относительно рабочей книги листа. Функция копирования рабочего листа добавляет все формулы ячеек с помощью WBA, что делает его «абсолютным», и я этого не хочу.
Джейк
специальные значения вставки вставляют только рассчитанные значения. Мне нужно скопировать формулы, без WBA.xls.
Джейк
Хорошо, я в порядке. Я
выложу
Разве вы не можете просто сделать копию всей книги и затем удалить то, что вам не нужно, из новой копии?
dwolters

Ответы:

21

Попробуйте использовать Ctrl+ ~для отображения формул. Затем используйте Ctrl+, Aчтобы выделить все, скопируйте и вставьте его в блокнот.

Наконец, скопируйте его из блокнота и вставьте в другую рабочую книгу.

SVandenBerg
источник
1
@ Джейк: Но вы сказали, что в вашей книге есть кнопки, выпадающие списки и тому подобное; и именованные диапазоны. Этот метод не копирует их (или обыденные вещи, такие как форматирование) - как / почему вы считаете это приемлемым?
Скотт
На большом листе техника «Редактировать ссылки / Изменить источник» была мучительно медленной, но это было быстро.
Тони Пулокас
24

Во многих случаях мне было проще сделать следующее:

  • скопировать лист в новую рабочую книгу
  • активировать новый лист в новой книге
  • выбрать все ( Ctrl+ A)
  • найти / заменить на
    • находить: [WorkbookA.xlsx]!
    • заменить: <оставить пустым>
  • заменить все
Yoheeb
источник
11

Неподписанный ответ прямо под этим - тот, который работал для меня, с очень небольшим изменением.

  1. Создайте и сохраните таблицу назначения.

  2. Используйте «переместить», «скопировать» или перетащите страницу с формулами в новую электронную таблицу. Это оставляет формулы на новой странице, указывающие на старый лист. Затем сохраните новую электронную таблицу в том же месте, что и старая таблица.

  3. Затем перейдите на вкладку «Данные»> нажмите «Изменить ссылки». Опция не будет активной, если на странице нет ссылок.

  4. В появившемся диалоговом окне выберите имя исходного файла и нажмите «Изменить источник».

  5. В открывшемся диалоговом окне открытия файла выберите имя новой электронной таблицы.

Нажмите Закрыть, и вы закончите.

Пит
источник
9

Или просто сделайте следующее:

Преобразуйте это:

=database_feed!A1

к этому:

=INDIRECT("database_feed!A1")

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

Если на вас не ссылается много листов, другой альтернативой будет использование

=INDIRECT("'"&B1&"'!A1")

и введите имя справочного листа в ячейку B1. Теперь у вас есть только одна ячейка для обновления при копировании в новую электронную таблицу.

Джейсон Хигби
источник
1
Хорошая идея, работает, если у вас есть шаблон листа с формулами, и вы копируете его в новую рабочую книгу с VBA. Я обнаружил, что вам нужно сохранить ссылку между кавычками и добавить TRUE, чтобы сохранить ссылки типа A1. например. = INDIRECT ("Sheet1 '! A1", TRUE)
RogerB
2
INDIRECTэто изменчивая формула, поэтому она будет пересчитываться каждый раз (в отличие от только когда она отредактирована), что действительно может замедлить работу более сложных рабочих книг, поэтому используйте с осторожностью
Энди Терра
3

Код ниже может быть адаптирован к вашим потребностям. Он берет все формулы из листа wb1и применяет их к листу в новой рабочей книге. Формулы применяются как Strings, поэтому нет ссылок на исходную книгу. Кроме того, этот код очень быстрый, потому что он не использует буфер обмена и не требует циклического перемещения по ячейкам.

Sub copyformulas()

Dim wb1 As Workbook, wb2 As Workbook
Dim s1 As Worksheet, s2 As Worksheet
Dim formArr() As Variant

Set wb1 = ThisWorkbook
Set s1 = wb1.Sheets("Sheet1")
Set wb2 = Workbooks.Add
Set s2 = wb2.Sheets("Sheet1")

formArr = s1.UsedRange.Formula
s2.Range("A1").Resize(UBound(formArr, 1), UBound(formArr, 2)).Formula = formArr

End Sub
Excellll
источник
3

Поскольку 99% ответов даже не касались исходного вопроса, вот правильный ответ.

  1. Скопируйте листы из исходного файла (Original.xlsx) в новый файл Excel (New.xlsx), как обычно. Обычно я щелкаю правой кнопкой мыши на имени и выбираю «Переместить или Копировать ...».

  2. Сохраните второй - вновь созданный файл (New.xlsx).

  3. В новом файле в разделе «Данные» нажмите «Редактировать ссылки».

  4. Во всплывающем окне выберите «Изменить источник ...»

  5. Найдите файл (New.xlsx) и нажмите Открыть.

Все ссылки на оригинал (Original.xlsx) будут удалены.

СДЕЛАННЫЙ!

Дэвид
источник
Должен быть выше в списке ответов
sabre23t
2
  • скопировать лист в «WorkbookB.xlsx»
  • открыть лист в новом файле
  • выбрать все
  • перейдите в меню «Данные», нажмите на ссылку «Изменить»
  • отредактируйте ссылки так, чтобы ссылка на старый файл теперь была ссылкой на открытый в данный момент файл

Это работает для меня.

user259817
источник
0

Обе книги должны быть открыты, чтобы это работало . Вы запускаете этот макрос, и он скопирует workbookA!sheet1 workbookB!sheet1и затем заменит все workbookAссылки. Это сырой, но это работает . Очевидно, вы можете изменить код в соответствии с именами WorkbookA.xlsx, но убедитесь, что они имеют правильное расширение и остаются в кавычках.

О, чтобы сделать макрос, если вы не знаете, нажмите, alt + F11чтобы вызвать редактор Visual Basic. Затем щелкните правой кнопкой мыши на WBA, insert - moduleскопируйте и вставьте приведенный ниже код в модуль. Затем нажмите, F5чтобы запустить макрос. Если макрос не запускается, возможно, это связано с тем, что макросы не включены, поэтому сохраните его и снова откройте, а когда он предложит включить макросы, включите их.

Sub copysheetremoveWBref()

    Application.ScreenUpdating = False

    'activate WBA
    Application.Workbooks("workbooka.xlsx").Activate
    'Select WBA Sheet1
    Application.Workbooks("workbooka.xlsx").Sheets("Sheet1").Select
    'copy WBA!sheet1 to WBB!sheet1
    Sheets("Sheet1").copy Before:=Workbooks("WorkbookB.xlsx").Sheets("sheet2")
    'find WBA references and remove them
    Cells.Replace What:="=[workbookA.xlsx]", Replacement:="=", LookAt:=xlPart _
        , SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False

    Application.ScreenUpdating = True


End Sub
Raystafarian
источник
1
CTRL+HОтдельная рутина хороша, как и сейчас, вручную , но все они не фиксируют ссылки на элементы управления, например кнопки, выпадающие списки и тому подобное; и именованные диапазоны.
Джейк
0

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

Например, если первая формула =J2и это становится =[filepath]J2, то просто найдите и замените всю новую электронную таблицу [filepath]и ничего не заменяйте. Это удалит его и восстановит формулу =J2.

VB не требуется!

cdpinker
источник
К сожалению, Excel, кажется, работает только с перерывами, когда дело доходит до поиска подстрок внутри формул: /. Кажется, он не способен найти что-либо с одинарными кавычками.
Дуглас Гаскелл
0

У меня была похожая проблема. Причина, по которой формулы были вставлены со ссылкой на WBA, заключалась в том, что вкладка (лист), над которой я работал в WBA, была названа иначе, чем в WBB. Для меня это всегда был «последний лист», но один назывался «MinFlow», а другой - «NormalFlow». Я переименовал оба в «Результаты», и копирование / вставка работали так, как я хотел - «относительная вставка».

Дженет
источник
0

Выберите клетки, которые вы хотите переместить. Теперь попробуйте переместить их, перетащив n drop на другой лист (на другую вкладку).

Я знаю, это прокручивается. Вот сложная часть: просто нажмите cmd (mac) или alt (win), и он позволит вам бросить ячейки на другую вкладку.

Энди Абель
источник
Можете ли вы немного расширить свой ответ? Непонятно, как и куда перетащить на другую вкладку при перетаскивании. Спасибо.
fixer1234
0

Привет, вот простое решение этой проблемы:

  1. Скопируйте ячейки как обычно.
  2. В формуле выберите и скопируйте текст, связывающий его с предыдущей книгой [WorkbookA.xlsx].
  3. Выберите все ячейки, которые вы хотите изменить, и нажмите CTRL+F и выберите вкладку замены.
  4. Замените [WorkbookA.xlsx] пустым пространством (иначе ничего не пишите в Replace withполе, нажмите Replace All.

Вуаля - это сделано.

Никлас
источник
0

Еще одна хитрость - перед копированием исходного листа замените все квалификаторы формул =другими наборами символов (скажем ###=).

Скопируйте лист поверх, затем после копирования замените спецификатор формулы обратно (заменив ###= на =).

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

Укротитель Салама
источник
0
  1. Скопируйте лист как обычно. (щелкните правой кнопкой мыши вкладку и выберите «переместить или скопировать»). Это для форматирования.

  2. Скопируйте все ячейки с исходного листа (используя Ctrl+ Aили верхний левый треугольник и Ctrl+ C)

  3. Вставить как значения в новую книгу (на листе «шаг-1») (Параметры вставки> 123)

ЕСВ
источник
0

Если вам нужно сделать это автоматически, потому что вы загружаете листы в программе VBA. Использовать этот:

Public Sub ChangeSource()
'
' ChangeSource Macro
' Edit the links to point to the current workbook.
'
    Dim allLinks As Variant
    allLinks = ThisWorkbook.LinkSources(xlExcelLinks)
    If Not IsEmpty(allLinks) Then
        Dim eachLink As Long
        For eachLink = 1 To UBound(allLinks)
            If InStr(3, "String found in source book name.", allLinks(eachLink)) Then
                ThisWorkbook.ChangeLink Name:=allLinks(eachLink), NewName:=ThisWorkbook.FullName, Type:=xlExcelLinks
            End If
        Next eachLink
    End If
End Sub

Просто измените «Строка найдена в названии исходной книги». соответствовать старым ссылкам, которые вы хотите заменить. Вы можете удалить это, если заблокировать, если вы хотите заменить все ссылки.

HackSlash
источник
-1

Откройте обе рабочие книги. В исходной рабочей книге (WorkbookA.xlsx) выберите лист, который вы хотите скопировать. Щелкните правой кнопкой мыши вкладку листа и выберите «Переместить или скопировать…». В диалоговом окне «Переместить или скопировать» выберите «WorkbookB.xlsx» в раскрывающемся списке «В книгу», выберите место в этой книге, куда вы хотите поместить его, и установите флажок «Создать копию». (И нажмите «ОК».)

Скотт
источник
-1

Сделайте копию листа, который вы хотите переместить листы, из которого в этом случае будет WorkbookA.xlsx. Переименуйте его, чтобы сказать «Копия WorkbookA.xlsx». Теперь откройте эту новую рабочую книгу, а также рабочую книгу, которую вы хотите переместить, в которую в этом случае будет WorkbookB.xlsx. Щелкните правой кнопкой мыши листы в созданной вами копии книги, т. Е. «Копия WorkbookA.xlsx» и выберите «переместить или скопировать», а затем переместите эти листы в WorkbookB.xlsx. Вы сделали !

Nishant
источник
Непонятно, как ваш ответ решает проблему вопроса. Почему перемещение будет работать иначе, чем копирование?
Матэ Юхас,
Я попробовал предложенное вами решение, и оно не работает. Нет разницы между копированием и перемещением целых листов.
никсда