7

Tôi đang tìm một số lời khuyên về phương pháp/cấu trúc dữ liệu/cách tiếp cận thuật toán cho một vấn đề mà tôi đang cố giải quyết.Lời khuyên về phương pháp/cấu trúc dữ liệu/thuật toán sử dụng

Tôi đang viết ứng dụng bảng tính tùy chỉnh trong VBA. Bảng tính là một lịch trình lao động & tài liệu tạo báo giá. Người dùng nhập thông tin lập kế hoạch lao động cơ bản, sau đó được sử dụng để tạo nhiều trang tính/tài liệu khác nhau với dữ liệu nguồn được trình bày trong nhiều bố cục/định dạng khác nhau.

Thành thật mà nói Excel là ứng dụng sai cho điều này nhưng đó là những gì người dùng muốn và cảm thấy thoải mái và tôi biết VBA khá tốt nên đó là những gì tôi bị mắc kẹt.

Dữ liệu chính mà người dùng nhập ở định dạng dưới đây, về cơ bản là mục nhập cho mỗi cuộc gọi công việc hàng ngày cho mỗi vai trò.

╔═════╦════════╦════════════════╦════════════════╦═══════════════════╗ 
║ QTY ║ ROLE ║  START  ║  END  ║ DESCRIPTION  ║ 
╠═════╬════════╬════════════════╬════════════════╬═══════════════════╣ 
║ 1 ║ Rigger ║ 6/15/17 08:00a ║ 6/15/17 04:00p ║ Travel to Prep ║ 
╠═════╬════════╬════════════════╬════════════════╬═══════════════════╣ 
║ 1 ║ Rigger ║ 6/16/17 08:00a ║ 6/16/17 06:00p ║ Prep    ║ 
╠═════╬════════╬════════════════╬════════════════╬═══════════════════╣ 
║ 1 ║ Rigger ║ 6/17/17 08:00a ║ 6/17/17 07:00p ║ Prep    ║ 
╠═════╬════════╬════════════════╬════════════════╬═══════════════════╣ 
║ 3 ║ Rigger ║ 6/18/17 06:00a ║ 6/18/17 05:00p ║ Travel to Install ║ 
╠═════╬════════╬════════════════╬════════════════╬═══════════════════╣ 
║ 3 ║ Rigger ║ 6/19/17 08:00a ║ 6/20/17 01:00a ║ Install   ║ 
╠═════╬════════╬════════════════╬════════════════╬═══════════════════╣ 
║ 3 ║ Rigger ║ 6/20/17 10:00a ║ 6/20/17 08:00p ║ Install   ║ 
╠═════╬════════╬════════════════╬════════════════╬═══════════════════╣ 
║ 3 ║ Rigger ║ 6/21/17 07:00a ║ 6/21/17 04:00p ║ Travel Home  ║ 
╚═════╩════════╩════════════════╩════════════════╩═══════════════════╝ 

Thông thường dữ liệu là nhiều vai trò trong nhiều ngày và thường sẽ có nhiều phiên bản vai trò trong một số ngày (nhưng không nhất thiết phải là tất cả) ngày.

Một trong những thao tác dữ liệu mà mã thực hiện là lấy dữ liệu nguồn này và định dạng lại thành bảng tóm tắt để người dùng có thể gán tên vào ngày sau khi người được chỉ định. Nó cũng là cơ sở cho nhiều tờ cá nhân làm việc-cuộc gọi khác và số lượng tính toán của các chuyến bay/khách sạn đêm, vv

╔══════╦═══════════╦═════════╦═════════╦═══════════════════════════════════════╗ 
║ NAME ║ ROLE  ║ START ║ END  ║ DESCRIPTION       ║ 
╠══════╬═══════════╬═════════╬═════════╬═══════════════════════════════════════╣ 
║  ║ Rigger #1 ║ 6/15/17 ║ 6/21/17 ║ Trav | Prep | Trav | Install | Trav ║ 
╠══════╬═══════════╬═════════╬═════════╬═══════════════════════════════════════╣ 
║  ║ Rigger #2 ║ 6/18/17 ║ 6/21/17 ║ Trav | Install | Trav     ║ 
╠══════╬═══════════╬═════════╬═════════╬═══════════════════════════════════════╣ 
║  ║ Rigger #3 ║ 6/18/17 ║ 6/21/17 ║ Trav | Install | Trav     ║ 
╠══════╬═══════════╬═════════╬═════════╬═══════════════════════════════════════╣ 
║  ║ Sound  ║ 6/15/17 ║ 6/22/17 ║ Trav | Install | Trav     ║ 
╠══════╬═══════════╬═════════╬═════════╬═══════════════════════════════════════╣ 
║  ║ Crew #1 ║ 6/17/17 ║ 6/30/17 ║ Trav | Install | Show | Strike | Trav ║ 
╠══════╬═══════════╬═════════╬═════════╬═══════════════════════════════════════╣ 
║  ║ Crew #2 ║ 6/17/17 ║ 6/22/17 ║ Trav | Install | Trav     ║ 
╠══════╬═══════════╬═════════╬═════════╬═══════════════════════════════════════╣ 
║  ║ Crew #2 ║ 6/26/17 ║ 6/30/17 ║ Trav | Strike | Trav     ║ 
╚══════╩═══════════╩═════════╩═════════╩═══════════════════════════════════════╝ 

nào để chuyển đổi dữ liệu nguồn từ hàng n-qty thành hàng nx của qty 1 và thêm một ví dụ tính vào giá trị vai trò nếu có nhiều phiên bản. Điều này hiện đang đạt được bằng cách lặp mảng dữ liệu một vài lần và thao tác dữ liệu cho phù hợp - psuedocode bên dưới

Sau đó tôi tạo bảng tóm tắt từ mảng được mở rộng.

này hoạt động tốt đối với trường hợp đơn giản tuy nhiên khi có cấu hình phức tạp nó có thể tạo ra kết quả inconsistant khi phụ thêm số ví dụ liên quan đến các giá trị mô tả ví dụ ...

╔═════╦════════╦═════════════════╦════════════════╦═══════════════════╗ 
║ QTY ║ ROLE ║ START   ║ END   ║ DESCRIPTION  ║ 
╠═════╬════════╬═════════════════╬════════════════╬═══════════════════╣ 
║ 1 ║ Rigger ║ 6/15/17 08:00a ║ 6/15/17 04:00p ║ Travel to Prep ║ 
╠═════╬════════╬═════════════════╬════════════════╬═══════════════════╣ 
║ 1 ║ Rigger ║ 6/16/17 08:00a ║ 6/16/17 06:00p ║ Prep    ║ 
╠═════╬════════╬═════════════════╬════════════════╬═══════════════════╣ 
║ 1 ║ Rigger ║ 6/17/17 08:00a ║ 6/17/17 07:00p ║ Prep    ║ 
╠═════╬════════╬═════════════════╬════════════════╬═══════════════════╣ 
║ 3 ║ Rigger ║ 6/18/17 06:00a ║ 6/18/18 05:00p ║ Travel to Install ║ 
╠═════╬════════╬═════════════════╬════════════════╬═══════════════════╣ 
║ 3 ║ Rigger ║ 6/19/17 08:00a ║ 6/19/17 06:00p ║ Install   ║ 
╠═════╬════════╬═════════════════╬════════════════╬═══════════════════╣ 
║ 1 ║ Rigger ║ 6/20/17 07:00a ║ 6/20/17 04:00p ║ Travel Home  ║ 
╠═════╬════════╬═════════════════╬════════════════╬═══════════════════╣ 
║ 2 ║ Rigger ║ 6/20/17 08:00a ║ 6/20/17 06:00p ║ Install   ║ 
╠═════╬════════╬═════════════════╬════════════════╬═══════════════════╣ 
║ 2 ║ Rigger ║ 6/21/17 07:00a ║ 6/21/17 04:00p ║ Travel Home  ║ 
╚═════╩════════╩═════════════════╩════════════════╩═══════════════════╝ 

... sẽ ra ...

╔═══════════╦═════════╦═════════╦════════════════════════════════════════════╗ 
║ ROLE  ║ START ║ END  ║ DESCRIPTION        ║ 
╠═══════════╬═════════╬═════════╬════════════════════════════════════════════╣ 
║ Rigger #1 ║ 6/15/17 ║ 6/21/17 ║ Trav | Prep | Trav | Install | Trav | Trav ║ 
╠═══════════╬═════════╬═════════╬════════════════════════════════════════════╣ 
║ Rigger #2 ║ 6/18/17 ║ 6/21/17 ║ Trav | Install | Trav      ║ 
╠═══════════╬═════════╬═════════╬════════════════════════════════════════════╣ 
║ Rigger #3 ║ 6/18/17 ║ 6/20/17 ║ Trav | Install        ║ 
╚═══════════╩═════════╩═════════╩════════════════════════════════════════════╝ 

Toàn bộ hoạt động này xảy ra nhiều lần trong khi sử dụng tài liệu bình thường và nếu thay đổi thứ tự dữ liệu (có thể) nó cũng có thể tạo ra kết quả không phù hợp giữa các hoạt động.

Tôi không muốn sắp xếp mảng nguồn như là một phần của quá trình vì nó là quá trình tốn kém làm tăng độ trễ đáng kể khi bảng được chia thành 10 hàng, ngay cả khi sử dụng sắp xếp hợp nhất hoặc sắp xếp nhanh.

Tôi đang cố gắng giữ quy trình này càng được tối ưu hóa càng tốt; rất nhiều đầu ra khác sử dụng mảng mở rộng này, một số trong đó cung cấp phản hồi trực tiếp một cách hiệu quả do đó hoạt động chạy mỗi khi người dùng nhập dữ liệu.

Danh sách giới thiệu có thể là người dùng có thể chọn là xác định trước

╔═══════════════════════╗ 
║ Travel to Prep  ║ 
╠═══════════════════════╣ 
║ Travel & Prep   ║ 
╠═══════════════════════╣ 
║ Prep     ║ 
╠═══════════════════════╣ 
║ Prep & Travel   ║ 
╠═══════════════════════╣ 
║ Travel to Install  ║ 
╠═══════════════════════╣ 
║ Travel & Install  ║ 
╠═══════════════════════╣ 
║ Install    ║ 
╠═══════════════════════╣ 
║ Travel to Show  ║ 
╠═══════════════════════╣ 
║ Rehearsal    ║ 
╠═══════════════════════╣ 
║ Show     ║ 
╠═══════════════════════╣ 
║ Show & Dismantle  ║ 
╠═══════════════════════╣ 
║ Travel to Dismantle ║ 
╠═══════════════════════╣ 
║ Dismantle    ║ 
╠═══════════════════════╣ 
║ Travel Home   ║ 
╠═══════════════════════╣ 
║ Travel to Site Survey ║ 
╠═══════════════════════╣ 
║ Site Survey   ║ 
╠═══════════════════════╣ 
║ Dark Day    ║ 
╚═══════════════════════╝ 

tôi nghĩ đây là một cách hiệu quả một đồ thị có hướng, các cạnh đều có một hướng đi (nhất là một chiều) và một số các nút có thể tự vòng lặp.Tôi đã xây dựng một ma trận kề cho danh sách trên vì đây có vẻ là một cách hợp lý để xác định xem thứ tự gán có hợp lệ không.

Có cách nào hiệu quả để đảm bảo tất cả các đường dẫn cho một vai trò cụ thể là các đường dẫn truyền hợp lệ hay không và cách tốt nhất để gán lại các số cá thể vai trò nếu một hoặc nhiều đường dẫn không hợp lệ? Hoặc có thể sử dụng tập hợp con các giá trị mô tả ở mỗi cấp độ truyền tải đường dẫn trong khi hoạt động mở rộng để đảm bảo số lượng vai trò vai trò được chỉ định chính xác để bắt đầu không? Không.

Có một khu vực lý thuyết đồ thị cụ thể nào mà tôi nên xem không? Đồ thị có phải là cách tiếp cận đúng ở đây không? Có cách tiếp cận thay thế nào có hiệu quả/hiệu quả hơn không?

Mọi lời khuyên/trợ giúp sẽ được biết ơn.

Cảm ơn

+3

Tôi đã đọc mô tả 3 lần, nhưng bạn đang cố giải quyết vấn đề gì? Từ dữ liệu của bạn, dữ liệu dự kiến ​​của bạn sẽ ra sao? Nhiều lần nếu bạn có thể giải thích vấn đề của mình cho người lạ, bạn sẽ có giải pháp. Điều này đọc như bạn đang mắc kẹt trong một cách như thế nào và quên những gì. Bạn có thể đưa ra một số ví dụ về đầu vào, đầu ra tốt, đầu ra sai không? – starmole

Trả lời

0

Vâng, triển khai phần mềm tích hợp trong sản phẩm Office, chủ yếu là Excel, đôi khi là giấc mơ cho người dùng. Điều đó không có nghĩa là bạn nên viết mã vào một tệp bảng tính đặc biệt (.xlsm).

Bạn có các tùy chọn khác có thể cải thiện sự phân biệt và dễ dàng có thể được dịch sang các giải pháp khác. Một số khả năng:

1) ExcelAddIn trong VBA: https://msdn.microsoft.com/en-us/library/office/gg597509%28v=office.14%29.aspx

2) ExcelAddIn trong .NET: https://msdn.microsoft.com/en-us/library/cc668205.aspx

hoặc thậm chí,

3) XLL, nếu hiệu suất là một vấn đề (không dường như là trường hợp của bạn) https://msdn.microsoft.com/en-us/library/office/bb687829.aspx

Tôi hy vọng điều đó sẽ hữu ích!

1

Tập trung vào các trích dẫn sau đây:

Tôi không muốn phải sắp xếp các mảng nguồn như một phần của hoạt động như nó là một quá trình tốn kém mà thêm lag đáng chú ý lần bàn được vào 10s các hàng, ngay cả khi sử dụng sắp xếp hợp nhất hoặc sắp xếp nhanh.

Tôi nhận thấy rằng bạn đang đề cập đến nguồn của mình dưới dạng mảng. Vì vậy, người dùng nhập thông tin vào một phạm vi trang tính và từ đó bạn sử dụng VBA để tải dữ liệu vào một mảng? Nếu vậy, tôi tự hỏi nếu bạn nhận thức được Recordsets trong VBA. Từ hồi ức của tôi, chúng không chính xác đơn giản để đọc dữ liệu, nhưng một khi dữ liệu được đưa vào, thì bạn có thể chạy truy vấn SQL trên đó. Điều này không miễn dịch với các vấn đề về hiệu suất, nhưng tôi nghĩ bạn sẽ làm tốt hơn việc đạt được thành công sau 10 bản ghi. Và có thể bạn sẽ không phải lo lắng về phương pháp phân loại. Nếu bạn không quen thuộc với SQL, tôi muốn nói rằng nó chắc chắn có giá trị thời gian cho những điều bạn đang cố gắng làm.

Here's một anh chàng đã làm điều đó. Anh ta có một lý do khác để thực hiện nó, nhưng bạn sẽ có thể áp dụng nó trong trường hợp của bạn.

Nhân tiện, nếu người dùng của bạn cảm thấy thoải mái với Excel, thì khi làm việc, họ vẫn có thể cảm thấy thoải mái với MS Access. Không cài đặt phần mềm mới, bạn có thể thực hiện SQL mà không cần tải dữ liệu vào các đối tượng mới và bạn có thể làm việc với các biểu mẫu và phát triển các báo cáo dễ dàng hơn.

Các vấn đề liên quan