Hiển thị dữ liệu cũ đã nhập (ý tưởng) !

Liên hệ QC

tuanqnbd

Thành viên chính thức
Tham gia
20/5/07
Bài viết
75
Được thích
106
Chào các bạn,
Tôi mới làm xong một sheet nhập dữ liệu để tạo ra hai Văn bản theo yêu cầu. Bây giờ tôi muốn thêm 2 nút chọn (kiểu như previou next )để hiển thị lại các văn bản cũ dựa trên dữ liệu trong sheet Data đã nhập.

Xin hỏi các bạn có ý tưởng nào thực hiện hiệu quả, code cần viết sẽ ngắn không ?

Nếu mọi người có góp ý chỉnh sửa gì thì tôi rất sẵn lòng tiếp thu và cám ơn.

Các sheet protect chỉ cần chọn unprotect.
 
Lần chỉnh sửa cuối:
File của bác up lên bị lỗi! Xin bác up lại! Tức là bác muốn xem lại lần trước mình đã nhập những gì phải không! Giống như Undo và Redo vậy? Nếu vậy bác tạo nút lệnh liên kết với 1 Macro có dòng lệnh như sau:
PHP:
Sub Undo() Application.Undo End Sub
Còn nút kia thì xóa hết dữ liệu ở sheet này đi là xong! Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Chào các bạn,
Tôi mới làm xong một sheet nhập dữ liệu để tạo ra hai Văn bản theo yêu cầu. Bây giờ tôi muốn thêm 2 nút chọn (kiểu như previou next )để hiển thị lại các văn bản cũ dựa trên dữ liệu trong sheet Data đã nhập.

Xin hỏi các bạn có ý tưởng nào thực hiện hiệu quả, code cần viết sẽ ngắn không ?

Nếu mọi người có góp ý chỉnh sửa gì thì tôi rất sẵn lòng tiếp thu và cám ơn.

Các sheet protect chỉ cần chọn unprotect.

Chào bạn tuanqnbd,
Mình xin góp ý một chút nhé:
1. Sheet("Data") của bạn không chứa dữ liệu của một số Range trong sheet nhập dữ liệu (ví dụ: Range("SoHDTD"), Range("TriGiaHDTD"), Range("NGayKYHDTD"), v.v...); vậy làm sao lấy dữ liệu từ sheet("Data") để ghi ngược lại vào sheet("Nhap du lieu") ??

2. Nút tạo mới của bạn: thực hiện thao tác copy dòng cuối cùng trong sheet("Data") xuống dòng kế dưới, lúc đó số BCRR không thay đổi? Như vậy Key để xem xét dòng dữ liệu này khác với dòng dữ liệu kia là không có!

3. Đề nghị:
- Số BCRR là kiểu dữ liệu số và sẽ tự động nhảy kế tiếp khi ta tạo mới dữ liệu và phải đảm bảo là số BCRR bên sheet("Data") là duy nhất (gọi là Primary Key);
- Dữ liệu mới cần lưu vào sheet("Data") phải là dữ liệu từ bên sheet("Nhap du lieu");
- Tất cả các ô nhập liệu bên sheet("Nhap du lieu") phải được lưu vào sheet("Data").

Với đề nghị trên, nếu bạn đồng ý, có thể chúng ta sẽ phải thiết kế lại cấu trúc sheet("Data") của bạn và cũng có lẽ sẽ phải chỉnh hầu như toàn bộ code của bạn.

Riêng yêu cầu cho hai nút Previous và Next record để xem lại dữ liệu đã lưu bên sheet("Data"), thực sự không khó! Cách làm tuần tự như sau:
A. Previous Record:
1. Từ vị trí hiện tại của số BCRR bên sheet("Nhap du lieu"), tạo một biến MySoBCRR = Range("SoBCRR")-1
2. Tìm giá trị của MyBCRR bên cột A của sheet("Data"), dùng phương thức Find (xem sơ lượt về phương thức Find tại đây)
3. Nếu không tìm thấy thì cho ra thông báo "không có dữ liệu trước đó để xem!, nếu có thì tại vị trí dòng của ô tìm được, gán lần lượt giá trị các ô tại các cột từ trái qua phải trên cùng dòng dữ liệu đó tương ứng với từng Range nhập liệu tại sheet("Nhap du lieu") - Dùng Offset.

B. Next Record:
1. Từ vị trí hiện tại của số BCRR bên sheet("Nhap du lieu"), tạo một biến MySoBCRR = Range("SoBCRR")+1
2. Tìm giá trị của MyBCRR bên cột A của sheet("Data"), dùng phương thức Find (xem sơ lượt về phương thức Find tại đây)
3. Nếu không tìm thấy thì cho ra thông báo "không có dữ liệu kế tiếp để xem!, nếu có thì tại vị trí dòng của ô tìm được, gán lần lượt giá trị các ô tại các cột từ trái qua phải trên cùng dòng dữ liệu đó tương ứng với từng Range nhập liệu tại sheet("Nhap du lieu") - Dùng Offset.

Bạn có thể tham khảo file mình đính kèm (mình cũng đang viết dở dang chưa xong, nhưng phần Edit dữ liệu thì cũng tương đối hoàn chỉnh).
Từ sheet("Entry"), bạn click vào nút Edit, sau đó chọn chứng từ cần xem lại/chỉnh sửa. Đây là một trong những cách xem lại dữ liệu và chỉnh sửa trực quan. bạn có thể sort theo từng tiêu chí khác nhau cho từng record khác nhau!
Ban tham khảo code mình viết trong file đính kèm nhé!
Thân.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Chào bạn tuanqnbd,
Mình xin góp ý một chút nhé:
1. Sheet("Data") của bạn không chứa dữ liệu của một số Range trong sheet nhập dữ liệu (ví dụ: Range("SoHDTD"), Range("TriGiaHDTD"), Range("NGayKYHDTD"), v.v...); vậy làm sao lấy dữ liệu từ sheet("Data") để ghi ngược lại vào sheet("Nhap du lieu") ??

Những dữ liệu này mình quên, vì yêu cầu công việc chưa dùng tới nên lúc làm quên mất, đúng là phải thêm vào.

2. Nút tạo mới của bạn: thực hiện thao tác copy dòng cuối cùng trong sheet("Data") xuống dòng kế dưới, lúc đó số BCRR không thay đổi? Như vậy Key để xem xét dòng dữ liệu này khác với dòng dữ liệu kia là không có!

Mình chỉ paste special (value) dòng hiện tại, thao tác copy chỉ là copy công thức xuống hàng dưới, mục đích là đảm bảo dữ liệu mới được thêm vào range("Vùng dữ liệu")

3. Đề nghị:
- Số BCRR là kiểu dữ liệu số và sẽ tự động nhảy kế tiếp khi ta tạo mới dữ liệu và phải đảm bảo là số BCRR bên sheet("Data") là duy nhất (gọi là Primary Key);
Đây là góp ý rất giá trị. Mình đảm bảo mọi số BCRR nhập vào là duy nhất. Chỉ có trường hợp xảy ra khi kết hợp các góp ý (2) và (3) của bạn. Tức là nếu chọn thêm mới (nhưng không nhập dữ liệu mới vào) mà lại chọn xem dữ liệu cũ. Lúc này sẽ có 02 record giống nhau. Tuy nhiên cách này cũng xử lý được, ví dụ dùng một range khác là resize ("VungDuLieu") có bỏ đi hàng cuối cùng trong trường hợp này.

- Dữ liệu mới cần lưu vào sheet("Data") phải là dữ liệu từ bên sheet("Nhap du lieu");
- Tất cả các ô nhập liệu bên sheet("Nhap du lieu") phải được lưu vào sheet("Data").
Tất cả đều như bạn nói.
Bên sheet("Nhap du lieu") là nhập giá trị vào các biến được đặt tên.
Bên sheet("Data") là indrect(tên biến, là dòng heading đầu tiên).

A. Previous Record:
1. Từ vị trí hiện tại của số BCRR bên sheet("Nhap du lieu"), tạo một biến MySoBCRR = Range("SoBCRR")-1

Ý bạn là resize hay là value.

Cám ơn Pikachu đã góp ý và cho mình ý tưởng. Mình sẽ xem file của bạn. Nếu được, cho xin một vài "bản quyền" nghen.


Cám ơn nhiều
 
Lần chỉnh sửa cuối:
Upvote 0
Mình đã gửi file vào Mail cho bạn rồi đó! Bạn mở hộp thư ra xem nha! Còn phần bản quyền thì bạn cứ lấy thoải mái, Free tất! Cái nào có bản quyền sẽ có chữ Buy ở trong đó bạn yên tâm. Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
..............Chỉ có trường hợp xảy ra khi kết hợp các góp ý (2) và (3) của bạn. Tức là nếu chọn thêm mới (nhưng không nhập dữ liệu mới vào) mà lại chọn xem dữ liệu cũ. Lúc này sẽ có 02 record giống nhau. Tuy nhiên cách này cũng xử lý được, ví dụ dùng một range khác là resize ("VungDuLieu") có bỏ đi hàng cuối cùng trong trường hợp này.
Trong trường hợp Xem lại dữ liệu và có chỉnh sửa, ta có thể xử lý sự kiện này như sau:
-Chuyển Caption của nút Tạo mới thành Lưu. Tạo một biến dạng Boolean xét xem caption của nút lệnh là Tạo mới hay Lưu. Nếu caption là Tạo mới thì append record mới này vào sheet("data"). Nếu caption là Lưu thì chạy đoạn code lưu dữ liệu cũ như sau:
+ Delete record cũ;
+ Append record mới chỉnh sửa vào.

- Để xác định dòng cuối cùng có dữ liệu bên sheet("Data"), bạn có thể dùng đoạn code sau đây và không cần dùng Name (dùng nhiều Name sẽ chiếm nhiều bộ nhớ):
PHP:
MaxDataRow= Sheets("Data").[A65000].End(xlUp).Row

A. Previous Record:
1. Từ vị trí hiện tại của số BCRR bên sheet("Nhap du lieu"), tạo một biến MySoBCRR = Range("SoBCRR")-1

Ý bạn là resize hay là value.
Ý mình là value (giá trị).

Không biết có fải do máy mình hay không mà load file xuống mở ra không hiểu định dạng file. Chọn open with bằng Excel thì toàn ra chữ La mã.
File đính kèm là file nén với phần mở rộng zip (*.zip) bạn phải giải nén file này để xem. Nếu bạn chưa có chương trình giải nén file thì Click vào đây để tải về!

To Po_Pikachu:
Tức là bác muốn xem lại lần trước mình đã nhập những gì phải không! Giống như Undo và Redo vậy?
Nếu vậy bác tạo nút lệnh liên kết với 1 Macro có dòng lệnh như sau:
PHP:
Sub Undo()
Application.Undo
End Sub
Theo mình nghĩ thì không đơn giản vậy đâu! Thêm vào đó, nếu xử lý bằng VBA thì không thể undo được.
 
Upvote 0
File của bác up lên bị lỗi! Xin bác up lại!
Tức là bác muốn xem lại lần trước mình đã nhập những gì phải không! Giống như Undo và Redo vậy?
Nếu vậy bác tạo nút lệnh liên kết với 1 Macro có dòng lệnh như sau:
PHP:
Sub Undo()
Application.Undo
End Sub
Còn nút kia thì xóa hết dữ liệu ở sheet này đi là xong!
Thân.

Lệnh Undo này không có tác dụng khi ta chạy code VBA, đây là một khó khăn và thách thức cho võ lâm đồng đạo khi nghiên cứu về VBA.
 
Upvote 0
Web KT

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

Back
Top Bottom