Baricentro mobile con Macro

Versione Completa   Stampa   Cerca   Utenti   Iscriviti     Condividi : FacebookTwitter
L2018
00sabato 8 ottobre 2022 12:40
Buongiorno, mi dispiace vedere il forum silente da troppo tempo, per cui pongo un problemino a mio avviso interessante.

Supponiamo di avere una serie di punti e che questi punti abbiano dei valori di coordinata, geografica o cartesiana.
se noi li consideriamo coordinate geografiche o cartesiane saremmo tentati di costruire un grafico che poi non sarebbe più molto facile da gestire nel foglio, almeno per quanto mi riguarda o per quanto ne so io.
Se invece queste coordinate le scriviamo in una colonna A (es. 4,6) o in 2 colonne A,B di un foglio (es. A=4, B=6), potremmo facilmente, con una macro, estrapolare la media dei valori delle ascisse e la media dei valori delle ordinate.
in questo modo otterremmo un valore medio di coordinata che rappresenta esattamente il Baricentro di una poligono costituito dai punti stessi.
La macro quindi ottiene il baricentro facendo la media delle ordinate e delle ascisse.
Ma possiamo rendere più interessante il giochetto facendo in modo che se a fianco dei valori dei punti noi scriviamo una coordinata diversa da quella che c'è nello stesso rigo, colonna(e)precedenti, la macro automaticamente copierà nella nuova colonna i valori preesistenti nella colonna(e) precedente.
Ed anche se noi scriviamo, in C o in C,D una nuova coordinata ma su una riga diversa dalle precedenti, la macro copierebbe in C, o in C,D i valori precedenti, realizzando così una nuova colonna aggiornata di coordinate, su cui calcolare, cioè aggiornare il Baricentro.
Facendo in modo che il processo si ripeta automaticamente ad ogni nuova immissione o variazione di coordinate si otterrebbe una serie di valori di baricentro che puo' essere interpretata come lo spostamento della figura virtuale composta dai poligoni successivi.
Quale è il significato di questo rompicapo ? per esempio lo spostamento di un temporale indicato dallo spostamento dei fulmini.
L'idea mi è venuta dal sito www.lightningmaps.org che mostra i fulmini in tempo reale e quindi lo spostamento di un temporale.
Se l'argomento puo' essere di interesse di chi è appassionato di macro mi piacerebbe avere un'idea di come congegnare il codice, non oso chiedere la pappa pronta, ma io posso creare una macro solo se (quasi)tutto il suo codice riesce a seguire il linguaggio di programmazione che uso, cioè collegare il codice al foglio per far eseguire la macro mi è davvero difficile.
Se interessati potrei provare a fare uno schema più decente di questo qui sotto, ma che al momento non ho.
Spero di essere stato abbastanza chiaro.
Grazie

A B......... C D..........E F
1 3......... 7 9..........7 9
2 4......... 2 4..........2 4
3 6......... 3 6..........3 6
6 8......... 6 8..........6 8
.................................3 9

Risu........ Risult......Risult.
4 7......... 6 9..........7 12

LEO
L2018
00martedì 11 ottobre 2022 12:41
Buongiorno
mi sono accorto di qualche strafalcione nel mio esempio, spero che non sia stato questo il motivo della mancata risposta.
In realtà la tabella, in qualche modo corretta, sarebbe:

A..B......... C....D..........E....F
1..3......... 7....9..........7....9
2..4......... 2....4..........2....4
3..6......... 3....6..........3....6
6..7......... 6....7..........6....7
....................................3....9

Risu........ Risult......Risult.
3..5.........4,5..6,5......4,2..7

sono le medie delle colonne A,B,C,D,E,F e quindi 3,5 - 4,5,6,5 e 4,2,7 sono coordinate da leggere come
X,Y = 3,5
X,Y = 4,5,6,5
X,Y = 4,2,7
eccetera

LEO
Marius44
00martedì 11 ottobre 2022 17:34
Ciao
La mancanza di interlocutori credo dipenda principalmente da due fattori:
a) comprensione di cosa si vuole fare (ed io, ti assicuro, non ho capito quale dovrebbe essere il risultato finale)
b) mancanza di un tuo file che dia un'idea di cosa bisogna fare (o correggere se il risultato non soddisfa).

Ciao,
Mario
L2018
00martedì 11 ottobre 2022 18:20
Ciao Mario

mi permetto di dissentire un po' dalle tue spiegazioni, intanto perchè, come ho già detto, negli ultimi 10-15 giorni non ho visto traffico, certo non si puo' escludere che qualcuno abbia visto e non potuto reagire per non aver capito, ma io tengo quasi continuamente aperto il forum e vedo il traffico.

la tua seconda spiegazione mi sconvolge abbastanza perchè con quella sorta di papiro che ho scritto ero sicuro di essermi spiegato abbastanza bene, certo molto meglio di altri utenti.
Mi permetto di immaginare che una spiegazione, diffusa, chiara, precisa sia sufficiente a rendere l'idea, al punto che lo schema che ho pubblicato poco aggiungerebbe alla spiegazione, per questo non ho messo un file.

Comunque mi adatto, cercherò di mettere un file, che necessariamente non avrà formule, perchè non è nell'ipotesi, e tanto meno avrà una macro, che è proprio ciò che vorrei. Quindi nel file ci sarebbe di nuovo un testo descrittivo e ripetitivo del mio desiderio.
No problem.

Ciao

LEO
L2018
00martedì 11 ottobre 2022 19:00
ed ecco quindi un file di esempio in cui ho solo potuto ripetere nelle righe di istruzione ciò che ho già detto

la macro potrebbe essere un po' flessibile nel suo funzionamento, insomma qualche abbellimento operativo, e in seguito potrebbe essere resa più sofisticata

LEO
rollis13
10martedì 11 ottobre 2022 19:52
Un saluto a tutti.
Fino al calcolo delle medie si sono poi per il resto non ho capito granché:
Option Explicit
Sub CalcolaMedie()
    Dim PR     As Long                            'prima riga
    Dim PC     As Long                            'prima colonna
    Dim UR     As Long                            'ultima riga
    Dim UC     As Long                            'ultima colonna
    Dim x      As Long                            'contatore generico
    PR = 1                                        '<- adeguare come necessita
    PC = 1                                        '<- adeguare come necessita
    x = 1
    UC = Cells(PR, PC).SpecialCells(xlLastCell).Column
    Do Until x = UC
        If Cells(PR, x) <> "" And Cells(PR, x).Offset(0, 1) <> "" Then
            UR = Cells(PR, x).End(xlDown).Row
            Cells(UR + 2, x) = "Media X"
            Cells(UR + 3, x) = WorksheetFunction.Average(Range(Cells(PR, x), Cells(UR, x)))
            Cells(UR + 2, x + 1) = "Media Y"
            Cells(UR + 3, x + 1) = WorksheetFunction.Average(Range(Cells(1, x + 1), Cells(UR, x + 1)))
        End If
        x = x + 1
    Loop
End Sub
L2018
00martedì 11 ottobre 2022 20:38
ciao Rollis

anzitutto GRAZIE dell'ottima macro
in basso alle colonne A e B, sotto alle diciture Media X e Media Y, compaiono 2 valori : 3 e 5
Cerchiamo di immaginarli legati in questo modo: 3,5, cioè 2 valori separati da virgola, che è la notazione di una coordinata cartesiana
io ho messo i valori separati in 2 colonne perché da solo avrei saputo gestirli meglio, ma forse in questo modo ho creato confusione agli altri.
quindi 3,5 è la coordinata di un punto del poligono ideale che ha 4 vertici, quelli delle 4 coppie di valori delle colonne A e B, da intendersi anche esse come coordinate.
Di tale poligono, che non disegniamo per praticità, 3,5 è la coordinata del baricentro geometrico.
Se in successive coppie di colonne scrivo altri valori che non differiscono molto dalle colonne precedenti, posso immaginare il tutto come una successione di poligoni, dei quali il valore in basso, baricentro, indicherà lo spostamento del primo poligono (prime 2 colonne) in una qualche direzione, come una nuvola di blob.
Infatti se io unissi su un piano cartesiano quei valori di baricentro, otterrei una linea e potrei dire che il temporale a cui mi riferisco nel sito che ho citato, e che ha l'estensione delimitata dai suoi fulmini periferici si sta spostando in una determinata direzione.
Troppo cervellotico ? a me non pare, tanto è vero che ho trovato almeno 2 programmi che fanno esattamente questo lavoro, ma vuoi mettere il gusto di un giocattolo fatto in casa ?

Grazie ancora, forse si puo' sofisticare di piu la macro ma ne possiamo riparlare
P.S.
Se ci riesco devo fare in modo che la macro gestisca coppie di colonne anche abbastanza più lunghe di 5 valori, vediamo se trovo i punti da modificare.

LEO


rollis13
00martedì 11 ottobre 2022 22:12

Se ci riesco devo fare in modo che la macro gestisca coppie di colonne anche abbastanza più lunghe di 5 valori, vediamo se trovo i punti da modificare.

Per quest'altro dettaglio non devi fare niente, l'ho già previsto. Con UR calcolo sempre l'ultima riga della colonna ed il risultato viene sempre messo poco sotto, pertanto, basta non superare il numero massimo di righe consentite da Excel -2. Se hai colonne di lunghezza diversa ma vuoi tenere le medie tutte allineate sulla stessa riga basta modificare il calcolo della variabile UR.
Mentre in alto puoi decidere di partire da qualunque riga e colonna, basta adeguare nella macro i valori di PR e PC.
L2018
00martedì 11 ottobre 2022 22:19
avevo sospettato qualcosa del genere, e poco fa ho fatto dei tentativi, devo organizzare meglio le modifiche, grazie ancora

LEO
Marius44
20mercoledì 12 ottobre 2022 10:30
Salve a tutti

Ho fatto mia la macro di @rollis13 (ciao Rolando) ma l'ho applicata all'Evento Worksheet_Change.
Nell'allegato prova a cambiare uno dei valori delle colonne M:N e vedrai il Grafico adeguarsi spostando anche il quadratino rosso (punto medio o baricentro come lo hai chiamato tu).

E' quello che volevi?

Ciao,
Mario
L2018
00mercoledì 12 ottobre 2022 11:24
Ciao Marius

OTTIMO, GRANDIOSO !

è esattamente ciò che mancava, ma mi vergognavo nel richiedere questa miglioria, e neppure avrei saputo farla.
questo aggiornamento risolve anche un altro problema, e cioè che i valori che indicano delle coordinate devono costituire una figura chiusa, al "buio" non ci si riesce.
Qui si vede al volo se la cosa si verifica o meno e quindi il tuo aggiornamento permette di correggere la figura.
Veramente risolutivo.
Grazie, grazie davvero

La LODE accademica.....se il grafico potesse essere indirizzato, almeno alternativamente o a scelta, anche verso (le) altre coppie di colonne
in tal modo si potrebbero correggere anche le altre coordinate, ottenere poligoni successivi, fare di ogni grafico uno screenshot, e il gioco è fatto.
pazzesco

LEO
Marius44
10mercoledì 12 ottobre 2022 15:43
Ciao
Ho aggiunto un altro Foglio e disposto i dati in maniera leggermente diversa.
Questa la macro
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim PR     As Long                            'prima riga
Dim PC     As Long                            'prima colonna
Dim UR     As Long                            'ultima riga
Dim UC     As Long                            'ultima colonna
Dim x      As Long                            'contatore generico
Dim cn As Long
Dim LC1 As String, LC2 As String
Dim valX1 As String, valY1 As String, valX2 As String, valY2 As String
PR = 2                                        '<- adeguare come necessita
PC = 1                                        '<- adeguare come necessita
x = 1
UC = Cells(PR, PC).SpecialCells(xlLastCell).Column
If Not Intersect(Target, Range("J2")) Is Nothing Then
  Do Until x = UC
    If Cells(PR, x) <> "" And Cells(PR, x).Offset(0, 1) <> "" Then
      UR = Cells(PR, x).End(xlDown).Row
      Cells(UR + 2, x) = "Media X"
      Cells(UR + 3, x) = WorksheetFunction.Average(Range(Cells(PR, x), Cells(UR, x)))
      Cells(UR + 2, x + 1) = "Media Y"
      Cells(UR + 3, x + 1) = WorksheetFunction.Average(Range(Cells(1, x + 1), Cells(UR, x + 1)))
    End If
    x = x + 1
  Loop
  'cerca la colonna relativa al grafico da mostrare
  cn = Application.WorksheetFunction.Match(Target, Range(Cells(1, 1), Cells(1, UC)))
  'converte numero colonna in lettera (sia per cn sia per cn+1
  LC1 = Replace(Cells(1, cn).Address(False, False), "1", "")
  LC2 = Replace(Cells(1, cn + 1).Address(False, False), "1", "")
  UR = Cells(PR, cn).End(xlDown).Row 'assume ultima riga dei dati
  valX1 = "Foglio1!$" & LC1 & "$" & PR & ":$" & LC1 & "$" & UR
  valY1 = "Foglio1!$" & LC2 & "$" & PR & ":$" & LC2 & "$" & UR
  valX2 = "Foglio1!" & LC1 & "$" & UR + 3
  valY2 = "Foglio1!" & LC2 & "$" & UR + 3
  UR = Cells(PR, cn).End(xlDown).Row
  'modifica il Grafico
  ActiveSheet.ChartObjects(1).Activate
  ActiveChart.SeriesCollecti0n(1).XValues = valX1
  ActiveChart.SeriesCollecti0n(1).Values = valY1
  ActiveChart.SeriesCollecti0n(2).XValues = valX2
  ActiveChart.SeriesCollecti0n(2).Values = valY2
  ActiveChart.ChartTitle.Text = Target
End If
End Sub


Prova a selezionare un dato nella cella gialla.

Fai sapere. Ciao,
Mario
L2018
00mercoledì 12 ottobre 2022 16:18
anche questa è ottima e comoda modifica, di cui ringrazio, e penso di riuscire ad estenderla un po'
naturalmente l'appetito vien mangiando, ed allora io vorrei incaricarmi di alcune cosette
- restringere a 4 la larghezza delle colonne, in modo che nel foglio entrino più dati, e lo so fare
- eliminare UNA di ogni coppia di colonne vuote, lo so fare
- fissare a 18 o circa il valore di UR, in modo che i risultati colonnari appaiano sulla stessa riga, come giustamente osservava Rollis, lo so fare
- estendere a 10 il range delle Ordinate E delle Ascisse, penso di riuscirci ma non sono sicuro

intanto mi son perso un passaggio nel tentativo di fare io qualcosa, ed è sparito il quadratino rosso importante, forse avendo cambiato i riferimenti alle colonne per averne cancellate una ogni coppia di vuote per risparmio spazio.
ma ora ho il tuo ultimo aggiornamento e ricomincio volenterosamente.
E comunque vedo con piacere che la possibilità di vedere il grafico per le varie colonne di coordinate permette di correggere l'illogicità di certi valori numerici, sempre allo scopo di realizzare poligoni chiusi.

benissimo, un grazie "progressivo"

LEO

Marius44
00mercoledì 12 ottobre 2022 17:16
Ciao
Una volta ebbi a dire: Excel è come il Mediterraneo: ci sono coste frastagliate, sabbiose, insenature, baie, isole, stretti. I Grafici rispetto al Mediterraneo sono come il Mar D'Azov (con la recent guerra tutti sappiamo dove si trova) che è si piccolo ma ha una profondità incredibile."

Avventurarsi nei Grafici è operazione ardua ma piena di soddisfazioni.

Ma non voglio divagare più. Veniamo ai nuovi problemi.
Queste due righe di codice (rifacendomi alla macro di @Rollis13) calcola la Serie 2 che rappresenta il puntino
valX2 = "Foglio1!" & LC1 & "$" & UR + 3 'ascissa
valY2 = "Foglio1!" & LC2 & "$" & UR + 3 'ordinata
che poi vengono passate al Grafico per segnare il quadratino rosso
ActiveChart.SeriesCollecti0n(2).XValues = valX2
ActiveChart.SeriesCollecti0n(2).Values = valY2
Come noterai fanno riferimento alla cella posta 3 righe più in basso della colonna dei valori. Se cambi la posizione della media devi adeguare anche il riferimento. Se vuoi fissarlo a 18 allora invece della variabile UR + 3 devi indicare 18 (e non hai più necessità di andare a recuperare il valore di ogni coppia di colonne.

Se elimini le colonne non avrai alcun problema. L'importante è che ci sia l'intestazione col nome del Grafico che vuoi evidenziare (quello che io avevo posto in A1, D1 e F1. La ricerca che fa la macro cerca la colonna in cui è scritto il titolo che hai scelto.

Aspetto che tu mi dica che hai vinto🤣
Altrimenti chiedi pure.

Ciao,
Mario
L2018
00mercoledì 12 ottobre 2022 17:43
Bella la doppia similitudine Excel-Grafici-Mediterraneo-Azov, infatti per risponderti a tono dico che pur non sapendo nuotare uso il windsurf
mo m'è piaciuta pure questa.
intanto devo leggermi bene la tua spiegazione, e verificarla punto per punto sul campo.
ma devo dire che non ce la faccio per oggi, con questo giochetto interessante ormai ho troppa carne al fuoco

Soprattutto sono invaso da mail di sollecito pagamenti gestori vari a causa di fatture che ricevo via mail e confondo o dimentico, per cui devo sistemare urgentemente. (per caso hai una macro che fa pagare tutto in un solo click ?).

Spero di riuscire ad applicare speditamente per comunicare eventuale vittoria, non è che sia tanto facile, errori ne farò e magari chiederò facendo la rima....

Grazie
As soon as

LEO
Questa è la versione 'lo-fi' del Forum Per visualizzare la versione completa clicca qui
Tutti gli orari sono GMT+01:00. Adesso sono le 13:23.
Copyright © 2000-2024 FFZ srl - www.freeforumzone.com