Có thể dùng Code để thay hàm tham chiếu không?

Liên hệ QC

ThuyDuong2024

Thành viên chính thức
Tham gia
14/12/11
Bài viết
50
Được thích
5
Chào cả nhà, e có nội dung này cần sự giúp đỡ:
Em làm một file hồ sơ CL. Muốn khi nhập liệu công tác mới, hoặc chỉnh sửa các nội dung đã nhập, xóa dòng, thêm dòng từ sheet NHAPDULIEU thì dữ liệu ở các cột có nội dung tương ứng bên sheet Lọc DL sẽ tự động thay đổi theo, giống như dùng hàm để liên kết vậy.
Em gửi file kèm, có nêu rõ nội dung trong sheet Lọc DL
 

File đính kèm

  • File HSCL_mau.xls
    323.5 KB · Đọc: 9
Giải thích như thế chưa chắc người khác hiểu.
Ở mỗi thời điểm thì nội dung ở LOCDL được lấy tất tần tật từ NHAPDULIEU, 2 sheet chỉ khác nhau là LOCDL có ít cột hơn? Nếu thế thì tại sao LOCDL chỉ có 1 dòng 3 trong khi "Đào móng bằng máy và thủ công" xuất hiện 2 lần trong NHAPDULIEU - dòng 9 và 19.
Tốt nhất là mô tả xong thì lấy ví dụ cụ thể.
 
Upvote 0
Nội dung các dòng trong NHAPDULIEU có thể lặp đi lặp lại nhiều lần theo trình tự thời gian thi công, vì nó cùng mã CV nhưng khác ngày giờ. VD như thi công xong từng đoạn đường chẳng hạn, sau đó lại lặp lại các công tác tương tự. Có những công tác nhập sau cùng nhưng có thể lấy thời gian trước. Bởi vậy, các cv ở bảng NHAPDULIEU chưa được sắp xếp trình tự theo thời gian, việc chỉ lấy một số cột từ Sheet này sang LOCDL là để phục vụ việc sắp xếp thời gian theo thữ tự tăng dần. từ đó lọc được nội dung các công việc cũng theo thời gian tăng dần để tạo ra nhật ký.
E gửi lại file đã gán một code lấy dữ liệu cho LOCDL rồi. Nhưng vấn đề là chỉ những cột bên NHAPDULIEU có dữ liệu được nhập trực tiếp hoặc bằng form thì nó mới tự động cập nhật sang LOCDL, còn dữ liệu nếu cột đó là kết quả của một hàm lấy từ các cột khác thì nó ko tự động cập nhật, mà nó chỉ "nhảy" sau khi nhập hoặc sửa lại bất kỳ một mã CV nào.
Một việc nữa, code này lấy toàn bộ kể cả các format bên NHAPDULIEU để đưa sang, kể cả các rules...
 

File đính kèm

  • File HSCL_mau2.xls
    332.5 KB · Đọc: 7
Upvote 0
Giải thích như thế chưa chắc người khác hiểu.
Ở mỗi thời điểm thì nội dung ở LOCDL được lấy tất tần tật từ NHAPDULIEU, 2 sheet chỉ khác nhau là LOCDL có ít cột hơn? Nếu thế thì tại sao LOCDL chỉ có 1 dòng 3 trong khi "Đào móng bằng máy và thủ công" xuất hiện 2 lần trong NHAPDULIEU - dòng 9 và 19.
Tốt nhất là mô tả xong thì lấy ví dụ cụ thể.
Ý e là lấy toàn bộ dữ liệu các cột cần lấy từ Sheet NHAPDULIEU sang LOCDL. Khi sửa, xóa dòng, chèn dòng thì nó đều tự động cập nhật sang
 
Upvote 0
. . . Nhưng vấn đề là chỉ những cột bên NHAPDULIEU có dữ liệu được nhập trực tiếp hoặc bằng form thì nó mới tự động cập nhật sang LOCDL, còn dữ liệu nếu cột đó là kết quả của một hàm lấy từ các cột khác thì nó ko tự động cập nhật, mà nó chỉ "nhảy" sau khi nhập hoặc sửa lại bất kỳ một mã CV nào. . . . .
Bạn này chắc không đủ sức khỏe để liệt kê cụ thể các cột nào cần cập nhật, cột nào không (?!)
 
Upvote 0
Nội dung các dòng trong NHAPDULIEU có thể lặp đi lặp lại nhiều lần theo trình tự thời gian thi công, vì nó cùng mã CV nhưng khác ngày giờ. VD như thi công xong từng đoạn đường chẳng hạn, sau đó lại lặp lại các công tác tương tự. Có những công tác nhập sau cùng nhưng có thể lấy thời gian trước. Bởi vậy, các cv ở bảng NHAPDULIEU chưa được sắp xếp trình tự theo thời gian, việc chỉ lấy một số cột từ Sheet này sang LOCDL là để phục vụ việc sắp xếp thời gian theo thữ tự tăng dần. từ đó lọc được nội dung các công việc cũng theo thời gian tăng dần để tạo ra nhật ký.
Tôi không thắc mắc vấn đề này. Tôi đoán mò là lấy TẤT TẦN TẬT từ các cột C, D, N, O từ NHAPDULIEU trong khi nhìn dữ liệu LOCDL thì rõ ràng bạn đã không lấy TẤT TẦN TẬT. Lấy TẤT TẦN TẬT thì bên LOCDL phải có 25 trong khi bạn có 4 dòng. Vì thế mà tôi thắc mắc.
Bạn viết
Muốn khi nhập liệu công tác mới, hoặc chỉnh sửa các nội dung đã nhập, xóa dòng, thêm dòng từ sheet NHAPDULIEU thì dữ liệu ở các cột có nội dung tương ứng bên sheet Lọc DL sẽ tự động thay đổi theo
Bạn định xóa thế nào? Là chọn cả dòng nào đó và nhấn DELETE hay thế nào? Nếu nhấn DELETE thì trong các cột I, J, M, O sẽ có lỗi #REF!
Nhưng vấn đề là chỉ những cột bên NHAPDULIEU có dữ liệu được nhập trực tiếp hoặc bằng form thì nó mới tự động cập nhật sang LOCDL, còn dữ liệu nếu cột đó là kết quả của một hàm lấy từ các cột khác thì nó ko tự động cập nhật, mà nó chỉ "nhảy" sau khi nhập hoặc sửa lại bất kỳ một mã CV nào.
Tôi không hiểu lắm. Trong 4 cột C, D, N, O thì 3 cột C, D, N là nhập tay, chỉ có O được tính bằng công thức, được lấy từ cột J. Mà J phụ thuộc vào I và K. Kiểm tra thì chỉ thay đổi ô I6 hoặc/và cột K mới làm thay đổi cột J. I6 và cột K nhập bằng tay, vậy để phản ứng với sự thay đổi của J thì ta theo dõi thay đổi ở I6 và cột K. Vậy thì code sẽ làm mới LOCDL khi có sự thay đổi ̉ C, D, N và I6, K
Mã:
Private Sub worksheet_Change(ByVal Target As Range)
    If Not Intersect(Me.Range("C9:D1000, N9:N1000, K9:K1000, I6"), Target) Is Nothing Then
        Sheets("LOCDL").Range("B3:E1000").ClearContents
        Union(Me.Range("C9:D1000"), Me.Range("N9:O1000")).Copy
        Sheets("LOCDL").Range("B3").PasteSpecial xlPasteValues
        Application.CutCopyMode = False
    End If
End Sub
 
Upvote 0
Tôi không thắc mắc vấn đề này. Tôi đoán mò là lấy TẤT TẦN TẬT từ các cột C, D, N, O từ NHAPDULIEU trong khi nhìn dữ liệu LOCDL thì rõ ràng bạn đã không lấy TẤT TẦN TẬT. Lấy TẤT TẦN TẬT thì bên LOCDL phải có 25 trong khi bạn có 4 dòng. Vì thế mà tôi thắc mắc.
Bạn viết

Bạn định xóa thế nào? Là chọn cả dòng nào đó và nhấn DELETE hay thế nào? Nếu nhấn DELETE thì trong các cột I, J, M, O sẽ có lỗi #REF!

Tôi không hiểu lắm. Trong 4 cột C, D, N, O thì 3 cột C, D, N là nhập tay, chỉ có O được tính bằng công thức, được lấy từ cột J. Mà J phụ thuộc vào I và K. Kiểm tra thì chỉ thay đổi ô I6 hoặc/và cột K mới làm thay đổi cột J. I6 và cột K nhập bằng tay, vậy để phản ứng với sự thay đổi của J thì ta theo dõi thay đổi ở I6 và cột K. Vậy thì code sẽ làm mới LOCDL khi có sự thay đổi ̉ C, D, N và I6, K
Cảm ơn anh đã trợ giúp. Cái file lúc đầu ở LOCDL chỉ là minh họa mấy dòng vì chưa có code. Ý tưởng là ở các cột C,D,N,O có bao nhiêu dòng dữ liệu thì sẽ được link sang sheet LOCDL tương ứng số lượng cột đó (vị trí thì tùy chọn).
A nói đúng, vì dữ liệu ở cột O là công thức nên những thay đổi ở cột này nó ko tự động cập nhật mà phải được chạy lại code hoặc nhập lại một dữ liệu ở một cel nào đó trong các cột khác. Đó là điều e ko giải quyết được.
Còn xóa là xóa cả dòng, chọn đầu dòng rồi delete. Và xóa dòng thì nó xuất hiện lỗi #REF chính vì dữ liệu ở cột O ko cập nhật kịp sang LOCDL đó anh.
 
Upvote 0
Bạn thớt chịu khó nhìn lại những gì mình viết ra một chút.
Đề bài thì cột C, D, L, O tùm lum mà cũng cố viết tắt A, E. Không bao giờ nghĩ đến bảng tính cũng có cột A và E.
 
Upvote 0
Mã:
Private Sub worksheet_Change(ByVal Target As Range)
    If Not Intersect(Me.Range("C9:D1000, N9:N1000, K9:K1000, I6"), Target) Is Nothing Then
        Sheets("LOCDL").Range("B3:E1000").ClearContents
        Union(Me.Range("C9:D1000"), Me.Range("N9:O1000")).Copy
        Sheets("LOCDL").Range("B3").PasteSpecial xlPasteValues
        Application.CutCopyMode = False
    End If
End Sub
Đoạn code này của a giải quyết đc vđ rồi, nhưng nó chạy lag màn hình quá. CHóng hết cạ mặt.
Có thể đặt thêm Application.ScreenUpdating = False để hết giật đc ko a?
Bài đã được tự động gộp:

Bạn thớt chịu khó nhìn lại những gì mình viết ra một chút.
Đề bài thì cột C, D, L, O tùm lum mà cũng cố viết tắt A, E. Không bao giờ nghĩ đến bảng tính cũng có cột A và E.
Xin lỗi nhé, mình ko hiểu! Thì sheet NHAPDULIEU là cần lấy dữ liệu từ các cột C,D,N,O mà. Có viết tắt gì đâu?
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi đã nói một lần rồi và tôi không lặp lại nữa.
Chuyện bạn muốn làm ở bài #1 có điều rất nguy hiểm mà người làm việc với dữ liệu cần tránh hoặc cần phải nắm vững để làm chủ nó. Tôi tính xen vào để cảnh báo bạn thôi chứ không có ý viết code giúp bạn.
Tuy nhiên, tác giả bài #6 giỏi hơn tôi về code lẫn khả năng "đoán các từ viết tắt". Cho nên bạn cứ yên tâm là code sẽ chạy tốt.
 
Lần chỉnh sửa cuối:
Upvote 0
Đoạn code này của a giải quyết đc vđ rồi, nhưng nó chạy lag màn hình quá. CHóng hết cạ mặt.
Có thể đặt thêm Application.ScreenUpdating = False để hết giật đc ko a?
Thì bạn tự thêm vào thôi chứ sao lại hỏi ý kiến tôi? Hay bạn hỏi sự đồng ý của tôi?
Thực ra tôi giữ ý của bạn, chỉ thêm I6 và cột K vào điều kiện IF. Nếu bạn thay đổi I6 hay ô nào đó trong cột K thì tất cả các công thức sẽ được tính lại, các ô sẽ được làm mới, do vậy mới thấy nháy nháy. Tự chặn làm mới màn hình thôi, đâu cần người khác cầm tay dẫn đi từng bước.
Trong code tôi dùng tới dòng 1000, còn bạn dùng tới dòng 38. Nếu luôn không vượt 38 thì tự sửa thôi. Vì bạn có mô tả gì dữ liệu đâu.
 
Upvote 0
Tôi đã nói một lần rồi và tôi không lặp lại nữa.
Chuyện bạn muốn làm ở bài #1 có điều rất nguy hiểm mà người làm việc với dữ liệu cần tránh hoặc cần phải nắm vững để làm chủ nó. Tôi tính xen vào để cảnh báo bạn thôi chứ không có ý viết code giúp bạn.
Tuy nhiên, tác giả bài #6 giỏi hơn tôi về code lẫn khả năng "đoán các từ viết tắt". Cho nên bạn cứ yên tâm là code sẽ chạy tốt.
Mình ko biết mới hỏi thôi, còn trình bày tóm tắt là vì xem trên diễn đàn, nhiều bạn thấy mô tả nhiều quá nhiều người luôn bảo đưa file lên để xem cho dễ hiểu, nên mình chọn cách đó. Chứ ai biết là ngta sợ nguy hiểm như cụ. Dù sao thì những người đi hỏi là cần sự giúp đỡ của cộng đồng như mình thì những hiểu biết về lập trình và an toàn dữ liệu là rất mơ hồ. Mà góp ý cũng ko nói toẹt ra cho dễ hiểu. Nếu thấy giúp người khác giải quyết đc vấn đề thì nên dành thời gian cụ ạ!
 
Upvote 0
Mã:
Private Sub worksheet_Change(ByVal Target As Range)
    If Not Intersect(Me.Range("C9:D1000, N9:N1000, K9:K1000, I6"), Target) Is Nothing Then
        Sheets("LOCDL").Range("B3:E1000").ClearContents
        Union(Me.Range("C9:D1000"), Me.Range("N9:O1000")).Copy
        Sheets("LOCDL").Range("B3").PasteSpecial xlPasteValues
        Application.CutCopyMode = False
    End If
End Sub
E thay:
Union(Me.Range("C9 : D1000"), Me.Range("N9:O1000")).Copy
Sheets("LOCDL").Range("B3").PasteSpecial xlPasteValues

Sửa lại thành:
Union(Me.Range("C9: D1000"), Me.Range("N9:O1000")).Copy Destination:=Sheets("LOCDL").Range("B3")
Thì code chạy mượt, ko giật nữa.
 
Upvote 0
Web KT

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

Back
Top Bottom