-
Gọi trình VBA để điều chỉnh sự kiện từ Form
DooHoaangPhuuc > 10-08-19, 01:54 PM
Kính chào Các Bác, các Chú .
Cháu xin hỏi vấn đề liên quan đến trình VBA.
Thông thường khi cần mở trình VBA ta vào công cụ menu "Database Tools" ---> "Visual Basic" để mở trình soạn thảo VBA và tạo mới sự kiện hay điều chỉnh các sự kiện cho phù hợp.
Hoặc từ chế độ "Design View" chọn "Control" rồi vào "Property / Event" để mở trình soạn thoả VBA nhằm tạo mới hay sửa đổi sự kiện .
Nay cháu muốn hỏi ta có thể tạo nút lệnh để mở trực tiếp trình soạn thảo VBA nhằm điều chỉnh lại sự kiện cho phù hợp ?
Cụ thể : trong database ngoài Table1, query1 (nguồn từ Table1 này), còn có Form1 , Report1 (Report1 có nguồn từ Table1/query1)
Bây giờ cháu tạo trên Form1 này thêm Button1.
Chức năng Button1 khi được nhấn vào sẽ mở trực tiếp trình soạn thảo VBA đến sự kiện "On Print" của Report1 (đã tạo trước), để sửa lại sự kiện này cho phù hợp khi có sự thay đổi cơ sở dữ liệu .
Liệu trong Access có thể thực hiện được như vậy không ? Nhờ Các Bác , Các Chú giúp hướng dẫn cháu cách viết code cho nút lệnh này.
Cháu xin chân thành cảm ơn.
DooHoaangPhuuc -
RE: Gọi trình VBA để điều chỉnh sự kiện từ Form
Cuong Servenet > 13-08-19, 09:03 AM
(10-08-19, 01:54 PM)DooHoaangPhuuc Đã viết: Kính chào Các Bác, các Chú .
Cháu xin hỏi vấn đề liên quan đến trình VBA.
Thông thường khi cần mở trình VBA ta vào công cụ menu "Database Tools" ---> "Visual Basic" để mở trình soạn thảo VBA và tạo mới sự kiện hay điều chỉnh các sự kiện cho phù hợp.
Hoặc từ chế độ "Design View" chọn "Control" rồi vào "Property / Event" để mở trình soạn thoả VBA nhằm tạo mới hay sửa đổi sự kiện .
Nay cháu muốn hỏi ta có thể tạo nút lệnh để mở trực tiếp trình soạn thảo VBA nhằm điều chỉnh lại sự kiện cho phù hợp ?
Cụ thể : trong database ngoài Table1, query1 (nguồn từ Table1 này), còn có Form1 , Report1 (Report1 có nguồn từ Table1/query1)
Bây giờ cháu tạo trên Form1 này thêm Button1.
Chức năng Button1 khi được nhấn vào sẽ mở trực tiếp trình soạn thảo VBA đến sự kiện "On Print" của Report1 (đã tạo trước), để sửa lại sự kiện này cho phù hợp khi có sự thay đổi cơ sở dữ liệu .
Liệu trong Access có thể thực hiện được như vậy không ? Nhờ Các Bác , Các Chú giúp hướng dẫn cháu cách viết code cho nút lệnh này.
Cháu xin chân thành cảm ơn.
DooHoaangPhuuc
thì bạn viết cái lệnh openReport cho cái button đó là dc mà -
RE: Gọi trình VBA để điều chỉnh sự kiện từ Form
ongke0711 > 13-08-19, 10:05 AM
Tôi lại nghĩ ý tưởng này không thực sự thiết thực trong việc thiết kế ứng dụng nên không có ai bỏ công sức viết code cho nó. Các IDE chuyên nghiệp cũng không viết cái tool này.
Viết code là trong giai đoạn thiết kế, thời gian bỏ ra cho code cho thuật toán tốn gấp trăm, ngàn lần cho thời gian bạn mở màn hình VBA (Atl + F11) thì bạn tốn code cho nó làm gì. Hơn nữa khi phân phối ứng dụng lại phải xoá từng cái button đó trong từng form, report, lại tốn thời gian.
Còn việc phải sửa code khi có thay đổi dữ liệu thì bạn phải xem lại:
- Cách thiết kế CSDL có lường trước những phát sinh có thể có.
- Viết code để tùy chọn thay đổi thiết kế giao diện report theo y/c.
- Nếu liên quan đến thay đổi hệ thống nhiều thì sửa và gửi lại bản cập nhât FE. Mà nếu thay đổi CSDL BE là thay đổi lớn, coi như viết lại toàn bộ rồi.
Còn nếu bạn vẫn muốn dùng code mở VBA Editor thì dùng code đơn giản sau:
Application.VBE.MainWindow.Visible = True
Đi thẳng đến Function hoặc Sub cần sửa thì dùng: Docmd.OpenModule
DoCmd.OpenModule "Form_Form1", "cmdOpenReport_Click" -
RE: Gọi trình VBA để điều chỉnh sự kiện từ Form
http2 > 13-08-19, 11:58 AM
cụ thể bạn muốn mở ra "On Print" để làm gì . muốn biết cái kết quả bạn muốn thực hiện. mọi người mới biết giúp bạn . chứ còn mở cửa sổ VBA thì như . Anh ông kẹ nói nhất (Alt + F11) là ra rồi . mình biết bạn muốn mở cái code trong sự kiện "On Print" để làm gì . thì mới biết cách giúp bạn . -
RE: Gọi trình VBA để điều chỉnh sự kiện từ Form
tranthanhan1962 > 13-08-19, 06:28 PM
Viết phần mềm xong, Khóa code là một điều ai cũng mong muốn hàng đầu. Tạo trực tiếp nút lệnh mở code cho ai sử dụng, cho tác giả phần mềm hay cho user có điều kiện quậy phá -
RE: Gọi trình VBA để điều chỉnh sự kiện từ Form
DooHoaangPhuuc > 15-08-19, 12:26 AM
Trước tiên cháu xin cảm ơn Các Bác & Các Chú đã góp ý giúp cháu để xây dựng và hoàn thiện cơ sở dữ liệu access mà cháu đang tiến hành thiết kế. Mặc dù có những khó khăn nhất định, cũng như thời gian hạn hẹp nên đôi lúc ban đầu phải đưa ra giải pháp tạm thời để giải quyết vấn đề theo yêu cầu.
Xuất phát từ chủ đề :
https://thuthuataccess.com/forum/thread-10995.html (Cố định số dòng report)
Do cơ sở dữ liệu luôn thay đổi, khi in ra số trang report phải được cố định, đồng thời các dữ liệu ảo đưa vào không liên quan sẽ in màu trắng trùng với giấy in. Từ đây phát sinh ra vấn đề phải điều chỉnh code VBA ở sự kiện "On Print" của report cần in. (đến hiện tại cháu cũng chưa thể tìm ra thêm được giải pháp nào hoàn hảo hơn, nên vẫn tạm thời dùng cách này), cũng như đôi lúc không có mặt tại chỗ để xử lý. Mặt khác người sử dụng khi in cũng không chuyên về phần mềm access, chỉ thực hiện được các xử lý đơn giản nếu được hướng dẫn .
Đây là lý do mà cháu xin nhờ Các Bác , các Chú hướng dẫn tạo nút lệnh chỉ mở trình VBA tại sự kiện "On Print" cho Report cụ thể, để người sử dụng có thể thao tác điều chỉnh cơ bản nhất khi gặp trường hợp trang in không như mong muốn.
Đối với nhấn phím ( Alt + F11 ) mở VBA, nhưng đôi khi không mở trực tiếp đến sự kiện "On Print" cho Report cần điều chỉnh, mà lại mở các trang sự kiện khác. Điều đấy , thật sự không như mong muốn của cháu, do họ có thể làm hỏng code cho các phần khác của chương trình.
Cháu sẽ thử cách do Chú Ongke711 hướng dẫn , cũng như nghiên cứu thêm, xem có thể giải quyết được phần nào cho vấn đề này.
Cháu xin cảm ơn tất cả Các Bác, Các Chú đã ghé qua xem và giúp đỡ cháu.
DooHoaangPhuuc -
RE: Gọi trình VBA để điều chỉnh sự kiện từ Form
ongke0711 > 15-08-19, 11:55 AM
Bài toán của bạn là cố định số trang in hay số dòng trong từng trang?
Tức là cái báo cáo ABC nào đó lúc nào in ra cũng đủ 5 trang (ví dụ)?, số dòng thì co giãn để chỉ vừa đủ 5 trang? -
RE: Gọi trình VBA để điều chỉnh sự kiện từ Form
DooHoaangPhuuc > 16-08-19, 12:05 AM
Cảm ơn Chú Ongke0711 .
Theo cơ sở dữ liệu, nhiều báo cáo report được in. Một số report được thiết kế layout cố định về số trang cho từng report.
Một vài báo cáo (dạng continuous) có dữ liệu thay đổi liên tục, như vậy tuỳ theo record nó chứa, báo cáo sẽ co giãn dẫn đến số trang in thay đổi. Ở đây , ngoài in đủ số trang (mỗi trang được đánh số thứ tự), mà còn tính đến việc co giãn các record sau cho chiều cao các record này không lệch nhiều lắm đẫn đến trình bày mất thẩm mỹ.
Cháu xin đưa ra ví dụ cụ thể :
Một report báo cáo khi in cần đủ 4 trang (2 tờ). báo cáo này chứa khoảng 18 records đến khoảng 27 records. Một số trong các record đấy (khoảng 16 records) sẽ không thay đổi trong khoảng thới gian dài. Theo thiết kế dàn trang cho report, thì 1 trang ngoài tiêu đề sẽ chứa 8 records (đây là cách dàn trang cố định không thay đổi chiều cao khi in ra cảm thấy hài hoà nhất).
Như vậy khi báo cáo report chứa 18 records thì in thành 3 trang. Để cố định số trang in là 4 trang (2 tờ / in 2 mặt), cháu phải tạo thêm một số records ảo vào cơ sở dữ liệu table nguồn report (số thứ tự từ 19 đến ít nhất 25 , các records này khi in sẽ có phông chữ trắng cùng giấy in, đây là yêu cầu in đủ records, in đủ số trang).
Việc in phông trắng cho các record ảo, như cháu đã trình bày , thì được viết lại code VBA tại sự kiện "On Print". Và khi in lại người sử dụng khác thực hiện phần này. Vì thế nảy sinh phải hướng dẫn họ điều chỉnh cơ bản VBA cho phần này.
Do thời gian hạn hẹp, cũng như vượt quá hiểu biết về Access của cháu. Cháu vẫn chưa nghĩ được cách thiết kế tối ưu cho cơ sở dữ liệu.
Lần nữa cháu xin cảm ơn.
DooHoaangPhuuc -
RE: Gọi trình VBA để điều chỉnh sự kiện từ Form
tranthanhan1962 > 16-08-19, 12:32 AM
Về nguyên tắc phần mềm phải để cho nhiều người sử dụng, và không phải ai sử dụng cũng am hiểu code như bạn, và một người không biết code có thể không sử dụng được với cái code của bạn hoặc thậm chí làm hỏng code của bạn (kể cả nhưng module khác chứ không phải chỉ có report này).
Trong cách trình bày của bạn tôi cũng am hiểu phần nào khó khăn này vì tôi đã từng bị như vậy.
Cách tối ưu nhất là bạn xử lý mốt tham số tổng số record. Và mỗi trường hợp tổng số record khác nhau bạn phải thiết kế một report riêng tùy theo tham số record thì sẽ view hay in report đó.
Ví dụ: số record ít nhất là 15 và nhiều nhất là 35 thì bạn phải thiết kế 20 report để xử lý.
Cách này tôi đã áp dụng cho nhiều trường hợp và là cách duy nhất không để ảnh hưởng đết bảo mật của phần mềm. Tất nhiên nếu khéo léo thì có thể sử dụng gom các report đồng dạng thành 1 để giảm số lượng report thiết kế.
Vì dụ số record 5 thì mở report kiểu 1, từ 6 --> 10 mở report kiểu 2, từ 11 -->15 mở report kiểu 3...
chúc bạn thành công. -
RE: Gọi trình VBA để điều chỉnh sự kiện từ Form
DooHoaangPhuuc > 16-08-19, 11:01 PM
Chào Bác TranThanhAn1962,
Cảm ơn Bác đã chỉ dẫn về xử lý việc này. Bác nhắc đến tham số tổng số record và làm số lượng report . Vừa đọc qua của Bác đề cập, thì cháu sực nhớ lại.
Đúng là có những điều rất đơn giản, đôi khi do hướng tập trung suy nghĩ quá nhiều nhằm giải quyết, mà làm con người ta phức tạp hoá thêm vấn đề. Dẫn tới gần như bế tắc lối giải quyết.
Cách giải quyết thật đơn giản nằm ở xử lý kỹ thuật tạo report "Dấu cột của report"
Trong Table nguồn cho report , cháu thêm trường ID có tổng số record là tối thiểu là 25 đến 32 (số thứ tự từ 1 đến 25, hoặc đến 32), tuỳ thuộc vào tổng số record thực sự cần in. Ở chế độ thiết kế Report, trường "ID" này có chiều rộng = 0 (width =0), và nếu chắc thêm chọn màu font chữ trắng luôn thể. Đây nhằm dấu cột trường "ID".
Như vậy dòng record sẽ cố định trong report và cố định trang in.
Cảm ơn Các Bác, Các Chú đã hướng dẫn cũng như chỉ bảo cháu xây dựng cơ sở dữ liệu được hoàn chỉnh nhất.
Cháu DooHoaangPhuuc