คัดลอกแผ่นงาน Excel และรักษาการอ้างอิงเซลล์สัมพัทธ์ในสูตร


40

ปัญหาการคัดลอกอื่นใน Excel:

ฉันจะคัดลอกแผ่นงานจาก WorkbookA.xlsx ไปยัง WorkbookB.xlsx ได้อย่างไรโดยไม่มีแผ่นงานที่คัดลอกยังอ้างอิงถึง WorkbookA.xlsx เช่นสูตร=B!23จะกลายเป็น=[WorkbookA.xlsx]!B!23เมื่อคัดลอกไป

ฉันต้องการรักษาการอ้างอิงเซลล์ที่ "สัมพันธ์" แทนการอ้างอิงเซลล์ "สัมบูรณ์" (ฉันจะประดิษฐ์คำศัพท์นี้ในโลก Excel ถ้ายังไม่มี)

ทางเลือกอื่นที่เป็นไปได้ที่ฉันไม่สามารถใช้งานได้คือตัวเลือกในการวาง "ค่า" ของเซลล์เท่านั้น Excel ถือว่า "ค่า" เป็นค่าที่คำนวณได้แทนที่จะเป็นสูตรจริงในเซลล์ ถ้าฉันเลือกสูตรวางก็ยังคงให้การอ้างอิงที่แน่นอน

เพิ่มเติมเกี่ยวกับเหตุผลที่ฉันต้องการสิ่งนี้: ฉันมี xlsx ที่ใช้งานจริงสำหรับการดำเนินงานรายวัน เราจำเป็นต้องทำการ "อัปเกรด" กับ xlsx นี้อย่างต่อเนื่องเพื่อให้บุคคลหนึ่งสามารถสร้างสำเนาและการเปลี่ยนแปลงของเขาที่นั่นสำหรับแผ่นงานเดียว ในขณะเดียวกันบุคคลอื่นอาจมีการเปลี่ยนแปลงแผ่นงานอื่น เนื่องจากแผ่นงานเหล่านี้ไม่มีเซลล์ที่ขึ้นกับแผ่นงานอื่น ๆเช่นรายงานสรุปจึงเป็นที่พึงปรารถนาสำหรับเราที่จะคัดลอกและผสานแผ่นงานกลับเข้าไปใน xlsx ดั้งเดิม แต่การอ้างอิงแบบ "สมบูรณ์" นั้นก่อให้เกิดปัญหามากมาย


ฉันสับสน คุณต้องการคัดลอกแผ่นงานที่ 1 จาก WBA ไปยัง WBB และคุณต้องการคัดลอกสูตรที่สัมพันธ์กับ WBB แทนที่จะเป็น WBA สิ่งนี้เป็นไปไม่ได้นอกเสียจากว่า WBB แผ่นที่ 2 จะเหมือนกับ WBA แผ่นที่ 2 ใช่หรือไม่ นอกจากนี้หากคุณต้องการค่าคุณสามารถคัดลอกแผ่นงานselect all - copy - paste special - valuesเพื่อให้มีค่าเท่านั้น หากคุณต้องการทำทุกอย่างในระหว่างการคัดลอกแทนที่จะพึ่งพาผู้ใช้เพื่อทำตามขั้นตอนเหล่านั้นดีฉันได้ทำงานกับมันแล้ว บอกให้เรารู้ว่าคุณต้องการให้มันเป็นอย่างไรในแง่ของ WorkbookA (หรือ 1) และ WBB (2) และแผ่นงาน #
Raystafarian

ฉันพยายามอธิบายในย่อหน้าสุดท้ายแล้ว แต่ฉันคิดว่ามันยังไม่ชัดเจน ใช่ WBA และ WBB เหมือนกันสำหรับหนึ่งแผ่นใน WBA ในขณะที่การออกแบบแผ่นงานนั้นใน WBA นั้นมีวัตถุประสงค์เพื่อการอ้างอิงเซลล์ทั้งหมดที่เกี่ยวข้องกับสมุดงานของแผ่นงาน ฟังก์ชั่นการคัดลอกแผ่นงานผนวกสูตรเซลล์ทั้งหมดด้วย WBA ทำให้ "แน่นอน" และฉันไม่ต้องการมัน
Jake

การวางค่าพิเศษจะวางเฉพาะค่าที่คำนวณได้เท่านั้น ฉันต้องการสูตรที่จะคัดลอกไปโดยไม่ต้องผนวก WBA.xls
Jake

โอเคฉันชัดเจน ผมจะโพสต์คำตอบถ้า / เมื่อฉันคิดออก
Raystafarian

คุณไม่สามารถทำสำเนาของสมุดงานทั้งหมดแล้วลบสิ่งที่คุณไม่ต้องการจากสำเนาใหม่ได้หรือไม่
dwolters

คำตอบ:


21

ลองใช้Ctrl+ ~เพื่อแสดงสูตร จากนั้นใช้Ctrl+ Aเพื่อเลือกทุกอย่างคัดลอกแล้ววางลงในแผ่นจดบันทึก

ขั้นสุดท้ายให้คัดลอกออกจากแผ่นจดบันทึกแล้ววางลงในสมุดงานอื่นของคุณ


1
@ เจค: แต่คุณบอกว่าสมุดงานของคุณมีปุ่มแบบเลื่อนลงและเช่น; และช่วงที่มีชื่อ เทคนิคนี้จะไม่คัดลอก (หรือสิ่งต่าง ๆ เช่นการจัดรูปแบบ) - คุณคิดว่ามันเป็นที่ยอมรับได้อย่างไร?
Scott

บนเวิร์กชีตขนาดใหญ่เทคนิค Edit Links / Change Source ช้าลงอย่างเจ็บปวด แต่ก็รวดเร็ว
Tony Pulokas

23

ฉันพบว่าง่ายขึ้นในหลาย ๆ กรณีโดยทำดังต่อไปนี้

  • คัดลอกแผ่นงานไปยังสมุดงานใหม่
  • เปิดใช้งานแผ่นงานใหม่ในสมุดงานใหม่
  • เลือกทั้งหมด ( Ctrl+ A)
  • ทำการค้นหา / แทนที่
    • หา: [WorkbookA.xlsx]!
    • แทนที่: <ปล่อยให้ว่าง>
  • แทนที่ทั้งหมด

11

คำตอบที่ไม่ได้ลงชื่อด้านล่างนี้คือคำตอบที่เหมาะกับฉันโดยมีการเปลี่ยนแปลงเล็กน้อย

  1. สร้างและบันทึกสเปรดชีตปลายทาง

  2. ใช้ "ย้าย", "คัดลอก" หรือลากหน้าของคุณด้วยสูตรลงในสเปรดชีตใหม่ สิ่งนี้จะทำให้สูตรในหน้าใหม่ชี้ไปที่แผ่นงานเก่า จากนั้นให้บันทึกสเปรดชีตใหม่ในตำแหน่งเดียวกับเวิร์กชีทเก่า

  3. จากนั้นไปที่แท็บข้อมูล> คลิกแก้ไขลิงค์ ตัวเลือกจะไม่ทำงานเว้นแต่จะมีลิงค์ในหน้านั้น

  4. ในช่องโต้ตอบที่เป็นผลลัพธ์ให้เลือกชื่อไฟล์ต้นฉบับและคลิก "เปลี่ยนแหล่งที่มา"

  5. จากช่องโต้ตอบเปิดไฟล์ที่ปรากฏขึ้นถัดไปให้เลือกชื่อของสเปรดชีตใหม่

คลิกปิดและคุณทำเสร็จแล้ว


9

หรือทำสิ่งต่อไปนี้:

แปลงสิ่งนี้:

=database_feed!A1

สำหรับสิ่งนี้:

=INDIRECT("database_feed!A1")

และไม่มีการเปลี่ยนแปลงการอ้างอิงของคุณอีกต่อไปเมื่อคุณคัดลอกระหว่างแผ่นงาน

หากคุณไม่ได้อ้างอิงหลายชีตจะมีการใช้อีกทางเลือกหนึ่ง

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

และป้อนชื่อของแผ่นอ้างอิงในเซลล์ B1 ตอนนี้คุณมีเซลล์เดียวที่จะอัปเดตเมื่อคัดลอกไปยังสเปรดชีตใหม่


1
ความคิดที่ดีใช้งานได้ถ้าคุณมีแผ่นแม่แบบที่มีสูตรและคุณกำลังคัดลอกสิ่งนี้ลงในสมุดงานใหม่ด้วย VBA ฉันพบว่าคุณต้องเก็บการอ้างอิงระหว่างคำพูดและเพิ่ม TRUE เพื่อให้การอ้างอิงประเภท A1 เช่น. = INDIRECT ("'Sheet1'! A1", TRUE)
RogerB

2
INDIRECTเป็นสูตรระเหยดังนั้นมันจะถูกคำนวณใหม่ทุกครั้ง (ตรงข้ามกับเมื่อแก้ไขเท่านั้น) ซึ่งสามารถชะลอเวิร์กบุ๊กที่ซับซ้อนมากขึ้นดังนั้นควรใช้ด้วยความระมัดระวัง
Andy Terra

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

3

เนื่องจาก 99% ของคำตอบไม่ได้ตอบคำถามเดิมนี่คือคำตอบที่เหมาะสม

  1. คัดลอกแผ่นงานจากไฟล์ต้นฉบับ (Original.xlsx) ไปยังไฟล์ Excel ใหม่ (New.xlsx) ตามปกติ โดยทั่วไปฉันคลิกขวาที่ชื่อและเลือก "ย้ายหรือคัดลอก ... "

  2. บันทึกที่สอง - ไฟล์ที่สร้างขึ้นใหม่ (New.xlsx)

  3. ในไฟล์ใหม่ภายใต้ข้อมูลคลิก "แก้ไขลิงค์"

  4. ในป๊อปอัปเลือก "เปลี่ยนแหล่งที่มา ... "

  5. ค้นหาไฟล์ (New.xlsx) และคลิก Open

การอ้างอิงทั้งหมดไปที่ต้นฉบับ (Original.xlsx) จะถูกลบออก

ทำ!


ควรสูงกว่าในรายการคำตอบ
sabre23t

2
  • คัดลอกแผ่นงานไปที่ 'WorkbookB.xlsx'
  • เปิดแผ่นงานในไฟล์ใหม่
  • เลือกทั้งหมด
  • ไปที่เมนูข้อมูลคลิกที่ลิงค์แก้ไข
  • แก้ไขลิงค์เพื่อให้ลิงค์ไปยังไฟล์เก่ากลายเป็นลิงค์ไปยังไฟล์ที่เปิดอยู่ในปัจจุบัน

มันใช้งานได้สำหรับฉัน


0

เวิร์กบุ๊กทั้งสองจะต้องเปิดให้ทำงานได้ คุณเรียกใช้แมโครนี้และมันจะคัดลอก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

1
รูทีนเดียวก็ดีเหมือนฉันCTRL+Hตอนนี้ด้วยตนเองแต่สิ่งเหล่านี้ไม่ได้แก้ไข refences สำหรับการควบคุมเช่นปุ่มแบบเลื่อนลงและเช่น; และช่วงที่มีชื่อ
Jake

0

ฉันทำได้โดยการคัดลอกเซลล์ไปยังแผ่นงานใหม่ตามปกติจากนั้นทำการค้นหาแทนที่เพื่อลบพา ธ ไฟล์เก่าในสูตร

เช่นถ้าสูตรแรกเป็น=J2และสิ่งนี้กลายเป็น=[filepath]J2เพียงแค่ทำการค้นหาและแทนที่สเปรดชีตใหม่ทั้งหมดสำหรับ[filepath]และแทนที่ด้วยไม่มีอะไร =J2นี้จะลบมันและเรียกคืนสูตรการ

ไม่จำเป็นต้องใช้ VB!


Sadly excel ดูเหมือนว่าจะทำงานเป็นระยะเมื่อมันมาถึงการค้นหาสายย่อยภายในสูตร: / ดูเหมือนว่าจะไม่สามารถค้นหาสิ่งใดด้วยคำพูดเดียว
Douglas Gaskell

0

ฉันมีปัญหาที่คล้ายกัน เหตุผลที่สูตรถูกวางด้วยลิงก์ไปยัง WBA คือแท็บ (แผ่น) ที่ฉันทำงานใน WBA นั้นมีชื่อแตกต่างจากใน WBB สำหรับฉันมันเป็น "แผ่นสุดท้าย" เสมอ แต่มีชื่อว่า 'MinFlow' และอีกแผ่นหนึ่งชื่อว่า 'NormalFlow' ฉันเปลี่ยนชื่อทั้งสองเป็น 'ผลลัพธ์' และคัดลอก / วางทำงานได้ตามที่ฉันต้องการ - เป็น "ญาติที่วาง"


0

เลือกเซลล์ที่คุณต้องการย้าย ทีนี้ลองย้ายมันโดยลาก n วางไปยังแผ่นงานอื่น (แท็บอื่น)

ฉันรู้ว่ามันเลื่อน นี่คือส่วนที่ยุ่งยาก: เพียงกด cmd (mac) หรือ alt (win) และมันจะช่วยให้คุณวางเซลล์ลงในแท็บอื่น


คุณสามารถขยายคำตอบของคุณเล็กน้อยได้ไหม? ยังไม่ชัดเจนว่าจะวางบนแท็บอื่นได้อย่างไรในขณะที่ลาก ขอบคุณ
fixer1234

0

สวัสดีนี่เป็นวิธีง่ายๆในการแก้ไขปัญหานี้:

  1. คัดลอกไปที่เซลล์ตามปกติ
  2. ในสูตรเลือกและคัดลอกข้อความที่เชื่อมโยงไปยังสมุดงานก่อนหน้า [WorkbookA.xlsx]
  3. เลือกเซลล์ทั้งหมดที่คุณต้องการเปลี่ยนและกดCTRL+Fและเลือกแท็บแทนที่
  4. แทนที่ [WorkbookA.xlsx] ด้วยช่องว่าง (aka ไม่ได้เขียนอะไรในสนามกดReplace withReplace All

Voila - เสร็จแล้ว


0

'เคล็ดลับ' อื่น - ก่อนคัดลอกแผ่นงานต้นฉบับให้แทนที่ตัวระบุสูตรทั้งหมด=ด้วยชุดอักขระอื่น (พูด###=)

คัดลอกแผ่นงานจากนั้นคัดลอกแทนที่ตัวระบุสูตรกลับ (แทนที่###=ด้วย=)

ตรวจสอบให้แน่ใจว่ามีการคัดลอกการอ้างอิงแผ่นงานใด ๆ ภายใน formauls ไปยังแผ่นงานใหม่ก่อนหน้าแผ่นงานอ้างอิง


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” ในรายการแบบเลื่อนลง“ To book” เลือกตำแหน่งในหนังสือเล่มนั้นที่คุณต้องการวางและทำเครื่องหมาย“ สร้างสำเนา” (และคลิก“ ตกลง”)


-1

ทำสำเนาแผ่นงานที่คุณต้องการย้ายแผ่นงานซึ่งในกรณีนี้คือ WorkbookA.xlsx เปลี่ยนชื่อเป็น "สำเนาของ WorkbookA.xlsx" ตอนนี้เปิดสมุดงานใหม่นี้รวมทั้งสมุดงานที่คุณต้องการย้ายแผ่นงานซึ่งในกรณีนี้จะเป็น WorkbookB.xlsx คลิกขวาที่แผ่นงานในสำเนาสมุดงานที่คุณสร้างขึ้นเช่นสำเนาของ WorkbookA.xlsx แล้วเลือก 'ย้ายหรือคัดลอก' จากนั้นย้ายแผ่นงานเหล่านี้ไปยัง WorkbookB.xlsx คุณทำเสร็จแล้ว!


ยังไม่ชัดเจนว่าคำตอบของคุณแก้ปัญหาของคำถามได้อย่างไร เหตุใดการย้ายจึงทำงานในวิธีที่แตกต่างจากนั้นการคัดลอกจะใช้งานได้
MátéJuhász

ฉันลองใช้วิธีแก้ปัญหาที่คุณเสนอแล้ว แต่ไม่ได้ผล ไม่มีความแตกต่างระหว่างการทำสำเนาและย้ายแผ่นงานทั้งหมด
nixda
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.