2010-07-15 50 views
32

Thực hành tốt và vệ sinh mã tốt là gì? Đặt mã trong Mô-đun hoặc Trang tính?Đặt mã Excel-VBA vào mô-đun hoặc trang tính?

Tôi có Sổ làm việc Excel này, với giao diện người dùng trong mỗi trang tính. Mỗi trang tính trong sổ làm việc thực hiện một phần khác nhau của một số nhiệm vụ tổng thể. Tôi có nên đặt mã có liên quan đến từng trang tính trong các đối tượng Trang tính hoặc trong Mô-đun không? Nhóm thành một mô-đun, hoặc các mô-đun riêng biệt?

Tôi đang sử dụng Excel 2003.

Trả lời

40

Chắc chắn trong Mô-đun.

  • Trang tính có thể bị xóa, sao chép và di chuyển với kết quả đáng ngạc nhiên.
  • Bạn không thể gọi mã trong trang "mã-đằng sau" từ các mô-đun khác mà không đủ điều kiện tham chiếu. Điều này sẽ dẫn đến sự ghép nối của trang tính và mã trong các mô-đun/trang tính khác.
  • Mô-đun có thể được xuất và nhập vào các sổ làm việc khác và đặt trong điều khiển phiên bản
  • Mã chia thành các mô-đun (truy cập dữ liệu, tiện ích, định dạng bảng tính, v.v.) có thể được sử dụng lại làm đơn vị và dễ quản lý hơn các macro của bạn trở nên lớn.

Vì công cụ quá kém trong các hệ thống nguyên thủy như Excel VBA, thực tiễn tốt nhất, vệ sinh mã theo dõi và tôn giáo theo quy ước là điều quan trọng, đặc biệt là nếu bạn đang cố gắng làm điều gì đó từ xa phức tạp với nó.

This article giải thích các tập quán dự định của các loại mã chứa khác nhau. Nó không đủ điều kiện lý do tại sao những khác biệt này nên được thực hiện, nhưng tôi tin rằng hầu hết các nhà phát triển đang cố gắng phát triển các ứng dụng nghiêm túc trên nền tảng Excel theo dõi chúng.

Ngoài ra còn có danh sách VBA coding conventions Tôi thấy hữu ích, mặc dù chúng không liên quan trực tiếp đến Excel VBA. Vui lòng bỏ qua các quy ước đặt tên điên mà họ có trên trang web đó, tất cả là điên hungarian.

+1

ký hiệu Hungarian như im plemented trong Công ước đặt tên Reddick đã nhiều hơn hoặc ít hơn là tiêu chuẩn cho đặt tên biến cho Visual Basic cho các ứng dụng và VB6. Trong khi tôi chắc chắn sẽ tránh sử dụng nó trong .NET, nơi công cụ rất mạnh, nó không làm tổn thương khi sử dụng nó trong VBA, nơi mà công cụ cũ hơn. –

+0

@Ben - "Crazy hungarian" được nói lưỡi-in-má :) Trong khi hungarian không giúp đỡ với việc thiếu gõ tĩnh và dụng cụ xung quanh "những gì này một lần nữa", tôi nghĩ rằng nó rơi ngắn khi bạn đi nhiều hơn đối tượng- định hướng VBA và bắt đầu tạo các đối tượng miền của riêng bạn. Khiếu nại lớn nhất của tôi, tuy nhiên, là thực sự gây rối với dòng chảy của mã * đọc * thực sự. Mỗi người trong số họ mặc dù, không phải là một điểm tôn giáo đối với tôi. Nhưng nếu ai đó hỏi, tôi sẽ không giới thiệu nó. – jevakallio

+0

Điểm tốt. Tôi đồng ý rằng khi xây dựng các lớp trong VBA, hungarian có thể làm cho các đối tượng của bạn trông xấu xí. Có lẽ tôi vẫn còn sử dụng nó trong VB6 để nhắc nhở bản thân mình rằng tôi đang làm việc trong VB6 :-). –

9

Theo kinh nghiệm của tôi, bạn nên đặt nhiều mã nhất có thể vào các mô-đun được đặt tên và chỉ đặt nhiều mã khi bạn cần vào các đối tượng bảng tính thực tế.

Ví dụ: Bất kỳ mã nào sử dụng các sự kiện trang tính như Worksheet_SelectionChange hoặc Worksheet_Calculate.

+0

Đó là chính sách chung của tôi. – Lunatik

9

Tôi khuyên bạn nên tách mã của bạn dựa trên chức năng và mục đích cụ thể cho từng trang tính hoặc mô-đun. Theo cách này, bạn sẽ chỉ đặt mã tương ứng với giao diện người dùng của trang tính trong mô-đun của trang tính và chỉ đặt mã liên quan đến các mô-đun trong các mô-đun tương ứng. Ngoài ra, sử dụng các mô-đun riêng biệt để đóng gói mã được chia sẻ hoặc tái sử dụng trong số các trang tính khác nhau.

Ví dụ: giả sử bạn có nhiều trang tính chịu trách nhiệm hiển thị dữ liệu từ cơ sở dữ liệu theo cách đặc biệt. Chúng ta có những loại chức năng nào trong tình huống này? Chúng tôi có chức năng liên quan đến từng trang tính cụ thể, các tác vụ liên quan đến việc nhận dữ liệu từ cơ sở dữ liệu và các tác vụ liên quan đến việc điền một trang tính có dữ liệu. Trong trường hợp này, tôi có thể bắt đầu với một mô-đun cho truy cập dữ liệu, một mô-đun để điền một trang tính với dữ liệu và trong mỗi trang tôi có mã để truy cập mã trong các mô-đun đó.

Nó có thể được đặt ra như thế này.

Module: DataAccess:

Function GetData(strTableName As String, strCondition1 As String) As Recordset 
    'Code Related to getting data from the database' 
End Function 

Module: PopulateSheet:

Sub PopulateASheet(wsSheet As Worksheet, rs As Recordset) 
    'Code to populate a worksheet ' 
End Function 

Sheet: Sheet1 Mã:

Sub GetDataAndPopulate() 
    'Sample Code' 
    Dim rs As New Recordset 
    Dim ws As Worksheet 
    Dim strParam As String 
    Set ws = ActiveSheet 
    strParam = ws.Range("A1").Value 

    Set rs = GetData("Orders",strParam) 

    PopulateASheet ws, rs 
End Sub 

Sub Button1_Click() 
    Call GetDataAndPopulate 
End Sub 
Các vấn đề liên quan