Gioco del 15, in doppia salsa excelliana

Documenti analoghi
VBA Principali Comandi

VBA è un linguaggio di scripting derivato da Visual Basic, da cui prende il nome. Come ogni linguaggio ha le sue regole.

5 Array Cicli iterativi Contenuto di cella 28/02/2014 Copyright V. Moriggia 1

28/02/2014 Copyright V. Moriggia

VISUAL BASIC FOR APPLICATION

Automazione Excel con Visual Basic (base)

Automazione Excel con Visual Basic (base)

Note per la programmazione in linguaggio Visual Basic di Excel

MINIMANUALE VBA PER CREARE MACRO NEI FOGLI EXCEL

= < < < < < Matematica 1

Excel & VBA. Excel e Visual Basic for Application

Esiste anche l operatore logico NON che rende FALSA una condizione VERA e VERA una condizione FALSA.

Algoritmo per l ordinamento di un array

Come ordinare facilmente i dati in un foglio di calcolo Excel definendo chiavi e parametri.

Foglio elettronico Microsoft Office Excel 2003

Sviluppare un programma in FORTRAN

Proprietà delle potenze

ELEMENTI DI INFORMATICA E PROGRAMMAZIONE

Grafici. 1 Generazione di grafici a partire da un foglio elettronico

Classe 1C E-book di informatica Marco Ciani

Introduzione alla Programmazione e Applicazioni per la Finanza M2 (Prodotti Derivati) Lezione 13

Codici a barre - Seconda parte (EAN 8 ed EAN 13)

14Ex-Cap11.qxd :20 Pagina Le macro

Abilità Informatiche

Sintesi delle differenze

Programmazione con il linguaggio LibreOffice Basic

Marco Canu Excel Advanced: Note Operative Tabelle Pivot Excel 2013 Sella & Mosca Agg. 06/05/2017

Visual Basic For Application Guida Pratica per Esempi

Convertire numeri da lettere a cifre (UDF)

Verifica della correttezza formale del numero di partita IVA

DEFINIZIONI SMART E RELATIVE ESERCITAZIONI

Creare una tabella di pivot

IMPOSTAZIONI DI EXCEL. Per rendere disponibile l ambiente di sviluppo di Visual Basic for Application in Excel:

Algoritmi e dintorni: La radice quadrata Prof. Ettore Limoli. Formule iterative

Excel & VBA. Excel e Visual Basic for Application

Uso di base dell ordinamento di dati in Microsoft Excel

Operazioni preliminari: creare una cartella in Documenti

OGGETTO RANGE DI CELLE. Una cella o un gruppo di celle in un foglio di lavoro di Excel è un oggetto di tipo Range.

9In questa sezione. Ordinare e filtrare i dati. Dopo aver aggiunto dati ai fogli di lavoro, potresti voler

Excel avanzato. Certificazione Microsoft. Excel: le basi. 1.1 Excel: le basi NUMBER TITLE

WORD PROCESSING.

Matematica in laboratorio

Corso di Laboratorio di Sistemi Operativi

Anagrammi e combinazioni con ripetizione

Aprire un file xls che è contenuto in un percorso il cui nome è nella cella A1 Sub Apri() Dim A As String A = "C:\Documenti\" & Range("A1").

nome di un menu per visualizzarlo e poi selezionate facendo clic sul comando che vi interessa.

Appunti di Excel per risolvere alcuni problemi di matematica (I parte) a.a

INFORMATICA 10-Foglio di calcolo-adv

EXCEL AVANZATO Le Funzioni in Excel DEFINIZIONE DI FUNZIONE

Capitolo 2. Figura 21. Inserimento dati

Excel: guida alle operazioni di base per la risoluzione dell esercizio 13

Appunti sui Fogli Elettronici. Introduzione. D. Gubiani. 19 Luglio 2005

Programma del corso Che cosa è Excel. Il comando File \ Impostazione Pagina. Come selezionare le celle con il mouse.

Introduzione al Foglio Elettronico

Esercitazioni di Elementi di Informatica

Imparare a utilizzare le formule e le funzioni

EXCEL software Excel .xlxs, La cella intestazione della colonna intestazione di righe l indirizzo della cella testo numeri formule

Utilizzo del linguaggio Basic utilizzando l interfaccia di Excel Silvia Patacchini

Esercitazione. Excel: le macro. C.1 Registrazione di macro

Excel. Il foglio di lavoro. Il foglio di lavoro Questa viene univocamente individuata dalle sue coordinate Es. F9

6. Applicazione: gestione del centro sportivo Olympic

Fogli Google: nozioni di base sui fogli di lavoro

Excel VBA Lezione 17. Generare numeri casuali

Convertire un numero da cifre a lettere (UDF)

L INTERFACCIA GRAFICA DI EXCEL

3. Le routine evento in Access 2000/2003

Agent and Object Technology Lab Dipartimento di Ingegneria dell Informazione Università degli Studi di Parma. Fondamenti di Informatica.

Microsoft Excel. Il foglio elettronico. Attivazione delle celle

Excel memorizza il riferimento alla cella A1 sotto forma di distanza dalla cella contenente la formula.

Metodologie informatiche per la chimica

Automatizzare le attività con le macro di Visual Basic

Introduzione al Foglio Elettronico

Rimuovere la password dalle protezioni di foglio e cartella in Excel

Giselda De Vita 2015

Programmazione in Excel con il linguaggio Visual Basic

Fondamenti di Informatica

I dati rappresentati (tutti di pura fantasia) sono contenuti in un file excel denominato Personale.xls.

Introduzione a Matlab

La stampa Unione con MS-Word

1 Riduzione per righe e matrici equivalenti per righe.

Esercizi su Python. 14 maggio Scrivere una procedura che generi una stringa di 100 interi casuali tra 1 e 1000 e che:

APVE in Rete Modulo 8 Excel nozioni di base e esercitazioni su economia domestica

Codice Gray. (versione Marzo 2007)

Le variabili di Visual Basic consentono di memorizzare temporaneamente valori durante

Prefazione... xi. Da leggere prima di iniziare...xiv. Capitolo 1 Introduzione a JavaScript Sezione A Programmazione, HTML e JavaScript...

Cenni sull utilizzo dei fogli elettronici

Foglio Elettronico Lezione 1

La stampa Unione con MS-Word

MATLAB I/O. Informatica B - A.A. 2012/2013 ACQUISIZIONE DI INPUT DA TASTIERA

ELEMENTI DI INFORMATICA E PROGRAMMAZIONE

EXCEL: FORMATTAZIONE E FORMULE

11-Cap :40 Pagina Tabelle pivot

Fogli di Calcolo. Corso di Informatica. Fogli di Calcolo. Fogli di Calcolo. Corso di Laurea in Conservazione e Restauro dei Beni Culturali

Un grafico utilizza i valori contenuti in un foglio di lavoro per creare una rappresentazione grafica delle relazioni esistenti tra loro;

Mi piacerebbe condividere con voi una funzione che ho realizzato per rispondere ad una richiesta posta nella Sezione Visual Basic 6 su MasterDrive.it.

Insert > Object > Chart

Vuoi impaginare un libro senza ricevere critiche?

Contare quante volte si presenta un valore singolo utilizzando una funzione

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Gestire le Spese Famigliari e personali in modo efficace Parte 2 - aggiungere tabelle statistiche automatiche

Transcript:

Gioco del 15, in doppia salsa excelliana (Il modello Gioco del 15.xls è disponibile per il download all indirizzo http://www.giannigiaccaglini.it/download/gioco%20del%2015.xls Sono sicuro che a molta gente, perlomeno a coloro che sono dotati di sufficiente fantasia e pertanto sanno che Excel NON serve solo per aridi bilanci e scontate previsioni di vendite trimestrali, è già venuta in mente la possibilità di implementare questo giochino in Excel + VBA. A beneficio di tutti i giocherelloni e in omaggio alle sospirate vacanze prossimo venture, ecco due soluzioni possibili, entrambe fanno ovviamente riferimento a uno schema come il seguente: gioco del 15 5 10 7 15 6 2 3 4 11 12 8 14 1 9 13

Prima soluzione L intervallo di cui alla figura precedente ha nome Gioco15, complice l abuso di fantasia. Venendo subito al sodo, ecco il relativo codice macro, interamente ospitato nel modulo Foglio1: Dim VettoriAssegnati As Boolean 'Switch definito a livello modulo 'Vettori di nomi sempre definiti a livello modulo Dim Vett, Vett1, Vett2, Vett3, Vett4, Vett5, Vett6, Vett7, Vett8, _ Vett9, Vett10, Vett11, Vett12, Vett13, Vett14, Vett15, Vett16 Private Sub NominaCelle() Nomi = Array("Uno", "Due", "Tre", "Quattro", "Cinque", "Sei" _ "Sette", "Otto", "Nove", "Dieci", "Undici", "Dodici", _ "Tredici", "Quattordici", "Quindici", "Sedici") For Each c In Range("Gioco15") c.name = Nomi(i) i = i + 1 Private Sub AssegnaVettori() If VettoriAssegnati Then Exit Sub Vett1 = Array("Due", "Cinque") Vett2 = Array("Uno", "Tre", "Sei") Vett3 = Array("Due", "Quattro", "Sette") Vett4 = Array("Tre", "Otto") Vett5 = Array("Uno", "Sei", "Nove") Vett6 = Array("Due", "Cinque", "Sette", "Dieci") Vett7 = Array("Sei", "Tre", "Otto", "Undici") Vett8 = Array("Quattro", "Sette", "Dodici") Vett9 = Array("Cinque", "Dieci", "Tredici") Vett10 = Array("Sei", "Nove", "Undici", "Quattordici") Vett11 = Array("Sette", "Dieci", "Dodici", "Quindici") Vett12 = Array("Otto", "Undici", "Sedici") Vett13 = Array("Nove", "Quattordici") Vett14 = Array("Dieci", "Tredici", "Quindici") Vett15 = Array("Undici", "Quattordici", "Sedici") Vett16 = Array("Dodici", "Quindici") VettoriAssegnati = True Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _ Cancel As Boolean) Cancel = True If Target.Cells.Count > 1 Then Exit Sub 'Evita selezioni multiple If Intersect(Target, Range("Gioco15")) Is Nothing Then Exit Sub If IsEmpty(Target) Then Exit Sub AssegnaVettori Select Case Target.Name.Name Case "Uno": Vett = Vett1 Case "Due": Vett = Vett2 Case "Tre": Vett = Vett3 Case "Quattro": Vett = Vett4 Case "Cinque": Vett = Vett5 Case "Sei": Vett = Vett6 Case "Sette": Vett = Vett7 Case "Otto": Vett = Vett8 Case "Nove": Vett = Vett9 Case "Dieci": Vett = Vett10 Case "Undici": Vett = Vett11 Case "Dodici": Vett = Vett12 Case "Tredici": Vett = Vett13 Case "Quattordici": Vett = Vett14

Case "Quindici": Vett = Vett15 Case "Sedici": Vett = Vett16 End Select ColorTarget = Target.Interior.ColorIndex DatoTarget = Target.Value For i = 0 To UBound(Vett) With Range(Vett(i)) If.Value = "" Then.Copy Target.Interior.ColorIndex = ColorTarget.Value = DatoTarget End If End With Macchinosa anzichenò? È vero, ma le ridondanza è dovuta soltanto all adozione di una selva di nomi opportuni, dopo di che il funzionamento è relativamente semplice: 1. dare un doppio clic su una cella dello schema; 2. vedere il risultante spostamento della cella cliccata nel buco, se e solo se questo si trova accanto ad essa. Commenti essenziali La Sub NominaCelle prepara il vettore Nomi contenente le stringhe Uno, Due, Sedici quindi le assegna come nomi (dinamici!) alle celle dell intervallo Gioco15 ). Nota Palesemente è una finezza, questi battesimi si potevano compiere a mano, con noti comandi Inserisci > Nome... Segue AssegnaVettori che inserisce nei vari Vett1, Vett2,, Vett16 i nomi delle celle circostanti sopra, sotto, a sinistra e a destra di ciascuna di quelle dello schema. Tali operazioni si compiono solo se VettoriAssegnati =True (con =True sottinteso). A questo punto interviene la routine dell evento doppio-click. Tralasciandone l esordio, incluso il richiamo di AssegnaVettori, la struttura Select Case discrimina i possibili nomi della cella colpita (Target) in ciascuno dei Case previsti ponendo il relativo Vett1, Vett2, ecc. in un solo array Vett.. A quel punto si registrano il colore e il valore della cella Target in ColorTarget poi si avvia un ciclo che spazzola Vett individuando, con Range(Vett(i)) le celle circostanti il Target per vedere se è vuota. Nel qual caso si opera lo scambio desiderato, su cui mi affido al comprendonio di chi legge. Seconda soluzione Fa ovviamente riferimento a uno schema del tutto simile al precedente, ma con due varianti: l intervallo, supposto collocato in una altro foglio di lavoro, si chiama GiocoDel15 ; l evento sfruttato è il clic semplice, ergo la routine è la Selection_Change di questo foglio. Il codice, presente nel modulo, diciamo, Foglio2 dell Editor VBA stavolta è più compatto: Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Cancel = True MsgBox "In questo foglio devi usaree il clic NORMALE...", vbinformation, "Attenzione" Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Target.Cells.Count > 1 Then Exit Sub 'Evita selezioni multiple If Intersect(Target, Range("GiocoDel15")) Is Nothing Then Exit Sub If IsEmpty(Target) Then Exit Sub Dim OffRiga, OffColonna Dim TargOffset As Range Dim depcolore As Integer, depdato As Integer OffRiga = Array(-1, 0, 1, 0) OffColonna = Array(0, 1, 0, -1) depcolore = Target.Interior.Color depdato = Target.Value For i = 0 To UBound(OffRiga) Set TargOffset = Target.Offset(OffRiga(i), OffColonna(i)) With TargOffset If IsEmpty(.Cells(1)) Then.Copy Target.Interior.Color = depcolore.value = depdato Exit Sub End If End With Commenti essenziali Nessuno! Mi affido all esegesi autogestito di chi legge, dico solo che: a) stavolta, come ripeto, l evento sfruttato è il cambio selezione, che corrisponde al clic semplice sulla cella Target; b) OffRiga e OffColonna sono vettori contenenti gli scarti (Offset) di riga e di colonna del Target, in base ai quali vengono anche qui esplorate le celle circostanti scambiando il Target col buco, se possibile. Rimescolamento caselle Sono quasi certo che tutti gl informatici per ottenere questo scopo penseranno di ricorrere ad operazioni casuali di spostamento del buco, magari con sofisticati algoritmi ricorsivi Da praticone invece ho pensato a un altro algoritmo: eseguire il sort sia per righe che per colonne (che Excel consente) dello schemino. A tal fine ho inserito nella riga sopra e nella colonna a sinistra funzioni =CASUALE(), occultate con il formato numerico ;;;" assegnato a tali celle. Dopodiché ecco il codice rimescolante, associato a un pulsante CommandButton1 ottenuto quasi solo tramite Registratore: Private Sub CommandButton1_Click() Disordina Sub Disordina() 'Sort per righe Range("B5:F8").Sort Key1:=Range("B5"), Order1:=xlAscending, _ Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _ Orientation:=xlTopToBottom, DataOption1:=xlSortNormal 'Sort per colonne Range("C4:F8").Sort Key1:=Range("C4"), Order1:=xlAscending, _ Header:=xlNo, OrderCustom:=1, MatchCase:=False, _ Orientation:=xlLeftToRight, DataOption1:=xlSortNormal

Va da sé che il riordino secondo numeri casuali, di fatto crea disordine. Aggiungo solo che sento che questi scambi di colonne e righe non dovrebbero creare schemi irrisolvibili (*), ma non ne sono sicuro. Ancora una volta ci vorrebbe un matematico che dimostri, se vero, tale teorema. Se costui c è e mi legge, batta un colpo Nota (*) Ricordo che uno schema che ammettesse, ad esempio, una soluzione coi valori 15-14- 13 nell ultima riga non sarebbe compatibile con quello regolare.