Sao chép bảng tính Excel và duy trì tham chiếu ô tương đối trong công thức


40

Một vấn đề sao chép khác trong Excel:

Làm cách nào tôi có thể sao chép một Worksheet từ WorkbookA.xlsx vào WorkbookB.xlsx mà không có Worksheet được sao chép vẫn tham chiếu WorkbookA.xlsx, ví dụ như công thức =B!23trở thành =[WorkbookA.xlsx]!B!23khi được sao chép.

Tôi muốn duy trì các tham chiếu ô "tương đối" thay vì tham chiếu ô "tuyệt đối" (tôi sẽ phát minh ra thuật ngữ này trong thế giới Excel nếu nó chưa tồn tại).

Một cách khác có thể mà tôi không thể làm cho nó hoạt động là tùy chọn chỉ dán "giá trị" của ô. Excel coi "giá trị" là giá trị được tính toán thay vì các công thức thực tế trong ô. Nếu tôi chọn công thức dán, nó vẫn cung cấp tài liệu tham khảo tuyệt đối.

Thêm về lý do tại sao tôi cần điều này: Tôi có một xlsx sản xuất được sử dụng cho các hoạt động hàng ngày. Chúng tôi liên tục cần thực hiện "nâng cấp" cho xlsx này và vì vậy một người có thể tạo một bản sao và những thay đổi của anh ta ở đó cho một tờ. Đồng thời, một người khác cũng có thể thay đổi trang tính khác. Vì các trang tính này không có các ô phụ thuộc trên các trang tính khác , như báo cáo tóm tắt, chúng tôi mong muốn chỉ cần sao chép và hợp nhất các trang tính trở lại vào xlsx ban đầu. Nhưng tham chiếu "tuyệt đối" đang gây ra nhiều rắc rối.


Tôi hơi bối rối. Bạn muốn sao chép tờ 1 từ WBA vào WBB và bạn muốn nó sao chép các công thức liên quan đến WBB chứ không phải WBA. Điều này là không thể trừ khi WBB tờ 2 giống hệt với bảng WBA 2. Có phải vậy không? Ngoài ra, nếu bạn chỉ muốn các giá trị, bạn có thể sao chép trang tính select all - copy - paste special - valuesđể chỉ có các giá trị. Nếu bạn muốn làm tất cả trong quá trình sao chép thay vì dựa vào người dùng cuối để thực hiện các bước đó, tốt, tôi đã làm việc trên đó. Hãy cho chúng tôi biết chính xác bạn muốn nó đi như thế nào về WorkbookA (hoặc 1) và WBB (2) và tờ #s
Raystafarian

Tôi đã cố gắng giải thích trong đoạn cuối của tôi, nhưng tôi nghĩ nó vẫn chưa rõ ràng. Có, WBA và WBB là kỳ vọng giống hệt nhau cho một tờ trong WBA. Trong khi thiết kế trang tính đó trong WBA, dự định rằng tất cả các tham chiếu ô đều liên quan đến sổ làm việc của trang tính. Hàm bảng tính sao chép sẽ nối thêm tất cả các công thức ô với WBA, làm cho nó "tuyệt đối" và tôi không muốn điều đó.
Jake

các giá trị dán đặc biệt chỉ dán các giá trị được tính toán. Tôi cần các công thức được sao chép qua, KHÔNG CÓ WBA.xls được thêm vào.
Jake

Được rồi tôi rõ ràng. Tôi sẽ đăng câu trả lời nếu / khi tôi nhận ra
Raystafarian

Bạn không thể tạo một bản sao của toàn bộ sổ làm việc và sau đó xóa những gì bạn không cần từ bản sao mới?
lùn

Câu trả lời:


21

Hãy thử sử dụng Ctrl+ ~để hiển thị các công thức. Sau đó sử dụng Ctrl+ Ađể chọn mọi thứ, sao chép nó và sau đó dán vào notepad.

Cuối cùng, sao chép nó ra khỏi notepad và dán nó vào sổ làm việc khác của bạn.


1
@Jake: Nhưng bạn đã nói rằng sổ làm việc của bạn có các nút, danh sách thả xuống và như vậy; và phạm vi được đặt tên. Kỹ thuật này sẽ không sao chép chúng (hoặc những thứ trần tục như định dạng) - làm thế nào / tại sao bạn cho rằng nó có thể chấp nhận được?
Scott

Trên một bảng tính lớn, kỹ thuật Chỉnh sửa Liên kết / Thay đổi Nguồn rất chậm, nhưng tốc độ này rất nhanh.
Tony Pulokas

23

Trong nhiều trường hợp, tôi đã thấy dễ dàng hơn khi thực hiện các thao tác sau:

  • sao chép trang tính sang sổ làm việc mới
  • kích hoạt trang tính mới trong sổ làm việc mới
  • chọn tất cả ( Ctrl+ A)
  • tìm / thay thế
    • tìm thấy: [WorkbookA.xlsx]!
    • thay thế: <để trống>
  • thay thế tất cả

11

Câu trả lời không dấu ngay bên dưới câu trả lời này là câu trả lời phù hợp với tôi, với một biến thể rất nhỏ.

  1. Tạo và lưu bảng tính đích.

  2. Sử dụng "di chuyển", "sao chép" hoặc kéo trang của bạn với các công thức vào bảng tính mới. Điều này để lại các công thức trên trang mới chỉ vào bảng tính cũ. Sau đó lưu bảng tính mới ở cùng vị trí với bảng tính cũ.

  3. Sau đó, chuyển đến Tab Dữ liệu> bấm Chỉnh sửa Liên kết. Tùy chọn sẽ không hoạt động trừ khi có các liên kết trong trang.

  4. Trong hộp thoại có kết quả, chọn tên của tệp nguồn và nhấp vào "Thay đổi nguồn."

  5. Từ hộp thoại mở tệp xuất hiện tiếp theo, chọn tên của bảng tính mới.

Nhấp vào Đóng và bạn đã hoàn tất.


9

Hoặc đơn giản là làm như sau:

Chuyển đổi này:

=database_feed!A1

đến đây:

=INDIRECT("database_feed!A1")

và không có nhiều thay đổi đối với tài liệu tham khảo của bạn khi bạn sao chép giữa các trang tính.

Nếu bạn không có nhiều trang được tham chiếu, một cách khác sẽ là sử dụng

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

và nhập tên của bảng tham chiếu trong ô B1. Bây giờ bạn chỉ có một ô để cập nhật khi được sao chép vào bảng tính mới.


1
Ý tưởng hay, hoạt động nếu bạn có một bảng mẫu với các công thức và bạn đang sao chép nó vào một sổ làm việc mới với VBA. Tôi thấy rằng bạn cần giữ tham chiếu giữa các trích dẫn và thêm TRUE để giữ các tham chiếu loại A1. ví dụ. = INDIRECT ("'Trang tính 1'! A1", THẬT)
RogerB

2
INDIRECTlà một công thức dễ bay hơi vì vậy nó sẽ được tính toán lại mỗi lần (trái ngược với chỉ khi nó được chỉnh sửa), điều này thực sự có thể làm chậm các sổ làm việc phức tạp hơn, vì vậy hãy thận trọng
Andy Terra

3

Mã dưới đây có thể được điều chỉnh theo nhu cầu của bạn. Nó lấy tất cả các công thức từ trang tính trên wb1và áp dụng chúng cho một trang tính trong một bảng tính mới. Các công thức được áp dụng như Strings, vì vậy không có chèn các tham chiếu đến sổ làm việc gốc. Ngoài ra, mã này cực nhanh vì nó không sử dụng bảng tạm và không yêu cầu bất kỳ vòng lặp nào qua các ô.

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

Vì 99% câu trả lời thậm chí không giải quyết được câu hỏi ban đầu, đây là câu trả lời thích hợp.

  1. Sao chép các trang tính từ tệp gốc (Original.xlsx) sang tệp Excel mới (New.xlsx) như bình thường. Nói chung, tôi nhấp chuột phải vào tên và chọn "Di chuyển hoặc Sao chép ...".

  2. Lưu tệp thứ hai - mới được tạo (New.xlsx).

  3. Trong tệp mới, bên dưới Dữ liệu, nhấp vào "Chỉnh sửa liên kết"

  4. Trong cửa sổ bật lên, chọn "Thay đổi nguồn ..."

  5. Xác định vị trí tệp (New.xlsx) và nhấp vào Mở.

Tất cả các tham chiếu đến bản gốc (Original.xlsx) sẽ bị xóa.

LÀM XONG!


Nên cao hơn trong danh sách các câu trả lời
sabre23t

2
  • sao chép bảng tính vào 'WorkbookB.xlsx'
  • mở bảng tính trong tập tin mới
  • chọn tất cả
  • vào menu Dữ liệu, nhấp vào liên kết chỉnh sửa
  • chỉnh sửa các liên kết để liên kết đến tệp cũ hiện là liên kết đến tệp đang mở

Điều này làm việc cho tôi.


0

Cả hai sách bài tập phải được mở để làm việc này . Bạn chạy macro này và nó sẽ sao chép workbookA!sheet1 đến workbookB!sheet1và sau đó thay thế tất cả các workbookAtham chiếu. Đó là thô, nhưng nó hoạt động . Rõ ràng bạn có thể thay đổi mã để khớp với tên WorkbookA.xlsx của bạn, nhưng đảm bảo chúng có phần mở rộng chính xác và vẫn còn trong dấu ngoặc kép.

Ồ, để tạo một macro, trong trường hợp bạn không biết, hãy nhấn alt + F11để hiển thị Trình soạn thảo Visual Basic. Sau đó nhấp chuột phải vào WBA insert - modulevà sao chép và dán mã bên dưới vào mô-đun. Sau đó nhấn F5để chạy macro. Nếu macro không chạy, có thể là do macro không được bật, vì vậy hãy tiếp tục và lưu nó và mở lại và khi nó nhắc bật macro, hãy bật chúng.

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
Một thói quen duy nhất là tốt như tôi hiện đang làm thủ công CTRL+H, nhưng tất cả những điều này không khắc phục được các tinh chỉnh cho các điều khiển, ví dụ như các nút, thả xuống và như vậy; và phạm vi được đặt tên.
Jake

0

Tôi đã đạt được điều này bằng cách sao chép các ô vào bảng tính mới như bình thường, sau đó thực hiện tìm thay thế để xóa đường dẫn tệp cũ trong công thức.

Ví dụ, nếu công thức đầu tiên là =J2và điều này trở thành =[filepath]J2, thì chỉ cần tìm và thay thế toàn bộ bảng tính mới [filepath]và thay thế bằng không có gì. Điều này xóa nó và khôi phục công thức =J2.

Không cần VB!


Đáng buồn là excel dường như chỉ hoạt động không liên tục khi tìm chuỗi con bên trong các công thức: /. Nó dường như không có khả năng tìm thấy bất cứ điều gì với dấu ngoặc đơn.
Douglas Gaskell

0

Tôi đã có một vấn đề tương tự. Lý do các công thức được dán với liên kết đến WBA là vì tab (trang tính) tôi đang làm việc trong WBA được đặt tên khác với liên kết trong WBB. Đối với tôi, nó luôn là "tờ cuối cùng" nhưng một cái được đặt tên là 'MinFlow' và cái còn lại được đặt tên là 'NormalFlow'. Tôi đã đổi tên cả thành 'Kết quả' và bản sao / dán hoạt động như tôi muốn - một "dán tương đối".


0

Chọn các ô bạn muốn di chuyển. Bây giờ hãy thử di chuyển chúng bằng cách kéo n thả vào bảng tính khác nhau (tab khác nhau).

Tôi biết, nó cuộn. Đây là phần khó khăn: chỉ cần nhấn cmd (mac) hoặc alt (win) và nó sẽ cho phép bạn thả các ô sang một tab khác.


Bạn có thể mở rộng câu trả lời của bạn một chút không? Không rõ làm thế nào / nơi để thả trên một tab khác trong khi kéo. Cảm ơn.
fixer1234

0

Xin chào, đây là một giải pháp đơn giản cho vấn đề này:

  1. Sao chép qua các ô như bình thường.
  2. Trong công thức chọn và sao chép văn bản liên kết nó với sổ làm việc trước đó [WorkbookA.xlsx].
  3. Chọn tất cả các ô mà bạn muốn thay đổi và Bấm CTRL+Fvà chọn tab thay thế.
  4. Thay thế [WorkbookA.xlsx] bằng khoảng trống (còn gọi là không viết bất cứ điều gì trên Replace withtrường, nhấn Replace All.

Voila - đã xong.


0

Một 'mẹo' khác - trước khi sao chép bảng nguồn, thay thế tất cả các vòng loại công thức =bằng các bộ ký tự khác (giả sử ###=).

Sao chép bảng tính qua, sau đó sau khi sao chép, thay thế vòng loại công thức trở lại (thay thế ###=bằng =).

Đảm bảo rằng bất kỳ tham chiếu trang tính nào trong công thức cũng được sao chép sang trang tính mới trước trang tính tham chiếu.


0
  1. Sao chép tờ như bình thường. (nhấp chuột phải vào tab và đi đến 'di chuyển hoặc sao chép') Đây là định dạng.

  2. Sao chép tất cả các ô từ trang tính gốc (sử dụng Ctrl+ Ahoặc tam giác trên cùng bên trái và Ctrl+ C)

  3. Dán dưới dạng Giá trị vào sổ làm việc mới (trên trang tính "bước 1") (Tùy chọn dán> 123)


0

Nếu bạn cần thực hiện việc này một cách tự động vì bạn đang kéo các trang tính trong chương trình VBA. Dùng cái này:

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

Chỉ cần thay đổi "Chuỗi tìm thấy trong tên sách nguồn." để phù hợp với các liên kết cũ mà bạn muốn thay thế. Bạn có thể loại bỏ khối đó nếu bạn muốn thay thế tất cả các liên kết.


-1

Mở cả hai sách bài tập. Trong sổ làm việc nguồn (WorkbookA.xlsx), chọn trang tính bạn muốn sao chép. Nhấp chuột phải vào tab trang tính và chọn Di chuyển hoặc Sao chép. Trong hộp thoại của Move Move hoặc Sao chép, hãy chọn một cuốn sách khác trong cuốn sách của bạn (Và nhấp vào OK OK.)


-1

Tạo một bản sao của trang tính mà bạn muốn di chuyển các trang tính từ trường hợp này sẽ là WorkbookA.xlsx. Đổi tên thành "Bản sao của WorkbookA.xlsx". Bây giờ hãy mở sổ làm việc mới này cũng như sổ làm việc bạn muốn di chuyển trang tính mà trong trường hợp này sẽ là WorkbookB.xlsx. Nhấp chuột phải vào các trang tính trong sổ làm việc sao chép mà bạn đã tạo, tức là Sao chép WorkbookA.xlsx và chọn 'di chuyển hoặc sao chép' và sau đó di chuyển các trang tính này sang WorkbookB.xlsx. Bạn xong việc rồi !


Không rõ câu trả lời của bạn giải quyết vấn đề của câu hỏi như thế nào. Tại sao di chuyển sẽ hoạt động theo cách khác nhau sau đó sao chép sẽ làm việc?
Máté Juhász

Tôi đã thử giải pháp đề xuất của bạn và nó không hoạt động. Không có sự khác biệt giữa sao chép và di chuyển toàn bộ tờ.
nixda
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.