2010-07-15 5 views
32

Cosa sono le buone pratiche e l'igiene del codice? Inserire il codice in moduli o fogli?Inserisci il codice Excel-VBA nel modulo o nel foglio?

Ho questa cartella di lavoro di Excel, con le interfacce utente in ogni foglio. Ogni foglio all'interno della cartella di lavoro fa una parte diversa di alcune attività generali. Devo posizionare il codice relativo a ciascun foglio all'interno degli oggetti Foglio o nei Moduli? Raggruppa in un modulo o moduli separati?

Sto usando Excel 2003.

risposta

40

Sicuramente nei moduli.

  • I fogli possono essere cancellati, copiati e spostati con risultati sorprendenti.
  • Non è possibile chiamare il codice nel foglio "code-behind" da altri moduli senza qualificare completamente il riferimento. Ciò porterà all'accoppiamento del foglio e al codice in altri moduli/fogli.
  • I moduli possono essere esportati e importati in altri cartelle di lavoro e messe sotto il controllo di versione
  • Codice in divisa logicamente in moduli di accesso ai dati (, utilities, foglio di calcolo formattazione ecc) possono essere riutilizzati come unità, e sono più facili da gestire se i tuoi macro diventano grandi.

Dal momento che l'attrezzatura è così povero nei sistemi primitivi come Excel VBA, best practice, l'igiene codice ossessivo e seguenti religiosi di convenzioni sono importanti, soprattutto se si sta cercando di fare qualcosa di anche lontanamente complesso con esso.

This article spiega gli usi previsti di diversi tipi di contenitori di codice. Non si qualifica perché queste distinzioni dovrebbero essere fatte, ma credo che seguano la maggior parte degli sviluppatori che cercano di sviluppare applicazioni serie sulla piattaforma Excel.

C'è anche un elenco di VBA coding conventions che ho trovato utile, anche se non sono direttamente correlati a Excel VBA. Si prega di ignorare le convenzioni di denominazione impazzite che hanno su quel sito, è tutto ungherese pazzo.

+1

notazione ungherese im implementato nella convenzione di denominazione Reddick è stato più o meno lo standard per la denominazione delle variabili per Visual Basic, Applications Edition e VB6. Mentre eviterei sicuramente il suo uso in .NET, dove gli strumenti sono molto potenti, non fa male usarlo in VBA, dove gli strumenti sono vecchi. –

+0

@Ben - "Ungherese pazzo" è stato detto ironico :) Mentre l'ungherese aiuta con la mancanza della tipizzazione statica e gli strumenti attorno a "che cos'è di nuovo", penso che sia insufficiente quando si va di più verso gli oggetti- orientato VBA e inizia a creare i tuoi oggetti di dominio. La mia più grande lamentela, tuttavia, è che ungherese è davvero in disaccordo con il flusso del codice in realtà * reading *. Ognuno al loro, però, non un punto di vista religioso per me. Ma se qualcuno chiede, non lo consiglierò. – jevakallio

+0

Buon punto. Sono d'accordo che quando si costruiscono classi in VBA, l'ungherese può rendere brutti i tuoi oggetti. Forse lo uso ancora in VB6 per ricordare a me stesso che sto lavorando in VB6 :-). –

9

Nella mia esperienza è meglio inserire più codice possibile in moduli ben denominati e inserire solo il codice necessario negli oggetti del foglio di lavoro effettivo.

Esempio: qualsiasi codice che utilizza eventi del foglio di lavoro come Worksheet_SelectionChange o Worksheet_Calculate.

+0

Anche questa è la mia politica generale. – Lunatik

9

Suggerirei di separare il codice in base alla funzionalità e allo scopo specifico di ogni foglio o modulo. In questo modo, si inserisce il codice solo nell'interfaccia utente di un foglio all'interno del modulo del foglio e si inserisce solo il codice relativo ai moduli nei rispettivi moduli. Inoltre, utilizzare moduli separati per incapsulare il codice che è condiviso o riutilizzato tra più fogli diversi.

Ad esempio, supponiamo che più fogli siano responsabili della visualizzazione di dati da un database in un modo speciale. Che tipo di funzionalità abbiamo in questa situazione? Disponiamo di funzionalità correlate a ciascun foglio specifico, attività relative al recupero dei dati dal database e attività relative alla compilazione di un foglio con i dati. In questo caso, potrei iniziare con un modulo per l'accesso ai dati, un modulo per compilare un foglio con i dati e all'interno di ciascun foglio avrei il codice per accedere al codice in quei moduli.

Potrebbe essere disposto in questo modo.

Modulo: DataAccess:

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

Modulo: PopulateSheet:

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

Scheda: Foglio1 Codice:

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