Hỏi về thuật toán

Liên hệ QC

Nguyen Rem

Tất cả chỉ là đưa ra quyết định đúng đắn
Tham gia
23/2/22
Bài viết
211
Được thích
30
Giới tính
Nữ
Em chào các anh chị :))))
Em đang có một chút vấn đề sau mong anh chị cho em hướng giải quyết . Em cảm ơn anh chị nhiều
Giả sử trong một sheet tên là "Hello" ta có một bảng dữ liệu có số cột là x
Nếu x chia hết cho 3 thì
Ta tạo x/3 sheet mới bên trong một workbook khác
Câu hỏi:
Viết câu lệnh thế nào để cứ mỗi 3 cột trong sheet tên "Hello" sẽ "đưa" được vào trong mỗi sheet vừa được tạo . Em mới học VBA nên mong các anh chị giải thích code của anh chị giúp em ^^
 
Lần chỉnh sửa cuối:
Upvote 0
anh có giáo án nào hay group nào học cái này như bạn ý không cho em theo với
Từ "hay" có tính cách chủ quan. Bắt buộc nó phải trong môi trường "trường phái" thì mới có ý nghĩa.
Ví dụ, tôi theo căn bản về lý thuyết lập trình cho nên đi sát với lý thuyết ấy mới hay. Nhưng dân GPE theo trường phái tốc độ cho nên cách viết code chạy nhanh mới là hay. Tôi theo trường phải chỉ chú ý vào cách vận hành nên code của tôi phân biệt từng công việc, mỗi công việc là một sub. Dân GPE chủ yếu về hiệu quả trước mắt cho nên hay viết code dồn nhiều công việc vào một sub.
 
Upvote 0
Tôi theo trường phải chỉ chú ý vào cách vận hành nên code của tôi phân biệt từng công việc, mỗi công việc là một sub.
Cháu là người học ngang, Không được đào tạo bài bản. Cũng toàn học đọc của các anh chị thầy cô trên này. Thành ra cứ chập choạng cái được cái không.
Nhiều lúc thấy chú nói có vẻ buâng quơ nhưng nó lại thấy có lý.
Đúng là lúc mới học thì mỗi công việc 1 sub.
Thế nào dần dần đúng như chú nói. Cứ dồn hết vào 1 sub
Và bản thân cháu đã bị và rất hay bị là chia nhỏ sub ra rồi. Tới lúc sửa chữa gì đó. Không biết cái nút nào là của cái sub nào. Có lẽ vì thế nên mới dồn hết vào 1 sub í ạ
 
Upvote 0
Và bản thân cháu đã bị và rất hay bị là chia nhỏ sub ra rồi. Tới lúc sửa chữa gì đó. Không biết cái nút nào là của cái sub nào (1). Có lẽ vì thế nên mới dồn hết vào 1 sub í ạ (2)
(1). Tại không đặt tên cho sub và tên cho nút đúng cách. Nên đặt tên cho khớp với công việc muốn làm. (nói chung là đặt tên tất cả control: combobox, scrollbar, listbox, ...) Các subcon thì đặt tên theo công việc đã chia nhỏ
(2). Có vẻ ngụy biện
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi nghĩ bạn đã có chừng này rồi mà. VBA cơ bản là vậy thôi.
...
Danh sách đó chỉ là cái sơ đồ, và vài ví dụ.
Muốn tiến vào bậc trung thì phải dựa vào cái sơ đồ ấy mà tìm hiểu thêm.
Muốn lên bậc cao thì chỉ có thời gian và kinh nghiệm. Tuy nhiên, nếu có một vài đề tài mà cứ code qua lại mãi thì có khả năng bị quen lối tư duy.
Đó là dấu hiệu nguy hiểm nếu bạn muốn lập trình. Nếu chỉ muốn vọc VBA thì không sao. Vọc thì gì chẳng được.
(nếu muốn học lập trình thì xem phần chú thích bên dưới - không muốn thì bỏ qua)

...Nhiều lúc thấy chú nói có vẻ buâng quơ nhưng nó lại thấy có lý. ...
Và vì lẽ trên, thỉnh thoảng tôi nói tầm xàm với ẩn ý nhắc tìm hiểu thêm.

Chú thích:
Cái list kia không nói đến một kỹ thuật lập trình: quản lý code.
Phương diện này có rất ít tư liệu, và rất ít sách dạy chỉ dẫn cặn kẽ. Dễ hiểu thôi, cái này không thuộc về ngôn ngữ cần dạy. Bạn chỉ học nó trong chương trình IT đào tạo lập trình viên.
 
Upvote 0
Danh sách đó chỉ là cái sơ đồ, và vài ví dụ.
Muốn tiến vào bậc trung thì phải dựa vào cái sơ đồ ấy mà tìm hiểu thêm.
Muốn lên bậc cao thì chỉ có thời gian và kinh nghiệm. Tuy nhiên, nếu có một vài đề tài mà cứ code qua lại mãi thì có khả năng bị quen lối tư duy.
Đó là dấu hiệu nguy hiểm nếu bạn muốn lập trình. Nếu chỉ muốn vọc VBA thì không sao. Vọc thì gì chẳng được.
(nếu muốn học lập trình thì xem phần chú thích bên dưới - không muốn thì bỏ qua)


Và vì lẽ trên, thỉnh thoảng tôi nói tầm xàm với ẩn ý nhắc tìm hiểu thêm.

Chú thích:
Cái list kia không nói đến một kỹ thuật lập trình: quản lý code.
Phương diện này có rất ít tư liệu, và rất ít sách dạy chỉ dẫn cặn kẽ. Dễ hiểu thôi, cái này không thuộc về ngôn ngữ cần dạy. Bạn chỉ học nó trong chương trình IT đào tạo lập trình viên.
1. "Danh sách đó chỉ là cái sơ đồ, và vài ví dụ"
Bác nói đúng. Đó chỉ là cái cơ bản tối cần thiết cần nắm vững trước khi đi xa hơn. Nhưng theo dòng sự kiện của bài #21 cộng thêm những gì tác giả bài ấy thể hiện, thì tôi nghĩ bạn ấy đã vượt quá VBA cơ bản rồi. Còn bạn ấy đứng ở nấc thang nào của bậc trung thì chưa biết được. Riêng tôi thì cũng chỉ ở mức bậc trung đó thôi, có muốn cũng không phát triển hơn được. Do vậy tôi không sợ lối mòn tư duy dù rất chú ý đến cảnh báo "quen lối tư duy" của bác.
2. "thỉnh thoảng tôi nói tầm xàm với ẩn ý nhắc tìm hiểu thêm..."
Tôi hiểu bác không nói bâng quơ về học thuật (tất nhiên trừ những chỗ cần bâng quơ). Nhưng tôi muốn hỏi bác ở chỗ quản lý code. Bác có thể nói sơ lược để tôi hiểu được không?
 
Upvote 0
Nhưng tôi muốn hỏi bác ở chỗ quản lý code. Bác có thể nói sơ lược để tôi hiểu được không?
Chen ngang 1 phát. Quản lý code là:
- Quản lý bằng tên: Đặt tên thủ tục & hàm tương ứng với nhiệm vụ của code
- Quản lý bằng module: Bỏ những code tương đồng hoặc chung 1 nhiệm vụ vào 1 module. Đương nhiên là phải đặt tên module tương ứng với cái nó chứa bên trong.
- Quản lý chi tiết bên trong code: Tên biến, tên control tương ứng với nội dung chứa trong biến và nhiệm vụ của controls (nút nhấn, combobox, scrollbar)
- Chia nhỏ code. (Lão trên núi thích nói về việc này). Nguyên tắc chia nhỏ. Sau khi chia nhỏ phân loại thủ tục con, hàm con, bỏ vào các module tương ứng. Thủ tục, hàm dùng nhiều lần ở nhiều thủ tục cha khác nhau nên bỏ chung 1 chỗ, và chỗ chứa đó cũng phải có tên để dễ tìm.
- Sự kiện của sheet bỏ trong sheet đúng rồi, nhưng hạn chế dùng từ khóa đại khái "ActiveSheet".
- Quản lý biến dùng chung, biến toàn cục, biến công cộng.

(Chắc lão trên núi sẽ ghét mình đây, và sẽ sửa lưng 1 đống thứ)
 
Upvote 0
.... Nhưng tôi muốn hỏi bác ở chỗ quản lý code. Bác có thể nói sơ lược để tôi hiểu được không?
Khi có một Project lớn. Ví dụ vài code modules. Thì bạn cần quản lý. Sub nào trong module nào. Biến toàn cục ở module nào thì nó là Private thay vì Global. Khi nào cần che một sub/function bằng Private.
Đó là chưa kể, tôi nhặt được code nào hay hay thì chép nó vào thư viện (files *.bas). Lúc mới chép vào thì phân loại chúng theo nhóm, ghi chú ró ràng từng nhóm (dùng comments, tức dấu '). Sau một thời gian, thư viện phình ra thì bắt đầu tách chúng ra từng file *.bas. Project nào cần loại nào thì tìm file ấy mà import vào. Các việc này, người khác thì vòi thêm code import, nhưng tôi thích làm thủ công. Đối với tôi, tình trạng kết quả đầu ra mới quan trọng; việc tự động cho nhanh (bấm một phát import code), hay mầu mè kẻ khung tôi ít màng tới.
 
Upvote 0
Khi có một Project lớn. Ví dụ vài code modules. Thì bạn cần quản lý. Sub nào trong module nào. Biến toàn cục ở module nào thì nó là Private thay vì Global. Khi nào cần che một sub/function bằng Private.
Đó là chưa kể, tôi nhặt được code nào hay hay thì chép nó vào thư viện (files *.bas). Lúc mới chép vào thì phân loại chúng theo nhóm, ghi chú ró ràng từng nhóm (dùng comments, tức dấu '). Sau một thời gian, thư viện phình ra thì bắt đầu tách chúng ra từng file *.bas. Project nào cần loại nào thì tìm file ấy mà import vào. Các việc này, người khác thì vòi thêm code import, nhưng tôi thích làm thủ công. Đối với tôi, tình trạng kết quả đầu ra mới quan trọng; việc tự động cho nhanh (bấm một phát import code), hay mầu mè kẻ khung tôi ít màng tới.
Tôi cũng đoán câu chuyện sẽ là như vậy nhưng hỏi để cho chắc mình không hiểu sai về việc quản lý code theo ý của bác.
Về việc này, tôi thấy mỗi người sẽ có mỗi kiểu "quản lý" code theo tầm của mình. Hồi xưa tôi toàn dồn cục code vào 1 chỗ, nhưng giờ khá 1 tí rồi thì phân loại và tách chúng ra theo cách nghĩ của mình. Rồi mai kia lại sẽ có cách tách và liên kết giữa chúng tốt hơn. Chắc cũng tự học cách phân loại và kết nối tối ưu thôi.
 
Upvote 0
.... Rồi mai kia lại sẽ có cách tách và liên kết giữa chúng tốt hơn. Chắc cũng tự học cách phân loại và kết nối tối ưu thôi.
Nếu bạn muốn làm việc này thì cần học kỹ về kỹ thuật "quản lý phiên bản" (version control).
Điển hình, bạn xem một project khá cũ thì cần biết các thư viện nó import ngày xưa thuộc phiên bản nào.
Quản lý phiên bản là một phần của quản lý code (code management, modulisation).
 
Upvote 0
Nếu bạn muốn làm việc này thì cần học kỹ về kỹ thuật "quản lý phiên bản" (version control).
Tôi quản lý phiên bản những bước thực hiện của chính mình. Tôi chia nhỏ dự án lớn thành những phần nhỏ hơn, mỗi phần nhỏ nếu còn lớn thì chia nhỏ hơn nữa. Khi code xong 1 phần, test xong xuôi đâu đấy lưu lại, sao thành phiên bản mới hơn để thực hiện phần tiếp theo.
Lý do là dù chia nhỏ nhưng các phần đó có mối quan hệ mật thiết với nhau: kế tiếp nhau, kế thừa nhau, sử dụng lẫn nhau, bổ sung cho nhau, hoặc cũng có khi độc lập. Code phần sau mà có hư, hoặc lỗi không xác định phải bỏ làm lại, còn có chỗ quay về, không mất trắng.
 
Upvote 0
Tôi quản lý phiên bản những bước thực hiện của chính mình. Tôi chia nhỏ dự án lớn thành những phần nhỏ hơn, mỗi phần nhỏ nếu còn lớn thì chia nhỏ hơn nữa. Khi code xong 1 phần, test xong xuôi đâu đấy lưu lại, sao thành phiên bản mới hơn để thực hiện phần tiếp theo.
Lý do là dù chia nhỏ nhưng các phần đó có mối quan hệ mật thiết với nhau: kế tiếp nhau, kế thừa nhau, sử dụng lẫn nhau, bổ sung cho nhau, hoặc cũng có khi độc lập. Code phần sau mà có hư, hoặc lỗi không xác định phải bỏ làm lại, còn có chỗ quay về, không mất trắng.
Tôi cũng có quản lý phiên bản nhưng không chia nhỏ quá như bác nói. Chia theo kiểu 3.1.0.10 thì nghe oải quá. Còn chỗ để quay về thì tôi có Google Drive quản lý giúp 10 phiên bản gần nhất trong vòng 30 ngày.
 
Upvote 0
Tôi cũng có quản lý phiên bản nhưng không chia nhỏ quá như bác nói. Chia theo kiểu 3.1.0.10 thì nghe oải quá. Còn chỗ để quay về thì tôi có Google Drive quản lý giúp 10 phiên bản gần nhất trong vòng 30 ngày.
Tôi chỉ cần đánh số để biết lối quay về. Có dự án của tôi kéo dài 2, 3 tháng cơ, dù lưu trên Onedrive tôi cũng phải lưu nhiều phiên bản. Tất nhiên những phiên bản theo thứ tự nhỏ nhất không cần nữa, tôi sẽ xóa khi hoàn thành. Tôi có 1 thí dụ như hình sau, mỗi bước có khi cách nhau vài ngày, có khi mươi ngày, có khi hơn nửa tháng tùy theo mức độ của phần đó. Nếu an toàn thì tôi giữ 1 phiên bản nào đó lâu hơn, nếu có cảm giác rủi ro, tôi lưu với tần suất dày hơn, thậm chí sáng 1 bản, chiều 1 bản.
Ngoài ra khi quay về vẫn muốn giữ bản lỗi để dùng 1 phần, hoặc để xem lỗi mà rút kinh nghiệm.

1652196514553.png
 
Upvote 0
Khiếp anh, em còn học thuộc lòng những thứ này roài, nhưng tại sao em chẳng tự viết được sub() nào hở anh?
Tôi đâu có thuộc lý thuyết đó đâu. Thậm chí tôi còn chưa biết nhiều thứ trong đó khi viết code. Công việc buộc và thôi thúc tôi phải viết. Nhờ đó mà sub() ra đời.
 
Upvote 0
Tôi đâu có thuộc lý thuyết đó đâu. Thậm chí tôi còn chưa biết nhiều thứ trong đó khi viết code. Công việc buộc và thôi thúc tôi phải viết. Nhờ đó mà sub() ra đời.
Cái gì mà mình cần. Thực sự cần. Thì thế nào cũng sẽ tìm cách được anh nhỉ. Không đi đường thẳng. Thì đi đường vòng
 
Upvote 0
Tôi đâu có thuộc lý thuyết đó đâu. Thậm chí tôi còn chưa biết nhiều thứ trong đó khi viết code. Công việc buộc và thôi thúc tôi phải viết. Nhờ đó mà sub() ra đời.
Nhưng mừ anh không thuộc lý thuyết thì làm sao mờ làm được.
Anh bốc phét;)
;););)
 
Upvote 0
1652204753594.png

Cái gì mà mình cần. Thực sự cần. Thì thế nào cũng sẽ tìm cách được anh nhỉ. Không đi đường thẳng. Thì đi đường vòng
Đi đường vòng cung được. Cái quan trọng là đi xong, thay vì tự mãn là mình có thể đi vòng thì chịu khó tìm hiểu tại sao mình đã không thể đi đường thẳng.
Cái "lý thuyết" nó là chỗ đó.
 
Upvote 0
Web KT

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

Back
Top Bottom