web-dev-qa-db-ja.com

Excelワークシートをコピーして数式で相対セル参照を管理する

Excelのもう一つのコピー問題:

コピーしたワークシートがまだWorkbookA.xlsxを参照していない状態で、ワークシートをWorkbookA.xlsxからWorkbookB.xlsxにコピーする方法はありますか。コピーされると、式=B!23=[WorkbookA.xlsx]!B!23になります。

「絶対」セル参照ではなく「相対」セル参照を維持したい(この用語がまだ存在しない場合は、この用語をExcelの世界で発明する)。

私がそれを働かせることができないもう一つの可能​​性のある選択肢はセルの "値"だけを貼り付けるオプションです。 Excelは、セル内の実際の数式ではなく、計算値として "値"を扱います。私がペースト式を選択した場合、それでも絶対参照を与えます。

これが必要な理由の詳細:日常業務にxlsxプロダクションを使用しています。私たちは常にこのxlsxを「アップグレード」する必要があるので、1人の人がコピーを作成し、そこで1枚のシートに変更を加えることができます。同時に、別の人が別のシートに変更を加えることもあります。 これらのシートには要約レポートのように他のシートに従属セルがないことを考えると、シートをコピーして元のシートに戻すことが望ましいです。元のxlsxしかし、「絶対的な」参照は多くの問題を引き起こしています。

37
Jake

使ってみる Ctrl + ~ 式を表示します。それから使う Ctrl + A すべてを選択するには、それをコピーしてメモ帳に貼り付けます。

最後に、メモ帳からコピーして他のブックに貼り付けます。

20
SVandenBerg

私は、多くの場合、次のことを行う方が簡単だと思いました。

  • シートを新しいブックにコピーする
  • 新しいブックの新しいシートをアクティブにする
  • すべて選択 (Ctrl+A
  • で検索/置換を行います
    • 見つける:[WorkbookA.xlsx]!
    • 置き換える:<空白のままにする>
  • 全部交換
23
Yoheeb

これの真下の未署名の答えは私にとっては非常にわずかな変化を伴いましたものです。

  1. 宛先スプレッドシートを作成して保存します。

  2. 「移動」、「コピー」を使用するか、数式を含むページを新しいスプレッドシートにドラッグします。これにより、新しいページ上の数式は古いワークシートを参照したままになります。次に、新しいワークシートを古いワークシートと同じ場所に保存します。

  3. 次に[データ]タブに移動し、[リンクの編集]をクリックします。ページにリンクがない限り、このオプションはアクティブになりません。

  4. 表示されたダイアログで、ソースファイルの名前を選択して[ソースの変更]をクリックします。

  5. 次に表示されるファイルを開くダイアログから、新しいスプレッドシートの名前を選択します。

閉じるをクリックして終了です。

10
Pete

あるいは単に次のようにします。

これを変換する:

=database_feed!A1

これに:

=INDIRECT("database_feed!A1")

ワークシート間でコピーしても、参照に変更はありません。

参照しているシートがそれほど多くない場合は、もう1つの方法があります。

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

セルB1に参照シートの名前を入力します。これで、新しいスプレッドシートにコピーしたときに更新するセルが1つだけになりました。

9
Jason Higbee

以下のコードはあなたのニーズに適応することができます。これは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
3
Excellll
  • ワークシートを 'WorkbookB.xlsx'にコピーします
  • 新しいファイルでワークシートを開く
  • すべて選択
  • メニューのデータに行き、編集リンクをクリック
  • 古いファイルへのリンクが現在開いているファイルへのリンクになるようにリンクを編集する

これは私のために働きます。

2
user259817

回答の99%が元の質問にも対処していなかったので、これが正しい回答です。

  1. 通常どおり、元のファイル(Original.xlsx)から新しいExcelファイル(New.xlsx)にシートをコピーします。一般的に、私は名前を右クリックして "Move or Copy ..."を選びます。

  2. 2番目に新しく作成されたファイル(New.xlsx)を保存します。

  3. 新しいファイルの[データ]で、[リンクの編集]をクリックします。

  4. ポップアップで、[ソースの変更]を選択します。

  5. ファイル(New.xlsx)を見つけて[開く]をクリックします。

オリジナル(Original.xlsx)への参照はすべて削除されます。

完了しました。

1
David

こんにちはここでこの問題に対する簡単な解決策です:

  1. 通常どおりセルをコピーします。
  2. 式で、それを前のワークブック[WorkbookA.xlsx]にリンクしているテキストを選択してコピーします。
  3. 変更したいセルをすべて選択し、CTRL+Fを押して置換タブを選択します。
  4. [WorkbookA.xlsx]を空のスペースに置き換えます(Replace withフィールドには何も書き込まないで、Replace Allを押します。

出来上がり - それは完了です。

0
Niklas

移動したいセルを選択します。今すぐ別のワークシート(別のタブ)にドラッグ&ドロップでそれらを移動してみてください。

私は知っています、それはスクロールします。これが難しい部分です:単にcmd(mac)かalt(win)を押すとセルを別のタブにドロップすることができます。

0
Andy Abel

セルを新しいワークシートに通常どおりコピーしてから、置換を検索して式の古いファイルパスを削除することでこれを実現しました。

例えば。最初の式が=J2でこれが=[filepath]J2になった場合は、[filepath]の新しいスプレッドシート全体を検索して置換し、何も置換しないでください。これはそれを削除し、式を=J2に復元します。

いいえVBは必要ありません。

0
cdpinker
  1. 通常通りシートをコピーします。 (タブを右クリックして[移動またはコピー]に移動します)これはフォーマット用です。

  2. 元のシートからすべてのセルをコピーする Ctrl+A または左上の三角形 Ctrl+C

  3. 新しいワークブックに値として貼り付け( "step-1"シートの上に)(貼り付けオプション> 123)

0
eru

もう1つの「トリック」 - ソースワークシートをコピーする前に、すべての式修飾子=を他の文字セット(たとえば###=)に置き換えます。

ワークシートをコピーし、コピー後に数式修飾子を元に戻します(###==に置き換えます)。

Formauls内のシート参照が参照シートよりも前に新しいシートにもコピーされていることを確認してください。

0
Tamer Salama

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

「ソースブック名に見つかった文字列」を変更するだけです。置き換えたい古いリンクと一致させるため。すべてのリンクを置き換えたい場合は、そのifブロックを削除できます。

0
HackSlash

私は同様の問題を抱えていました。数式がWBAへのリンクで貼り付けられているのは、WBAで作業していたタブ(シート)の名前がWBBのタブとは異なるためです。私にとっては、それは常に「最後のシート」でしたが、一方は 'MinFlow'という名前で、もう一方は 'NormalFlow'という名前でした。私は両方とも 'Results'に改名し、コピー/ペーストは私が望んでいたようにうまくいきました - 「相対的なペースト」。

0
Janet

両方のブックはこれが機能するために開いている必要があります。このマクロを実行すると、workbookA!sheet1をworkbookB!sheet1にコピーしてから、すべてのworkbookA参照を置き換えます。 それは粗雑ですが、うまくいきます。 WorkbookA.xlsxの名前と一致するように明らかにコードを変更することはできますが、それらが正しい拡張子を持ち、引用符で囲まれていることを確認してください。

ああ、あなたが知らない場合は、マクロを作るために、ヒット alt + F11 Visual Basic Editorを起動します。次に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
0
Raystafarian