Author Topic: VBA- Lezione 2 - Come far interagire foglio-codice  (Read 39611 times)

0 Members and 1 Guest are viewing this topic.

Offline afazio

  • Veterano del forum
  • ****
  • Posts: 663
  • Karma: 273
  • dovizio mi delizio
    • CI si vede al Bar
Re: VBA- Lezione 2 - Come far interagire foglio-codice
« Reply #30 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.
« Last Edit: 19 May , 2012, 22:49:23 PM by afazio »
« Ogni qualvolta una teoria ti sembra essere l’unica possibile, prendilo come un segno che non hai capito né la teoria né il problema che si intendeva risolvere. »
K.P.

Offline afazio

  • Veterano del forum
  • ****
  • Posts: 663
  • Karma: 273
  • dovizio mi delizio
    • CI si vede al Bar
Re: VBA- Lezione 2 - Come far interagire foglio-codice
« Reply #31 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;



Uploaded with ImageShack.us

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



Uploaded with 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;



Uploaded with 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.
« Last Edit: 19 May , 2012, 23:36:07 PM by afazio »
« Ogni qualvolta una teoria ti sembra essere l’unica possibile, prendilo come un segno che non hai capito né la teoria né il problema che si intendeva risolvere. »
K.P.

Offline afazio

  • Veterano del forum
  • ****
  • Posts: 663
  • Karma: 273
  • dovizio mi delizio
    • CI si vede al Bar
Re: VBA- Lezione 2 - Come far interagire foglio-codice
« Reply #32 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.
« Last Edit: 20 May , 2012, 09:39:14 AM by afazio »
« Ogni qualvolta una teoria ti sembra essere l’unica possibile, prendilo come un segno che non hai capito né la teoria né il problema che si intendeva risolvere. »
K.P.

Offline afazio

  • Veterano del forum
  • ****
  • Posts: 663
  • Karma: 273
  • dovizio mi delizio
    • CI si vede al Bar
Re: VBA- Lezione 2 - Come far interagire foglio-codice
« Reply #33 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



Uploaded with 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

« Ogni qualvolta una teoria ti sembra essere l’unica possibile, prendilo come un segno che non hai capito né la teoria né il problema che si intendeva risolvere. »
K.P.

Offline afazio

  • Veterano del forum
  • ****
  • Posts: 663
  • Karma: 273
  • dovizio mi delizio
    • CI si vede al Bar
Re: VBA- Lezione 2 - Come far interagire foglio-codice
« Reply #34 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

« Last Edit: 20 May , 2012, 11:03:10 AM by afazio »
« Ogni qualvolta una teoria ti sembra essere l’unica possibile, prendilo come un segno che non hai capito né la teoria né il problema che si intendeva risolvere. »
K.P.

Offline afazio

  • Veterano del forum
  • ****
  • Posts: 663
  • Karma: 273
  • dovizio mi delizio
    • CI si vede al Bar
Re: VBA- Lezione 2 - Come far interagire foglio-codice
« Reply #35 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
« Ogni qualvolta una teoria ti sembra essere l’unica possibile, prendilo come un segno che non hai capito né la teoria né il problema che si intendeva risolvere. »
K.P.

Offline afazio

  • Veterano del forum
  • ****
  • Posts: 663
  • Karma: 273
  • dovizio mi delizio
    • CI si vede al Bar
Re: VBA- Lezione 2 - Come far interagire foglio-codice
« Reply #36 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
« Last Edit: 20 May , 2012, 11:38:50 AM by afazio »
« Ogni qualvolta una teoria ti sembra essere l’unica possibile, prendilo come un segno che non hai capito né la teoria né il problema che si intendeva risolvere. »
K.P.

Offline afazio

  • Veterano del forum
  • ****
  • Posts: 663
  • Karma: 273
  • dovizio mi delizio
    • CI si vede al Bar
Re: VBA- Lezione 2 - Come far interagire foglio-codice
« Reply #37 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.
« Last Edit: 20 May , 2012, 11:52:38 AM by afazio »
« Ogni qualvolta una teoria ti sembra essere l’unica possibile, prendilo come un segno che non hai capito né la teoria né il problema che si intendeva risolvere. »
K.P.

Offline afazio

  • Veterano del forum
  • ****
  • Posts: 663
  • Karma: 273
  • dovizio mi delizio
    • CI si vede al Bar
Re: VBA- Lezione 2 - Come far interagire foglio-codice
« Reply #38 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.
« Ogni qualvolta una teoria ti sembra essere l’unica possibile, prendilo come un segno che non hai capito né la teoria né il problema che si intendeva risolvere. »
K.P.

Offline afazio

  • Veterano del forum
  • ****
  • Posts: 663
  • Karma: 273
  • dovizio mi delizio
    • CI si vede al Bar
Re: VBA- Lezione 2 - Come far interagire foglio-codice
« Reply #39 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"



Uploaded with ImageShack.us

Avrete, insieme agli atri strumenti anche il seguente:



Uploaded with 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.



Uploaded with 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.
« Ogni qualvolta una teoria ti sembra essere l’unica possibile, prendilo come un segno che non hai capito né la teoria né il problema che si intendeva risolvere. »
K.P.

Offline afazio

  • Veterano del forum
  • ****
  • Posts: 663
  • Karma: 273
  • dovizio mi delizio
    • CI si vede al Bar
Re: VBA- Lezione 2 - Come far interagire foglio-codice
« Reply #40 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"



Uploaded with 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
« Ogni qualvolta una teoria ti sembra essere l’unica possibile, prendilo come un segno che non hai capito né la teoria né il problema che si intendeva risolvere. »
K.P.

Offline afazio

  • Veterano del forum
  • ****
  • Posts: 663
  • Karma: 273
  • dovizio mi delizio
    • CI si vede al Bar
Re: VBA- Lezione 2 - Come far interagire foglio-codice
« Reply #41 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:



Uploaded with ImageShack.us

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



Uploaded with 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



Uploaded with 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:



Uploaded with 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.
« Last Edit: 20 May , 2012, 22:36:21 PM by afazio »
« Ogni qualvolta una teoria ti sembra essere l’unica possibile, prendilo come un segno che non hai capito né la teoria né il problema che si intendeva risolvere. »
K.P.

Offline afazio

  • Veterano del forum
  • ****
  • Posts: 663
  • Karma: 273
  • dovizio mi delizio
    • CI si vede al Bar
Re: VBA- Lezione 2 - Come far interagire foglio-codice
« Reply #42 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.

« Last Edit: 20 May , 2012, 23:34:28 PM by afazio »
« Ogni qualvolta una teoria ti sembra essere l’unica possibile, prendilo come un segno che non hai capito né la teoria né il problema che si intendeva risolvere. »
K.P.

zax2010

  • Guest
Re: VBA- Lezione 2 - Come far interagire foglio-codice
« Reply #43 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.

Offline afazio

  • Veterano del forum
  • ****
  • Posts: 663
  • Karma: 273
  • dovizio mi delizio
    • CI si vede al Bar
Re: VBA- Lezione 2 - Come far interagire foglio-codice
« Reply #44 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
« Ogni qualvolta una teoria ti sembra essere l’unica possibile, prendilo come un segno che non hai capito né la teoria né il problema che si intendeva risolvere. »
K.P.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24