Copiar planilha do Excel e manter referência de célula relativa em fórmulas

Outro problema de cópia no Excel:

Como posso copiar uma planilha do WorkbookA.xlsx para o WorkbookB.xlsx sem que a planilha copiada ainda faça referência ao WorkbookA.xlsx? a fórmula = B! 23 torna-se = [WorkbookA.xlsx]! B! 23 quando copiada.

Eu quero manter referências de célula "relativas" em vez de referências de célula "absoluta" (vou inventar esta terminologia no mundo do Excel, se ainda não existe).

Outra alternativa possível que não consigo fazer funcionar é a opção de colar apenas "valores" de células. Excel trata "valores" como valores calculados em vez das fórmulas reais na célula. Se eu escolher a fórmula de colar, ela ainda fornece referências absolutas.

More About Why I Need This: I have a production xlsx in use for daily operations. We constantly need to make "upgrades" to this xlsx and so one person may create a copy and his changes there for a single sheet. Concurrently, another person may also be making changes to another sheet. Given that these sheets have no dependant cells on other sheets, like a summary report, it is desirable for us to just copy and merge the sheets back into the original xlsx. But the "absolute" referencing is giving a lot of trouble.

28
Estou meio confuso. Você deseja copiar a planilha 1 do WBA para o WBB e copiar as fórmulas relativas ao WBB em vez do WBA. Isso não é possível a menos que a folha 2 do WBB seja idêntica à folha WBA 2. Esse é o caso? Além disso, se você quiser apenas valores , poderá copiar a planilha para selecionar todos - copiar - colar - valores especiais para ter apenas valores. Se você quiser fazer tudo durante a cópia, em vez de confiar no usuário final para realizar essas etapas, bem, eu tenho trabalhado nisso. Deixe-nos saber exatamente como você quer ir em termos de WorkbookA (ou 1) e WBB (2) e as folhas #s
adicionado o autor Raystafarian, fonte
Ok, eu estou claro. Vou postar uma resposta se/quando eu descobrir
adicionado o autor Raystafarian, fonte
Eu já tentei explicar no meu último parágrafo, mas acho que ainda não estava claro. Sim, o WBA e o WBB são idênticos esperados para uma planilha no WBA. Ao projetar essa folha no WBA, pretende-se que toda referência de célula seja relativa à pasta de trabalho da planilha. A função de planilha de cópia anexa todas as fórmulas de célula com o WBA, tornando-a "absoluta" e eu não quero isso.
adicionado o autor phoenix, fonte
os valores especiais de colar colam apenas os valores calculados. Eu preciso que as fórmulas sejam copiadas, SEM WBA.xls anexadas.
adicionado o autor phoenix, fonte
@ WinOutreach4 se duas ou mais folhas forem editadas por pessoas diferentes em pastas de trabalho diferentes, nós desejaremos uma mesclagem eventualmente. É quando o problema chega.
adicionado o autor phoenix, fonte
A partir de 20 de abril de 2012, esta questão ainda está aberta a respostas. Obrigado.
adicionado o autor phoenix, fonte
Você não pode simplesmente fazer uma cópia de toda a pasta de trabalho e, em seguida, excluir o que você não precisa da nova cópia?
adicionado o autor user98780, fonte

17 Respostas

Achei mais fácil, em muitos casos, fazer o seguinte:

  • copy the sheet to a new workbook
  • activate the new sheet in the new workbook
  • select all (Ctrl+A)
  • do a find/replace on
    • find: [WorkbookA.xlsx]!
    • replace:
  • replace all
19
adicionado

Tente usar Ctrl + ~ para exibir as fórmulas. Então use Ctrl + A para selecionar tudo, copiá-lo e colá-lo no bloco de notas.

Por fim, copie-o do bloco de notas e cole-o em sua outra pasta de trabalho.

17
adicionado
@Jake: Mas você disse que sua pasta de trabalho possui botões, menus suspensos e outros; e intervalos nomeados. Esta técnica não as copia (ou coisas mundanas como formatação) - como/por que você considera isso aceitável?
adicionado o autor Scott, fonte

A resposta não assinada logo abaixo desta é a que funcionou para mim, com uma pequena variação.

  1. Create and save a destination spreadsheet.

  2. Use "move", "copy", or drag your page with the formulas into the new spreadsheet. This leaves the formulas on the new page pointing to the old worksheet. Then save the new spreadsheet in the same location as the old worksheet.

  3. Then go to the Data Tab > click Edit Links. The option won't be active unless there are links in the page.

  4. In the dialog that results, select the name of the source file and click "Change Source."

  5. From the open-file dialog that appears next, select the name of the new spreadsheet.

Clique em Fechar e você está acabado.

8
adicionado

Ou simplesmente faça o seguinte:

Converta isto:

=database_feed!A1

para isso:

=INDIRECT("database_feed!A1")

e não mais mudanças em suas referências quando você copia entre planilhas.

Se você não tem muitas folhas referenciadas, outra alternativa seria usar

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

e insira o nome da folha de referência na célula B1. Agora você só tem uma célula para atualizar quando copiada para a nova planilha.

7
adicionado
INDIRECT é uma fórmula volátil, por isso será recalculada a cada vez (ao contrário de apenas quando editada), o que pode realmente retardar pastas de trabalho mais complexas, portanto, use com cuidado
adicionado o autor Ash, fonte
Boa ideia, funciona se você tiver uma folha de modelo com fórmulas e estiver copiando isso em uma nova pasta de trabalho com o VBA. Descobri que você precisa manter a referência entre aspas e adicionar TRUE para manter as referências do tipo A1. por exemplo. = INDIRECT ("'Folha1'! A1", VERDADEIRO)
adicionado o autor RogerB, fonte

O código abaixo pode ser adaptado às suas necessidades. Ele pega todas as fórmulas da planilha em wb1 e as aplica a uma planilha em uma nova pasta de trabalho. As fórmulas são aplicadas como String s, portanto, não há inserção de referências à pasta de trabalho original. Além disso, esse código é super rápido porque não usa a área de transferência e não requer nenhum loop pelas células.

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
2
adicionado
  • copia a planilha para 'WorkbookB.xlsx'
  • planilha aberta no novo arquivo
  • selecione todos
  • vá para o menu Dados, clique em editar links
  • edita links para que o link para o arquivo antigo seja agora um link para o arquivo atualmente aberto

Isso funciona para mim.

2
adicionado

Abra as duas pastas de trabalho. Na pasta de trabalho de origem (WorkbookA.xlsx), selecione a planilha que você deseja copiar. Clique com o botão direito do mouse na guia da planilha e selecione “Mover ou Copiar…”. Na caixa de diálogo "Mover ou copiar", selecione "WorkbookB.xlsx" na lista suspensa "Para reservar", escolha onde no livro você quer colocá-lo e marque "Criar uma cópia". (E clique em "OK".)

1
adicionado

Faça uma cópia da planilha para a qual você deseja mover as planilhas das quais, neste caso, seria WorkbookA.xlsx. Renomeie para dizer "Copy of WorkbookA.xlsx". Agora abra esta nova pasta de trabalho, bem como a pasta de trabalho para a qual você deseja mover a pasta, para a qual, nesse caso, seria WorkbookB.xlsx. Clique com o botão direito em planilhas na pasta de trabalho de cópia que você criou, por exemplo, Copiar do WorkbookA.xlsx e selecione 'mover ou copiar' e, em seguida, mova essas planilhas para o WorkbookB.xlsx. Você terminou !

1
adicionado
Eu tentei a sua solução proposta e não funciona. Não há diferença entre copiar e mover folhas inteiras.
adicionado o autor Janis Veinbergs, fonte
Não está claro como sua resposta resolve o problema da questão. Por que mover funcionará de maneira diferente, então a cópia funcionaria?
adicionado o autor pierdevara, fonte

Como 99% das respostas nem sequer abordaram a pergunta original, aqui está a resposta apropriada.

  1. Copie as folhas do arquivo original (Original.xlsx) para o novo arquivo do Excel (New.xlsx) como faria normalmente. Geralmente, clico com o botão direito no nome e escolho "Mover ou copiar ...".

  2. Salve o segundo arquivo recém-criado (New.xlsx).

  3. No novo arquivo, em Dados, clique em "Editar links"

  4. No pop-up, escolha "Alterar fonte ..."

  5. Localize o arquivo (New.xlsx) e clique em Abrir.

Todas as referências ao original (Original.xlsx) serão removidas.

FEITO!

0
adicionado

Outro 'truque' - antes de copiar a planilha de origem, substitua todos os qualificadores de fórmula = por outro conjunto de caracteres (digamos ### = ).

Copie a planilha, depois da cópia, substitua o qualificador de fórmula (substituindo ### = por = ).

Certifique-se de que quaisquer referências de folhas dentro dos formulários também sejam copiadas para a nova folha antes da folha de referência.

0
adicionado

Both workbooks must be open for this to work. You run this macro and it will copy workbookA!sheet1 to workbookB!sheet1 and then replace all the workbookA references. It's crude, but it works. You can obviously change the code to match your WorkbookA.xlsx names, but ensure they have the correct extension and remain in quotation marks.

Ah, para fazer uma macro, caso você não saiba, pressione alt + F11 para abrir o Editor do Visual Basic. Em seguida, clique com o botão direito do mouse em WBA insert - module e copie e cole o código abaixo no módulo. Em seguida, pressione F5 para executar a macro. Se a macro não for executada, provavelmente é porque as macros não estão habilitadas, então vá em frente e salve-a e reabra-a e quando ela solicitar ativar as macros, ative-as.

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
0
adicionado
Uma única rotina é legal, já que eu sou manualmente CTRL + H agora, mas tudo isso não corrige as referências para os controles, por exemplo. botões, dropdowns e tal; e intervalos nomeados.
adicionado o autor phoenix, fonte

Se você precisar fazer isso automaticamente, porque você está puxando as folhas em um programa VBA. Usa isto:

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

Basta alterar "String encontrada no nome do livro de origem". para coincidir com os links antigos que você deseja substituir. Você poderia remover esse bloco se quiser substituir todos os links.

0
adicionado

Oi aqui é uma solução simples para este problema:

  1. Copie as células como de costume.
  2. Na fórmula, selecione e copie o texto que o vincula à pasta de trabalho anterior [WorkbookA.xlsx].
  3. Selecione todas as células que você deseja alterar e pressione CTRL + F e selecione a guia substituir.
  4. Substitua [WorkbookA.xlsx] por espaço vazio (também não escreva nada no campo Replace with , pressione Replace All .

Voila - está feito.

0
adicionado

Eu estava tendo um problema semelhante. A razão pela qual as fórmulas foram coladas com o link para o WBA foi que a guia (folha) na qual eu estava trabalhando no WBA recebeu um nome diferente do da WBB. Para mim, era sempre "a última folha", mas uma chamava-se "MinFlow" e a outra, "NormalFlow". Eu renomeiei ambos para 'Resultados' e o copiar/colar funcionou como eu queria - uma "pasta relativa".

0
adicionado

Eu consegui isso copiando as células para a nova planilha como normal, em seguida, fazendo um encontrar uma substituição para remover o caminho do arquivo antigo nas fórmulas.

Por exemplo. Se a primeira fórmula for = J2 e isso se tornar = [filepath] J2 , basta encontrar e substituir toda a nova planilha por [filepath] e substitua por nada. Isso exclui e restaura a fórmula para = J2 .

Não é necessário VB!

0
adicionado
Infelizmente excel parece funcionar apenas intermitentemente quando se trata de encontrar sub-strings dentro de fórmulas: /. Não parece ser capaz de encontrar nada com aspas simples também.
adicionado o autor Douglas Gaskell, fonte

Selecione as células que você deseja mover. Agora tente movê-los arrastando e soltando para uma planilha diferente (guia diferente).

Eu sei, ele rola. Aqui está a parte complicada: basta pressionar cmd (mac) ou alt (win) e ele permitirá que você solte as células para outra guia.

0
adicionado
Você pode expandir sua resposta um pouco? Não está claro como/onde cair em outra guia enquanto arrasta. Obrigado.
adicionado o autor Altealice, fonte
  1. Copy the sheet as usual. (right-click to tab and go to 'move or copy') This is for formatting.

  2. Copy all cells from original sheet (using Ctrl+A or top-left triangle and Ctrl+C)

  3. Paste as Values to the new workbook (over "step-1" sheet) (Paste Options>123)

0
adicionado