Hi Thầy,
Em muốn code lưu dữ liệu từ sheet DAILY_REPORT sang sheet DATA_WCREPORT nhưng không code được, thầy có thể hướng dẫn file demo giúp em,
Thanks thầy,
Bạn vui lòng đặt lại quyền truy cập cho link Drive nhé, hiện mình không truy cập vào file được do bị chặn quyền truy cập.
Thầy cho em xin địa chỉ gmail để em add share.
Khi chia sẻ link trong drive, bạn chọn mục "nhận đường liên kết" => trong phần này bạn đặt quyền truy cập cho "bất kỳ ai có đường liên kết này".
(các tài liệu bạn có thể đặt dưới dạng file mẫu, thông tin mang tính chất minh họa, không cần thông tin gốc và chia sẻ dạng Public)
Thanks thầy, em đã sửa quyền truy cập.
Mình hướng dẫn như sau nhé:
1. Vùng cần lấy dữ liệu (nơi cho): Sheet Daily, vùng B6:G & Dòng cuối
- Tạo biến lr xác định dòng cuối có dữ liệu trong Sheet Daily
2. Nơi nhận dữ liệu (nơi nhận): Sheet Data
- Dòng bắt đầu: là dòng cuối + 1 (dùng 1 biến dòng cuối khác để xác định dòng cuối có dữ liệu trong Sheet Data)
- Dòng kết thúc: là dòng bắt đầu + khoảng cách lưu
- Khoảng cách lưu = Dòng cuối sheet Daily - Dòng đầu sheet Daily (là dòng 6)
- Cột nhận kết quả: tính từ cột C tới cột H
Nội dung này trong chương 7 mình có hướng dẫn khá đầy đủ, bạn có thể xem lại.
Bạn xem code mẫu bên dưới:
Sub Test_GetData()
'Bien ten Sheet
Dim sh_daily As Worksheet, sh_data As Worksheet
Set sh_daily = Sheets("Daily_Report")
Set sh_data = Sheets("Data_WCReport")
'Bien dong cuoi trong cac Sheet
Dim lr_daily As Long, lr_data As Long
lr_daily = sh_daily.Range("B" & Rows.Count).End(xlUp).Row
lr_data = sh_data.Range("C" & Rows.Count).End(xlUp).Row
Dim KhoangCach As Long
KhoangCach = lr_daily - 6
'Lay du lieu
sh_data.Range("C" & lr_data + 1 & ":H" & lr_data + 1 + KhoangCach).Value = sh_daily.Range("B6:G" & lr_daily).Value
End Sub
Cảm ơn thấy, em đã chạy được code, thầy cho em hỏi " trong hình ảnh bên dưới", em muốn dựa vào cột A, nếu cột A có dữ liệu nhập bị trùng thì phải xóa nó đi và thay vào đó bằng bản ghi mới nhất, thầy giúp em code này với. Em còn đoạn này nữa là hoàn thành file phục vụ cho công việc.
Thanks thầy.
Code trên có tính chất lưu hàng ngày, sau khi lưu thì dữ liệu được bổ sung thêm (chứ không đè lên dữ liệu cũ).
Ở đây bạn cần làm rõ 1 vấn đề: việc xét trùng lặp có cần thiết không?
Bởi về nguyên tắc lưu: dữ liệu đã có thì lưu theo dữ liệu mới, dữ liệu chưa có thì lưu thêm vào => Như thế nội dung trong bảng Data sẽ luôn là lần lưu gần nhất, và nó sẽ ghi đè lên dữ liệu cũ.
Vậy thì đoạn lệnh nơi nhận:
sh_data.Range("C" & lr_data + 1 & ":H" & lr_data + 1 + KhoangCach).Value =sẽ cần sửa lại thành 1 vùng cố định, thay vì 1 vùng nối thêm bên dưới.
Vùng này sẽ tính từ dòng 4 , và có độ lớn bằng khoảng cách:
sh_data.Range("C4:H" & lr_data + 1 + KhoangCach).Value =Em lại mắc vấn đề, khi xây dựng thêm dữ liệu bên dưới bảng nhập liệu thì nó bị đưa tự động sang sheet data, thấy có cách nào khắc phục nó không ạ.
Vì phần dữ liệu thêm vào bạn đặt ở phía dưới dòng cuối.
Bạn nên đặt phần này ở phía trên của bảng để không làm ảnh hưởng tới vị trí dòng cuối. Vì dòng cuối là 1 yếu tố quan trọng trong lập trình giúp xác định phạm vi dữ liệu một cách tự động.
Nếu bắt buộc phải đặt phần này ở dưới thì bạn không dùng biến dòng cuối nữa, mà phải xác định trực tiếp giá trị này (dưới dạng hằng số, không phải biến). Như thế phạm vi lưu sẽ là 1 vùng cố định (không phải vùng co dãn).
Bất kỳ thay đổi nào trong cấu trúc bảng dữ liệu sẽ làm thay đổi phương pháp lập trình (đôi khi phải code lại từ đầu rất vất vả chỉ vì thay đổi nhỏ), nên bạn phải thật cân nhắc về điều này nhé. Đây là vấn đề thường gặp khi chúng ta mới học về lập trình.
thanks thầy,
chúc bạn học tốt cùng Gitiho!