Tìm hiểu công thức lấy tên Sheet trong File và Link các Sheet của File cho KQ sai (1 người xem)

Người dùng đang xem chủ đề này

Cao Mạnh Sơn

Tôi đồng ý
Tham gia
26/11/07
Bài viết
568
Được thích
591
Trên diễn đàn của GPE đã có công thức lấy tên Sheet trong File và cách Link đến các Sheet đó. Vấn đề hiện nay tôi thấy kết quả bị sai khi sử dụng cùng lúc 2 File cụ thể như sau:
File Test1 có 3 sheet 1,2,3. File test2 có 3 Sheet A,B,C.
khi mở file Test1 lên trước kết qủa của công thức lấy tên Sheet sẽ trả về đúng 3 sheet 1,2,3.
Bây giờ ta mở thêm file Test2 lên kết quả cũng sẽ là 3 Sheet A,B,C >>> OK kết quả đúng. Bạn hãy nhấn nút lệnh, chỉ là yêu cầu Excel tính toán thôi, kết quả vẫn là A,B,C >>> Kết quả đúng ???? Chưa phải, bạn hãy quay lại file Test1 thì kết quả lúc trước là 1,2,3 bây giờ thành lại là A,B,C >>> Kết quả sai. Chưa hết, bạn hãy nhấn nút lệnh ở file Test1>>> kết quả trả lại là 1,2,3 >>> OK kết quả đúng. và lại quay sang file Test2 thì kết quả lại là 1,2,3>>> lại sai rồi.
Bạn lại nhấn nút lệnh ở file Test2 để xem kết quả và lại trở lại File Test1 để ktra kết quả và cho nhận xét.
Như vậy khi Excel thực hiện lênh tính toán lại thì ở cả 2 File sẽ cho kết quả của của File đang Active.
Vấn đề tôi muốn tìm hiểu ở đây là cách mà Excel tính toán như thế nào mà lại cho kết quả như vậy và cách khắc phục như thế nào.
các bạn Down cả 2 file tôi đính kèm và tìm hiểu giúp nhé
 

File đính kèm

Không thấy bạn nào vào xem và nghiên cứu đưa ra giải pháp cả, các bậc cây cao bóng cả vào cho ý kiến nhé.
 
Trên diễn đàn của GPE đã có công thức lấy tên Sheet trong File và cách Link đến các Sheet đó. Vấn đề hiện nay tôi thấy kết quả bị sai khi sử dụng cùng lúc 2 File cụ thể như sau:
File Test1 có 3 sheet 1,2,3. File test2 có 3 Sheet A,B,C.
khi mở file Test1 lên trước kết qủa của công thức lấy tên Sheet sẽ trả về đúng 3 sheet 1,2,3.
Bây giờ ta mở thêm file Test2 lên kết quả cũng sẽ là 3 Sheet A,B,C >>> OK kết quả đúng. Bạn hãy nhấn nút lệnh, chỉ là yêu cầu Excel tính toán thôi, kết quả vẫn là A,B,C >>> Kết quả đúng ???? Chưa phải, bạn hãy quay lại file Test1 thì kết quả lúc trước là 1,2,3 bây giờ thành lại là A,B,C >>> Kết quả sai. Chưa hết, bạn hãy nhấn nút lệnh ở file Test1>>> kết quả trả lại là 1,2,3 >>> OK kết quả đúng. và lại quay sang file Test2 thì kết quả lại là 1,2,3>>> lại sai rồi.
Bạn lại nhấn nút lệnh ở file Test2 để xem kết quả và lại trở lại File Test1 để ktra kết quả và cho nhận xét.
Như vậy khi Excel thực hiện lênh tính toán lại thì ở cả 2 File sẽ cho kết quả của của File đang Active.
Vấn đề tôi muốn tìm hiểu ở đây là cách mà Excel tính toán như thế nào mà lại cho kết quả như vậy và cách khắc phục như thế nào.
các bạn Down cả 2 file tôi đính kèm và tìm hiểu giúp nhé

Thì tất nhiên nó vậy rồi
Nó gần giống như hàm đếm hoặc cộng theo màu sắc ấy! Việc bạn di chuyển qua các sheet (hoặc các file) sẽ không được xem là sự kiện Change. Vì thế công thức chỉ cập nhật được khi bạn nhấn F9 (hoặc có nhập liệu vào 1 cell nào đó)
Tóm lại: Mỗi khi di chuyển qua lại các file, bạn nhấn F9 là được (khỏi cần thiết kế Button làm gì)
 
Thì tất nhiên nó vậy rồi
Nó gần giống như hàm đếm hoặc cộng theo màu sắc ấy! Việc bạn di chuyển qua các sheet (hoặc các file) sẽ không được xem là sự kiện Change. Vì thế công thức chỉ cập nhật được khi bạn nhấn F9 (hoặc có nhập liệu vào 1 cell nào đó)
Tóm lại: Mỗi khi di chuyển qua lại các file, bạn nhấn F9 là được (khỏi cần thiết kế Button làm gì)
Ý của em không phải hỏi vậy, vấn đề ở chỗ tại sao khi 2 file này cùng mở 1 lúc file Test2 lại lấy kết quả của File Test1 và ngược lại. Vậy excel tính toán thế nào mà lại cho kết quả như vậy, khắc phục nó ra sao. trường hợp này thiết kế nút lệnh là mô phỏng, thưc tế nếu ở 2 file này sử dụng các Form mà trong cole có dòng lệnh Caculation = true thì kết quả sai hết.
 
Ý của em không phải hỏi vậy, vấn đề ở chỗ tại sao khi 2 file này cùng mở 1 lúc file Test2 lại lấy kết quả của File Test1 và ngược lại. Vậy excel tính toán thế nào mà lại cho kết quả như vậy, khắc phục nó ra sao.

Nó lưu lại kết quả cuối cùng thôi (như đã nói ở trên)
Khắc phục: Bấm F9
--------------------
trường hợp này thiết kế nút lệnh là mô phỏng, thưc tế nếu ở 2 file này sử dụng các Form mà trong cole có dòng lệnh Caculation = true thì kết quả sai hết.
Nếu bạn dùng Form + Code thì mắc gì bạn phải xài chúng? Đó là dành cho người không thích macro cơ mà
Đã code thì tự viết toàn bộ luôn (khỏi suy nghĩ)
 
Trên diễn đàn của GPE đã có công thức lấy tên Sheet trong File và cách Link đến các Sheet đó. Vấn đề hiện nay tôi thấy kết quả bị sai khi sử dụng cùng lúc 2 File cụ thể như sau:
File Test1 có 3 sheet 1,2,3. File test2 có 3 Sheet A,B,C.
khi mở file Test1 lên trước kết qủa của công thức lấy tên Sheet sẽ trả về đúng 3 sheet 1,2,3.
Bây giờ ta mở thêm file Test2 lên kết quả cũng sẽ là 3 Sheet A,B,C >>> OK kết quả đúng. Bạn hãy nhấn nút lệnh, chỉ là yêu cầu Excel tính toán thôi, kết quả vẫn là A,B,C >>> Kết quả đúng ???? Chưa phải, bạn hãy quay lại file Test1 thì kết quả lúc trước là 1,2,3 bây giờ thành lại là A,B,C >>> Kết quả sai. Chưa hết, bạn hãy nhấn nút lệnh ở file Test1>>> kết quả trả lại là 1,2,3 >>> OK kết quả đúng. và lại quay sang file Test2 thì kết quả lại là 1,2,3>>> lại sai rồi.
Bạn lại nhấn nút lệnh ở file Test2 để xem kết quả và lại trở lại File Test1 để ktra kết quả và cho nhận xét.
Như vậy khi Excel thực hiện lênh tính toán lại thì ở cả 2 File sẽ cho kết quả của của File đang Active.
Vấn đề tôi muốn tìm hiểu ở đây là cách mà Excel tính toán như thế nào mà lại cho kết quả như vậy và cách khắc phục như thế nào.
các bạn Down cả 2 file tôi đính kèm và tìm hiểu giúp nhé

Chỗ đỏ đỏ thì đương nhiên rồi. Tại sao? Đọc tiếp nhé.
----------
Nguyên nhân? Khi bạn click button thì cả 2 name đều được tính lại. Ví dụ bạn click button trên Test2.xlsm. Vậy thì active workbook là Test2.xlsm. Mà bạn dùng GET.WORKBOOK chỉ với 1 tham số đầu - cú pháp GET.WORKBOOK(type_num, name_text) - nên thông tin được trả về với hàm ý là đọc cho active workbook, tức cho Test2.xlsm. Vậy giá trị của name trong Test1.xlsm cũng y hệt như trong Test2.xlsm. Chỉ khi bạn trở lại Test1.xlsm rồi nhấn F9 thì name được tính lại.

Cách "đối phó"? Tôi mới nghĩ nhanh nên chỉ được cách đối phó nửa vời. Tức bạn chèn tên workbook vào name. Nửa vời vì nếu bạn liên tục đổi tên workbook thì mỗi lần đổi phải làm mới name

name AllSh trong Test1.xlsm
Mã:
=REPLACE(GET.WORKBOOK(ROW(INDIRECT("A1"));"Test1.xlsm");1;FIND("]";GET.WORKBOOK(ROW(INDIRECT("A1"));"Test1.xlsm"));"")

name AllSh trong Test2.xlsm
Mã:
=REPLACE(GET.WORKBOOK(ROW(INDIRECT("A1"));"Test2.xlsm");1;FIND("]";GET.WORKBOOK(ROW(INDIRECT("A1"));"Test2.xlsm"));"")

Bạn click thoải mái.
--------------
Những cái tôi viết ở trên chỉ để thỏa trí tò mò của bạn thôi - gọi là chứng minh là cái bạn thấy không phải bắt buộc nó phải thế - chứ nếu bạn chơi code thì khỏi bàn, còn nếu chơi công thức thì cứ F9 hoặc nhập liệu vào đâu đó thì tự nhiên lại "đúng". Nếu không có nhu cầu làm việc tiếp thì cũng chả cần F9 mà bạn save rồi đóng. Khi mở lại tự nhiên lại "đúng".
 
Những cái tôi viết ở trên chỉ để thỏa trí tò mò của bạn thôi - gọi là chứng minh là cái bạn thấy không phải bắt buộc nó phải thế - chứ nếu bạn chơi code thì khỏi bàn, còn nếu chơi công thức thì cứ F9 hoặc nhập liệu vào đâu đó thì tự nhiên lại "đúng". Nếu không có nhu cầu làm việc tiếp thì cũng chả cần F9 mà bạn save rồi đóng. Khi mở lại tự nhiên lại "đúng".
Không phải chỉ là tò mò, vậy là đã rõ cách lấy tên của excel.
Đương nhiên kết quả nó chỉ nhất thời sai sai đúng đúng và vấn đề cũng không phải biết sai mà tại sao không dùng code cho khỏe mà cái cần ở chỗ khắc phục như thế nào.
Phương án đưa ra là đổi tên Name theo tên Worbook cũng là 1 phương án khắc phục, tuy nhiên không khả thi khi áp dụng.
Xin cám ơn anh đã giải thích. Hy vọng anh có phương án tối ưu.
 
Trên diễn đàn của GPE đã có công thức lấy tên Sheet trong File và cách Link đến các Sheet đó. Vấn đề hiện nay tôi thấy kết quả bị sai khi sử dụng cùng lúc 2 File cụ thể như sau:
File Test1 có 3 sheet 1,2,3. File test2 có 3 Sheet A,B,C.
khi mở file Test1 lên trước kết qủa của công thức lấy tên Sheet sẽ trả về đúng 3 sheet 1,2,3.
Bây giờ ta mở thêm file Test2 lên kết quả cũng sẽ là 3 Sheet A,B,C >>> OK kết quả đúng. Bạn hãy nhấn nút lệnh, chỉ là yêu cầu Excel tính toán thôi, kết quả vẫn là A,B,C >>> Kết quả đúng ???? Chưa phải, bạn hãy quay lại file Test1 thì kết quả lúc trước là 1,2,3 bây giờ thành lại là A,B,C >>> Kết quả sai. Chưa hết, bạn hãy nhấn nút lệnh ở file Test1>>> kết quả trả lại là 1,2,3 >>> OK kết quả đúng. và lại quay sang file Test2 thì kết quả lại là 1,2,3>>> lại sai rồi.
Bạn lại nhấn nút lệnh ở file Test2 để xem kết quả và lại trở lại File Test1 để ktra kết quả và cho nhận xét.
Như vậy khi Excel thực hiện lênh tính toán lại thì ở cả 2 File sẽ cho kết quả của của File đang Active.
Vấn đề tôi muốn tìm hiểu ở đây là cách mà Excel tính toán như thế nào mà lại cho kết quả như vậy và cách khắc phục như thế nào.
các bạn Down cả 2 file tôi đính kèm và tìm hiểu giúp nhé

Có lẽ bạn hơi máy móc trong các công thức của bạn.
Cái này
Mã:
ROW(INDIRECT("A1"))
luôn có kết quả là 1
Cái này
Mã:
ROW(INDIRECT("A4"))
luôn có kết quả là 4
Và cái này
Mã:
ROW(INDIRECT("A16"))
luôn có kết quả là 16
Vậy sao bạn không sửa
Mã:
=SUBSTITUTE(GET.WORKBOOK(ROW(INDIRECT("A1"))),"["&GET.WORKBOOK(ROW(INDIRECT("A16")))&"]","")
thành
Mã:
=SUBSTITUTE(GET.WORKBOOK(1),"["&GET.WORKBOOK(16)&"]","")

Mã:
=GET.WORKBOOK(ROW(INDIRECT("A4")))
thành
Mã:
=GET.WORKBOOK(4)

Bàn vào việc chính
GET.WORKBOOK(16) là lệnh dùng để lấy tên Workbook đang được Active. Khi bạn đứng ở file nào thì cái đó là ActiveWorkbook và chuyện công thức cho kết quả như thế là hoàn toàn hợp lý.

Để khắc phục bạn hãy dùng một công thức khác để lấy tên file mà nó không bị thay đổi theo ActiveWorkbook. Và công thứ ấy đại loại như sau:
Mã:
=REPLACE(LEFT(CELL("filename",$A$1),FIND("]",CELL("filename",$A$1))-1),1,FIND("[",CELL("filename",$A$1)),"")

Các name sẽ được sửa lại như sau:
Filename
Mã:
=REPLACE(LEFT(CELL("filename",$A$1),FIND("]",CELL("filename",$A$1))-1),1,FIND("[",CELL("filename",$A$1)),"")
AllSh
Mã:
=SUBSTITUTE(GET.WORKBOOK(1,FileName),"["&FileName&"]","")
NoSh
Mã:
=GET.WORKBOOK(4)
Sửa 2 file rồi có bấm mỏi tay cũng không bị gì.
 
Có lẽ bạn hơi máy móc trong các công thức của bạn.
Cái này
Mã:
ROW(INDIRECT("A1"))
luôn có kết quả là 1
Cái này
Mã:
ROW(INDIRECT("A4"))
luôn có kết quả là 4
Và cái này
Mã:
ROW(INDIRECT("A16"))
luôn có kết quả là 16
Vậy sao bạn không sửa
Mã:
=SUBSTITUTE(GET.WORKBOOK(ROW(INDIRECT("A1"))),"["&GET.WORKBOOK(ROW(INDIRECT("A16")))&"]","")
thành
Mã:
=SUBSTITUTE(GET.WORKBOOK(1),"["&GET.WORKBOOK(16)&"]","")
Không phải MÁY MÓC đâu!
Có INDIRECT vào là để nó có thể CẬP NHẬT khi ta bấm F9 đấy thắng à
Nếu không dùng INDIRECT thì có thể dùng hàm NOW() thay vào
 
Không phải MÁY MÓC đâu!
Có INDIRECT vào là để nó có thể CẬP NHẬT khi ta bấm F9 đấy thắng à
Nếu không dùng INDIRECT thì có thể dùng hàm NOW() thay vào

Nếu làm vậy để tự cập nhật thì đâu cần hai cái nút kia đâu anh.
 
Trời, vừa nhấn nút gửi bài bỗng đâu xuất hiện bài nhảy dù, khiếp quá.
 

Bài viết mới nhất

Back
Top Bottom