problema codice



  • problema codice
    di Andrea (utente non iscritto) data: 29/08/2012 11:02:56

    Ciao a tutti, avrei bisogno di aiuto. Allora io ho un codice che mi genera diversi grafici (istogrammi) che hanno lo stesso formato ma dati diversi, sopra ogni barra devo inserire una textBox con dei valori di volta in volta diversi, per fare ciò però necessito di conoscere la posizione delle barre che formano il grafico dovendo inserire queste textBox in modo dinamico.

    Ho provato così (estrapolo solo la riga d'interesse):

    Sub dimensione_barra ()

    Dim valore as variant

    Set a = ActiveChart.SeriesCollection(1).Points(3) ' Nel caso prendo la 3 barra della serie
    valore = a.top
    valore = a.left

    End

    Però l'oggetto creato mi dice non supportare tale funzione

    Vi ringrazio cmq per l'aiuto e la disponibilità



  • di Vecchio Frac data: 29/08/2012 15:47:58

    1) versione di Excel ... ?
    2) evita di dichiarare Variant le variabili, si spreca memoria; se ti serve una String usa String
    3) valore = a.top viene perso nel momento in cui subito dopo assegni valore = a.left
    4) ogni Sub deve terminare con "End Sub"
    5) metti un oggetto più chiaro

    Ciò premesso, sto esaminando il caso :)





  • di Andrea (utente non iscritto) data: 29/08/2012 15:55:25

    Grazie, e scusa per l'oggetto, effettivamente molto poco chiaro!!..cmq ho sbagliato di riportare, avevo dichiarato anche valore1 a cui poi passavo il valore left, ed ho chiuso con end sub....mi scuso ma ho riportato velocemente le due righe. Grazie per il consiglio sul variant, non sapevo che mi andava ad occupare più memoria!!



  • di Andrea (utente non iscritto) data: 29/08/2012 15:56:22

    cmq excel 2003..thanks



  • di Vecchio Frac data: 29/08/2012 16:25:20

    Ok.
    Ci sto sbattendo la testa ma forse non è chiaro l'obiettivo :)
    Tu vuoi conoscere i "valori" associati alla barra del grafico di quella serie?
    Non ti basta dire ad Excel che vuoi i valori in testa ad ogni barra?
    Perchè mi sa che ottenere larghezza e altezza (in punti?) di ogni singola barra non è proprio usuale e forse no è nemmeno utile.
    Leggo anche che si può variare l'overlap ma forse non è quel che ti serve.
    Magari illustra il problema e proveremo a risolverlo insieme :)





  • di Andrea (utente non iscritto) data: 29/08/2012 16:42:44

    Innanzitutto grazie per l'aiuto!!
    Ti faccio un esempio:

    Ho un grafico ISTOGRAMMA IN PILA e su ogni barra devo inserire il valore totale attraverso una casella di testo, essendo però questo grafico dinamico necessito di capire la posizione delle barre per capire dove mettere la textbox (che deve stare sempre sopra la barra a mò di etichetta). Quindi se riesco a trovare il top e il left delle barre riesco di conseguenza a posizionare le caselle di testo in modo dinamico. Spero di essere stato chiaro




  • di Vecchio Frac data: 30/08/2012 08:30:11

    Sarò di coccio, ma ti chiedo: "su ogni barra devo inserire il valore totale attraverso una casella di testo" significa che sopra ogni barra vuoi vedere il dato di quel punto della serie?

    Perché se è così Excel ti permette già di farlo, ma lo saprai già: click destro sopra una barra, Formato serie dati..., nella linguetta Etichette dati --> frame "L'etichetta contiene" --> spunta la voce "valore"





  • di Andrea (utente non iscritto) data: 30/08/2012 09:16:11

    Si l'idea è quella, il problema è che essendo un istogramma a pila ho tante serie, quindi non si riesce ad inserire l'etichetta purtroppo. Mi sa che non si riesce a determinare la posizione delle barre, vero?



  • di Vecchio Frac data: 30/08/2012 09:39:48

    Ho creato un istogramma impilato con tre serie di dati, e per ogni serie, cliccando destro, Formato serie dati etc riesco, per ogni singola colonnina impilata, ad avere il rispettivo valore nella textbox (che poi si può formattare con carattere e dimensioni desiderate).
    Ti allego l'esempio, sempre sperando che sia quello che vuoi.
    Probabilmente il risultato si ottiene anche programmaticamente, ma se lo fai a mano è meno complicato :)





  • di Andrea (utente non iscritto) data: 30/08/2012 10:03:07

    Il problema è che a me serve il totale di tutte le pile impilate, quindi il totale di tutte le etichette della barra. Grazie mille cmq per la tua disponibilità.



  • di Vecchio Frac data: 30/08/2012 10:40:38

    La cosa più veloce che mi viene in mente è creare una colonna (nascosta) con la somma delle righe dei dati e utilizzare quella come titolo per l'asse delle categorie X.
    Oppure aggiungi la stessa serie al grafico come pila sovrapposta e imposti solo per questa il valore della serie.
    Riallego l'esempio modificato.





  • di Andrea (utente non iscritto) data: 30/08/2012 12:09:25

    Il problema è che a me serve il totale di tutte le pile impilate, quindi il totale di tutte le etichette della barra. Grazie mille cmq per la tua disponibilità.



  • di Andrea (utente non iscritto) data: 30/08/2012 12:13:19

    Sono riuscito a risolvere così, ho aggirato il problema. Grazie mille cmq per il tuo aiuto
     
    Sub prova_CaselleTesto()
    
    Dim Topgrafico, moltiplicatoredecremento, leftgrafico, altezzagrafico, altezzassex, maxassex, unitassex, larghezzagrafico, larghezzassey, VarTop, VarLeft, Valorebarra, dimensioneAltezza, dimensioneLarghezza, Top, Left, costanteTop As Integer
    
    VarTop = 19.5 ' differenza tra la posizione top della parte esterna e la parte interna del grafico
    
    VarLeft = 57 'differenza tra la posizione left della parte esterna e la parte interna del grafico, lato destro
    
    costanteTop = 20
    
    costanteLeft = 40
    
    
    ActiveSheet.ChartObjects("Grafico 1").Select
    
    Set Posgrafico = ActiveSheet.ChartObjects("Grafico 1")
    
    Topgrafico = Posgrafico.Top
    leftgrafico = Posgrafico.Left
    altezzagrafico = Posgrafico.Height
    larghezzagrafico = Posgrafico.Width
    
    Set assex = ActiveChart.Axes(xlValue)
    
    maxassex = assex.MaximumScale
    unitassex = assex.MajorUnit
    altezzassex = assex.Height
    
    Set assey = ActiveChart.Axes(xlCategory)
    
    larghezzassey = assey.Width
    
    ' dimensione e altezza delle barre
    
    
    For i = 1 To 3
    
        moltiplicatoredecremento = 4
    
        Valorebarra = Cells(i, 2).Value
        
        dimensioneAltezza = (altezzassex * Valorebarra) / maxassex
        
        Top = Topgrafico + VarTop + altezzassex - dimensioneAltezza - costanteTop
        
        decrementoleft = larghezzassey / 3
        
        moltiplicatoredecremento = moltiplicatoredecremento - i
        
        Left = leftgrafico + larghezzagrafico - VarLeft - (decrementoleft * moltiplicatoredecremento) + costanteLeft
        
        Set testo = ActiveSheet.Shapes("Casella di testo " & i)
        
        testo.Top = Top
        testo.Left = Left
        
        
    Next i
    
    
    End Sub