Copia il foglio di lavoro di Excel e mantieni il riferimento di cella relativo nelle formule


40

Un altro problema di copia in Excel:

Come posso copiare un foglio di lavoro da WorkbookA.xlsx in WorkbookB.xlsx senza che il foglio di lavoro copiato faccia ancora riferimento a WorkbookA.xlsx, ad esempio la formula =B!23diventa =[WorkbookA.xlsx]!B!23quando viene copiata.

Voglio mantenere riferimenti di cella "relativi" anziché riferimenti di cella "assoluti" (inventerò questa terminologia nel mondo di Excel se non esiste ancora).

Un'altra possibile alternativa che non riesco a far funzionare è l'opzione per incollare solo i "valori" delle celle. Excel considera i "valori" come valori calcolati anziché come formule effettive nella cella. Se scelgo la formula incolla, fornisce comunque riferimenti assoluti.

Maggiori informazioni sul perché ho bisogno di questo: ho un xlsx di produzione in uso per le operazioni quotidiane. Abbiamo costantemente bisogno di fare "aggiornamenti" a questo xlsx e quindi una persona può creare una copia e le sue modifiche lì per un singolo foglio. Allo stesso tempo, un'altra persona potrebbe anche apportare modifiche a un altro foglio. Dato che questi fogli non hanno celle dipendenti su altri fogli , come un rapporto di riepilogo, è auspicabile per noi semplicemente copiare e unire nuovamente i fogli nella xlsx originale. Ma il riferimento "assoluto" sta dando molti problemi.


Sono un po 'confuso. Vuoi copiare il foglio 1 da WBA in WBB e vuoi che copi le formule relative a WBB anziché a WBA. Questo non è possibile a meno che il foglio WBB 2 sia identico al foglio WBA 2. È così? Inoltre, se si desidera solo valori, è possibile copiare il foglio select all - copy - paste special - valuesin modo che contenga solo valori. Se vuoi fare tutto durante la copia piuttosto che affidarti all'utente finale per eseguire quei passaggi, beh, ci ho lavorato su. Facci sapere esattamente come vuoi che vada in termini di Workbook A (o 1) e WBB (2) e del foglio #s
Raystafarian

Ho già tentato di spiegare nel mio ultimo paragrafo, ma penso che non fosse ancora chiaro. Sì, WBA e WBB sono identici per un foglio in WBA. Durante la progettazione di quel foglio in WBA, si intende che tutti i riferimenti di cella siano relativi alla cartella di lavoro del foglio. La funzione di copia del foglio di lavoro aggiunge tutte le formule di cella con WBA, rendendola "assoluta" e non la desidero.
Jake

i valori speciali incolla incollano solo i valori calcolati. Ho bisogno che le formule siano copiate, SENZA WBA.xls aggiunto.
Jake

Va bene sono chiaro.
Invierò

Non puoi semplicemente fare una copia dell'intera cartella di lavoro e quindi eliminare ciò che non ti serve dalla nuova copia?
abitanti

Risposte:


21

Prova a usare Ctrl+ ~per visualizzare le formule. Quindi utilizza Ctrl+ Aper selezionare tutto, copiarlo e quindi incollarlo nel blocco note.

Infine, copialo dal blocco note e incollalo nell'altra cartella di lavoro.


1
@Jake: Ma hai detto che la tua cartella di lavoro ha pulsanti, menu a discesa e simili; e intervalli denominati. Questa tecnica non li copia (o cose banali come la formattazione) - come / perché la consideri accettabile?
Scott,

Su un foglio di lavoro di grandi dimensioni, la tecnica Modifica collegamenti / Cambia sorgente era dolorosamente lenta, ma era veloce.
Tony Pulokas,

23

Ho trovato più facile, in molti casi, fare quanto segue:

  • copia il foglio in una nuova cartella di lavoro
  • attiva il nuovo foglio nella nuova cartella di lavoro
  • seleziona tutto ( Ctrl+ A)
  • trova / sostituisci
    • trova: [WorkbookA.xlsx]!
    • sostituisci: <lascia vuoto>
  • sostituisci tutto

11

La risposta senza segno proprio sotto questa è quella che ha funzionato per me, con una leggera variazione.

  1. Crea e salva un foglio di calcolo di destinazione.

  2. Usa "sposta", "copia" o trascina la pagina con le formule nel nuovo foglio di calcolo. In questo modo le formule nella nuova pagina puntano al vecchio foglio di lavoro. Quindi salva il nuovo foglio di calcolo nella stessa posizione del vecchio foglio di lavoro.

  3. Quindi vai alla scheda Dati> fai clic su Modifica collegamenti. L'opzione non sarà attiva a meno che non ci siano collegamenti nella pagina.

  4. Nella finestra di dialogo che risulta, seleziona il nome del file di origine e fai clic su "Cambia fonte".

  5. Dalla finestra di dialogo Apri file che appare dopo, seleziona il nome del nuovo foglio di calcolo.

Fai clic su Chiudi e hai finito.


9

O semplicemente fai quanto segue:

Converti questo:

=database_feed!A1

a questa:

=INDIRECT("database_feed!A1")

e non più modifiche ai riferimenti quando copi tra i fogli di lavoro.

Se non hai molti fogli di riferimento, un'altra alternativa sarebbe quella di utilizzare

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

e inserisci il nome del foglio di riferimento nella cella B1. Ora hai solo una cella da aggiornare quando copiata nel nuovo foglio di calcolo.


1
Buona idea, funziona se hai un foglio modello con formule e lo stai copiando in una nuova cartella di lavoro con VBA. Ho scoperto che è necessario mantenere il riferimento tra virgolette e aggiungere TRUE per mantenere i riferimenti di tipo A1. per esempio. = INDIRETTO ("'Foglio1'! A1", VERO)
RogerB,

2
INDIRECTè una formula volatile, quindi verrà ricalcolata ogni volta (al contrario solo quando viene modificata) che può davvero rallentare le cartelle di lavoro più complesse, quindi usate con cautela
Andy Terra

3

Il codice seguente può essere adattato alle tue esigenze. Prende tutte le formule dal foglio in poi wb1e le applica a un foglio in una nuova cartella di lavoro. Le formule vengono applicate come Strings, quindi non è possibile inserire riferimenti alla cartella di lavoro originale. Inoltre, questo codice è super veloce perché non usa gli Appunti e non richiede alcun ciclo tra le celle.

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

3

Poiché il 99% delle risposte non ha nemmeno affrontato la domanda originale, ecco la risposta corretta.

  1. Copia i fogli dal file originale (Original.xlsx) nel nuovo file Excel (New.xlsx) come faresti normalmente. In genere, faccio clic con il pulsante destro del mouse sul nome e scelgo "Sposta o copia ...".

  2. Salva il secondo file appena creato (New.xlsx).

  3. Nel nuovo file, sotto Dati, fai clic su "Modifica collegamenti"

  4. Nel pop-up, scegli "Cambia sorgente ..."

  5. Individua il file (New.xlsx) e fai clic su Apri.

Tutti i riferimenti all'originale (Original.xlsx) saranno rimossi.

FATTO!


Dovrebbe essere più in alto nell'elenco delle risposte
sabre23t

2
  • copia il foglio di lavoro in "WorkbookB.xlsx"
  • apri il foglio di lavoro nel nuovo file
  • seleziona tutto
  • vai al menu Dati, fai clic su modifica collegamenti
  • modificare i collegamenti in modo che il collegamento al vecchio file sia ora un collegamento al file attualmente aperto

Questo funziona per me.


0

Entrambe le cartelle di lavoro devono essere aperte affinché questo funzioni . Si esegue questa macro e copierà workbookA!sheet1 in workbookB!sheet1e quindi sostituirà tutti i workbookAriferimenti. È rozzo, ma funziona . Puoi ovviamente modificare il codice in modo che corrisponda ai nomi WorkbookA.xlsx, ma assicurati che abbiano l'estensione corretta e rimangano tra virgolette.

Oh, per creare una macro, nel caso non lo sapessi, premi alt + F11per visualizzare Visual Basic Editor. Quindi fai clic destro su WBA insert - modulee copia e incolla il codice qui sotto nel modulo. Quindi premi F5per eseguire la macro. Se la macro non verrà eseguita, è probabilmente perché le macro non sono abilitate, quindi vai avanti e salvalo e riaprilo e quando ti chiede di abilitare le macro, abilitalo.

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

1
Una singola routine è piacevole come lo sono CTRL+Hora manualmente , ma tutti questi non risolvono i riferimenti per i controlli, ad esempio pulsanti, menu a discesa e simili; e intervalli denominati.
Jake

0

Ho raggiunto questo obiettivo copiando le celle nel nuovo foglio di lavoro come di consueto, quindi facendo una ricerca per sostituire il vecchio percorso del file nelle formule.

Ad esempio, se la prima formula è =J2e questa diventa =[filepath]J2, quindi cerca e sostituisci l'intero nuovo foglio di calcolo [filepath]e sostituiscilo con nulla. Questo lo cancella e ripristina la formula =J2.

Nessun VB richiesto!


Purtroppo Excel sembra funzionare in modo intermittente solo quando si tratta di trovare sottostringhe all'interno delle formule: /. Non sembra nemmeno in grado di trovare nulla con virgolette singole.
Douglas Gaskell,

0

Stavo avendo un problema simile. Il motivo per cui le formule sono state incollate con il collegamento a WBA è che la scheda (foglio) su cui stavo lavorando in WBA è stata denominata diversamente da quella in WBB. Per me, era sempre "l'ultimo foglio" ma uno si chiamava "MinFlow" e l'altro si chiamava "NormalFlow". Ho rinominato entrambi in "Risultati" e la copia / incolla ha funzionato come volevo: una "incolla relativa".


0

Seleziona le celle che desideri spostare. Ora prova a spostarli trascinandoli su un foglio di lavoro diverso (scheda diversa).

Lo so, scorre. Ecco la parte difficile: basta premere cmd (mac) o alt (win) e ti lascerà cadere le celle in un'altra scheda.


Puoi espandere leggermente la tua risposta? Non è chiaro come / dove rilasciare su un'altra scheda durante il trascinamento. Grazie.
fixer1234,

0

Ciao ecco una semplice soluzione a questo problema:

  1. Copia sulle celle come al solito.
  2. Nella formula selezionare e copiare il testo che lo collega alla cartella di lavoro precedente [WorkbookA.xlsx].
  3. Seleziona tutte le celle che desideri modificare e premi CTRL+Fe seleziona la scheda Sostituisci.
  4. Sostituisci [WorkbookA.xlsx] con spazio vuoto (ovvero non scrivere nulla nel Replace withcampo, premi Replace All.

Voilà - è fatto.


0

Un altro "trucco": prima di copiare il foglio di lavoro di origine, sostituisci tutti i qualificatori di formula =con altri set di caratteri (ad esempio ###=).

Copia il foglio di lavoro, quindi dopo la copia, sostituisci il qualificatore della formula (sostituendolo ###=con =).

Assicurarsi che tutti i riferimenti ai fogli all'interno delle formeul siano copiati anche sul nuovo foglio prima del foglio di riferimento.


0
  1. Copia il foglio come al solito. (fare clic con il tasto destro del mouse sulla scheda e selezionare "sposta o copia") Questo è per la formattazione.

  2. Copia tutte le celle dal foglio originale (usando Ctrl+ Ao triangolo in alto a sinistra e Ctrl+ C)

  3. Incolla come valori nella nuova cartella di lavoro (sul foglio "passaggio 1") (Opzioni Incolla> 123)


0

Se è necessario farlo automaticamente perché si stanno inserendo fogli in un programma VBA. Usa questo:

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 cambiare "Stringa trovata nel nome del libro di origine". per abbinare i vecchi collegamenti che si desidera sostituire. È possibile rimuoverlo in caso di blocco se si desidera sostituire tutti i collegamenti.


-1

Apri entrambe le cartelle di lavoro. Nella cartella di lavoro di origine (WorkbookA.xlsx), selezionare il foglio che si desidera copiare. Fai clic destro sulla scheda del foglio e seleziona "Sposta o copia ...". Nella finestra di dialogo "Sposta o copia", seleziona "WorkbookB.xlsx" nel menu a discesa "Per prenotare", scegli dove nel libro desideri metterlo e seleziona "Crea una copia". (E fare clic su "OK".)


-1

Crea una copia del foglio da cui desideri spostare i fogli, in questo caso sarebbe WorkbookA.xlsx. Rinominalo per dire "Copia di WorkbookA.xlsx". Ora apri questa nuova cartella di lavoro e la cartella di lavoro in cui desideri spostare il foglio in cui in questo caso sarebbe WorkbookB.xlsx. Fare clic con il pulsante destro del mouse sui fogli nella cartella di lavoro di copia creata, ad esempio Copia della cartella di lavoro A.xlsx e selezionare "sposta o copia", quindi spostare questi fogli in WorkbookB.xlsx. Hai fatto !


Non è chiaro come la tua risposta risolva il problema della domanda. Perché lo spostamento funzionerà in modo diverso rispetto alla copia?
Máté Juhász,

Ho provato la soluzione proposta e non funziona. Non c'è differenza tra la copia e lo spostamento di interi fogli.
nixda,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.