Excelのもう一つのコピー問題:
コピーしたワークシートがまだWorkbookA.xlsxを参照していない状態で、ワークシートをWorkbookA.xlsxからWorkbookB.xlsxにコピーする方法はありますか。コピーされると、式=B!23
は=[WorkbookA.xlsx]!B!23
になります。
「絶対」セル参照ではなく「相対」セル参照を維持したい(この用語がまだ存在しない場合は、この用語をExcelの世界で発明する)。
私がそれを働かせることができないもう一つの可能性のある選択肢はセルの "値"だけを貼り付けるオプションです。 Excelは、セル内の実際の数式ではなく、計算値として "値"を扱います。私がペースト式を選択した場合、それでも絶対参照を与えます。
これが必要な理由の詳細:日常業務にxlsxプロダクションを使用しています。私たちは常にこのxlsxを「アップグレード」する必要があるので、1人の人がコピーを作成し、そこで1枚のシートに変更を加えることができます。同時に、別の人が別のシートに変更を加えることもあります。 これらのシートには要約レポートのように他のシートに従属セルがないことを考えると、シートをコピーして元のシートに戻すことが望ましいです。元のxlsxしかし、「絶対的な」参照は多くの問題を引き起こしています。
使ってみる Ctrl + ~ 式を表示します。それから使う Ctrl + A すべてを選択するには、それをコピーしてメモ帳に貼り付けます。
最後に、メモ帳からコピーして他のブックに貼り付けます。
私は、多くの場合、次のことを行う方が簡単だと思いました。
[WorkbookA.xlsx]!
これの真下の未署名の答えは私にとっては非常にわずかな変化を伴いましたものです。
宛先スプレッドシートを作成して保存します。
「移動」、「コピー」を使用するか、数式を含むページを新しいスプレッドシートにドラッグします。これにより、新しいページ上の数式は古いワークシートを参照したままになります。次に、新しいワークシートを古いワークシートと同じ場所に保存します。
次に[データ]タブに移動し、[リンクの編集]をクリックします。ページにリンクがない限り、このオプションはアクティブになりません。
表示されたダイアログで、ソースファイルの名前を選択して[ソースの変更]をクリックします。
次に表示されるファイルを開くダイアログから、新しいスプレッドシートの名前を選択します。
閉じるをクリックして終了です。
あるいは単に次のようにします。
これを変換する:
=database_feed!A1
これに:
=INDIRECT("database_feed!A1")
ワークシート間でコピーしても、参照に変更はありません。
参照しているシートがそれほど多くない場合は、もう1つの方法があります。
=INDIRECT("'"&B1&"'!A1")
セルB1に参照シートの名前を入力します。これで、新しいスプレッドシートにコピーしたときに更新するセルが1つだけになりました。
以下のコードはあなたのニーズに適応することができます。これはwb1
のシートからすべての式を取り出し、それらを新しいワークブックのシートに適用します。式はString
sとして適用されるため、元のワークブックへの参照の挿入はありません。また、このコードはクリップボードを使用せず、セルをループする必要がないため、非常に高速です。
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
これは私のために働きます。
回答の99%が元の質問にも対処していなかったので、これが正しい回答です。
通常どおり、元のファイル(Original.xlsx)から新しいExcelファイル(New.xlsx)にシートをコピーします。一般的に、私は名前を右クリックして "Move or Copy ..."を選びます。
2番目に新しく作成されたファイル(New.xlsx)を保存します。
新しいファイルの[データ]で、[リンクの編集]をクリックします。
ポップアップで、[ソースの変更]を選択します。
ファイル(New.xlsx)を見つけて[開く]をクリックします。
オリジナル(Original.xlsx)への参照はすべて削除されます。
完了しました。
こんにちはここでこの問題に対する簡単な解決策です:
CTRL+F
を押して置換タブを選択します。Replace with
フィールドには何も書き込まないで、Replace All
を押します。出来上がり - それは完了です。
移動したいセルを選択します。今すぐ別のワークシート(別のタブ)にドラッグ&ドロップでそれらを移動してみてください。
私は知っています、それはスクロールします。これが難しい部分です:単にcmd(mac)かalt(win)を押すとセルを別のタブにドロップすることができます。
セルを新しいワークシートに通常どおりコピーしてから、置換を検索して式の古いファイルパスを削除することでこれを実現しました。
例えば。最初の式が=J2
でこれが=[filepath]J2
になった場合は、[filepath]
の新しいスプレッドシート全体を検索して置換し、何も置換しないでください。これはそれを削除し、式を=J2
に復元します。
いいえVBは必要ありません。
通常通りシートをコピーします。 (タブを右クリックして[移動またはコピー]に移動します)これはフォーマット用です。
元のシートからすべてのセルをコピーする Ctrl+A または左上の三角形 Ctrl+C)
新しいワークブックに値として貼り付け( "step-1"シートの上に)(貼り付けオプション> 123)
もう1つの「トリック」 - ソースワークシートをコピーする前に、すべての式修飾子=
を他の文字セット(たとえば###=
)に置き換えます。
ワークシートをコピーし、コピー後に数式修飾子を元に戻します(###=
を=
に置き換えます)。
Formauls内のシート参照が参照シートよりも前に新しいシートにもコピーされていることを確認してください。
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ブロックを削除できます。
私は同様の問題を抱えていました。数式がWBAへのリンクで貼り付けられているのは、WBAで作業していたタブ(シート)の名前がWBBのタブとは異なるためです。私にとっては、それは常に「最後のシート」でしたが、一方は 'MinFlow'という名前で、もう一方は 'NormalFlow'という名前でした。私は両方とも 'Results'に改名し、コピー/ペーストは私が望んでいたようにうまくいきました - 「相対的なペースト」。
両方のブックはこれが機能するために開いている必要があります。このマクロを実行すると、workbookA!sheet
1を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