Excelワークシートをコピーし、数式で相対セル参照を維持する


40

Excelの別のコピーの問題:

どのように私はコピーされたワークシートがまだWorkbookA.xlsxを参照せずWorkbookB.xlsxにWorkbookA.xlsxからワークシートをコピーすることができます例えば式が=B!23なった=[WorkbookA.xlsx]!B!23コピーされたとき。

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

私がそれを動作させることができない別の可能な選択肢は、セルの「値」のみを貼り付けるオプションです。Excelは、セル内の実際の数式ではなく、「値」を計算値として扱います。貼り付け式を選択した場合でも、絶対参照が提供されます。

これが必要な理由の詳細: 毎日の運用に使用されている実稼働のxlsxがあります。このxlsxを「アップグレード」する必要があるため、1人のユーザーが1枚のシートに対してコピーとその変更を作成できます。同時に、別の人が別のシートに変更を加えることもあります。これらのシートには、要約レポートのように他のシートに依存するセルがないため、シートをコピーして元のxlsxにマージすることが望ましいです。しかし、「絶対的な」参照は多くの問題を引き起こしています。


私はちょっと混乱しています。シート1をWBAからWBBにコピーし、WBAではなくWBBに関連する数式をコピーしたい場合。WBBシート2がWBAシート2と同一でない限り、これは不可能です。また、だけが必要場合は、select all - copy - paste special - values値のみを持つようにシートをコピーできます。エンドユーザーに依存してこれらの手順を実行するのではなく、コピー中にすべてを実行したい場合は、私はそれに取り組んでいます。私たちはあなたはそれがWorkbookAの面で行きたい正確にどのように知ってみましょう(または1)及びWBB(2)とシート#S
Raystafarian

私はすでに最後の段落で説明しようとしましたが、まだはっきりしていなかったと思います。はい、WBAとWBBは、WBAの1枚のシートに対して同一です。WBAでそのシートを設計するとき、すべてのセル参照はシートのワークブックに関連することを意図しています。ワークシートのコピー機能は、すべてのセル式にWBAを追加し、「絶対」にします。これは望ましくありません。
ジェイク

特殊値の貼り付けでは、計算値のみが貼り付けられます。WBA.xlsを追加せずに、式をコピーする必要があります。
ジェイク

わかりました。私はそれを
見つけた

ブック全体のコピーを作成してから、新しいコピーから不要なものを削除することはできませんか?
12

回答:


21

Ctrl+ ~を使用して数式を表示してみてください。次に、Ctrl+ Aを使用してすべてを選択し、コピーしてからメモ帳に貼り付けます。

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


1
@Jake:しかし、あなたのワークブックにはボタンやドロップダウンなどがあると言っています。および名前付き範囲。この手法はそれらをコピーしません(またはフォーマットなどのありふれたもの)—どのように/なぜそれを受け入れられると思いますか?
スコット

大きなワークシートでは、リンクの編集/ソースの変更の手法は非常に遅くなりましたが、これは高速でした。
トニーピュロカス

23

多くの場合、次のことを行う方が簡単であることがわかりました。

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

11

これのすぐ下にある無署名の答えは、私にとっては非常にわずかな変化を伴って働いたものです。

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

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

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

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

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

[閉じる]をクリックすると完了です。


9

または、単に次のことを行います。

これを変換:

=database_feed!A1

これに:

=INDIRECT("database_feed!A1")

ワークシート間でコピーする際に参照が変更されることはありません。

多くのシートが参照されていない場合、別の選択肢は

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

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


1
数式を含むテンプレートシートがあり、これをVBAを使用して新しいブックにコピーする場合に有効です。引用符の間に参照を保持し、A1型の参照を保持するにはTRUEを追加する必要があることがわかりました。例えば。= INDIRECT( "'Sheet1'!A1"、TRUE)
ロジャーB

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

2
  • ワークシートを「WorkbookB.xlsx」にコピーします
  • 新しいファイルでワークシートを開く
  • すべて選択
  • メニューデータに移動し、編集リンクをクリックします
  • 古いファイルへのリンクが現在開いているファイルへのリンクになるようにリンクを編集します

これは私のために動作します。


2

回答の99%が元の質問に対応していなかったため、適切な回答を示します。

  1. 通常どおり、元のファイル(Original.xlsx)から新しいExcelファイル(New.xlsx)にシートをコピーします。通常、名前を右クリックし、「移動またはコピー...」を選択します。

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

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

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

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

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

完了!


0

これが機能するには、両方のワークブックが開いている必要があります。このマクロを実行workbookA!sheetするworkbookB!sheet1と、1 がコピーされ、すべての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

1
私は手動でCTRL+H作業しているので、単一のルーチンは便利ですが、これらはすべて、ボタン、ドロップダウンなどのコントロールの参照を修正しません。および名前付き範囲。
ジェイク

0

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

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

VBは必要ありません!


残念ながら、数式内のサブストリングを見つけることに関しては、断続的に優れているようです:/。単一引用符で囲まれたものを見つけることもできないようです。
ダグラスガスケル

0

私は同様の問題を抱えていました。数式にWBAへのリンクが貼り付けられた理由は、WBAで作業していたタブ(シート)の名前がWBBでの名前と異なるためです。私にとっては、常に「最後のシート」でしたが、1つは「MinFlow」、もう1つは「NormalFlow」という名前でした。両方の名前を「結果」に変更し、コピー/貼り付けが思いどおりに機能するようになりました-「相対貼り付け」。


0

移動するセルを選択します。次に、nドロップを別のワークシート(別のタブ)にドラッグして移動してみます。

スクロールします。ここに注意が必要な部分があります。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

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


-1

両方のワークブックを開きます。ソースブック(WorkbookA.xlsx)で、コピーするシートを選択します。シートタブを右クリックして、「移動またはコピー…」を選択します。[移動またはコピー]ダイアログボックスで、[ブックへ]ドロップダウンで[WorkbookB.xlsx]を選択し、そのブックのどこに配置するかを選択し、[コピーの作成]をオンにします。(そして「OK」をクリックします。)


-1

この場合はWorkbookA.xlsxであるシートを移動するシートのコピーを作成します。「WorkbookA.xlsxのコピー」という名前に変更します。次に、この新しいワークブックと、この場合はWorkbookB.xlsxに移動するシートを移動するワークブックを開きます。作成したワークブックのコピー(WorkbookA.xlsxのコピー)でシートを右クリックし、「移動またはコピー」を選択して、これらのシートをWorkbookB.xlsxに移動します。できました!


答えが質問の問題をどのように解決するかは明確ではありません。移動が異なる方法で機能し、コピーが機能するのはなぜですか?
マテジュハス

提案された解決策を試しましたが、機能しません。シート全体のコピーと移動に違いはありません。
-nixda
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.