Sintassi        (21/07/03)

Sicuramente uno degli aspetti nella compilazione di codice, è come fare a scrivere, cioè quale sintassi usare, per far capire ad Excel determinati parametri. Un veloce esempio per illustrare cosa si intende, viene da una recente domanda postami: "come scrivere l'istruzione per far capire ad Excel che i riferimenti alle celle (cioè gli indirizzi cella) che delimitano una zona che si intende selezionare, sono rappresentati da valori scritti in due celle" . Simuliamo l'esempio: in A1 scriviamo C1, e in B1 scriviamo H1:

  A B C D E F
1 C1 H1        
2            

vorremo quindi selezionare la zona compresa tra C1 ed H1. La prassi di usare due celle per scriverci i riferimenti ad altre celle, deriva dal fatto che si vogliono rendere variabili le zone da selezionare di volta in volta, e in questo modo saremo noi ad indicare le aree da selezionare modificando i riferimenti nelle due celle fisse (A1 e B1 o quelle che preferite voi). Non possiamo scrivere espressioni strane, tipo

Range("A1.Value:B1.Value").Select

o similari, perchè il debugger ci dà una una mazzolata in testa, e ci rimanda con foglio di via, all'asilo. Per fortuna che ogni tanto la nostra cpu si rimette a funzionare, ed elabora: cosa ci vuole perchè Excel possa identificare una zona? I riferimenti alle celle ! Assegniamo quindi a due variabili questi riferimenti:

X = Range("A1").Value   (ed X sarà uguale a C1)

Y = Range("B1").Value   (ed X sarà uguale a H1)

Ora, per capire il perchè della sintassi che adopereremo, bisogna precisare che il riferimento A1 in Range("A1") (lo stesso per B1) viene visto come un riferimento letterale, cioè una "stringa"e quindi posto tra doppi apici; X e Y sono invece variabili (di tipo Variant), e NON vanno messe tra doppi apici (scusate, ma meglio non mi riesce spiegarmi), per cui una istruzione come Range(X : Y) dovrebbe andare bene, invece no perchè ci sono i due punti ( : ) che indicano l'intervallo, che non sono di tipo Variant, ma testo e quindi i due punti vano messi tra due doppi apici, concatenandoli con il segno di concatenazione: & tra i due valori Variant - vediamo quindi la giusta sintassi:

Range(X & ":" & Y).Select

Quello che poi faremo con la selezione, non è affare di questa pagina, ma la selezione C1:H1 ci sarà.

Vediamo ora il caso in cui si voglia indicare un intervallo i cui la sintassi per i riferimenti è mista: cioè uno dei riferimenti è in stile notazione A1, e l'altro e reperito tramite una variabile. Supponiamo quindi di voler identificare (e selezionare) tutte le righe che intercorrono tra la prima riga (la numero 1, ma potrà essere qualunque altra, ma definita a priori) e la riga corrispondente alla cella in quel momento attiva. Non sapendo prima quale sarà la cella attiva, useremo nelle istruzioni, una variabile che identifichi la riga della cella attiva, tipo:

X = ActiveCell.Row  (ed X sarà uguale al numero di riga della cella selezionata in quel momento)
Rows(X).Select         

L'istruzione è giusta e con Rows(X) rispettiamo quanto sopra detto e selezioniamo la riga intera. Se ora però cerchiamo di usare la sintassi appena vista per selezionare tutte le righe tra la riga numero 1 e la numero X, scrivendo così:

Rows("1:X").Select

otteniamo un bell'errore di run-time: "tipo non corrispondente"; infatti X è una variabile Variant e come tale non può essere inserita in una "stringa" (gli intervalli messi tra doppi apici), a meno che non si usi la sintassi prevista, cioè tra due doppi apici e due segni di concatenazione ( & ). Questa sarà allora la giusta istruzione (in rosso la correzione):

X = ActiveCell.Row
Rows("1:
" & X & "").Select

Attenzione! questo tipo di istruzioni (selezioni di intervalli) dovranno risiedere in macro appositamente costruite e non bisogna inserirle nell'evento WorkSheet.Selection_Change; il perchè è facile capirlo: l'attivazione delle istruzioni si basa appunto su un cambio di selezione, che è quello che le istruzioni in pratica fanno: cominciano a selezionare la prima riga (per proseguire fino alla riga X) ma lì si fermano in ossequio alle istruzioni che vengono ripetute, e trovando la prima riga come attiva, lì si fermano.

 

Altro esempio

Ora vediamo un esempio in cui si vogliano salvare o aprire file i cui nomi sono rappresentati da due o tre valori presenti in altrettante celle di un foglio di lavoro. Un tipico esempio potrebbe essere quello di un foglio archivio fatture, dal quale, tramite macro, vogliamo aprire per consultazione una fattura salvata in precedenza. Vediamo la situazione:

  N.Fatt Data Nominativo Imponibile ImportoIva TOTALE
1 1 07-08-03 Filippini Spa 1.000 200 1.200
2 2 31-08-03 Giocondi srl 1.500 300 1.800
3 3 31-08-03 Lippetti F. & C 2.000 400 2.400

e che si sia deciso, nel salvataggio del foglio emissione fattura, di usare, come nome da assegnare alla copia, il N.Fatt, la data, ed il nominativo cliente, per cui il file salvato si presenterebbe:

107-08-03Filippini Spa.xls

oppure avremmo potuto salvarlo con nominativo, data, n.fatt. non ha importanza la chiave che sceglieremo come ordinamento per il salvataggio, l'importante sarà seguire sempre lo stesso ordine, sia per salvare che per aprire poi una copia fattura. Una precisazione: visto che usiamo anche il campo "Data" come componente del nome da salvare, ricordo che Windows NON consente l'uso di barre ( / ) nei nomi di files, per questo usiamo il trattino ( - ) come separatore di data. Ora dovremo decidere quale campo scegliere da selezionare per attivare le istruzioni di apertura file, tenendo presente che dovremo "concatenare" gli altri due campi che formano il nome del file da aprire. Supponiamo di selezionare un campo "Nominativo": dovremo usare una variabile che "leghi" insieme i valori di tre celle:

  • il  Nominativo , che sarà Activecell in quanto lo selezioneremo

  • la Data, che sarà una cella a sinistra rispetto all'Activecell  (useremo Offset per reperire il valore)

  • il N.Fatt, che sarà due celle a sinistra rispetto all'Activecell  (useremo Offset per reperire il valore)

Quindi la sintassi da usare per comporre la variabile "nome" sarà:

  • nome = Activecell.Offset(0, -2) & Activecell.Offset(0, -1) & Activecell

Selezionando quindi "Filippini Spa", "nome" sarà uguale a: 107-08-03Filippini Spa

Ovviamente la sequenza della concatenazione e quindi degli Offset dipenderà dal campo che decideremo di usare come chiave iniziale di apertura, se scegliessimo di selezionare un numero di fattura, rendendo questo Activecell, "nome" sarebbe uguale a:

  • nome = Activecell & Activecell.Offset(0, 1) & Activecell.Offset(0, 2)

La routine per l'apertura della copia diventa (col primo caso):

  • Sub aprifile()
    Dim X As String
    nome = Activecell.Offset(0, -2) & Activecell.Offset(0, -1) & Activecell
    X = "C:\VostraCartella\" & nome & ".xls"
    Workbooks.Open Filename:=X, ReadOnly:=False
    End Sub

     

 

Aggiornerò questa pagina con altri "suggerimenti".

 

Buon lavoro.

prelevato sul sito http://ennius.interfree.it