Help



  • Help
    di Lucas (utente non iscritto) data: 17/09/2012 10:53:51

    Ciao a tutti, posto di seguito. Sono 2 piccole operazioni differenti che compongono la macro: quando uso il comando If..then e la condizione non si verifica, il processo si interrompe (per chiarire io scrivo "then Exit Sub").il mio problema e' che pero' io voglio che si interrompa solo il processo non l'intera Sub (mi riferisco nel caso specifico al secondo pezzo della macro, quella che comincia con Dim i as Integer)

    Ho necessita' di racchiuderla solo in una Sub, e spezzarla in piu' Sub.

    Mi potete aiutare?

    Grazie


     
    Sub Valuemacro()
        
    '    Value Macro
    
        Range("AE5").Select
        ActiveCell.FormulaR1C1 = _
            "=IF(RC[46]=""Shares"",RC[-1]*RC[-12],IF(RC[46]=""Notional"",RC[-1]*RC[-12]/100,""""))"
        Range("AE5").Select
        Selection.AutoFill Destination:=Range("AE5:AE200"), Type:=xlFillDefault
        Range("AE5:AE200").Select
        ActiveWindow.ScrollRow = 212
        ActiveWindow.ScrollRow = 178
        ActiveWindow.ScrollRow = 164
        ActiveWindow.ScrollRow = 140
        ActiveWindow.ScrollRow = 116
        ActiveWindow.ScrollRow = 77
        ActiveWindow.ScrollRow = 39
        ActiveWindow.ScrollRow = 10
        ActiveWindow.ScrollRow = 5
        Dim i As Integer
        For i = 5 To 200
        If Range("BY" & i) = "" Then Exit Sub
     
    
        Dim i As Integer
        For i = 5 To 200
        If Range("A" & i) = "Fixed Income" Then Range("CB" & i) = "Fixed Income"
        If Range("A" & i) = "Cash and Money markets" Then Range("CB" & i) = "Fixed Income"
        If Range("A" & i) = "Alternative Investments" Then Range("CB" & i) = "Growth Assets"
        If Range("A" & i) = "Equity" Then Range("CB" & i) = "Growth Assets"
        If Range("A" & i) = "" Then Exit Sub
    
    



  • di xxx (utente non iscritto) data: 17/09/2012 11:16:36

    ciao

    sostituisci Then Exit Sub
    con Then Exit for

    ciao da xxx


  • Help
    di Lucas (utente non iscritto) data: 17/09/2012 11:17:24

    Mitico! grazie mille! gentilissimo!



  • di Vecchio Frac data: 17/09/2012 13:03:38

    Se hai risolto, del che sono lieto, per cortesia clicca sula casella "Spunta se risolta" (comunque il codice contiene degli errori).
    Grazie :)




  • Help
    di Lucas (utente non iscritto) data: 18/09/2012 04:53:16

    Ciao vecchio Frac! Si' ho in parte risolto..potresti aiutarmi a migliorarla? magari a renderla piu' snella...ma soprattutto, vorrei che andasse bene per piu' fogli, perche' ho provato ad attivarla in un altro foglio e non va...sapresti aiutarmi?
    grazie mille..



  • di Vecchio Frac data: 18/09/2012 08:12:01

    Ti aiutiamo volentieri ma, per cominciare, pubblica l'intera Sub e non soltanto un pezzo :)
    Inoltre se spieghi quello che deve fare la procedura (cioè il problema e il risultato atteso) è meglio.
    Per cominciare a snellire, puoi togliere tutti gli ScrollRow: il registratore di macro registra tutto, anche gli scroll down fatti col mouse o la tastiera :)




  • Help
    di Lucas (utente non iscritto) data: 18/09/2012 09:07:54

    ok questa e' l'intera macro (PESI RELATIVI)..vorrei solo fosse un po' piu' snella. Sono alle prime armi con VBA e credo che quella che ho scritto possa essere facilmente migliorabile. E' una macro che si applica a piu' fogli, non solo ad uno, ma non a tutti. (per questo ricorro spesso a ActiveSheet.Select)

    Altra richiesta di aiuto, questa piu' complessa, spero possiate aiutarmi: i worksheet a cui questa macro viene applicata, sono, a loro volta, creati attrraverso un'altra macro (CLIENT), che appunto mi da' origine a questi worksheet che hanno alcune particolari impostazioni e settings.
    Vorrei che una volta che credo un/dei nuovo/i worksheet/s attraverso questa macro (CLIENT), il/i worksheet/s, fosse/ro gia' dotato/i di un pulsante (facciamo nella cella G2) a cui ho assegnato la macro PESI RELATIVI. E' fattibile?

    Grazie!
     
    Sub Pesirelativi()
    
    ' Calcola il vero valore in PTF della security, una volta inserito il NOMINALE, a seconda la security che sia SHARE o NOTIONAL
    
        ActiveSheet.Range("AE5").Select
        ActiveCell.FormulaR1C1 = _
            "=IF(RC[46]=""Shares"",RC[-1]*RC[-12],IF(RC[46]=""Notional"",RC[-1]*RC[-12]/100,""""))"
        Range("AE5").Select
        Selection.AutoFill Destination:=Range("AE5:AE200"), Type:=xlFillDefault
        Range("AE5:AE200").Select
        
        Dim i As Integer
        For i = 5 To 200
        If Range("BY" & i) = "" Then Exit For
        Next i
    
    ' completa intestazione
    
        
        ActiveSheet.Range("CC4").Select
        ActiveCell.FormulaR1C1 = "Pesi Relativi"
        Range("CC4").Select
        With Selection.Interior
            .Pattern = xlSolid
            .PatternColorIndex = xlAutomatic
            .ThemeColor = xlThemeColorAccent6
            .TintAndShade = 0
            .PatternTintAndShade = 0
        End With
        With Selection.Interior
            .Pattern = xlSolid
            .PatternColorIndex = xlAutomatic
            .ThemeColor = xlThemeColorAccent6
            .TintAndShade = -0.249977111117893
            .PatternTintAndShade = 0
        End With
        
       
    'formatti le celle in %
    
        ActiveSheet.Range("CD5:DV200").NumberFormat = "0.00%"
        
    'copia/incolla intestazione
    
        ActiveSheet.Range("AF4:BX4").Copy ActiveSheet.Range("CD4")
        
        ActiveSheet.Range("CC5").Select
        ActiveCell.FormulaR1C1 = "=IF((RC31/SUM(R5C31:R1000C31))=0,"""",(RC31/SUM(R5C31:R1000C31)))"
        Range("CC5").Select
        Selection.AutoFill Destination:=Range("CC5:CC200"), Type:=xlFillDefault
        
        ActiveSheet.Select
        Dim y As Integer
        For y = 5 To 200
        If Range("AE" & y) = "" Then Range("CC" & y & ":CC200") = ""
        If Range("AE" & y) = "" Then Exit For
        Next y
        
        Range("CD5").Select
        ActiveCell.FormulaR1C1 = "=RC81*RC[-50]"
        Range("CD5").Select
        Selection.AutoFill Destination:=Range("CD5:DV5"), Type:=xlFillDefault
        Range("CD5:DV5").Select
        Selection.AutoFill Destination:=Range("CD5:DV200"), Type:=xlFillDefault
        Range("CD5:DV200").Select
        
        ActiveSheet.Select
        Dim i As Integer
        For i = 5 To 200
        If Range("CC" & i) = "" Then Range("CC" & i & ":DV200") = ""
        If Range("CC" & i) = "" Then Exit For
        Next i
    
        
    End Sub
    



  • di Vecchio Frac data: 18/09/2012 15:35:55

    La macro è abbastanza complessa e poichè inserisce direttamente delle formule nelle celle di Excel, invece di sostituire tali formule con del codice nuovo, la lascerei stare (se tutto funziona come dovrebbe).
    Inutile farti solo qualche maquillage estetico.

    Non ha per niente senso quel ciclo iniziale perchè esci dal ciclo se la cella a un certo punto è vuota, ma non ci fai nient'altro in mezzo, quindi perdi solo tempo :)
    For i = 5 To 200
    If Range("BY" & i) = "" Then Exit For
    Next i

    Per la seconda questione, quando crei un nuovo foglio puoi utilizzare un codice simile a questo per aggiungere un pulsante alla posizione desiderata (espressa in punti: cambia i valori per spostare il pulsante nel foglio) e associare all'evento Clic la macro "Pesirelativi":

    ActiveSheet.Buttons.Add(295, 81, 115, 30).OnAction = "Pesirelativi"





  • Aiuto su macro
    di Riccardo (utente non iscritto) data: 19/09/2012 10:12:04

    Ciao! Mi servirebbe un aiuto su una macro...Posto sotto il codice di una macro che sto attualmente usando, ma che ora ho necessita' di modificare leggermente.
    Come potete vedere la macro riporta delle celle dal worksheet (x), dove x e' una variabile ed e' il nome del cliente (il worksheet chiamato cosi'), e le riporta nel worksheet Ospedale. Il tutto avviene con delle celle fisse, che vengono copiate e incollate, mentre la variabile e' solo il nome del cliente (cioe' il worksheet denominato con il suo nome).

    Vorrei fare un cambiamento: io ora ho sempre il mio worksheet Ospedale in cui in voglio riportare i valori, sempre in quelle celle,fisse. Deve pero' prendere i valori da nuovo worksheet (Summary View), che contiene i dati di ogni cliente (mentre prima c'era un worksheet per ogni cliente). il problema e' che i clienti vengono inseriti e tolti di volta in volta, quindi non ho dei riferimenti assoluti per le celle. Avrei bisogno che la macro cercasse (nel worsksheet Summary view) il nome del cliente ( si trovano tutti sulla riga 4, es. C4, F4, I4, L4...), e una volta che ho trovato il nome cliente, vada a recuperare delle celle (se ad esempio il cliente e' Paperino e si trova nella cella C4, le celle da prendere saranno la cella C15 e C22) [se pero' aggiungo un nuovo cliente Pluto, e Paperino non sara' piu' nella cella C4 ma slitta in F4, dovra' prendermi le celle F15 e F22).

    Siccome sono parecchio impedito con vba, avrei proprio bisogno che mi riportiate il codice, perche' se me lo spiegate a parole, so che non riusciro' mai a farlo.
     
    Sub SourceCliente()
    
    Dim x As String
    
        x = InputBox("Inserire il nome del Cliente")
        
        [A4].Value = Worksheets(x).Name
         
        Worksheets("Ospedale").Range("B14:B15").Value = Worksheets(x).Range("C385:C386").Value
        
        Worksheets("Ospedale").Range("B31:B39").Value = Worksheets(x).Range("C391:C399").Value
        
        Worksheets("Ospedale").Range("B53:B57").Value = Worksheets(x).Range("I385:I389").Value
        
        Worksheets("Ospedale").Range("B61:B84").Value = Worksheets(x).Range("I391:I414").Value
        
        Worksheets("Ospedale").Range("B94").Value = Worksheets(x).Range("B314").Value
        
        Worksheets("Ospedale").Range("B96").Value = Worksheets(x).Range("B316").Value
    
    End Sub


  • Help
    di Lucas (utente non iscritto) data: 19/09/2012 10:16:06

    Credo che Riccardo abbia fatto un po' di confusione..

    cmq grazie mille agli altri, siete stati d'aiuto!
    Grazie!