Ingegneria Forum

Ingegneria Edile, Strutturale & Geotecnica => .:C#, Excel, VB e Programmazione:. => Topic started by: afazio on 30 April , 2012, 22:41:23 PM

Title: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 30 April , 2012, 22:41:23 PM
In questo secondo esempio mi propongo di mostrare come fare interagire un codice con un foglio strutturato in un ben determinato modo.

Posizione del problema:

sia data una palificata composta da "np" pali di diametro "dp" i cui centri sono posizionati nei punti di coordinate (Xpi; Ypi).
Fissiamo come numero massimo 20 pali.
I pali siano collegati in testa da un plinto sufficientemente rigido da poter considerare i pali vincolati alla rotazione nella loro sezione di testa.
Il peso del plinto dovrà essere determinato dall'utente e sommato col coefficiente di combinazione adeguato al sistema di azioni agenti allestradosso del plinto (oltre ai momenti di trasporto nel baricentro della palificata). Sia quindi dato lo spessore del plinto "Hpl" necessario per il trasporto dei tagli sul piano di testa pali.

Sia quindi dato un sistema di carichi derivanti da una combo che denominiamo "nCombo" costituito dalla sei componenti Tx, Ty, Tz, Mx, My, Mz affetti dai coefficienti di combinazione della combo in esame e che tengono conto del peso del plinto e degli eventuali momenti di trasporto del peso del plinto dal baricentro del plinto al baricentro della palificata.

Il sistema di riferimento xyz è tale che xy determina il piano orizzontale mentre z è verticale positivo verso l'alto. Il sistema sia levogiro.

Ci proponiamo:
- strutturare un semplice foglio di calcolo che esegua la distribuzione dei carichi sui pali di fondazione
- costruire una tabella delle combinazioni derivanti da una serie di combinazioni di carico

- a questo punto scrivere del codice che in automatico sostituisca le sollecitazioni lette dalla tabella delle combinazioni  nelle corrispondenti celle del foglio che esegue la distribuzione sui pali,
- far costruire al codice una tabella in cui riassumiamo per ciascuna combinazione, lo sforzo normale massimo sul palo, lo sforzo normale minimo sul palo, il taglio alla testa ed il momento flettente massimo sul palo.

Strada facendo potremo decidere di aggiungere altro che verrà in mente con ovvia modifca del codice.

E' naturale che prima di iniziare a comporre/strutturare fogli occorre avere chiaro il problema e sopratutto avere chiaro il procedimento di calcolo e come eseguire la distribuzione degli sforzi sui pali.




Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 01 May , 2012, 21:24:23 PM
Complichiamo il problema. Il plinto sia definito da una poligonale di cui conosciamo le coordinate dei suoi vertici. Occorrerà, pertanto, far calcolare l'area del plinto per poi, moltiplicato per la densità e per lo spessore, determinarne il peso. Inoltre occorrerà determinarsi la posizione del baricentro del plinto per poter poi eseguire il trasporto del peso del plinto nel punto baricentrico della palificata. Nella tabella delle combinazioni dovremo quindi inserire il coefficiente per cui moltiplicare il peso del plinto per rendere questa sollecitazione congruente con il tipo di combo dei carichi.
Iniziamo quindi a predisporci questo foglio.

Esso dovrà contenere una parte dove sia possibile dare in input i seguenti dati:
numero dei vertici della poligonale del plinto
spessore del plinto
area del plinto
densita del materiale cui è composto il plinto
una tabella di input delle coordinate della poligonale

poi occorrerà predisporre due celle atte a contenere le coordinate del baricentro del plinto
e le celle per depositarvi:
il coefficiente di combinazione del peso del plinto
il peso del plinto
i due momenti di trasporto dal baricentro del plinto al baricentro della palificata
per adesso credo non serva piu altro. Strada facendo vedremo se aggiungere altro.

La seconda sezione invece sara dedicata alla definzioone della geometria della palificata e per questo sarà necessario prevedere:
numero dei pali
diametro del palo
tabella delle coordinate dei pali
poi ci serviranno celle dove determinare :
l'area del singolo palo e dell'intera palificata
le coordinate del baricentro della palificata
le inerzie del palo singolo
le inerzie dell'intea palificata rispetto agli assi baricentrici
per adesso basta

Occorrerà pure una parte dedicata a riassumere:
la combo esaminata
le sollecitazioni derivanti dalla struttura sovrastante il plinto per quella specifica combo
le sollecitazioni sul piano passante per la testa dei pali.
Poi penso ci servirà qualche altra cella per la distribuzione del momento torcente e qualche altra cella col parametro Kh per la determinazione del massimo momento flettente sul palo.


Intanto iniziamo a formare lo scheletro del foglio.

NB. Non metterò a disposizione alcun file excel nè in corso di composizione di questo 3d e nemmeno alla fine. Chiunque volesse seguire lo sviluppo di questo esempio dovrà comporsi il foglio da se.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 01 May , 2012, 21:58:12 PM
nella immagine che segue riporto la maniera in cui ho pensato di strutturare la parte riguardante l'input dei dati del plinto

(http://img337.imageshack.us/img337/4330/001lcg.jpg) (http://imageshack.us/photo/my-images/337/001lcg.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Da notare che
- ho dato il nome "NV" alla cella relativa al numero dei vertici della poligonale del plinto. Questo per facilitare la scrittura delle formule nelle celle e per poter accedere a questa cella eventualmente da VBA.
- ho gia distinto le celle che devono essere di input con il colore di sottofondo verdino mentre ho gia attribuito il valore 25.00 kN/m³ alla densità del materiale cui è costituito il plinto. Ma volendo lo si puo imporre come un dato di input cioè che deve inserire l'utente.

In questa struttura vi sono due errori che ovviamente correggerò. Il primo è proprio l'unità di misura della densità [kN/m²] anzichè [kN/m³] ed il secondo consiste nel fatto che ho indicato con lo stesso simbolo sia la densità che il coefficiente di combinazione. Penso di correggere chiamando questo secondo con gamma.f.

Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 01 May , 2012, 22:51:16 PM
La tabella delle coordinate deve essere tale che la poligonale sia chiusa, ciò significa che occorrerà informare l'utilizzatore che nella composizione della tabella faccia coincidere l'ultimo vertice col vertice iniziale.  Lo faremo mettendo una nota da qualche parte sul foglio o una nota in una cella (4p docet)

Adesso ci si presentano i primi problemi.
Come calcolare l'area della sezione a partire dalle coordinate dei vertici della poligonale?
Stessa domanda vale per le coordinate del baricentro.

Sappiamo che esistono delle formule che ci danno tutte le caratteristiche geometriche di una sezione definita dalle cordinate dei suoi vertici che coinvolgono delle sommatorie.

Per esempio l'area della sezione è definita da:

A = somma [(x.i - x.(i-1))*(y.i + y.(i-1))/2

in cui la somma è estesa da 2 ad NV

Allora possiamo pensare di aggiungere alla tabella delle coordinate altre tre colonne in cui, a partire dalla seconda riga, riportiamo:
nella prima colonna aggiuntiva: la differenza della x con la x precedente, 
nella seconda colonna aggiuntiva: la somma dellla y e la y precedente, 
nella terza colonna aggiuntiva: il semiprodotto dei due valori delle due colonne precedenti

infine in coda all'ultima delle colonne aggiuntive eseguiamo la somma di tutti i termini della terza colonna aggiuntiva. Questo dovrebbe essere l'area del plinto. MA a questo punto, dato che avevamo gia dedicato una cella destinata a contenere l'area del poligono, potremmo mettere proprio lì questa somma.

Proverò ad aggiungere tutto ciò nel progetto del foglio anche se vi anticipo che, in vista delle operazioni necessarie per la determinazione delle coordinate del baricentro, è opportuno ricorrere a qualche codice che eviti di imbrattare il foglio con numeri che alla fine non interessa nemmeno presentare.

Ecco un primo passo:

(http://img805.imageshack.us/img805/5189/002gep.jpg) (http://imageshack.us/photo/my-images/805/002gep.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Come potete vedere ho aggiunto le colonne che avevo descritto ed ho inserito una "geometria di lavoro" per poter controllare i risultati delle formule che via via inserisco.

qui annoto quanto segue:
- siamo solo agli inizi col semplice calcolo dell'area ed abbiamo gia una tabella con dati che tutto sommato sono praticamente inutili da presentare. A noi poco importano i calcoli intermedi ma importa solo l'area. Qui sarebbe pertanto utilissima una funzione che prenda in pasto quella tabella e che ci dia solo l'area (per adesso). Ma andiamo avanti. Aggiungo solamente che quando non conoscevo a fondo le potenzialita di excel o quando questo non era potente come adesso (e mi riferisco ai tempi in cui excel era dotato solo di un rudimentale linguaggio macro) non mi fermavo di certo di fronte alla mole di numeri che avrebbero accompagnato le mie relazioni. Poi risolvevo il problema facendo fare i conti in fogli diversi che poi non stampavo.
- abbiamo fornito una tabella di input, le coordinate certamente le abbiamo ricavate da uno schema grafico che magari abbiamo davanti, siamo anche certi di non aver commesso errori, tuttavia quella serie di numeri snocciolati in tabella sono aridi e nulla dicono della forma effettiva della poligonale. Sarebbe utile poter visualizzare la forma. Questo con scopi multipli tra cui il controllo in diretta di errori di digitazioni e la presentazione di un eleborato elegante. Farò questo inserendo un diagramma a dispersioni di punti.

- purtroppo l'area calcolata è errata. Questo è dovuto alla presenza di termini nelle colonne aggiuntive e nel primo rigo oltre l'ultima coppia di coordinate; basterebbe pertanto cancellare proprio questi elementi indesiderati per ottenere il risultato corretto. Ma questo cancellerebbe anche le formule ivi inserite e in un successivo uso dovremmo ricordarci di ripristinare le formule. Penso che questo sia poco accettabile e dovremo trovare una soluzione per superare questo problema.
Una soluzione sarebbe quella di imporre all'utilizzatore di posizionare il primo vertice della poligonale nell'origine del sistema di riferimento (il risultato sarebbe corretto, provare per credere). Questa soluzione non è poi tanto cattiva. In alternativa dovremo trovare una formula che dia risultato nullo se le coordinate o il numero sequenziale del vertice non sono dati.

 

Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 02 May , 2012, 21:41:47 PM
Passiamo adesso alla determinazione delle coordinate del baricentro della poligonale.

Da geometria delle masse sappiamo che le coordinate del baricentro sono pari a:


xc = Sy / A

yc = Sx / A

In cui si sono indicati con Sx ed Sy il momento statico rispetto agli omologhi assi mentre con A si è indicata l'area della poligonale (che gia abbiamo calcolato anche se ancora errata, ma la correggeremo poi)

Se non ricordo male Zax ha riportato le formule che danno, a partire dalla tabella delle coordinate dei vertici, Sx ed Sy.
Non voglio ricorrere alla lettura del post di zax e, non ricordandole a memoria ,intendo ricavarmele da solo.
Per questo considero nel quadrante positivo il generico lato della poligonale che va dal vertice "i" al vertice "i+1" con valori crescenti sia delle x che delle y (nel senso che il punto "i+1" sta a destra ed in alto del vertice "i") e questo per poter trovare una formula che non dipenda dal segno, cioè, una formula in cui il segno del risultato derivi solo da una diversa posizione reciproca dei vertici rispetto a quella da me assunta che è positiva.

Conviene che prepari una figura esplicativa.

Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 02 May , 2012, 22:05:47 PM
ecco l'immaginetta:

(http://img214.imageshack.us/img214/372/52480512.jpg) (http://imageshack.us/photo/my-images/214/52480512.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Il momento statico della figura sottesa dal lato del poligono con l'asse delle y, calcolato rispetto all'asse delle y, è la somma algebrica dei momenti statici delle due figure colorate, il rettangolo in rosso ed il triangolo in blu. Nella figura sono riportate tutte le grandezze necessarie per il calcolo espresse in funzione delle coordinate dei due vertici.

Syi = [y(i+1) -y.i]*x.i²/2 + [y(i+1) - y.i]*[x(i+1)-x.i]/2*[x.i+[x(i+1)-x.i]/3]

Il momento statico dell'intera poligonale rispetto all'asse y è ottenuto sommando algebricamente i momenti statici rispetto allo stesso asse di tutte le aree sottese da ciascun lato della poligonale con l'asse delle y. Trattasi quindi di eseguire una sommatoria che varia da 1 a NV-1

Mi chiederete perche non fino a NV?. Semplice: perchè il vertice nv+1 non esiste e la formula cadrebbe in errore quando i vale NV.

Stesso ragionamento per ricavare Sx ma stavolta le aree da considerare sono quellle sottese dai lati della poligonale con l'asse delle x.

Scrivere quel papello di somme in unica cella è parecchio noioso ma l'alternativa, cioe quella di spezzettare la formula nelle sue parti componenti e poi eseguire i prodotti, sarebbe forse piu noiosa . Armiamoci di pazienza, aggiungiamo due colonne atte a ricevere Sxi e Syi in fondo alle quali inseriremo la somma dei singoli termini.
Ricordiamo anche che finquando non risolviamo il problema dei termini presenti e non desiderati, sia il calcolo dell'area che quella dei momenti statici sara errato.

Una nota post scriptum: dato che per il calcolo dell'area la sommatoria l'abbiamo considerata a partire da 2 fino a NV, conviene che anche le somme per i momenti statici abbiano stessi indici di sommatoria. Questo significa che dovremo modificare la formula dei momenti statici semplicemente sostituendo all'indice "i" il suo precedente, cioè "i-1" , e ad "i+1" l'indice "i". Non abbiamo fatto altro che una traslazione di indice, in questo modo la sommatoria e' estesa da 2 a NV. Spero sia chiaro questo escamotage
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 03 May , 2012, 19:40:13 PM
Prima di andare avanti inseriamo il grafico a dispersione di punti che ci permetta di visualizzare la forma. IL primo passo è quello di scegliere da menu la voce "inserisci grafico" oppure dlla barra degli strumenti:

(http://img31.imageshack.us/img31/9919/dispersione1.jpg) (http://imageshack.us/photo/my-images/31/dispersione1.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Dal dialogo che ci propone excel, selezioniamo il tipo di grafico a dispersione di punti e poi il sottotipo "con coordinate unite da linee senza indicatore". Premiamo su avanti

(http://img339.imageshack.us/img339/3523/dispersione2.jpg) (http://imageshack.us/photo/my-images/339/dispersione2.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Nel secondo dialogo scegliamo la linguetta "Serie" quindi diamo il nome alla serie che intendiamo aggiungere, per esempio "Plinto" e selezioniamo per i valori delle ascisse la colonna della tabella contenenti le ascisse della poligonale e per le ordinate l'altra colonna. Premiamo quindi "fine". A Questo punto è inutile continuare col processo guidato che ci proporrà altri due dialoghi Conviene , una volta inserito il grafico, che ce lo personalizziamo noi modificando le proprieà dei vari componenti del grafico.

Avremo una cosa del genere:

(http://img844.imageshack.us/img844/4514/dispersione3.jpg) (http://imageshack.us/photo/my-images/844/dispersione3.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Ognuno personalizzerà il grafico a proprio piacimento. IO tolgo subito il titolo della serie dato che penso che questo grafico conterrà anche il disegno dei pali e di altro che riterrò opportuno. Tolgo anche la legenda poiche non interessa e toglie spazio utile al disegno, poi imposto lo sfondo del grafico a "nessuno", faccio disegnare le linee della poligonale con tratto piu spesso e di colore rosso, inserisco le graduazioni secondarie e le griglie ed infine ridimensiono il grafcio. Ottengo una cosa simile:

(http://img205.imageshack.us/img205/6498/dispersione4.jpg) (http://imageshack.us/photo/my-images/205/dispersione4.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

adesso posso continuare con le formule relative ai momenti statici.

Per adesso annoto che sviluppando la formula che ho gia scritto per Sy ottengo la seguente:

Sy = 1/6* somma[(x².(i-1) + x.(i-1)*x.i +x².i) * (y.i - y.(i-1)]

mentre per Sx ho:

Sx = 1/6* somma[(y².(i-1) + y.(i-1)*y.i +y².i) * (x.i - x.(i-1)]
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 03 May , 2012, 19:54:41 PM
Inseriamo adesso due colonne, arricchendo la tabella delle coordinate, atte a contenere i valori parziali di Sxi ed Syi e a seguire scriviamo le formule relative partendo dal rigo della seconda coppia di cordinate:

(http://img839.imageshack.us/img839/9685/sxiqf.jpg) (http://imageshack.us/photo/my-images/839/sxiqf.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Copiamo (trascinando) la formula nelle celle sottostanti. L'operazione va ripetuta anche per Sy.

Qui occorre ancora una volta ricordare che i valori ottenuti per A, per Sx e per Sy sono errati a causa delle presenza di termini indesiderati nel rigo settimo, cioè il primo rigo dopo l'ultima coppia di coordinate ed inoltre che palesemente il segno di Sy è errato (dovrebbe essere positivo). Vedremo poi perchè, intanto occupiamoci di risolvere il problema degli intrusi indesiderati.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 03 May , 2012, 21:04:55 PM
Come togliere i termini indesiderati?

Possiamo pensare di scrivere le formule relative ai termini delle aree e dei momenti statici antecedendole con IF che fa riferimento al numero della riga:
=SE(numerodellariga<>0, allora scrivi il risultato della formula; altrimenti scrivi zero)

POsizioniamoci pertanto nella cella G14 che per adesso contiene la formula  =E14-E13 e scriviamo la formula =SE(D14<>0;E14-E13;0) come nella figura seguente:

(http://img137.imageshack.us/img137/6940/condizioni01.jpg) (http://imageshack.us/photo/my-images/137/condizioni01.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Copiamo trascinando la cella nelle celle sottostanti. Vedremo sparire il primo termine indesiderato.

Facciamo stessa cosa per la cella H14 che per adesso contiene la formula =F14+F13. La formula sostitutiva sarà =SE(D14<>0;F14+F13;0). Copiamo trascinando. Sparisce anche il secondo termine indesiderato e con esso anche quello relativo all'area dato che questa è il semiprodotto dei primi due.

Facciamo stessa cosa nelle celle J14 e K14. Evito di dettagliarlo qui.

Alla fine di queste operazioni i termini indesiderati sono spariti e resta solo di capire perche il momento statico Sy è negativo mentre ce lo aspettiamo positivo.


Gia che ci siamo inseriamo nelle cellette che avevamo dedicato a contenere xg e yg le formule  per determinarli dato che adesso abbiamo tutto.

Otteniamo questo:

(http://img11.imageshack.us/img11/4378/questow.jpg) (http://imageshack.us/photo/my-images/11/questow.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

E' quasi bello.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 05 May , 2012, 10:09:17 AM
Nel mio "esempio di lavoro" ho numerato i vertici della poligonale percorrendola in senso orario. IL senso della numerazione dà il segno dei tre termini A, Sx ed Sy; una numerazione antioriara darebbe come risultati gli stessi valori ma cambiati di segno.

Fissata la numerazione oraria, il momento statico  della figura rispetto all'asse delle y determinato con la formula che ho dato, risulta negativo. Il motivo è immediato da comprendere considerando un semplice rettangolo.

Il lato 1-2 piu prossimo e parallelo all'asse delle y determina un contributo positivo al momento statico con valore:
Sy(1-2)=(y2-y1)*x1²/2

mentre il lato 3-4, piu lontanno e paralleo all'asse delle y determina un contributo negativo al momento statico, con valore:
Sy(3-4)=(y4-y3)*x2²/2

essendo x4-x3= - (y2-y1)
abbiamo
Sy(3-4)=-(y2-y1)*x2²/2

quindi:

Sy = (y4-y3)*x1²/2 -(y2-y1)*x2²/2 = (y2-y1)*(x1²-x2²)/2

ed essendo x2>x1 il risultato è negativo.

Per correggere il nostro foglio basta pertanto cambiare il segno ad ogni contributo del momento statico rispetto all'asse y e ricordarsi di inserire una nota per l'utilizzatore con l'avviso di numerare i veritici in senso orario.

Adesso diamo un input allo spessore H del plinto e possiamo aggiungere anche la formula per il calcolo del peso.

Otteniamo quanto segue:
(http://img850.imageshack.us/img850/8713/pesouf.jpg) (http://imageshack.us/photo/my-images/850/pesouf.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Per adesso avremmo finito con la parte relativa ai dati del plinto. Torneremo ad aggiungere i due momenti di trasporto quando avremo determinato il baricentro della palificata e conosceremo quindi le eccentricità.

Iniziamo adesso la parte relativa alla palificata



P.S.: Nella formula del calcolo del peso ho commesso un errore che consiste nell'averlo inserito positivamente mentre avevo definito positivo l'asse delle z rivolto verso l'alto. Questa è una leggerezza, battutaccia, nel senso che questo errore avrebbe alleggerito i pali del doppio del peso del plinto.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 05 May , 2012, 10:25:48 AM
Predisponiamo le celle necessarie per la parte relativa ai pali. POtremmo decidere di cambiare foglio e costruirci li la struttura che ci serve, ma dato che in qualsiasi istante possiamo sempre fare un bel taglio-incolla, per adesso continuiamo a lavorare sempre nello stesso foglio.
Ci servono le seguenti celle:
- numero dei pali
- diametro del palo
- area singolo palo
- inerzia singolo palo
- coordinate baricentro palificata
- area totale della palificata
- inerzia totale rispetto ad ase x-x baricentrico
- inerzia totale rispetto ad asse y-y- baricentrico
- tabella dove inserire le coordinate di ciascun palo.

Io ho pensato di strutturare questi dati nel modo seguente:
(http://img17.imageshack.us/img17/4406/pli001.jpg) (http://imageshack.us/photo/my-images/17/pli001.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Nello schema che ho proposto, ho predisposto una tabella atta a contenere una decina di pali, ma questa tabella potra essere estesa in futuro. Inoltre, anche se non mostrato nella figura, ho attribuito il nome "NP" alla cella che contiene il dato del numero dei pali ed il nome "DP" alla cella che contiene il diametro del palo. altri nomi, se necessari, li attribuiò nel seguito.

Ovviamente ognuno puo strutturalo in qualsiasi altro modo salvo ad apportare le correzioni in corso d'opera derivanti da quello che servira nel seguito.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 05 May , 2012, 10:58:57 AM
Continuiamo inserendo dei dati di input di lavoro (per poter controllare/visualizzare i risultati delle formule che andremo ad inserire). Diamo sia il numero dei pali che il loro diametro e riempiamo la tabella con le coordinate di 9 pali immaginando di mettere un palo al centro, un palo prossimo ad ogni vertice della poligonale ed infine un palo nei punti medi dei lati lunghi.
Avendo sia il il numero dei pali che il diametro possiamo gia inserire le formule per il calcolo dell'area del singolo palo, della sua inerzia e l'area dell'intera palificata:

(http://img502.imageshack.us/img502/6002/pli002.jpg) (http://imageshack.us/photo/my-images/502/pli002.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Scriviamo quindi:
nella cella F30 la formula: =PI.GRECO()*DP^2/4
nella cella G30 la formula: =PI.GRECO()*DP^4/64
nella cella J30 la formula: =NP*F30

Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 05 May , 2012, 13:42:58 PM
Le coordinate del baricentro della palificata le calcoliamo al solito con la formula:

xg = somma(Ai*xi)/somma(Ai)
yg = somma(Ai*yi)/somma(Ai)

ma essendo Ai=Ao =costante, le formule si semplificano in:

xg = Ao*somma(xi)/(Ao*NP) = somma(xi)/NP
yg = Ao*somma(yi)/(Ao*NP) = somma(yi)/NP

In pratica le coordinate del baricentro della palificata altro non sono che i valori medi delle coordinate.

Posizioniamoci quindi in H30 e digitiamo la formula SOMMA(E35:E44)/NP e nella cella I30 la formula =SOMMA(F35:F44)/NP


Ragioniamo adesso sulle inerzie totali della palificata:

Jtotx= NP*Jo + somma[Ao*(yg-yi)²) = NP*Jo + Ao*somma[(yg-xi)²]

similmente per il momento di inerzia secondo l'altro asse.

Jtoty= NP*Jo + somma[Ao*(xg-xi)²) = NP*Jo + Ao*somma[(xg-xi)²]

Ci servono quindi due colonne dove far calcolare i termini (xg-xi)² e (yg-yi)². Queste due colonne le mettiamo accanto alla tabella delle coordinate ottendo una cosa simile alla seguente:

(http://img196.imageshack.us/img196/471/sommex.jpg) (http://imageshack.us/photo/my-images/196/sommex.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

In questa immagine noterete che ho gia inserito la prima formula nella cella G35:  =($H$30-E35)^2 che successivamente copierò trascinando la cella sulle celle sottostanti.
Il riferimento utilizzato per la celle H30 (che contiene xc) è assoluto. Questo significa che excel nella copia della formula di una cella in una qualsiasi altra cella non cambierà mai questo riferimento mentre tutti gli altri saranno adattati alla posizione relativa della cella di destinazione.
Faremo la stessa cosa nei riguardi di Jy ed alla fine della copia delle formule nelle celle sottostanti ci aspetteremo di trovare qualche termine indesiderato nelle righe dove non abbiamo definito alcuna coordinata. MA per superare questo problema sappiamo già come procedere.





Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 05 May , 2012, 14:07:29 PM
Riassumendo quanto gia composto, dovremmo avere qualcosa di simile ala figura che segue:

(http://img51.imageshack.us/img51/83/sumendo.jpg) (http://imageshack.us/photo/my-images/51/sumendo.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Ho già apportato le correzioni per evitare gli elementi indesiderati (notate gli zeri nei termini di Jxi e Jyi).
Adesso siamo in grado di calcolarci i due momenti di strasporto che avevamo lasciato indietro.

Ricordatevi che, per evitare errori nella scrittura di queste due formule, dovrete ipotizzare la forza positiva e l'eccentricità anch'essa positiva.
Cosi facendo abbiamo:

Mx = P*(Yg.plinto- Yg.pali)
My= - P*(Xg.plinto- Xg.pali)

Ovviamente il segno effettivo dei momenti di trasporto dipenderà poi dal segno effettivo dell'azione P e dal segno della differenza entro parentesi.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 12 May , 2012, 09:59:11 AM
Prima di andare avanti, vediamo di inserire anche il disegno dei pali nel grafico in cui avevamo già disegnato la forma del plinto ed iniziamo a dare dei nomi alla tabella.

Diamo un nome di tipo dinamico alla tabella delle coordinate dei pali, cioè il nome deve riferirsi ad un range di celle le cui dimensioni dipendono proprio dal numero dei pali.
Per fare questo selezioniamo dal menu "Inserisci" la voce "nome" e quindi la voce definisci. Si apre il dialogo per la definizione dei nomi con la proposta di attribuire un nome alla cella selezionata.
Per dare un nome di tipo dinamico dobbiamo fare ricorso alla funzione "scarto".
La sintassi è la seguente:

= scarto(cella_di_riferimento; spostamento_righe; spostamento_colonne; num_righe_tabella; num_colonne_tabella)

Procediamo quindi con la selezione della voce del menu per l'inserimento di un nuovo nome, otteniamo il seguente dialogo:

(http://img690.imageshack.us/img690/767/scartot.jpg) (http://imageshack.us/photo/my-images/690/scartot.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)
definiamo il nome "Tab_coord_Pali" e nella box di input "riferitoa" iniziamo a scrivere la funzione scarto. Indichiamo come cella di riferimento prima cella della tabella che intendiamo definire. Nel nostro caso intendiamo definire una tabella contenente il numero del palo e le sue coordinate, quindi la cella di riferimento è la cella con il numero del primo palo.

Completiamo la funzione scarto aggiungendo gli "scarti" rispetto alla cella di riferimento per avere la cella di inizio del range, (nel nostro caso saranno 0;0, ma se avessimo scelto come cella di riferimento altra cella piu distante, avremmo dovuto dare i valori di spostamento necessari per arrivare dalla cella di riferimento alla cella iniziale), completiamo la funzione scarto inserendo le dimensioni della nostra tabella (nel nostro caso sono NP righe e 3 colonne). Otteniamo la seguente;

(http://img542.imageshack.us/img542/644/scarto01.jpg) (http://imageshack.us/photo/my-images/542/scarto01.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Se adesso provate a selezionare, dal dialogo di definizione dei nomi, il nome "Tab_coord_Pali" e cliccate sull'icona di selezione delle celle, vedrete evidenziare proprio la tabella che abbiamo definito.
Inoltre, se dal foglio provate a cambiare il numero dei pali e tornate a visualizzare il range a cui si riferisce il nome "Tab_coord_Pali" vedrete adattare il range alle nuove dimensioni.
Questo modo di definire un range viene indicato con "range dinamici" e potrete intuire la potenza di questi nomi se poi gestiti da un qualche codice dato che gia il range col suo nome ha in se definiti anche le sue dimensioni accessibili da codice tramite i metodi .rows.count e columns.count

Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 12 May , 2012, 10:58:31 AM
Procediamo adesso col disegno dei pali nel grafico dove abbiamo gia disegnato la sagoma del plinto. Diamo il nome "FoglioDIServizio" ad un altro foglio del file e predisponiamo le celle dove ci richiamiamo il numero dei pali ed il diametro (mediante le semplici formule =NP e =DP). Inoltre stabiliamo altre due celle dove indicheremo il numero di punti in cui sarà suddiviso (ai fini del disegno) il cerchio rappresentante il palo e l'angolo di suddivisione.
Otteniamo una cosa simile a:

(http://img32.imageshack.us/img32/6460/dispali001.jpg) (http://imageshack.us/photo/my-images/32/dispali001.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Adesso per ciascun palo costruiamo la tabella delle coordinate x,y del cerchio che poi sara rappresentato nel diagramma.

LA tabella sara del tipo:

(http://img221.imageshack.us/img221/9640/dispali002.jpg) (http://imageshack.us/photo/my-images/221/dispali002.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

La tabella contiene: una cella col numero progressivo del palo, che viene posta pari ad uno nella tabella del primo palo mentre nelle successive tabelel questo numero sara determinato in automatico, e le due celle contenenti le coordinate x e y di quel palo.
Nella tabella sottostante metteremo le colonne che conterranno:
- il numero progressivo del punto del cerchio del disegno;
- un moltiplicatore che sarà pari a 1 se il numero del palo è maggiore di zero e pari a zero se il numero del palo è zero
- l'angolo relativo al punto del cerchio.
- le coordinate del punto del cerchio.

Nella figura potete notare la formula che ho inserito in corrispondenza del secondo punto del cerchio "=SE(E(T6>0;T6<$D$3+1);T6+1;0)".
Questa formula, se copiata nelle celle sottostanti, inserira il numero progressivo del punto del cerchio fino al raggiungimento del numero delle suddivisioni + 1. Seguiranno degli zeri.

Sarebbe alquanto laborioso illustrare ciascun passo e la formula di ciascuna cella o colonna. Procedero' predisponendo per mio conto la tabella relativa al primo palo ed a postarne l'immagine. Chiunque avesse un qualche dubbio come fare lo potra chiedere.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 12 May , 2012, 11:17:16 AM
Ecco la tabella con le coordinate dei punti necessari per poter disegnare il primo palo.

(http://img821.imageshack.us/img821/4204/dispali003.jpg) (http://imageshack.us/photo/my-images/821/dispali003.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Noterete che per far scrivere la coordinata xc del centro del palo ho fatto ricorso alla funzione cerca.vert utilizzando all'interno il nome dinamico (precedentemente definito) che punta alla tabella delle coordinate dei pali. Stessa cosa ho fatto per la coordinata yc (utilizzando però l'indice 3 anziche l'indice 2).

Nelle celle della colonna alfa ho inserito la formula che d.alfa*(num.punto-1) ma solo se num.punto è maggiore di zero.
Rinviando alle eventuali precise richieste di delucidazione delle altre celle, vediamo adesso come far disegnare questo palo nel diagramma dove ci sta gia la sagoma del plinto.

Torniamo quindi sul foglio principale, quello dove avevamo inserito i dati di input e dove attualmente si trova il disegno del plinto. Prendiamo quel diagramma, ridimensioniamolo in maniera proporzionale e mettiamolo dove ci fa comodo, quindi clik col destro in un punto vuoto del diagramma e scegliamo dal menu contuastuale la voce "dati di origine".

(http://img856.imageshack.us/img856/5798/dispali004.jpg) (http://imageshack.us/photo/my-images/856/dispali004.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 12 May , 2012, 11:46:10 AM
Si aprirà il dialogo per l'inserimento di nuovi dati nel diagramma.

(http://img851.imageshack.us/img851/3596/dispali005.jpg) (http://imageshack.us/photo/my-images/851/dispali005.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Clik su "aggiungi" e viene aggiunta una nuova serei di dati denominata "serie2" per adesso vuota. Clicchiamo sull'icona di selezione delle celle per i "valori x" e selezioniamo la colonna delle x dei punti del cerchio relativi al primo palo.
(http://img819.imageshack.us/img819/8017/dispali006.jpg) (http://imageshack.us/photo/my-images/819/dispali006.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Analogamente facciamo per i "valori y" ma selezionanado stavolta, ovviamente, la colonna delle y. Premiamo su OK e ci apparira il grafico con il primo palo all'interno della sagoma del plinto.

(http://img217.imageshack.us/img217/9150/dispali007.jpg) (http://imageshack.us/photo/my-images/217/dispali007.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Adesso non ci resta che cambiare, se lo riteniamo, lo stile di rappresentazione di quel cerchio (spessore, colore, tipo di linea) ed abbiamo finito col primo palo

Occorrerà ripetere la stessa operazione anche per i pali successivi dopo che ne avremo definito le tabelle nel foglio di servizio.

a dopo
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 12 May , 2012, 14:10:46 PM
Costruiamo adesso le tabelle delle coordinate dei rimanenti pali. Torniamo sul foglio di servizio, selezioniamo le colonne relative alla tabella delle coordinate dei punti del primo palo, copiamole ed incolliamole nelle colonne accanto.

(http://img163.imageshack.us/img163/2894/copiapali001.jpg) (http://imageshack.us/photo/my-images/163/copiapali001.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Riferendomi alla figura postata, incollero' le celle copiate a partire dalla colonna M. Se la tabella precedente era stata formata con formule contenenti i giusti riferimenti assoluti o parzialmente assoluto, per completare la tabella delle coordinate del secondo palo basterà solo inserire la formula in corrispondenza del numero progressivo del palo

(http://img856.imageshack.us/img856/3861/copiapali002.jpg) (http://imageshack.us/photo/my-images/856/copiapali002.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Inseriremo nella cella M3 la formula: =se(e(G3>0;G3<NP);G3+1;0) e vedremo apparire il 2
Adesso basta copiare questa ultima tabella ed incollarla a partire dalla colonna S (il trucco è quello di incollare le nuove tabelle sempre alla stessa distanza relativa rispetto alla precedente, in questo modo i riferimenti assoluti resteranno laddove erano mentre quelli relativi si sposteranno prendendo sempre il giusto posto.
Copieremo tante tabella di queste quanti sono il numero massimo di pali che abbiamo previsto di poter gestire nel foglio. In questo caso dieci, ma in qualsiasi istante potremo estendere il numero.

Facendo questo, scopriremo che quando il numero delle tabella supera il numero NP dei pali, otteniamo degli errori.

(http://img84.imageshack.us/img84/9606/copiapali003.jpg) (http://imageshack.us/photo/my-images/84/copiapali003.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Anticipo che l'errore è dovuto alla funzione cerca.vert che non riesce a trovare il palo numero zero in tabella. Spiegherò dopo come correggere l'errore.

Adesso ci armiamo di pazienza ed aggiungiamop al grafico altre nuove serie ognuna delle quali disegnerà un cerchio diverso.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 12 May , 2012, 14:42:54 PM
Dopo aver inserito tutte le serie rappresentanti i cerchi ed avere aggiustato la forma dei cerchi (linee spessore e colore) avremo una cosa del genere:

(http://img718.imageshack.us/img718/9053/copiapali004.jpg) (http://imageshack.us/photo/my-images/718/copiapali004.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Da qui ci accorgiamo che in effetti le coordinate dei pali che avevamo dato in input non rispecchiano quello che ci eravamo proposti. I pali n° 3, 7 e 9 hanno ascissa errata. La correggiamo quindi da 3.10 a 4.10 e visualizziamo il disegno corretto. DUrante le correzioni vedremi magicamente spostarsi i pali nel disegno. Possiamo variare il diametro e vedremo aggiustarsi il tutto. oppure correggere qualche coordinata di qualche vertice visualizzando immediatamente la nuova configurazione.

Adesso torniamo nel foglio di servizio e correggiamo l'errore che ci eravamo lasciati alle spalle.
La correzione consiste nell'inserire la formula
=SE(BI3>0;CERCA.VERT(BI3;Tab_coord_Pali;2);0) nella cella relativa ad xc del decimo palo
=SE(BI3>0;CERCA.VERT(BI3;Tab_coord_Pali;3);0) nella cella relativa a yc del decimo palo

quindi copiare queste due celle ed incollarle nelle corrispondenti celle di tutti i pali precedenti
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 12 May , 2012, 19:54:38 PM
Passiamo adesso ai carichi. Inseriamo un nuovo foglio e lo chiamiamo "carichi".

Per adesso decidiamo di prevedere un massimo di tcinque carichi distinti  gravanti sul plinto di fondazione.

In genere per plinti non regolari nella forma (plinti poligonali) difficilmente è presente un solo carico e comunque non si ha coincidenza tra coordinate del punto di applicazione dell'eventuale unico carico con le coordinate del baricentro del plinto o della palificata. Per rendere il foglio un po piu generico occorrerà prevedere le celle di input delle coordinate dei punti di applicazione dei carichi.

Inoltre abbiamo il problema del coefficiente di combinazione da attribuire al peso del plinto per ciascuna diversa combo di carichi derivanti dall'analisi della struttura sovrastante.

Iniziamo quindi a definire una tabella dei coefficienti di combinazione del peso del plinto, una tabella destinata a contenere le coordinate dei punti di applicazione dei carichi e 5 tabella destinate a contenere, una per ciascun carico, le sollecitazioni.

Otteniamo una cosa del genere:

(http://img31.imageshack.us/img31/6307/carichi01.jpg) (http://imageshack.us/photo/my-images/31/carichi01.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)


Basta vedere questo foglio ed il gran numero di cellette con sfondo verdino (celle di input) per capire che questa è la parte di input piu' onerosa specie se abbiamo una trentina di diverse combo provenienti dalla struttura sovrastante.
Non scoraggiamoci. Da qualche parte il nostro programma di calcolo registrerà i risultati delle analisi sotto forma di tabulato magari in un file tipo word o rtf. Basterà quindi organizzare quei dati di output nel modo che abbiamo predisposto (se non lo ha gia fatto il vostro programma) e fare dei semplici copia-incolla. Dovremo fare attenzione al dannato punto decimale e se per caso non è quello giusto, basta far eseguire al programma di videoscrittura un preventico cerca-trova-sostituisci il punto con la virgola o viceversa.
Poi, se non è possibile, per qualche motivo, eseguire il copincolla diretto tra dati selezionati nel tabulato ed excel, sara sufficiente salvare i dati che ci interessano in formato testo, quindi aprire un file vuoto di excel, fare l'import dei dati, dare le sistematine necessarie e fare un copincolla tra file di excel.

Adesso iniziamo ad attribuire i nomi alle celle ed ai range che poi dovremo gestire attraverso il codice.

Ho gia dato il nome "NmaxCombo" alla cella D2, quella contenente il numero massimo delle combinazioni ed il nome "NmaxCar" alla cella D3 quella contenente il numero massimo dei carichi presenti
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 13 May , 2012, 13:27:27 PM
Diamo un nome dinamico alla tabella dei coefficienti di combinazione. L'immagine che segue è esplicativa.

(http://img706.imageshack.us/img706/7088/carichi02.jpg) (http://imageshack.us/photo/my-images/706/carichi02.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Stessa cosa facciamo per la tabella delle coordinate dei punti di applicazione dei carichi:

(http://img848.imageshack.us/img848/1730/carichi03.jpg) (http://imageshack.us/photo/my-images/848/carichi03.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

dandogli il nome Tab_Coord_Car


@Bertolana: vedo che stai seguendo i messaggi di questo 3d. Almeno sei riuscito a comporre qualcosa? Se hai qualche dubbio chiedi pure.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: ferrarialberto on 13 May , 2012, 18:00:07 PM
Ciao Afazio,
   leggo solo ora i tuoi numerosi interventi: interessante il topic. Stai sviluppando un'applicazione di fatto identica ad una che io ho fatto un paio di anni fa, con gli stessi dati di input e probabilmente anche con le stesse finalità. Bravo.

Ciao.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 13 May , 2012, 18:11:28 PM
Ciao Afazio,
   leggo solo ora i tuoi numerosi interventi: interessante il topic. Stai sviluppando un'applicazione di fatto identica ad una che io ho fatto un paio di anni fa, con gli stessi dati di input e probabilmente anche con le stesse finalità. Bravo.

Ciao.

Ricevere i complimenti da una persona come te non puo' che fare enorme piacere.

In merito alla applicazione per essere sincero, io la ho riscritta decine di volte ed ogni volta per uno specifico scopo. Dimentico sempre dove ho messo i file ed impiego meno a riscrivere tutto che non a cercarla.

Tutto bene?
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: ferrarialberto on 13 May , 2012, 21:07:56 PM
Ricevere i complimenti da una persona come te non puo' che fare enorme piacere.

In merito alla applicazione per essere sincero, io la ho riscritta decine di volte ed ogni volta per uno specifico scopo. Dimentico sempre dove ho messo i file ed impiego meno a riscrivere tutto che non a cercarla.

Tutto bene?

In effetti questo è uno di quei casi in cui uno strumento ad hoc è molto utile, ma che richiede di essere adattato alle esigenze dello specifico problema.
Abbastanza bene, crisi a parte. Tu?

Ciao.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 19 May , 2012, 14:53:44 PM
Passiamo adesso alle formule della distribuzione degli sforzi sui pali.
Supponiamo di aver gia calcolato le sollecitazioni risultanti rispetto al baricentro della palificata.
Siano esse:  Fx Fy Fz Mx My Mz
con x, y e z gia definite precedentemente.

Trattasi di distribuire Fz, Mx, My sui pali in forma di azioni assiali, Tx e Ty alla testa dei pali in forma di azioni arizzontali , e Mz (torsione) sotto forma di azione orizzontale alla testa che va a sommarsi vettorialmente alle precedenti.

Iniziamo con le formule relative alla distribuzione di Fz, Mx e My.

Sia dato il sistema di pali di cui abbiamo gia determinato le caratteristiche Atot, Jxx, Jyy in cui xx e yy sono gli assi paralleli al sistema globale e passanti per il baricentro della palificata. Il sistema è rappresentato nella figura seguente

(http://img59.imageshack.us/img59/5476/distrib01.jpg) (http://imageshack.us/photo/my-images/59/distrib01.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Nell'ipotesi che il plinto sia infinitamente rigido, la configurazione deformata dello stesso per effetto delle sollecitazioni Fz, Mx, ed My sarà tale da mantenere piano il suo intradosso e lo spostamento/rotazioni rigide potranno essere definite attraverso una traslazione verticale e due rotazioni attorno agli assi baricentrici della palificata. Sotto queste ipotesi, la tensione nel baricentro del palo i-esimo si determina attraverso la trinomia di Navier:

sigma.i = Fz/Atot  + Mx*(yi-yg)/Jxx - My*(xi-xg)/Jyy

Nota la tensione, l'azione assiale trasmessa al palo i-esimo vale:

Np.i = sigma.i*Ao

in cui Ao è l'area del singolo palo.

Per l'applicazione delle suddette formule abbiamo già determinato tutto quanto e quindi potremmo procedere alla compilazione della tabella per fissata combinazione di carico.

LO farò dopo aver illustrato la distribuzione dei tagli e della torsione e dopo aver completato le tabelle dei carichi e la tabella delle risultanti.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 19 May , 2012, 15:08:24 PM
Per quanto riguarda la distribuzione di Fx ed Fy, la cosa è assai semplice dato che i pali hanno stessa lunghezza, sono immersi nello stesso terreno ed hanno quindi uguale rigidezza a taglio.

Indicate con Tx.i e Ty. i tagli alla testa del singolo palo, avremo:

Tx.i = Fx/NP
Ty.i = Fy/NP

In alternativa potremmo determinarci la risultante di Fx e Fy e quindi trovarci la risultante sul singolo palo

Fxy = radq(Fx² +Fy²)
e quindi:

Txy.i = Fxy/NP

MA cosi facendo avremo delle difficoltà quando dovremo, nel seguito, sommare vettorialmente la componente di taglio derivante dalla torsione avendo perso sia i segno che la direzione delle risultanti sui singoli pali.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 19 May , 2012, 15:38:29 PM
Passiamo alla distribuzione della torsione Mz.

Consideriamo la seguente figura:

(http://img580.imageshack.us/img580/5153/distrib02.jpg) (http://imageshack.us/photo/my-images/580/distrib02.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Per effetto del momento torcente il plinto ruota attorno ad un punto. In questo caso trattandosi di pali aventi uguali caratteristiche, il punto di rotazione coincide col baricentro della palificata.
La reazione di ciascun palo è direttamente proporzionale allo spostamento che esso subisce ed è diretta ortogonalmente alla congiungente il baricentro della palificata con il baricentro del singolo palo.

Indicati con Ti, il taglio trasmesso al singolo palo e con ri la distanza tra baricentro palificata e baricentro del palo i-esimo, si ha:

Mz = somma.i [ Ti*ri ]

Purtroppo solo questa equazione non è sufficiente a determinarci Ti ma occorre fare ricorso alla ipotesi suddetta.
In figura ho evidenziato le condizioni che discendono dalla ipotesi che la reazione del palo è direttamente proporzionale alòlo spostamento dello stesso, quindi direttamente proporzionale alla distanza ri.
Sempre nello schema ho indicato i due valori To ed ro che chiamo "valori di riferimento)

Dalla similitudine tra triangoli posso scrivere:

Ti : ri = To : ro

da cui: Ti = To*ri/ro

sostituisco quest'ultima nella precedente, ottenendo:

Mz = somma.i [To*ri²/ro]
tirando fuori dalla sommatoria le quantita costanti , si ha:
Mz = To/ro * somma.i[ ri² ]

in questa, la sommatoria è solo una questione geometrica quindi facilmente determinabile. Da questa possiamo ottenere il rapporto "di riferimento" To/ro

To/ro = Mz/somma[ri²]

Noto To/ro, tornando ad applicare la Ti = To*ri/ro è possibile determinare Ti

Ma non abbiamo ancora finito, poichè ci eravamo proposti di poter sommare vettorialmente questo taglio coi tagli derivanti dalla distribuzione di Fx e Fy.
Occorre quindi riuscire a ricavare le due componentri Tix e Tiy del taglio derivante dalla torsione.

A dopo
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 19 May , 2012, 21:35:52 PM
Ci occuperemo della questione della somma vettoriale dei tagli in seguito.
Vediamo adesso di aggiornare il nostro file.

Intanto annotiamo il fatto che avendo raccolto i coefficienti parziali gamma.F in una tabella a parte non serve più la celletta che avevamo dedicato nel primo foglio a contenere questo valore. D'altra parte essendo un valore che varia da combinazione a combinazione non sarebbe stato possibile dedicargli unica cella. Elimino pertanto questa cella dal primo foglio.

Inoltre avevo preannunciato che ci sarebbe servito un parametro del terreno per la determinazione del momento flettente massimo sul palo.
Per ricavare il momento flettente massimo sul palo penso di ricorrere alla schematizzazione di Winkler, palo elastico immerso in un mezzo elastico costituito da molle orizzontali separate di costante elastica costante e pari a Kh.
Predisponiamo pertanto una cella destinata a contenere questo dato di input.

Nell'ipotesi di palo impedito di ruotare alla testa sottoposto ad azione orizzontale ivi applicata, l'andamento del momento flettente è una funzione (che potete trovare in qualsiasi pubblicazione) il cui valore massimo risulta pari a:

Mpmax = Tp*lambda/2

in cui il parametro lambda risulta essere pari a:

lambda= radq{radq[ 4*E*J/(kh*Dp) ] }
in cui sono:
E = modulo elastico longitudinale del palo
J = momento di inerzia del palo
Kh = modulo laterale di Winkler
Dp = diametro del palo.

Predisponiamo pertanto una casella atta a contenere E ed una a contenere Lambda.

Le modifiche apportate sono riassunte nelle seguenti figure:

(http://img268.imageshack.us/img268/7052/lambdat.jpg) (http://imageshack.us/photo/my-images/268/lambdat.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 19 May , 2012, 21:53:35 PM
Adesso torniamo nel foglio dei carichi ed organizziamolo meglio.
Conviene costruirci una tabella del tutto uguale ad una delle tabelle dei carichi agenti sul plinto (che daremo in input), contenente ciò un numero di righe pari al numero della combinazioni di carico e le solite sei colonne Fx Fy Fz Mx My Mz, in cui inseriremo il prodotto dei carichi derivanti dal peso del plinto moltiplicati per il coefficente gamma.f delle diverse combo.

Per fare questo prima ci richiameremo le sollecitazioni derivanti dal peso del plinto, come nella figura che segue,

(http://img163.imageshack.us/img163/5114/carico00.jpg) (http://imageshack.us/photo/my-images/163/carico00.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

e successivamente riempiremo la tabella n° 0 mediante formule di prodotto tra una matrice ed un coefficiente, come illustrato nella figura che segue:

(http://img440.imageshack.us/img440/3729/carico01.jpg) (http://imageshack.us/photo/my-images/440/carico01.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Introdotta la formula di matrice nel primo rigo basta copiare per trascinamento nelle righe sottostanti. I riferimenti assoluti resteranno fissi (la tabelletta dei carichi) mentre quello relativo (la cella col gamma.F) si trascinerà durante la copia.
Ricordo che per inserire una formula di matrice (che poi excel visualizzerà antro le parentesi graffe) occorre selezionare le celle, indi col focus alla prima delle celle selezionate, digitare la formula (nel nostro caso selezionando le celle dei carichi dovute al peso proprio il segno di moltiplicazione e la cella col gamma.F) e premre contemporaneamente Crtl+Shift+Invio.
Se non si sono commessi errori, come per esempio aver selezionato matrici di ampiezza differente, vedremo automaticamente la formula di matrice applicata su tutte le celle selezionate.

P.S.: Noto adesso che excel ha attribuito ad alcune celle ilf ormato numerico con la notazione esponenziale. Selezioniamo tutta la tabella ed attribuiamo il formato numero con due cifre decimali. Stessa cosa facciamo per le altre tabella per avere alla fine una notazione uniforma in tutto il file.

Nota: La notazione dei kN con due cifre decimali può tornare parecchio utile per tutti gli ingegneri, come me, che sono cresciuti coi chilogrammi per avere l'immediatezza dell'ordine di grandezza con la quale eravamo abituati a ragionare. Basta infatti togliere la virgola e considerare l'intero ottenuto. Quelli sono i chilogrammi.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 19 May , 2012, 22:47:17 PM
Adesso inseriamo dei "valori di lavoro" ai carichi (per brevità per adesso consideriamone presenti solo 2).

Ci proponiamo adesso di costruirci la tabella coi carichi risultanti sul piano intradossso del plinto (piano passante per la testa dei pali).

Ciascun carico, applicato nel punto x,y e sul piano di estradosso del plinto, dovà essere riportato sul baricentro della palificata e sul piano testa-pali.

Predisponiamo quindi una settima tabella del tutto uguale nella struttura a quelle dei carichi applicati e del peso del plinto moltiplicato per gamma.F

Questa tabella potremmo riempirla mediante una serie di formule di foglio, oppure ricorrendo al codice. Ho parlato troppo spesso di codice in questo 3d, ma preso dalla foga di pervenire a qualcosa di immediatamente utilizzabile, non vi ho mai fatto ricorso. Penso sia arrivato il tempo di farlo.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 19 May , 2012, 23:30:48 PM
ecco pertanto i carichi di lavoro, che servono cioè unicamente a vedere se le formule inserite restituiscono valori corretti;

(http://img822.imageshack.us/img822/1199/carichilavoro1.jpg) (http://imageshack.us/photo/my-images/822/carichilavoro1.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

ed ecco la settima tabella che conterrà le risultanti per ogni combo sul piano di testa-pali

(http://img94.imageshack.us/img94/7622/tabrisultanti.jpg) (http://imageshack.us/photo/my-images/94/tabrisultanti.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Siamo quasi pronti al codice, occorre solo dare i nomi alle celle e tabelle che ci servirà richimare nel codice.

DIamo pertanto i nomi dinamici alle tabelle dei carichi mediante la funzione =scarto() che abbiamo gia usato
Io ho dato i seguenti nomi:

TabCar0 alla tabella relativa ai carichi derivanti dal peso del plinto
TabCar1 alla tabella del carico n° 1
TabCar2 alla tabella del carico n° 2
TabCar3 alla tabella del carico n° 3
TabCar4 alla tabella del carico n° 4
TabCar5 alla tabella del carico n° 5
TabCar alla tabella dellle risultanti che dovro riempire attraverso il codice.

mentre avevamo gia dato i nomi:

NmaxCar al numero dei carichi presenti sul plinto
NmaxCombo al numero delle combinazioni di carico da esaminare

Inoltre nel codice ci serviranno le coordinate del baricentro della palificata, l'altezza del plinto per il trasporto dei tagli sul piano testa-pali e le coordinate dei punti di applicazione dei singoli carichi.

Diamo pertanto il nome Tab_Coord_Car alla tabella (dinamica) contenente le coordinate dei singoli carichi, come in figura seguente;

(http://img201.imageshack.us/img201/4276/tabcoordcar.jpg) (http://imageshack.us/photo/my-images/201/tabcoordcar.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

ed i nomi:

XG e YG alle coordinate del baricenrtro della palificata
Hp all'altezza del plinto


P.S.: con ogni probabilità col nuovo excel vi verrà difficile inserire i nomi XG YG ed Hp (dato che questi sono gia nomi di colonne), in questo caso utilizzate i nomi X_G, Y_G e H_P.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 20 May , 2012, 00:00:27 AM
Prima di passare al codice (che spero di poter iniziare a trattare domani) scriviamo le formule necessarie a ricavare le risultanti,

diamo l'indice "o" alle azioni dovute al peso proprio (che vi ricordo sono gia ricondotte nel baricentro della palificata) e l'indice "i" al generico carico.

Le azioini risuoltanti su piano testa pali e nel baricentro della palificata li determiniamo attraverso le seguenti formule:

Fx = Fxo + somma.i[Fxi]
Fy = Fyo + somma.i[Fyi]
Fz = Fzo + somma.i[Fzi]

Mx = Mxo +somma.i[ Mxi +Fzi*(yi-yg) - Fyi*Hp]
My = Myo +somma.i[ Myi - Fzi*(xi-xg) + Fxi*Hp]

Mz = Mzo +somma.i[ Mzi - Fxi*(yi-yg) + Fyi*(xi-xg)]

Alla prossima.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 20 May , 2012, 10:09:13 AM
Ok, si parte col codice.
- Accediamo all'ambiente VBA tramite menu o pressione dei tasti ALT+F11
- inseriamo un nuovo modulo nel progetto relativo al file palificata
- iniziamo a scrivere una sub che chiamiamo "Calcola_Risultanti()"

Code: [Select]
Sub Calcola_Risultanti()


Premendo invio vedremo apparire la fine della sub con End Sub
Nello spazio tra sub ed end sub scriveremo tutto il codice che ci calcolerà le risultanti per ciascuna combo e scriverà i risultati nella tabella del foglio che abbiamo chiamano TabCar.

Iniziamo col dimensionare le variabili che ci serviranno (Dimensionare significa stabilirne il nome, il tipo e predisporre uno spazio di memoria atto a contenerne il valore)
Ci serviranno certamente le sei variabili relative alle sei componenti della risultante, ci serviranno anche le coordinate del baricentro della palificata e l'altezza del plinto

(http://img829.imageshack.us/img829/1497/codice1.jpg) (http://imageshack.us/photo/my-images/829/codice1.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Definite X_g, Y_g ed H_P, conviene subito richiamarsi i valori che sono contenuti nelle celle del foglio.

L'istruzione che attribuisce un valore di una cella del foglio ad una variabile VBA è l'istruzione:

variabile=range("nome_cella_nel_foglio").value

Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 20 May , 2012, 10:49:45 AM
Nel nostro codice dovremo fare eseguire almeno due cicli, quello più esterno per le combo e quello piu interno per i carichi.
Ci serve quindi sapere il numero delle combinazioni da esaminare ed il numero di carichi presenti.
Dimensioniamo allora altre due variabili che chiamo N_combo e N_carichi e questi sono degli interi

Dim N_combo as integer, N_carichi as integer

e ne richiamiamo subito i valori dalle corrispondenti celle del foglio

N_combo = Range("NmaxCombo").Value
N_carichi = Range("NmaxCar").Value


Adesso ci servono i contatori dei due cicli che chiamo:
Count_Comb per il contatore delle combinazioni
Count_Car per il contatore dei carichi

quindi:
Dim Count_Comb as integer, Count_Car as integer

a questo punto siamo pronti per dare inizio ai cicli. Scrivo immediatamente la struttura:


Code: [Select]
For Count_Comb = 1 To N_comb

    For Count_Car = 1 To N_carichi
   
   
    Next

Next

Nel ciclo interno faremo eseguire le operazioni necessarie (somme e moltiplicazioni) per ricavare le componenti della risultante relativa alla combinazione del ciclo esterno corrente.
Ricordando che le operazioni da eseguire sono:
Fx = Fxo + somma.i[Fxi]
Fy = Fyo + somma.i[Fyi]
Fz = Fzo + somma.i[Fzi]
Mx = Mxo +somma.i[ Mxi +Fzi*(yi-yg) - Fyi*Hp]
My = Myo +somma.i[ Myi - Fzi*(xi-xg) + Fxi*Hp]
Mz = Mzo +somma.i[ Mzi - Fxi*(yi-yg) + Fyi*(xi-xg)]

e notando che ogni termine parte dal valore iniziale dato dalla corrispondente componente del carico dovuto al peso del plinto, conviene impostare il valore delle sei variabili da calcolare proprio al valore corrispondente del carico dovuto al peso del plinto, prima di entrare nel ciclo. Quindi avremo:

Code: [Select]
For Count_Comb = 1 To N_comb

    Fx = Range("TabCar0").Cells(Count_Comb, 1)
    Fy = Range("TabCar0").Cells(Count_Comb, 2)
    Fz = Range("TabCar0").Cells(Count_Comb, 3)
    Mx = Range("TabCar0").Cells(Count_Comb, 4)
    My = Range("TabCar0").Cells(Count_Comb, 5)
    Mz = Range("TabCar0").Cells(Count_Comb, 6)

    For Count_Car = 1 To N_carichi
   
   
    Next

Next

Qui è da annotare l'istruzione range().cells
Quando un range presente nel foglio è costituito da una matrice, per poter accedere alle proprieta della singola cella della matrice (ricordo che tra le proprietà di una cella c'è anche la proprietà .value che contiene il valore della cella), è necessario fare ricorso alla proprietà .cells del range. La proprieta .cells del range accetta le coordinate della cella all'interno della matrice sottoforma di (riga,colonna)
Se per esempio scriviamo
Range("matrice_nel_foglio").cells(2,5)
ci riferiamo alla cella ubicata nel secondo rigo della quinta colonna della tabella denominata "matrice_nel_foglio". Per ottenerne il valore basta richiamarsi la proprietà .value
Range("matrice_nel_foglio").cells(2,5).value

Spero sia chiaro

Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 20 May , 2012, 11:25:42 AM
All'interno del secondo ciclo iniziamo a trascrivere le operazioni da fare per ottenere ciascuna delle componenti della risultante.
Prendiamo per esempio Fx (o Fy o Fz). Questa sarà data dal valore corrente di Fx (o Fy o Fz) (quindi quello posseduto alla fine dello step precedente o, se siamo al primo step, quello posseduto prima di entrare nel ciclo) più il valore della componente Fx (o Fy o Fz) (ricordo che la componente Fx si trova sempre nella prima colonna la Fy nella seconda e la Fz nella terza colonna) e relativo alla combo corrente.

Ma chi ci fa spostare dalla tabella del primo carico alla tabella del secondo carico e cosi via?
Semplice. Ricordiamo che alle tabelle dei carichi abbiamo dato i nomi
TabCar1
TabCar2
TabCar3
TabCar4
TabCar5
quindi basta creasi una stringa che chiamiamo tabella e che si compone della stringa "radice" TabCar a cui si accoda il numero del ciclo dei carichi corrente
dimensioniamo quindi una nuova variabile che chiamiamo tabella

dim tabella as string

ed a questa diamo il valore
tabella = "TabCar" & Count_Car
come prima istruzione all'interno del ciclo dei carichi

Il codice a questo punto è diventato:

Code: [Select]
Dim tabella As String
Dim Count_Comb As Integer
Dim Count_Car As Integer

For Count_Comb = 1 To N_combo

    Fx = Range("TabCar0").Cells(Count_Comb, 1)
    Fy = Range("TabCar0").Cells(Count_Comb, 2)
    Fz = Range("TabCar0").Cells(Count_Comb, 3)
    Mx = Range("TabCar0").Cells(Count_Comb, 4)
    My = Range("TabCar0").Cells(Count_Comb, 5)
    Mz = Range("TabCar0").Cells(Count_Comb, 6)

    For Count_Car = 1 To N_carichi
        tabella = "TabCar" & Count_Car
   
        Fx = Fx + Range(tabella).Cells(Count_Comb, 1)
        Fy = Fy + Range(tabella).Cells(Count_Comb, 2)
        Fz = Fz + Range(tabella).Cells(Count_Comb, 3)
   
   
    Next

Next
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 20 May , 2012, 11:37:14 AM
A questo punto non ci resta che completare le restenti tre formule che danno Mx, My ed Mz

Mx dovrebbe essere pari a:


Mx = Mx +  Range(tabella).Cells(Count_Comb, 4)+ Range(tabella).Cells(Count_Comb, 3)*(range("Tab_Coord_Car").cells(Count_Car,2)-y_g) - Range(tabella).Cells(Count_Comb, 2)*H_p

in cui
Range(tabella).Cells(Count_Comb, 4) è il valore della componente Mx del carico in esame
Range(tabella).Cells(Count_Comb, 3) è il valore della componente Fz del carico in esame
Range("Tab_Coord_Car").Cells(Count_Car, 2) è la ordinata del punto di applicazione del carico in esame
Range(tabella).Cells(Count_Comb, 2) è il valore della componente Fy del carico in esame
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 20 May , 2012, 11:47:48 AM
Scriviamo le formule relative a My ed Mz ottenendo il seguente codice:

Code: [Select]
For Count_Comb = 1 To N_combo

    Fx = Range("TabCar0").Cells(Count_Comb, 1)
    Fy = Range("TabCar0").Cells(Count_Comb, 2)
    Fz = Range("TabCar0").Cells(Count_Comb, 3)
    Mx = Range("TabCar0").Cells(Count_Comb, 4)
    My = Range("TabCar0").Cells(Count_Comb, 5)
    Mz = Range("TabCar0").Cells(Count_Comb, 6)

    For Count_Car = 1 To N_carichi
        tabella = "TabCar" & Count_Car
   
        Fx = Fx + Range(tabella).Cells(Count_Comb, 1)
        Fy = Fy + Range(tabella).Cells(Count_Comb, 2)
        Fz = Fz + Range(tabella).Cells(Count_Comb, 3)
        Mx = Mx + _
              Range(tabella).Cells(Count_Comb, 4) + _
              Range(tabella).Cells(Count_Comb, 3) * (Range("Tab_Coord_Car").Cells(Count_Car, 2) - Y_g) - _
              Range(tabella).Cells(Count_Comb, 2) * H_p
        My = My + _
              Range(tabella).Cells(Count_Comb, 5) - _
              Range(tabella).Cells(Count_Comb, 3) * (Range("Tab_Coord_Car").Cells(Count_Car, 1) - X_g) + _
              Range(tabella).Cells(Count_Comb, 1) * H_p
        Mz = Mz + _
              Range(tabella).Cells(Count_Comb, 6) - _
              Range(tabella).Cells(Count_Comb, 1) * (Range("Tab_Coord_Car").Cells(Count_Car, 2) - Y_g) + _
              Range(tabella).Cells(Count_Comb, 2) * (Range("Tab_Coord_Car").Cells(Count_Car, 1) - X_g)
    Next

da notare che per agevolare la leggibilità della formula (troppo lunga) la ho spezzettata nelle varie parti che la compongono facendo ricorso all'underscore alla fine della istruzione. Ricordarsi che l'underscore non deve essere attaccato a nulla.

Questa è una fase assai delicata ed è facile incorrere in banali errori nel tentativo di districarsi tra gli indici ed i pollici.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 20 May , 2012, 12:02:56 PM
Se tutto è andato bene e non abbiamo commesso errori di sintassi, all'uscita del ciclo interno (quello dei carichi) dovremme avere le sei componenti della risultante relativa alla combinazione in corso e siamo pertanto in grado di riportarne i valori nella tabella del foglio che abbiamo dedicato a contenere le risultanti.
Questa tabella la avevamo chiamata semplicemente TabCar senza nessun numero.

Per scrivere il valore di una variabili VBA in una cella del foglio dovremo fare riscorso alla istruzione inversa alla lettura. in questo caso trattandosi ancora di una cella di una tabella, serve ricorrere nuovamente alla proprietà .cells(rigo,colonna).

Per scrivere la componente Fx della risultante scriveremo l'istruzione:

Range("TabCar").Cells(Count_Comb, 1).Value = Fx

mentre per scrivere le restanti componenti cambieremo l'indice da 1 a 2 a 3 a 4 a 5 a 6.
ottenendo una cosa del genere
Code: [Select]

Sub Calcola_Risultanti()

Dim Fx As Double
Dim Fy As Double
Dim Fz As Double
Dim Mx As Double
Dim My As Double
Dim Mz As Double

Dim X_g As Double
Dim Y_g As Double
Dim H_p As Double

X_g = Range("XG").Value
Y_g = Range("YG").Value
H_p = Range("HP").Value

Dim N_combo As Integer
Dim N_carichi As Integer

N_combo = Range("NmaxCombo").Value
N_carichi = Range("NmaxCar").Value

Dim tabella As String
Dim Count_Comb As Integer
Dim Count_Car As Integer

For Count_Comb = 1 To N_combo

    Fx = Range("TabCar0").Cells(Count_Comb, 1)
    Fy = Range("TabCar0").Cells(Count_Comb, 2)
    Fz = Range("TabCar0").Cells(Count_Comb, 3)
    Mx = Range("TabCar0").Cells(Count_Comb, 4)
    My = Range("TabCar0").Cells(Count_Comb, 5)
    Mz = Range("TabCar0").Cells(Count_Comb, 6)

    For Count_Car = 1 To N_carichi
        tabella = "TabCar" & Count_Car
   
        Fx = Fx + Range(tabella).Cells(Count_Comb, 1)
        Fy = Fy + Range(tabella).Cells(Count_Comb, 2)
        Fz = Fz + Range(tabella).Cells(Count_Comb, 3)
        Mx = Mx + _
              Range(tabella).Cells(Count_Comb, 4) + _
              Range(tabella).Cells(Count_Comb, 3) * (Range("Tab_Coord_Car").Cells(Count_Car, 2) - Y_g) - _
              Range(tabella).Cells(Count_Comb, 2) * H_p
        My = My + _
              Range(tabella).Cells(Count_Comb, 5) - _
              Range(tabella).Cells(Count_Comb, 3) * (Range("Tab_Coord_Car").Cells(Count_Car, 1) - X_g) + _
              Range(tabella).Cells(Count_Comb, 1) * H_p
        Mz = Mz + _
              Range(tabella).Cells(Count_Comb, 6) - _
              Range(tabella).Cells(Count_Comb, 1) * (Range("Tab_Coord_Car").Cells(Count_Car, 2) - Y_g) + _
              Range(tabella).Cells(Count_Comb, 2) * (Range("Tab_Coord_Car").Cells(Count_Car, 1) - X_g)
    Next
    Range("TabCar").Cells(Count_Comb, 1).Value = Fx
    Range("TabCar").Cells(Count_Comb, 2).Value = Fy
    Range("TabCar").Cells(Count_Comb, 3).Value = Fz
    Range("TabCar").Cells(Count_Comb, 4).Value = Mx
    Range("TabCar").Cells(Count_Comb, 5).Value = My
    Range("TabCar").Cells(Count_Comb, 6).Value = Mz
Next

End Sub

e col codice avremmo finito per adesso.

Ora dobbiamo creare un pulsante sul foglio alla cui pressione si attiva questa Sub.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 20 May , 2012, 12:22:35 PM
Come inserire un pulsante sul foglio ed avviare una Sub.

Se non avete visualizzata la barra degli strumenti denominata "moduli" attivatene la visualizzazione: click col destro in un punto vuoto sulla riga del menu e dal menu contestuale spuntate la voce "moduli"

(http://img99.imageshack.us/img99/7752/moduli.jpg) (http://imageshack.us/photo/my-images/99/moduli.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Avrete, insieme agli atri strumenti anche il seguente:

(http://img515.imageshack.us/img515/4628/moduli1.jpg) (http://imageshack.us/photo/my-images/515/moduli1.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Premete sull'iconetta del pulsante e trascinate un'area sul foglio. Verra posizionato un pulsante avente le dimensioni dell'area che avete selezionato e immediatamente vi apparira il dialogo per la scelta della sub da associare alla pressione del pulsante.

(http://img96.imageshack.us/img96/6726/moduli2.jpg) (http://imageshack.us/photo/my-images/96/moduli2.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Dall'elenco della Sub presenti selezionate la sub "Calcola_risultanti" e premere OK. Adesso date un nome piu significativo al pulsante (al posto di quell'anonimo "pulsante1" che vi si propone.
Terminata la rinomina del pulsante, fate clik in un punto qualsiasi del foglio. Da questo momento in poi, ogni volta che si clikka sul pulsante parte la sub e potrete vederne gli effetti scorrendo il foglio dei carichi per viasualizzare la tabella con le risultanti. La vedrete piena di numeri.

Prima di andare avanti occorrerebbe fare il debug, cioe vedere se in effetti i risultati sono corretti.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 20 May , 2012, 17:50:35 PM
Ho condotto le prime verifiche con calcoli a mano (sempre con l'ausilio del foglio). I risultati sembrano essere corretti. bene.

Se adesso provassimo a variare il numero delle combinazioni, per esempio dalle 8 che ho inserito come valore di "lavoro" a soli 3, accadrebbe che alla pressione del tasto "calcola risultanti" si aggiornerebbero solo le prime tre righe della tabella "TabCar" e resterebbero scritte le restanti 5 scritte nella prova precedente. Questo potrebbe causare qualche errore nella presentazione dei dati. Servirebbe quindi cancellare il contenuto della tabella TabCar prima di premere il tasto di esecuzione della Sub.
Capità però, col tempo, di non ricordare ciò. E' opportuno quindi prevedere la cancellazione dei dati contenuti in tabella attraverso codice e prima di riempirla. Ma quante righe dovremmo cancellare?
E' ragionevole supporre che difficilmente supereremo una cinquantina di combo, quindi fissiamo di cancellare 50 righe. Nel caso ci capitasse qualche cosa con piu di 50 combo saremo costretti a rivedere il codice, a meno che non registriamo da qualche parte, per esempio nel foglio di servizio, il numero delle righe da pulire. Seguiamo questa seconda via e dedichiamo una cella del foglio di servizio a contenere itale numero. Chiamiamo la cella col nome "N_righe_da_Pulire"

(http://img42.imageshack.us/img42/3817/righe.jpg) (http://imageshack.us/photo/my-images/42/righe.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Adesso torniamo nel codice ed inseriamo:
- dimensionamento di una variabile N_R_C che ci indica il numero delle righe da cancellare: Dim N_R_C as integer
- lettura di N_R_C dal foglio mediante l'istruzione: N_R_C= range("N_righe_da_Pulire").value
- dimensionamento di un contatore generico: dim Count as integer.

A questo punto inseriamo il codice che cancella le righe da tabCar prima di entrare nei cicli che la riempiono.


Code: [Select]
Dim N_R_C As Integer
Dim Count As Integer
N_R_C = Range("N_righe_da_Pulire").Value

For Count = 1 To N_R_C
    Range("TabCar").Cells(Count, 1).Value = ""
    Range("TabCar").Cells(Count, 2).Value = ""
    Range("TabCar").Cells(Count, 3).Value = ""
    Range("TabCar").Cells(Count, 4).Value = ""
    Range("TabCar").Cells(Count, 5).Value = ""
    Range("TabCar").Cells(Count, 6).Value = ""

Next
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 20 May , 2012, 22:25:00 PM
Occupiamoci adesso della distribuzione degli sforzi sui pali iniziando a predisporre gli spazi a contenere i risultati.
Aggiungiamo un nuovo foglio al file e lo chiamiamo "Distrib".
In questo nuovo foglio predisponiamo una prima sezione in cui sono riportate le sollecitazioni per fissata combinazione di carico ed una sezione sottostante in cui riportiamo le sollecitazioni su ciascuno dei pali presenti.

Qualcosa di simile a quanto raffigurato nell'immagine:

(http://img20.imageshack.us/img20/5476/distrib01.jpg) (http://imageshack.us/photo/my-images/20/distrib01.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Ho dato il nome "N_combo" alla cella con sfondo verdino dove metteremo la combinazione che intendiamo distribuire:

(http://img37.imageshack.us/img37/5153/distrib02.jpg) (http://imageshack.us/photo/my-images/37/distrib02.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Adesso potremmo sfruttare la funzione di foglio = INDICE() per riempire le sei celle delle componenti della risultante relativa alla combo in esame.
Scriviamo allora la formula
=INDICE(TabCar;N_Combo;1)
in corrispondenza della cella relativa a FX
Vi ricordo che la tabella dove sono depositate le componenti delle risultante la abbiamo chiamata "TabCAr" e che la componente Fx si trova nella prima colonna

(http://img12.imageshack.us/img12/2153/distrib03.jpg) (http://imageshack.us/photo/my-images/12/distrib03.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Stessa cosa facciamo per le rimanenti celle, magari copiando con trascinamento quella gia scritta in Fx e cambiando solo l'indice da 1 a 2 a 3 a 4 a 5 a 6, ottenendo una cosa del genere:

(http://img51.imageshack.us/img51/7043/distrib04.jpg) (http://imageshack.us/photo/my-images/51/distrib04.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)


In questo modo con due semplici click abbiamo trasferito qui tutte e sei le componenti della risultante relativa alla combo in esame (nell'esempio la combo n° 1). Se proviamo a cambiare la celletta verde da 1 a 2 vedremo richiamate le componenti della riisultante relativa alla combo n° 2

Se proviamo a mettere un numero di una combo che non esiste (per esempio 10) otterremo l'errore #RIF che ci avverte che siamo fuori dal range (tabella) che abbiamo definito.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 20 May , 2012, 23:08:16 PM
Correggiamo ancora qualche imprecisione, per esempio l'unita di misura di Mp da [kN] a [kNm] e la dicitura "palipali" ed occupiamoci della distribuzione vera e propria.

Qui ricordo di aver lasciato ancora non conclusa la determinazione dell'azione orizzontale alla testa di ciascun palo a causa dell'azione orizzontale dovuta alla torsione mentre erano già definite le rimanenti:
per opportuna memoria, avevamo:

Npi = Ap* [ Fz/Atot  + Mx*(yi-yg)/Jxx - My*(xi-xg)/Jyy ]

Mpi = Tpi *lambda/2

restando ancora non determinato proprio Tpi.


Indicando con Txi e Tyi le sue componenti, avremo:

Tpi = radq( Txi² + Tyi²) ed a questo punto arrivati non ci interesserebbe il segno nè tampoco la direzione

Ciascuna delle due componenti risulta essere la somma:

Txi = Txi(Fx) + Txi(Mz)  [ azione orizzontale dovuta ad Fx e componente lungo x dell'azione dovuta alla torsione ]
Tyi = Tyi(Fy) + Tyi(Mz)  [ azione orizzontale dovuta ad Fy e componente lungo y dell'azione dovuta alla torsione ]

indicato con alfa l'angolo rispetto all'asse x della retta orientata su cui giace la reazione Tpi dovuta alla torsione e ricordando che Tpi = Mz *ri/somma[ri²], avremo:

Txi = Tx/Np + Mz*ri*cos(alfa)/somma[ri²]
Tyi = Ty/Np + Mz*ri*sen(alfa)/somma[ri²]

in cui sono:

ri = radq[ (xi-xg)² +(yi-yg)²]
alfa = arctg[(yi-yg)/(xi-xg)] + pigreco/2

Qui il problema è la funzione arctg che restituisce sempre un angolo compreso tra -pigreco/2 e +pigreco/2 e quindi ci serve esaminare il segno del rapporto [(yi-yg)/(xi-xg)]  per riportare l'angolo nel quadrante esatto.
Nel caso della funzione di foglio ARCTG(num) basta vedere solo il segno di (xi-xg) e se questo è negativo sommare al risultato fornito dalla funzione il valore pigreco.
Inoltre esiste anche la possibilita di incorrere nell'errore  #NUM quando l'ascissa di un palo coincide con l'ascissa del baricentro. In questo caso dovremmo far restituire pigreco/2 o -pigreco/2 a seconda del segno di (yi-yg).

Ovviamente tutto questo procedimento è gestibile anche ricorrendo alle sole funzioni di foglio, senza cioè fare ricorso a codice, ma la cosa sarebbe alquanto laboriosa. Vedrò nei prossimi giorni come affrontare e risolvere questo problema.

Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: zax2010 on 21 May , 2012, 09:09:14 AM
Scusami afazio se interrompo la tua continuità e costanza.

La tabella Tab_gammaF viene da te utilizzata solamente per 'amplificare' il peso del plinto.
Si presuppone quindi che le azioni esterne dei 5 possibili carichi che stai considerando siano già affette dei vari coefficienti parziali di combinazione.

Trovo 'strani' alcuni numeri che tu hai assegnato alla tabella suddetta (1.5 ad esempio). Trattasi di solamente di "numeri in libertà" immagino.
Bene sarebbe avere anche una descrizione della combo. Cioè se trattasi, almeno, di una SLU, SLE, ecc.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 21 May , 2012, 13:16:52 PM
Scusami afazio se interrompo la tua continuità e costanza.

La tabella Tab_gammaF viene da te utilizzata solamente per 'amplificare' il peso del plinto.
Si presuppone quindi che le azioni esterne dei 5 possibili carichi che stai considerando siano già affette dei vari coefficienti parziali di combinazione.

Trovo 'strani' alcuni numeri che tu hai assegnato alla tabella suddetta (1.5 ad esempio). Trattasi di solamente di "numeri in libertà" immagino.
Bene sarebbe avere anche una descrizione della combo. Cioè se trattasi, almeno, di una SLU, SLE, ecc.


Si zax. Ho immaginato che le sollecitazioni (quelle che io chiamo carichi sull'estradosso del plinto) derivino da una analisi strutturale e che quindi arrivino comprensivi dei coefficienti parziali dei carichi, mentre il peso del plinto deve ancora essere moltiplicato per il proprio gamma.F.
I numeri che ho dato in quella tabella che vedi sono numeri a caso solo per poter visualizzare i risultati delle formule che vado via via inserendo
Per quanto riguarda la descrizione del tipo di combo, in effetti hai ragione. penso di inserire una ulteriore colonna prima del coefficiente gamma.F dove poter inserire questa descrizione.

Grazie
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 21 May , 2012, 15:03:08 PM
Ho pensato di risolvere la questione del taglio alla testa del palo dovuto alla torsione attraverso una funzione che accettando in input i seguenti dati:
- momento torcente Mz
- coordinate xi, yi del palo iesimo
- coordinate xg, yg del baricentro della palificata
- parametro somma.i[ri²] per la distribuzione della torsione
mi restituisca o la componente Tx o la Ty sul palo i-esimo dovuti alla torsione
Affinche la funzione possa restituirci a nostro piacimento l'una o l'altra componente occorre, al solito, fare ricorso al "mio" flag (che sarà dato anch'sso in input alla funzione) che varrà 1 se vogliamo che ci restituisca Tx o 2 se vogliamo che ci restituiscs Ty

Per poter procedere alla scrittura della funzione abbiamo quasi tutto, ci manca soltanto il valore somma.i[ri²].

sappiamo che ri²= (xg-xi)² + (yg-yi)²
ma i quadrati delle differenze (xg-xi) e  (yg-yi) le abbiamo gia calcolate e presenti nel foglio nella sezione relativa all'input delle coordinate dei pali.
Torniamo pertanto su quel foglio, inseriamo altra colonna a seguire la tabella delle coordinate dei pali, inseriamo nelle celle la somma delle due precedenti ed in coda inseriamo la formula della somma.
Chiamiamo quindi quest'ultima cella (quella contenente la somma dei quadrati di ri) col nome RiQuadro.

(http://img856.imageshack.us/img856/2784/riquadro.jpg) (http://imageshack.us/photo/my-images/856/riquadro.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Gia che ci siamo, in accoglimento della opportuna segnalazione di zax, inseriamo nella tabella dei gamma.F presente nel foglio carichi una ulteriore colonna destinata a contenere la descrizione del tipo di combo:

(http://img29.imageshack.us/img29/4039/tipocombo.jpg) (http://imageshack.us/photo/my-images/29/tipocombo.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Basta selezionare la colonna contenente i gammaF, fare click col destro e scegliere il comando inserisci. Accadra che anche le celle contenenti i dati del numero massimo delle combo e del numero dei carichi si sposteranno verso destra. Per ripristinarne la originaria posizione sarà sufficiente selezionarle e spostarle di un posto a sinistra oppure si lasciano dove stanno.

Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 21 May , 2012, 15:16:47 PM
La struttura della nostra funzione dedicata alla determinazione delle componenti del taglio dovuto alla torsione sarà del tipo:


Public Function TAgliDaTorsione(xi as double, yi as double, xg as double, yg as double, RiQ as double, Mz as double, flag as integer) as double

in cui il significato dei parametri è stato precedentemente illustrato.

Troniamo quindi in ambiante VBA, e nello stesso modulo dove abbiamo già scritto il codice per il calcolo della risultante, iniziamo a scrivere proprio l'intestazione della funzione. Premendo invio, VBA scrive in automatico la fine della funzione. Otteniamo una cosa simile a:

(http://img88.imageshack.us/img88/5494/tagliodamz01.jpg) (http://imageshack.us/photo/my-images/88/tagliodamz01.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Se vi infastidisce la riga troppo lunga che non vi permette di visualizzarne il contenuto in unica schermata, potrete spezzettarla ricorrendo al solito all'underscore

(http://img31.imageshack.us/img31/3493/tagliodamz02.jpg) (http://imageshack.us/photo/my-images/31/tagliodamz02.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 21 May , 2012, 15:26:45 PM
Per poter ricavare Tx e Ty ci serve determinare
- alfa (angolo formato dalla retta su cui giace T e l'asse x)
- r (distanza tra baricentro palificata e centro del palo)

Ma alfa è dato dalla somma tra
- alfa0 (angolo formato dal segmento che congiunge il baricentro della palificata ed il centro del palo sempre con l'asse x)
- pigreco/2 (questo poiche abbiamo visto che la reazione del palo è sempre ortogonale alla congiungente sopra descritta)

Infine dovendo ragionare coi radianti, ci serve anche il valore di pigreco.

Dobbiamo quindi definire le seguenti variabili di appoggio:
- Pigreco (che poi è costante)
- Tx
- Ty
- r
- alfa0
- alfa
sono tutti dei Double

Procediamo pertanto con il loro dimensionamento.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 21 May , 2012, 20:37:36 PM
Code: [Select]
Dim Pi As Double
Dim Tx As Double
Dim ty As Double
Dim r As Double
Dim alfa0 As Double
Dim alfa As Double

iniziamo a calcolare pi ed r

Code: [Select]
Pi = 4 * Atn(1)
r = sqrt((xi - xg) ^ 2 + (yi - yg) ^ 2)

e adesso determiniamoci alfa0 prevedendo tutti i possibili casi (anche quello in cui le coordinate del palo coincidono con quelle del baricentro della palificata)

Code: [Select]
If xi = xg Then
    If yi = yg Then
    ' il centro del palo coincide col baricentro della palificata
    ' il palo non è sollecitato da taglio dovuto alla torsione
        Tx = 0
        ty = 0
    ' a questo punto dovremmo saltare alla parte finale per farci restituire i risultati
    ' siccome in ogni caso avremmo valore nullo, conviene fissare il valore della funzione a zero
    ' ed uscire
        TAgliDaTorsione = 0
        Exit Function
    End If

    If yi > yg Then alfa0 = Pi / 2
    If yi < yg Then alfa0 = -Pi / 2
Else
    alfa0 = Atn((yi - yg) / (xi - xg))
    If (xi - xg) < 0 Then alfa0 = alfa0 + Pi
End If

da questa parte di codice usciamo col valore di alfa0, cioè con l'angolo formato dalla congiungente tra batricentro palificata a centro del palo.
Sommandovi 90° otteniamo l'angolo alfa, cioe quello della retta su cui giace Tp.

Code: [Select]
alfa = alfa0 + Pi / 2

quindi possiamo calcolarci sia Tx che TY

Code: [Select]
Tx = Mz * r * Cos(alfa) / RiQ
Ty = Mz * r * Sin(alfa) / RiQ

adesso non ci resta che scrivere il blocco del select case

Code: [Select]
Select Case flag

    Case 1
        TAgliDaTorsione = Tx
    Case 2
        TAgliDaTorsione = Ty
    Case Else
        TAgliDaTorsione = 0
End Select


finita. Salviamo e torniamo sul foglio di lavoro. Se non vi sono errori questa funzione dovrebbe apparire nella lista delle funzioni definite dall'utente.

P.S.: Corretta la riga     If (xi - xg) < 0 Then alfa0 = alfa0 + Pi /2 in     If (xi - xg) < 0 Then alfa0 = alfa0 + Pi
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 21 May , 2012, 20:40:17 PM
Voglio far notare che nella parte di codice:

    If yi = yg Then
    ' il centro del palo coincide col baricentro della palificata
    ' il palo non è sollecitato da taglio dovuto alla torsione
        Tx = 0
        ty = 0
    ' a questo punto dovremmo saltare alla parte finale per farci restituire i risultati
    ' siccome in ogni caso avremmo valore nullo, conviene fissare il valore della funzione a zero
    ' ed uscire
        TAgliDaTorsione = 0
        Exit Function
    End If

sono praticamente inutili le istruzioni che calcolano Tx e Ty.
avremmo potuto risolvere la questione con sole 4 righe:

    If yi = yg Then
        TAgliDaTorsione = 0
        Exit Function
    End If


anche la parte di codice che segue:
    If yi > yg Then alfa0 = Pi / 2
    If yi < yg Then alfa0 = -Pi / 2
avremmo potuto risolverla diversamente con unica istruzione:

alfa0= abs(yi-yg)*(pi/2)/(yi-yg)
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 21 May , 2012, 21:44:57 PM
Errata
Code: [Select]
r = sqrt((xi - xg) ^ 2 + (yi - yg) ^ 2)

Corrige
Code: [Select]
r = sqr((xi - xg) ^ 2 + (yi - yg) ^ 2)
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 22 May , 2012, 10:51:13 AM
Finalmente siamo nelle condizioni di procedere alla distribuzione degli sforzi sui pali. Si tratta di popolare di formule le tre colonne indicate con Np, Tp ed Mp della tabella che abbiamo predisposto nel foglio "distrib".
Ci accorgeremo, però, che quando dovremo inserire la formula relativa a Tp essa sarà troppo lunga, quindi poco gestibile e probabile fonte di errore. Ci conviene pertanto calcolare separatamente le due componenti Tpx e Tpy ed a seguire calcolare Tp. Aggiungiamo pertanto due colonne che chiamiamo Tpx e Tpy.

(http://img580.imageshack.us/img580/2613/tpxtpy.jpg) (http://imageshack.us/photo/my-images/580/tpxtpy.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Adesso conviene dare dei nomi specifici alle celle i cui valori intervengono nelle formule per evitare di scrivere formule troppo lunghe dato che i valori si trovano in altri fogli.
Per esempio, lo sforzo normale sull'i-esimo palo lo determiniamo scrivendo la formula:

Npi = Apo*[ Fz/Atot + Mx *(yi-YG)/Jxx - My*(xi-XG)/Jyy ]

diamo quindi i nomi:
- Apo alla cella che contiene l'area del singolo palo
- Atot alla cella che contiene l'area dell'intera palificata
- Jxx e Jyy alla due celle che contengono le inerzie della palificata rispetto agli assi baricentrici.

Fatto questo, posizioniamoci nella prima cella della tabella che conterrà gli sforzi sui pali (nel mio esempio la cella C11) e digitiamo la formula:

=Apo*($E$6/Atot +$F$6*(Foglio1!F35-YG)/Jxx-$G$6*(Foglio1!E35-XG)/Jyy)

(http://img259.imageshack.us/img259/8539/npik.jpg) (http://imageshack.us/photo/my-images/259/npik.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Qui vi faccio notare che le tre sollecitazioni che intervengono nella formula ( Fz, Mx ed My) sono richiamate con riferimento assoluto mentre i valori di xi e yi vengono richiamati con riferimento relativo. In questo modo durante la copia della formula nelle celle sottostanti, il riferimento alle sollecitazioni rimane invariato mentre le coordinate xi e yi varieranno spostandosi nella giusta posizione.
Vi ricordo che un riferimento assoluto si scrive antecedendo la riga o la colonna o entrambi col simbolo $
$E$6 - significa che nel corso di una copia il riferimento non cambia
$E6 - significa che nel corso di una copia il riferimento cambia ma senza cambiare la colonna, vale a dire che se copiamo la cella con la formula che contiene quel riferimento assoluto du due colonne a destra e due righe in basso, nella copia apparirà il nuovo riferimento $E8
E$6 - uguale alla precedente ma in questo caso viene mantenuta fissa la riga
E6- il riferimento si aggiorna con la copia

Per passare dalla notazione "relativa" (E6) a quella "assoluta" ($E$6), basta premere il tasto F4 col cursore posizionato accanto al riferimento nella formula. Ulteriori pressioni del tasto F4 faranno passare la notazione da $E$6 a $E6 a E$6 per poi tornare a E6.

Digitata la formula copiamola con trascinamento nelle celle in basso ottenendo una cosa del genere:

(http://img33.imageshack.us/img33/6758/npi1.jpg) (http://imageshack.us/photo/my-images/33/npi1.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Ci accorgiamo di avere dei termini non desiderati cioè lo sforzo normale anche nel rigo dove non c'è palo

risolviamo la cosa con un Se() come abbiamo gia fatto in precedenza.
Torniamo nella cella iniziale e correggiamo la formula ivi digitata racciudendola all'interno di una istruzione SE

=se(B11>0;Apo*($E$6/Atot +$F$6*(Foglio1!F35-YG)/Jxx-$G$6*(Foglio1!E35-XG)/Jyy);0)

Ricopiando questa nuova formula nelle celle sottostanti, otteniamo finalmente quanto desiderato

(http://img854.imageshack.us/img854/6015/npi2.jpg) (http://imageshack.us/photo/my-images/854/npi2.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 22 May , 2012, 11:46:40 AM
Passiamo adesso a riempire la colonna dei Tpx

sappiamo che è data dalla somma di due termini: quello dovuto alla azione orizzontale Fx (= Fx/NP) e quello dovuto alla torsione. Per calcolare quest'ultimo abbiamo scritto la funzione apposita TAgliDaTorsione().

Posizioniamoci nella prima cella della colonna Tpx e iniziamo a digitare
=$C$6/NP +     [in cui la cella $C$6, riportata come riferimento assoluto dato che non vogliamo che poi cambi nella copia, si riferisce al valore di Fx)

a questo punto premiamo l'iconetta che sta accanto al rigo di inserimento formula  ed apparirà il dialogo di scelta della funzione. Scorriamo fino a far visualizzare quelle definite dall'utente,

(http://img525.imageshack.us/img525/7256/tpx1.JPG) (http://imageshack.us/photo/my-images/525/tpx1.JPG/)

Uploaded with ImageShack.us (http://imageshack.us)


selezioniamo la nostra funzione e premiamo OK. Apparirà il dialogo di richiesta di inserimento dei parametri della nostra funzione in maniera praticamente identita a qualsiasi altra funzione incorporata:

(http://img10.imageshack.us/img10/8908/tpx2m.jpg) (http://imageshack.us/photo/my-images/10/tpx2m.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Premendo sull'iconetta che ho evidenziato nell'immagine, sarà possibile navigare tra i vari fogli alla ricerca della cella che contiene il parametro richiesto.

Completiamo il dialogo  coi restanti dati, inserendo alla fine il valore 1 al parametro flag, mentre quando inseriremo il parametro Mz avremo cura di premere anche il tasto F4 per trasformare in  il riferimento da relaivo ad assoluto.

(http://img521.imageshack.us/img521/6955/tpx3.jpg) (http://imageshack.us/photo/my-images/521/tpx3.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Alla pressione del tasto Ok vedremo apparire il risultato nella cella. Adesso copiamo trascinadola la cella in quelle sottostanti. Anche qui ci accorgiamo di avere dei terminiindesiderati ed anche qui risolveremo la questione con un mirabolante SE().

Adesso siamo nelle condizioni di poter controllare se i risultati ottenuti sono quelli corretti o in altre parole se la funzione funziona correttamente.


Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 22 May , 2012, 11:56:35 AM
Primo intoppo: la funzione non funziona o qualcosa non funziona.

Infatti, proviamo a fare la somma di tutti i termini Tpx ottenuti ed otteniamo il valore -1077.24 kN contro un valore di -1012.42 di Fx.

Non abbiamo rispettato la condizione di equilibrio alla traslazione secondo l'asse x.

Adesso sono dolori per andare a scovare dove abbiamo commesso l'errore. Il mio primo pensiero va verso la funzione ed in questa va verso la determinazione dell'angolo alfa0.
Per poter scovare l'errore dobbiamo separare (anche se solo temporaneamente)  i diversi contributi in modo da poter circonscrivere la zona d'errore.


P.S.: Allarme rientrato. Stanotte lo avevo già individuato ed avevo apportato stamattina la correzione in un Post Scriptum qui nel 3d, ma avevo dimenticato ad apportare la stessa correzione nel mio codice.
Trattavasi della correzione:

da "    If (xi - xg) < 0 Then alfa0 = alfa0 + Pi/2"
  a "    If (xi - xg) < 0 Then alfa0 = alfa0 + Pi"
 
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 22 May , 2012, 12:28:52 PM
Procediamo analogalmente con la colonna di Tpy avendo cura ad inserire i giusti parametri ed il valore 2 al parametro flag. Anche qui metteremo la formula all'interno di una funzione SE.

Passiamo quindi alla determinazione di Tp inserendo la semplice formula:
=RADQ(D11^2+E11^2)

(http://img41.imageshack.us/img41/8027/tpx4.jpg) (http://imageshack.us/photo/my-images/41/tpx4.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Per popolare, infine, la colonna di Mp, diamo prrima il nome "lambda" alla cella contenente questo valore e quindi iseriamo la formula:

=F11*lambda/2

(http://img16.imageshack.us/img16/3280/tpx5.jpg) (http://imageshack.us/photo/my-images/16/tpx5.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Copiamo trascinando ed avremmo finito anche la parte relativa alla distribuzione degli sforzi sui pali.

Adesso ci possiamo divertire a cambiare la celletta con sfondo verdino cambiando quindi il numero della combo da distribuire e vedremo i risultati in un battibaleno.

Come sempre, prima di dichiarare completata una parte di calcolo occorre condurre le verifiche a mano o con altri strumenti che tutto è a posto e correttamente calcolato.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 22 May , 2012, 19:03:44 PM
Ok.

Controlliamo se i risultati sono corretti. Per far questo penso di verificare che sono rispettate le equazioni cardinali della statica ;
equazione di equilibrio alla traslazione verticale
equazione di equilibrio alla traslazione lungo x
equazione di equilibrio alla traslazione lungo y
equazione di equilibrio alla rotazione attorno all'asse xx baricentrico
equazione di equilibrio alla rotazione attorno all'asse yy baricentrico
equazione di equilibrio alla rotazione attorno all'asse zz baricentrico

Penso che se risultano verificate tutte e sei le equazioni di equilibrio si possa affermare che il calcolo è corretto.

Per fare questo sfruttiamo sempre il foglio di calcolo.
Scriviamo la somma di valori della colonna degli NP e controlliamo se il risultato è uguale alla componente Fz. Nella immagine che segue è riportata la verifica con le indicazioni in rosso.

(http://img710.imageshack.us/img710/3750/equz.jpg) (http://imageshack.us/photo/my-images/710/equz.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Stessa cosa facciamo per gli Tpx: facciamo la somma dei valori della colonna dei Tpx e controlliamo se il risultato è uguale alla componente Fx della risultante. Idem per Tpy.
Nella immagone che segue sono riportate le due verifiche

(http://img225.imageshack.us/img225/7064/equxy.jpg) (http://imageshack.us/photo/my-images/225/equxy.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Fino ad adesso tutto ok. Vi anticipo che le prossime verifiche saranno negative (lo sapevo già fin dall'inizio poiche mi ci sono duramente scontrato in una occasione precedente) e poi parleremo dei motivi apportandone le correzioni
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: bertolana on 22 May , 2012, 19:05:02 PM

Nell'ipotesi di palo impedito di ruotare alla testa sottoposto ad azione orizzontale ivi applicata, l'andamento del momento flettente è una funzione (che potete trovare in qualsiasi pubblicazione) il cui valore massimo risulta pari a:

Mpmax = Tp*lambda/2

in cui il parametro lambda risulta essere pari a:

lambda= radq{radq[ 4*E*J/(kh*Dp) ] }
in cui sono:
E = modulo elastico longitudinale del palo
J = momento di inerzia del palo
Kh = modulo laterale di Winkler
Dp = diametro del palo.



scusami afazio ma ripercorrendo la trattazione mi sono accorto che forse c'è qcs che non va nella
definizione di Mp e di lambda:
per me lambda dalla teoria della trave su suolo elastico è 2*pigreco/alfa
con alfa= [(Kh*Dp)/(4*E*J)]^0.25
e Mp= Tp/(2*alfa)

...ho provato a rigirare la tua formula ma non mi torna! sbaglio qualcosa?

grazie e complimenti per la trattazione veramente esaustiva, didattica e stimolante 
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 22 May , 2012, 19:45:25 PM
Per il controllo dell'equilibrio alla rotazione attorno all'asse x baricentrico ed attorno all'asse y baricentrico, dedichiamo due colonne accanto a quelle esistenti atte a contenere i prodotti:

Npi*(yi-yg)   =contributo di momento attorno all'asse xx dello sforzo normale sul palo i-esimo
-Npi*(xi-xg)   =contributo di momento attorno all'asse xx dello sforzo normale sul palo i-esimo

nelle celle sottostanti ne scriviamo le relative formule e nella cella in coda ne facciamo la somma. Otteniamo quanto segue:

(http://img69.imageshack.us/img69/3603/equrot.jpg) (http://imageshack.us/photo/my-images/69/equrot.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Dove sta l'errore?
Dopo essermici sbattuto per parecchio tempo, sono riuscito a capire dove sta l'errore, se di errore si può parlare.

L'errore sta nella formula

Npi = Apo*[ Fz/atot + Mx* (yi*yg)/Jxx - My*(xi*xg)/Jxx ]

in pratica la quantità entro parentesi quadra rappresenta la tensione normale in corrispondenza del baricentro del palo. Questa viene moltiplicata per l'area del palo, come se fosse costante in tutti i punti del palo, ottenendo cosi il valore corretto dello sforzo sul palo ma un valore errato del momento come abbiamo avuto modo di verificare attraverso le verifiche delle condizioni di equilibrio alla rotazione attorno agli assi.

In effetti la tensione normale è linearmente variabile punto per punto all'interno della sezione di ciascun palo. L'integrale delle tensioni normali esteso all'area del palo fornisce sempre il corretto valore di Npi ma l'integrale del prodotto della tensione  per la distanza del punto generico dal centro del palo, non fornisce momento nullo. Per comprenderlo è sufficiente riferirsi per esempio al diagramma triangolare delle spinte sul paramento di un muro. La spinta può essere calcolata moltiplicando il valore del diagramma nel punto medio del muro per l'altezza del muro, ma la risultante non è ubicata nel punto medio. stessa cosa vale nel caso in esame: Npi può essere determinato moltiplicando l'area del palo per la tensione assunta nel suo punto medio, ma la risultante Npi non risulta essere applicata nel centro del palo bensi in un punto da determinare.

Come possiamo correggerlo?
E' ovvio che se vogliamo il valore corretto dobbiamo decidere di imbarcarci su un battello che ci porterebbe in un mare in burrasca. Infatti se volessimo iniziare a calcolare il punto di applicazione di ciascun Npi all'interno dell'area del palo (cosa che potremmo anche decidere di fare se ne valesse davvero la pena) dovremmo poi modificare anche il momento flesstente agente lungo il fusto del palo dovendo aggiungere alla testa del palo oltre alla azione T anche il momento di trasporto di Np. A questo punto varierebbe anche lo schema di calcolo per la determinazione dell'andamento del momento flettente lungo il fusto del palo configurandosi adesso un palo impedito di ruotare alla testa e caricato nella sua sezione sommitale da una azione orizzontale e da un momento. Le cose si complicherebbero alquanto e diverrebbero quasi irrisolvibili con excel. Ma vogliomo tutto questo?

Io non ci penso nemmeno e preferisco tornare alle origini, laddove ho ipotizato di voler schematizzare la palificata come un sistema discreto di aree concentrate nei punti baricentrici di ciascun palo. Allora in coerenza con questa ipotesi, che è accettabile ed accettata universalmente, non devo mettere in conto, nel calcolo delle inerzie totali della palificata, le inerzie proprie dei pali.
Infatti fu proprio quando in una occasione decisi di "apportare un maggior rigore" al calcolo delle inerzie considerando anche le inerzie proprie dei pali rispetto ai propri assi baricentrici, che commisi l'errore che mi fu anche difficile da scovare.
Una volta trovato dove stava l'inghippo mi sono chiesto che cosa comportava tornare alle origini in termini di sicurezza. Trascurando le inerzie proprie dei pali si opera a favore della sicurezza anche se come è possibile constatare le differenze dei momenti complessivi agenti rispetto a quelle reagenti sono davvero irrisorie.

Accetto commenti in merito a questa ultima questione.

saluti
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 22 May , 2012, 19:51:13 PM
scusami afazio ma ripercorrendo la trattazione mi sono accorto che forse c'è qcs che non va nella
definizione di Mp e di lambda:
per me lambda dalla teoria della trave su suolo elastico è 2*pigreco/alfa
con alfa= [(Kh*Dp)/(4*E*J)]^0.25
e Mp= Tp/(2*alfa)

...ho provato a rigirare la tua formula ma non mi torna! sbaglio qualcosa?

grazie e complimenti per la trattazione veramente esaustiva, didattica e stimolante 

Praticamente il tuo alfa è l'inverso di quello che io ho indicato con lambda:
infatti tu riporti:

alfa= [(Kh*Dp)/(4*E*J)]^0.25

mentre io avevo definito

lambda= [(4*E*J)/(Kh*Dp)]^0.25

ciao e grazie
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 22 May , 2012, 20:08:57 PM
Ed allora, torniamo sul foglio principale ed apportiamo le correzioni togliendo da Jtx e Jty il contributo dovuto all'inerzia propria del palo. Nella immagine che segue è riportata la correzione a Jtx

(http://img24.imageshack.us/img24/5250/corr01.jpg) (http://imageshack.us/photo/my-images/24/corr01.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Tornando sul foglio dove stavamo conducendo le verifiche dell'equilibrio vedremo tornare tutto a posto.

Ci resta adesso la verifica alla rotazione attorno all'asse zz baricentrico.


Eccola:

(http://img4.imageshack.us/img4/407/corr02.jpg) (http://imageshack.us/photo/my-images/4/corr02.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

ed è positiva.
A questo punto possiamo ritenerci momentaneamente soddisfatti e tentare di andare avanti.

saluti
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 23 May , 2012, 23:15:41 PM
Prima di andare avanti, vorrei apportare qualche modifica ai vari fogli. Intanto vorrei aumentare sia il numero massimo dei vertici della poligonale e sia il numero massimo dei pali portando il primo a 15 ed il secondo a 20
Poi vorrei che nella colonna che riporta il numero progressivo dei vertici (ed anche in quella che riporta il numero progressivo dei pali) la numerazione fosse proposta in automatico da excel partendo da 1 e fermandosi al numero dato in input. Infine vorrei che le tabelle fossero "più pulite" cioè che non fossero presenti quegli inutili zeri nelle righe dove non sono presenti vertici o pali.

Prendiamo per esempio la tabella delle coordinate dei vertici della poligonale:

(http://img341.imageshack.us/img341/5503/auomatic.jpg) (http://imageshack.us/photo/my-images/341/auomatic.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Cambiando il numero dei vertici della poligonale, per esempio da 7 a 10, excel mi deve scrivere in automatico i numeri da 1 a 10 e fermarsi li e non devono apparire quegli zeri che erano stati messi per evitare termini indesiderati.

La questione della numerazione la possiamo risolvere inserendo a partire dalla seconda riga (quindi dalla cella dove ci sta il 2) una formula che inserisce la somma del valore della cella precedente + 1. Questo fino a quando il valore della cella precedente è minore di NV. altrimenti facciamo scrivere la stringa vuota "". Quindi dobbiamo usare un SE. Ma potendo trovare nella cella precedente il valore di stringa vuota, dobbiamo imporre al Se una condizione E.  La condizione E accetta due o piu' condizioni logiche e avra come rissultato il valore VERO solo se tutte le condizioni logiche della funzione E sono vere. Trattasi pertanto dell'operatore AND di Boole.
Scriveremo pertanto la funzione:
= SE(  E(cella<>"";cella<NV)  ;   cella+1   ;     "")

Nel nostro caso posizionandoci nella cella D14 digiteremo la formula

=SE(E(D13<>"";D13<NV);D13+1;"")

e la copieremo in tutte le celle sottostanti

(http://img600.imageshack.us/img600/3221/auomatic1.jpg) (http://imageshack.us/photo/my-images/600/auomatic1.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Adesso occupiamoci di far sparire gli zeri che non desideriamo.
Per fare scrivere questi zeri al posto degli eventuali termini indesiderati, avevamo inserito le formule antro una funzione SE. Qualcosa del tipo:

=SE(D14>0;E14-E13;0)

Sarà sufficiente modificare la condizione del SE nella seguente:

=SE(D14<>"";E14-E13;"")

modifica che si apportara anche  alle formule della colonna appresso e vedremo sparire gli zeri. Per contro visualizzeremo una sfilza di errori ###### che toglieremo inserendo le formule di quesste colonne con errori sempre entro una funzione SE.

(http://img543.imageshack.us/img543/923/auomatic2.jpg) (http://imageshack.us/photo/my-images/543/auomatic2.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Procediamo col Se anche per le colonne Sxi ed Syi ed avremo la tabella pulita dagli zeri inutili e senza segnalazione di errori
Se proviamo a cambiare il numero dei vertici vedremo la numerazione aggiornarsi automaticamente. Sarà cura dell'utente aggiungere le nuove coordinate o togliere quelle eventualmente presenti in piu' o apportare le correzioni alla coordinate agendo solo e soltanto nelle celle verdi antecedute dal numero di vertice.

(http://img36.imageshack.us/img36/7264/auomatic3.jpg) (http://imageshack.us/photo/my-images/36/auomatic3.jpg/)

Uploaded with ImageShack.us (http://imageshack.us)

Stessa cosa puo farsi nella tabella delle coordinate dei pali e, perchè no, anche nelle tabella delle combo e dei carichi




Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 24 May , 2012, 19:52:54 PM
Ho deciso di mettere in condivisione quanto fin qui prodotto.

https://www.box.com/s/c86a7f90d677aba69ad4 (https://www.box.com/s/c86a7f90d677aba69ad4)
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: ferrarialberto on 24 May , 2012, 22:44:56 PM
Ho dato un'occhiata veloce al tuo foglio di calcolo, ottimo.
Se mi consenti, ha un po' il limite di una trattazione alla Winkler con valore costante di rigidezza (in genere varia sensibilmente con la profondità). Poi ci sono molte altre trattazioni e casistiche oltre Winkler, comunque è già un ottimo punto di partenza.

Ciao.
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: afazio on 25 May , 2012, 08:02:24 AM
Ho dato un'occhiata veloce al tuo foglio di calcolo, ottimo.
Se mi consenti, ha un po' il limite di una trattazione alla Winkler con valore costante di rigidezza (in genere varia sensibilmente con la profondità). Poi ci sono molte altre trattazioni e casistiche oltre Winkler, comunque è già un ottimo punto di partenza.

Ciao.

Conosco le altre trattazioni che potrebbero anche essere sviluppate qui, ma penso che per gli scopi che mi ero proposto il modello di Winkler con coefficiente laterale costante era gia sufficiente.

Grazie. Saluti
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: quattropassi on 02 July , 2012, 19:58:55 PM
Conosco le altre trattazioni che potrebbero anche essere sviluppate qui, ma penso che per gli scopi che mi ero proposto il modello di Winkler con coefficiente laterale costante era gia sufficiente.
Grazie. Saluti

Sto provando a smanettare con "scarto", con dimensionamenti dinamici e con... con una UDF raccattata in rete sull' "ottimerrimo"
http://newtonexcelbach.wordpress.com/2012/05/03/using-udfs-continuous-beam-example-3/ (http://newtonexcelbach.wordpress.com/2012/05/03/using-udfs-continuous-beam-example-3/)
Ho provato qualcosa impiegando anche quanto fatto da g.iaria con i grafici a dimensione "comandata".
Beh... sembra interessante...
https://www.box.com/s/29ff8061dd178c5a8a32 (https://www.box.com/s/29ff8061dd178c5a8a32)

A questo punto, afazio, quando ce lo insegni un po' di VBA per autocad?
Da qui (Palatella mi ha praticamente introdotto alle UDF già 8 anni fa) http://digilander.libero.it/carlopala/vb/dvbtutor0.htm (http://digilander.libero.it/carlopala/vb/dvbtutor0.htm) sembrerebbe interessante.

Avevo visto cose "ghiotte" in certe tue applicazioni (la macro per il diesgno di pali e sezioni)

Tra l'altro anche questa
http://www.cadlandia.com/topic.asp?TOPIC_ID=13098 (http://www.cadlandia.com/topic.asp?TOPIC_ID=13098)   http://www.cadlandia.com/cgi-bin/upload/Aniello%20Annunziata/201052812446_ProprietaMassaEstese.zip (http://www.cadlandia.com/cgi-bin/upload/Aniello%20Annunziata/201052812446_ProprietaMassaEstese.zip) 
mi sembrava interessante per future/eventuali personalizzazioni.

 :ciau:
Title: Re: VBA- Lezione 2 - Come far interagire foglio-codice
Post by: quattropassi on 04 July , 2012, 20:25:25 PM
Chessò... si potrebbe applicare qualcosa di simile ad un grafico dinamico...
per esempio:
https://www.box.com/s/adc8cf20508c50786f9a (https://www.box.com/s/adc8cf20508c50786f9a)

 :byebye: