Aiuto su macro



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

    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
    


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

    Scusate, manca la prima parte. Avevo combinato un casino.

    Ciao a tutti. ho un favore da chiedervi per una macro:
    semplicemente, come potete vedere nel post precedente, riportavo dei valori ( sono celle fisse) da un foglio x (dove x e' una variabile ed e' il nome del cliente) ad un foglio chiamato Ospedale, anche qui in celle fisse. Ho fatto un cambiamento, e ho raccolto tutti i dati dei clienti in un unico worksheet, chiamato Summary View. ....poi proseguo con la seconda parte.



  • di Vecchio Frac data: 19/09/2012 11:18:10

    In attesa che posti la Sub per intero, e non solo un pezzo, visto che manca End Sub, ti suggerisco di analizzare questo piccolo codice:

    [1:1].find("topolino").select

    il quale cerca nella riga 1 (in tutta la riga 1) il valore "topolino" e lo seleziona.
    Se invece che selezionare la cella desideri (come è logico) un riferimento ad essa (infatti poi ti servirà sapere in che colonna si trova il dato), basta assegnare il risultato di find ad una variabile di tipo range:

    set f = [1:1].find("topolino")




  • Aiuto su macro
    di Riccardo (utente non iscritto) data: 19/09/2012 11:27:19

    Scusa, pensavo bastasse queso pezzo, perche' poi e' ripetitiva..
     
    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
        
        Worksheets("Ospedale").Range("B103:B118").Value = Worksheets(x).Range("F316:F331").Value
        
        Worksheets("Ospedale").Range("B126:B140").Value = Worksheets(x).Range("I316:I330").Value
        
        Worksheets("Ospedale").Range("B153:B160").Value = Worksheets(x).Range("N316:N323").Value
        
        Worksheets("Ospedale").Range("B175:B182").Value = Worksheets(x).Range("Y327:Y334").Value
        
        Worksheets("Ospedale").Range("B198:B202").Value = Worksheets(x).Range("U316:U320").Value
        
        Worksheets("Ospedale").Range("B206:B229").Value = Worksheets(x).Range("U321:U344").Value
        
        Worksheets("Ospedale").Range("B241:B243").Value = Worksheets(x).Range("Y316:Y318").Value
        
        Worksheets("Ospedale").Range("B263").Value = Worksheets(x).Range("K351").Value
        
        Worksheets("Ospedale").Range("B265").Value = Worksheets(x).Range("K352").Value
    
        Worksheets("Ospedale").Range("B267").Value = Worksheets(x).Range("K353").Value
        
        Worksheets("Ospedale").Range("B273:B288").Value = Worksheets(x).Range("C351:C366").Value
        
        Worksheets("Ospedale").Range("B297:B301").Value = Worksheets(x).Range("I351:I355").Value
        
        Worksheets("Ospedale").Range("B305:B328").Value = Worksheets(x).Range("I356:I379").Value
    
        
    
    End Sub



  • di Vecchio Frac data: 19/09/2012 11:37:59

    Ma C15 e C22 da dove saltano fuori che non le vedo nel codice?
    Stando a quanto riferisci a parole, il codice che allego:
    - chiede il nome del cliente
    - lo fissa nella cella A4 del foglio "Ospedale"
    - lo cerca nella riga 4 del foglio "Summary View"
    - riporta in Summary View, riga 15, colonna del dato cercato (e poi in riga 22) i dati che trova in ospedale, rispettivamente B14 e B15

    Quindi, bisogna maneggiare opportunamente tutto quel che sta tra With e End With affinché vengano posizionati i dati nell'ordine richiesto, solo che non ho capito qual è questo ordine :o)
     
    Sub SourceCliente()
    Dim f As Range
    
        Worksheets("Ospedale").Activate
        [A4] = InputBox("Inserire il nome del Cliente")
        
        Set f = Worksheets("Summary View").[4:4].Find(x)
        
        If f Is Nothing Then
            MsgBox "Nominativo non trovato."
            [A4] = ""
            Exit Sub
        End If
        
        With Worksheets("Ospedale")
            .[B14] = Worksheets("Summary View").Cells(15, f.Column)     'riga 15, colonna del dato cercato
            .[B15] = Worksheets("Summary View").Cells(22, f.Column)     'riga 22, colonna del dato cercato
        End With
        
    End Sub






  • di Vecchio Frac data: 19/09/2012 11:42:26

    Ti rifaccio la domanda, perché mi ero espresso in modo non chiaro:
    - se prima i dati da ricopiare erano (per esempio) in Worksheets(x).[C385:C386], adesso che sono in "Summary View", in quale range si trovano da poterli prendere e ricopiare in "Ospedale"?
    (se non è così che deve funzionare la faccenda allora spiegami meglio, ho già detto che ho una certa età ^_^)




  • Aiuto su macro
    di Riccardo (utente non iscritto) data: 19/09/2012 11:54:02

    Ahahah. No C15 e C22 (come F15 e F22) sono, ad esempio, due celle (del nuovo worksheet Summary View) che ho preso casualmente io.
    Io prima prendevo i dati dai worksheet di ogni cliente (Worksheet(x) e con quella macro venivano riportati nel worksheet Ospedale.
    Ora i dati di tutti i clienti li ho in unico worksheet (Summary view), e voglio sempre riportarli nel worksheet Ospedale.

    il problema qual e'? E' che nel nuovo worksheet (Summary View), le celle di riferimento di un cliente (Paperino, o Pluto) non sono fisse, perche' aggiungo e tolgo i clienti ogni volta e quindi magari la colonna da dove devo prendere i dati puo' cambiare(shifta letteralmente a dx o a sx, mentre la riga rimane la stessa(cioe' il dato che avevo C30 shifta in F30). (Topolino adesso e' nella cella C4, quindi tutti i suoi dati sono incolonnati nella colonna C, ma dopo aggiungero' un nuovo cliente, Clarabella, e Topolino shiftera' da C4 a F4. E cosi' avviene per tutti i dati, a lui riferiti). Per questo ti dico che non ho un riferimento assoluto, perche' i clienti si "spostano", ogni volta che aggiungo o tolgo qualcuno.


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

    Eh le celle di Summary View, non essendo fisse, non posso dartele. Cioe' potrei darti i riferimenti delle righe(perche' rimangono fissi), ma le colonne, come detto, variano, di volta in volta, a seconda dell'aggiunta/cancellazione dei clienti.



  • di Vecchio Frac data: 19/09/2012 13:26:26

    Ma io ho risolto il problema dello shiftaggio del nome-cliente mediante l'uso di set f = [4:4].Find(cliente), perché una volta trovato il nome cliente potrai sapere in che colonna si trova (con f.Column). Infatti nel mio esempio ho scritto Worksheets("Summary View").Cells(15, f.Column) come origine del dato perché la riga può variare (e varia) ma la colonna è quella del dato ricercato e trovato.
    Sono proprio i riferimenti di riga quelli che ci servono :D
    Sai cosa ti suggerisco? prepara un modellino (possibilmente in formato Excel 2003 così non ho problemi) con dati fittizi e postalo, così lavoriamo sul concreto.






  • Aiuto su macro
    di Riccardo (utente non iscritto) data: 20/09/2012 07:33:37

    Niente modellino, perche' ieri ho rivisto meglio il tuo codice, l'ho capito, e riesco ad andare avanti da solo (o almeno ci provo, eheh) senza disturbarti piu'.

    Piccolo aiuto, perche' mi sono gia' fermato. Ho scritto la macro che mi hai dato, mettendo solo due riferimenti, cosi' per vedere se funzionasse o meno, perche' poi tanto il comando e' ripetitivo.
    Cliccando sul pulsante a cui ho assegnato la macro, mi da' immediatamente errore, evidenziandomi in VBA la parola InputBox e dicendomi: COMPILE ERROR: SUB OR FUNCTION NOT DEFINED
     
    Sub SourceClienteProva()
    '
      Dim f As Range
       Worksheets("Ospedale").Activate
       [A4] = InputboxBox("Inserire il nome del Cliente")
       Set f = Worksheets("Summary View").[4:4].Find(x)
       If f Is Nothing Then
          MsgBox "Nominativo non trovato."
          [A4] = ""
          Exit Sub
       End If
       
       With Worksheets("Ospedale")
            .[B14] = Worksheets("Summary View").Cells(55, f.Column)
            .[B15] = Worksheets("Summary View").Cells(152, f.Column)
    
    End Sub
    



  • di Vecchio Frac data: 20/09/2012 07:36:51

    Benissimo, fai prove e riprove e vedrai che ne esci fuori.
    Guardando il tuo codice vedo che manca End With a chiusura del With.
    Vero che c'è e hai solo dimenticato di fare copia incolla? :)




  • Aiuto su macro
    di Riccardo (utente non iscritto) data: 20/09/2012 08:36:27

    Ahahaha si' si' c'era!!! Chiedo venia.

    Mi da' pero' ancora errore...cioe' clicco il pulsante e mi da la finestra d'errore dicendomi:
    COMPILE ERROR: SUB OR FUNCTION NOT DEFINED

    evidenziando in blu la parola InputBox e in giallo Sub SourceClienteProva


  • Aiuto su macro
    di Riccardo (utente non iscritto) data: 20/09/2012 08:56:23

    L'ho scritta cosi', e sembrerebbe funzionare! Dammi, please, solo un check se l'ordine dei comandi e' giusto o devo riordinarli o sistemarli?

    PS sei mattiniero! Io mi trovo dall'atra parte del mondo, e per me e' pomeriggio!
     
    Sub SourceClienteProva()
       
        Dim x As String
    
        x = InputBox("Inserire il nome del Cliente")
        
        [A4].Value = Worksheets(x).Name
        
      Dim f As Range
       Worksheets("Portfolio Management").Activate
       Set f = Worksheets("Summary View").[4:4].Find(x)
       If f Is Nothing Then
          MsgBox "Nominativo non trovato."
          [A4] = ""
          Exit Sub
       End If
       
       With Worksheets("Portfolio Management")
            .[B14] = Worksheets("Summary View").Cells(55, f.Column)
            .[B15] = Worksheets("Summary View").Cells(152, f.Column)
            
       End With
    
    
    End Sub


  • Aiuto su macro
    di Riccardo (utente non iscritto) data: 20/09/2012 10:00:07

    Ti chiedo un'altra cosa:
    .[B14] = Worksheets("Summary View").Cells(55, f.Column)
    .[B15] = Worksheets("Summary View").Cells(152, f.Column)

    Se voglio invece usare un range continuo di celle, ad esempio, da B14 a B17, come cambia la formula? (ipotizziamo che poi le celle della famosa f column siano da 100 a 103..

    .[B14:B17] = Worksheets("Summary View").Range(Cells(100,f.Column),Cells(103,f.Column))

    e' corretto?

    Perche' a me cosi' da' errore!!!!!!!
    Ufff come mi scoccia essere cosi' scarso!

    Grazie mille



  • di Vecchio Frac data: 20/09/2012 17:41:31

    Con ordine ^_^
    1) non aver paura di "disturbare"
    2) non sono mattiniero... erano le 7.36 e stavo uscendo per andare al lavoro
    3) ci credo che [A4] = InputboxBox("Inserire il nome del Cliente") ti dava errore ... è "InputBox", non "InputboxBox"
    4) la formula è corretta, ma metti un .Value alla fine, così:
    .[B14:B17] = Worksheets("Summary View").Range(Cells(100,f.Column),Cells(103,f.Column)).Value

    5) non sei scarso, e hai fatto ottimi progressi :)




  • Aiuto su macro
    di Riccardo (utente non iscritto) data: 21/09/2012 05:15:31

    Grazie mille per la questione dei progressi.

    Purtroppo ho messo il codice che mi hai dato..ma mi da' errore, mi evidenzia la stringa di codice (te la riposto sotto), e mi dice:
    Run-time error '1004': Application-defined or object defined error.

    Come mai?
    ho provato anche in altri modi (sempre postati qui sotto), ma senza successo.

    Mooolto strano!
    Se invece, scrivo il codice valore per valore, la macro funziona tranquillamente. E' un po' uno strazio pero'.


     
    With Worksheets("Ospedale")
       .[B31:B37] = Worksheets("Summary View").Range(Cells(154, f.Column), Cells(160, f.Column)).Value
    
    'Questi sono i modi alternativi con cui ho provato, ma mi ha sempre dato errore.
    
    Sheets("Ospedale").Range("B31:B37").Value = Sheets("Summary View"). Range(Cells(154, f.Column),Cells(160,f.Column)).Value
    
    Worksheets("Summary View").Range(Cells(154, f.Column),Cells(160,f.Column)).copy destination:=Worksheets("Ospedale").Range("B31")



  • di Vecchio Frac data: 21/09/2012 09:47:51

    Ma che bestiaccia questo Excel :o)
    "Errore definito dall'applicazione o dall'oggetto"... ci ho pensato un bel po' e poi ecco l'intuizione:
    "ogni riferimento a Cells deve essere qualificato, se ci sono riferimenti diversi nell'ambito del codice"!

    Quindi rovesciamo il With e invece che riferirci al foglio "Ospedale", che è già stato Activato poco sopra, riferiamoci al foglio che contiene le Cells dalle quali prelevare i dati (confermo che .Value finale è necessario). Occhio al punto prima di ogni Cells!
    Il codice che allego l'ho già testato e sembra funzionare.



     
    With Worksheets("Summary View")
         [B31:B37] = .Range(.Cells(154, f.Column), .Cells(160, f.Column)).Value
    End With





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

    Scusami Vecchio Frac, ricordati pero' che io devo fondamentalmente prendere i dati che ho in Summary view (da 154, f.column) a (160, f.column) e portarli in Ospedale da B31 a B37. Con il codice che mi hai scritto sotto, succede questo o il contrario?

    Io cancello definitivamente il With Worksheet("Ospedale") e riscrivo in funzione del Summary view?



  • di Vecchio Frac data: 21/09/2012 10:38:24

    L'istruzione With Worksheets("Summary View") ci indica chiaramente che d'ora in avanti stiamo puntando a Summary View. Questo finchè non lo chiudiamo con End With.
    Premesso ciò, è necessario che poco prima sia stato dato un Worksheet("Ospedale").Activate, al quale faranno riferimento tutti i range non qualificati dal punto:
    [B31:B37] --> è un range di "Ospedale"
    .Range(.Cell(154, f.column, .Cells(160, f.column)).Value --> è un range di "Summary View"

    Se tu non usassi With, avresti dovuto riscrivere per esteso Worksheets("Summary View") ogni volta che avessi voluto riferirti espressamente a quel foglio.

    La risposta alla tua domanda è "sì, sostituisci With Worksheet("Ospedale") e riscrivi il With riferendoti a "Summary View".

     
    Worksheets("Ospedale").Activate
    
    Set f = Worksheets("Summary View").[4:4].Find(x)
    
    With Worksheets("Summary View")
         [B31:B37] = .Range(.Cells(154, f.Column), .Cells(160, f.Column)).Value
    End With
     





  • Aiuto su macro
    di Riccardo (utente non iscritto) data: 21/09/2012 11:36:54

    grazie mille. Scusa se magari sono un po' stressante!
    Magari dopo ti posto la macro e mi dici se posso fare delle correzioni.

    Gentilissimo.