🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: free.it.visual-basic
Article #3500

Re: Forse OT (spero di no)

#3500
From: Maurizio Borrelli
Date: Sun, 23 Jun 2002 16:18
145 lines
5408 bytes
> "Carletto" [...]:
> >     Dove sta, fisicamente, questa macro? In un modulo della stessa
> > cartella
> > di lavoro dalla quale vuoi avviarla ogni volta che viene aperta tale
> > cartella di lavoro e solo in quel caso?
> Guarda ti giuro che la prima parte � arabo per me...

    :)

> Ti dico cosa ho fatto:
> Ho fatto registra nuova macro, ho scritto quindi il valore "1" nella cella
> A1 di Excel.
> Ho fatto esegui macro scegliendo "Esegui Istruzione" aprendo cos� il
> codice
> in VB con un breackpoint.
> Ho terminato l'esecuzione ed ho modificato il codice iniziale:
> Sub MacroConta()
>     ActiveCell.FormulaR1C1 = "1"
>     Range("A1").Select
> End Sub

    Eccoci qua. Ferma tutto. Passa in Visual Basic e:

    Visualizza > Gestione progetti

    Poniamo che la tua cartella di lavoro si chiami "Cartel1.xls".
Probabilmente quello che leggerai nella finestra "Progetto" sara' simile a:

    - VBAProject (Cartel1.xls)
      Foglio1 (Foglio1)
      Modulo1
      ThisWorkbook

e la tua "MacroConta" sara' scritta all'interno di Modulo1. Che e' un
"modulo standard" di Visual Basic. Un modulo cioe' atto a contenere codice
visual basic potenzialmente visibile in tutto il progetto "VBAProject". Dico
potenzialmente in quanto se tu avessi scritto:

    Private Sub MacroConta()

allora quella routine sarebbe stata visibile (richiamabile) solo dalle
routine scritte all'interno di Modulo1. Dato che hai scritto (tu o il
registratore di macro, poco importa):

    Sub MacroConta()

e' come se avessi scritto:

    Public Sub MacroConta()

potrai cosi chiamare tale routine anche da un altro modulo. Per esempio, nel
nostro caso, dal modulo "ThisWorkbook" che e' un modulo con caratteristiche
speciali: e' un "modulo di classe" (puo' cioe' contenere proprieta', eventi
e metodi) e rappresenta l'oggetto Workbook (la cartella di lavoro, appunto).
Pertanto e' in grado di rispondere agli eventi della cartella di lavoro. Uno
di tali eventi e' l'evento "Open". Esso viene "scatenato" dall'oggetto
Workbook alla sua apertura, ovviamente, e puo' essere "intercettato" da te
mediante la "routine-evento":

    Private Sub Workbook_Open()

    Come fare per ottenerla? Apri il modulo ThisWorkbook. Dovresti vedere
nel bordo superiore del modulo due caselle combinate con scritto:

    (generale)

e

    (dichiarazioni)

    Nella casella "(generale)" l'unica voce presente e' "Workbook".
Selezionala e dovrebbe apparire la routine:

    Private Sub Workbook_Open()
    |
    End Sub

col cursore gia posizionato dove devi scrivere. Digita:

    MacroConta

in modo da ottenere:

    Private Sub Workbook_Open()
        MacroConta
    End Sub

quindi:

    Debug > Compila VBAProject
    File > Salva Cartel1.xls (o come si chiama...)
    File > Chiudi e torna a Microsoft Excel

chiudi la cartella di lavoro poi riaprila.

    Tutto ok?

> In questo modo:
> Sub MacroConta()
>     ActiveCell.FormulaR1C1 = ActiveCell.FormulaR1C1+ 1
>     Range("A1").Select
> End Sub
> In questo modo quando mando il play la macro mi incrementa di 1 il valore
> in A1 realizzando un contatore...

    Mica detto...

    Come hai scritto: ti incrementa di uno la *cella attiva*. Che potrebbe
anche essere, per disgrazia, un'altra. Per quello che vuoi fare tu sarebbe
meglio scrivere:

    Sub MacroConta()
        With ThisWorkbook.Worksheets("Foglio1").Range("A1")
            .Value = .Value + 1
            .Select
        End With
    End Sub

cosi' sei certo di cio' che fara' excel. E potresti anche salvare
immediatamente dopo l'apertura:

    Sub MacroConta()
        With ThisWorkbook
            With .Worksheets("Foglio1").Range("A1")
                .Value = .Value + 1
                .Select
            End With
            .Save
        End With
    End Sub

> E questo il mio scopo e questo contatore conta quante volte viene aperto
> un
> file di excel (ovviamente dovr� mettere una funzione che mi salvi il
> foglio
> alla chiusura per� andiamoci piano...) e avevo bisogno di eseguire quel
> codice all'apertura... Come faccio?

--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------
Technical Details
Message-ID: <af4rul$gmn$1@newsreader.mailgate.org>
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-04!supernews.com!isdnet!newsfeed.icl.net!news.mailgate.org!newsreader.mailgate.org!not-for-mail
References: <ZVkR8.61276$TS.1713460@news1.tin.it> <af4msq$e0d$1@newsreader.mailgate.org> <af4otp$f3l$1@newsreader.mailgate.org>

Show Full Headers
Complete Article Headers
X-Google-Language: ITALIAN,ASCII
X-Google-Thread: f94ee,f57be98ac19244ae
X-Google-Attributes: gidf94ee,public
X-Google-ArrivalTime: 2002-06-23 09:11:06 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-04!supernews.com!isdnet!newsfeed.icl.net!news.mailgate.org!newsreader.mailgate.org!not-for-mail
From: "Maurizio Borrelli" <maurizio.borrelli@freepass.it>
Newsgroups: free.it.visual-basic
Subject: Re: Forse OT (spero di no)
Date: Sun, 23 Jun 2002 18:18:29 +0200
Organization: Mailgate.ORG Server - http://www.Mailgate.ORG
Lines: 147
Sender: maurizio.borrelli@freepass.it
Message-ID: <af4rul$gmn$1@newsreader.mailgate.org>
References: <ZVkR8.61276$TS.1713460@news1.tin.it> <af4msq$e0d$1@newsreader.mailgate.org> <af4otp$f3l$1@newsreader.mailgate.org>
NNTP-Posting-Host: ip134-30.dialup.edisontel.com
X-Trace: newsreader.mailgate.org 1024848662 17111 62.94.130.135 (23 Jun 2002 16:11:02 GMT)
X-Complaints-To: abuse@mailgate.org
NNTP-Posting-Date: Sun, 23 Jun 2002 16:11:02 +0000 (UTC)
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2600.0000
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000