Il blog di Gianni Giaccaglini

Blog su VBA e VSTO
Gianni Giaccaglini

My Links

News

NB - V. anche gli ARTICOLI (in fondo a questa barra)
Solo quesiti validi a: giannigiac@tin.it
Il mio nuovo libro


La mia nipotina ELISA

Foto con dedica a ME di
Bill Gates giovanissimo
nei mitici anni 80!

Categorie Post

Categorie Articoli

Archivio

Immagini

Blog Stats

Un alibi (quasi?) perfetto con una macro Word [ + una chicca Excel su Fibonacci/Sezione aurea ]

Un alibi (quasi?) perfetto con una macro Word [ + una chicca Excel ]

Questa ipotesi audace trae ispirazione da un noto caso giudiziario attuale, ove i periti, informatici, hanno scagionato l’indagato avendo constatato che un documento al quale stava lavorando  risultava ripetutamente salvato nel periodo in cui il crimine fu perpetrato.

La mia opinione è che tale perizia costituisca un alibi inoppugnabile... E tuttavia, lavorando di fantasia, ipotizzo una possibilità alternativa, beninteso da parte di una mente diabolica-ma-non-troppo. Dicendo “ma-non-troppo” ho in mente l’ideatore di un delitto perfetto o quasi basato sulla macro VBA seguente, incorporata nel documento .doc in questione:

 

Sub Alibi()

  ' k = 1 'Usato per debug

  While True

    MsgBox "Passaggio numero " & k 'Usato per debug

    ' k = k + 1 'Usato per debug

    With Selection.Find

      .Text = "Rossini"

      .Replacement.Text = "####"

      .Execute Replace:=wdReplaceAll

    End With

    ' Pausa... (soluzione rudimentale)

    ' For i = 1 To 200000000

    ' Next

    Attesa t:=Rnd * 50 ' In fase debug: 10 o 5

    With Selection.Find

      .Text = "####"

      .Replacement.Text = "Rossini"

      .Execute Replace:=wdReplaceAll

    End With

    ThisDocument.Save

  Wend

End Sub

 

Sub Attesa(t As Double)

  Dim QuestiSec As Double

  QuestiSec = Timer

  While Timer < QuestiSec + t

  Wend

End Sub

 

Tale macro per ipotesi lavora in un documento che inizia come segue:

Tesi con alibi

By Gioacchino Rossini

ecc. ecc.

Inizialmente ho previsto 4 passaggi (con indice k), ciascuno composto di due fasi che prevedono la sostituzione di “Rossini” con 4 cancelletti e, rispettivamente, il ripristino di “Rossini”, quindi il salvataggio del file (di fatto immutato, ma – si badi bene – non credo che ciò non lasci traccia). Ogni ciclo di indice k termina con una pausa rozzamente emulata con un i che varia da 1 a 200000000.

Successivamente ho sostituito il (rozzo) ciclo di indice k con un loop senza fine While True... Wend inserendo un ritardo di durata casuale che sfrutta la routine Attesa a sua volta basata sul codice Timer. In tal modo si evita che i periti si insospettiscano constatando salvataggi a periodi fissi.

La macro non merita altri commenti se non quelli inseriti, comunque funziona. L’ipotetico criminale per sfruttarla dovrebbe:

1.       Lanciarla prima di uscire;

2.       Compiere la nefandezza (non cruenta, si spera!);

3.       Tornare a casa;

4.       Bloccare la macro con Ctrl+Break;

5.       Eliminarla (!!!);

6.       Proseguire con modifiche e salvataggi manuali per un tempo adeguato.

Un amico cui ho sottoposto la cosa mi ha obiettato che forse cancellando la macro, ne resterebbe traccia, chiedendomi se c'e un modo per far girare la macro su chiavetta USB.

Ecco cosa gli ho risposto:

Sulla seconda ipotesi non ho al momento elementi (ci penserò); comunque, ripeto, la macro fa parte del documento ma si trova nell'Editor Visual Basic, inoltre non penso che le tracce sul disco contengano le versioni integrali precedenti ma solo, appunto, tracce sintetiche del documento (che ovviamente è salvato come .doc in conformità all'ultimo salvataggio effettuato). Se ora, al ritorno dal delitto il delinquente non solo elimina la macro nell'Editor VBA ma compie ripetuti salvataggi a mano del documento, è perlomeno difficile che periti non dotati di qualità extrasensoriali possano recuperare il codice criminale...

Se qualcuno s’intende di tracce si faccia vivo.

La chicca per Excel (un modellino didattico)

Tutti o quasi conoscono la serie dei conigli immortali dell’estroso matematico pisano Fibonacci, perciò mi limito a ricordare che partendo con una coppia di ... conigli, pardon!, numeri 1 e 1 ogni successivo numero si ricava sommando i due precedenti. Ottenerla con formule su un foglio elettronico è un gioco da ragazzi.

Forse però non tutti sanno che dividendo ciascun membro della serie per il successivo si ottiene un’approssimazione sempre più precisa della sezione aura, un numero “magico” che a sua volta ricorre in molti campi (v. Wikipedia) espresso dalla formula che do senz’altro in stile excelliano:

=(RADQ(5)-1)/2

In soldoni, limitandosi alle cifre significative che Excel fornisce, trattasi di
0,618033988749895

Nel modellino didattico che propongo si scelgano due celle a piacere ma diciamo in cima alle colonne D ed E denominandole SezioneAura e, rispettivamente, Epsilon. Va da sé che la prima conterrà la formula o il valore omonimi, mentre nella seconda ospiterà un numero molto piccolo, diciamo 0,00000000001 (stiamo sempre, per forza di cose, nei limiti imposti da Excel).

Ciò fatto, inseriamo nelle colonne A, B e C formulette opportune, ottenendo risultati del genere seguente:

 

A

B

C

1

1

2

1

3

2

0,5

FALSO

4

3

0,666666667

FALSO

5

5

0,6

FALSO

6

8

0,625

FALSO

7

13

0,615384615

FALSO

8

21

0,619047619

FALSO

9

34

0,617647059

FALSO

10

55

0,618181818

FALSO

11

89

0,617977528

FALSO

12

144

0,618055556

FALSO

13

233

0,618025751

FALSO

14

377

0,618037135

FALSO

15

610

0,618032787

FALSO

16

987

0,618034448

FALSO

17

1597

0,618033813

FALSO

18

2584

0,618034056

FALSO

19

4181

0,618033963

FALSO

20

6765

0,618033999

FALSO

21

10946

0,618033985

FALSO

22

17711

0,61803399

FALSO

23

28657

0,618033988

FALSO

24

46368

0,618033989

FALSO

 

Le formule nelle prime due colonne, ovviamente da introdurre a partire dalla riga 3 sono a questo punto scontate, comunque fornisco la prima coppia, che va more solito ricopiata verso il basso:

A3: =A1+A2

B3: =A2/A3

E la formula che parte in C3? I più accorti se ne saranno... accorti da soli. Ad ogni buon conto mi voglio rovinare, offrendo le prime tre:

C3: =ASS(B3-SezioneAura) <=Epsilon

C4: =ASS(B4-SezioneAura) <=Epsilon

C5: =ASS(B5-SezioneAura) <=Epsilon

Palesemente, danno una sfilza di valori logici FALSO nelle prime 27 celle, ma a partire dalla 28.ma comincia a spuntare il sospirato VERO:

 

A

B

C

24

46368

0,618033989

FALSO

25

75025

0,618033989

FALSO

26

121393

0,618033989

FALSO

27

196418

0,618033989

FALSO

28

317811

0,618033989

VERO

29

514229

0,618033989

VERO

30

832040

0,618033989

VERO

 

Formattazione condizionale

Sicuramente tutti avranno notato gli sfondi colorati che evidenziano viepiù l’agognato raggiungimento dell’approssimazione della dorata sezione. Sono stati ottenuti sfruttando la formattazione indicata nel titolo. Lascio per esercizio l’impostazione de formato condizionato di colonna C, mentre descrivo i passi per ottenere quella in colonna B.

1.       Selezionare l’intero intervallo, diciamo C3:C40 (ex abundantia);

2.       Attivare il comando Formattazione condizionali;

3.       Opzione Nuova regola poi Utilizza una formula;

4.       Nella susseguente casella ad hoc inserire la seguente formula:
=ASS($B3-$D$2)<=$E$2

5.       Meditare, gente...

 ?>

?>

posted on lunedì 12 ottobre 2009 15.10