Andare a capo nel codice VBA



  • Andare a capo nel codice VBA
    di Pellamy88 (utente non iscritto) data: 29/03/2016 11:47:26

    Ciao a tutti, ho una macro che alla pressione di un tasto mi inserisce una serie di formule all'interno di una serie di celle.
    Non capisco perchè, quando una formula è molto lunga, mi da errore nel VBA. Vi scrivo la macro in questione
     
    Range("AB8").FormulaR1C1 = _
            "=IFERROR(IF(R4C6=""LISTINO"",IF(RC[-26]=""Z"",IF(ISNA(VLOOKUP(RC[-25],LISTINO!C[-27]:C[-22],5,0)),VLOOKUP(RC[-25],LISTINO!C[-20]:C[-15],5,0),VLOOKUP(RC[-25],LISTINO!C[-27]:C[-22],5,0)),IF(ISNA(VLOOKUP(RC[-27],LISTINO!C[-27]:C[-22],5,0)),VLOOKUP(RC[-27],LISTINO!C[-20]:C[-15],5,0" & _
            "P(RC[-27],LISTINO!C[-27]:C[-22],5,0))),0),0)"



  • di Raffaele_53 data: 29/03/2016 13:52:38

    Puoi spostare la formula scritta normale (senza R1C1)



  • di pellamy88 (utente non iscritto) data: 29/03/2016 15:00:45

    Ciao raffaele che cosa intendi ? non capisco poichè con tutte le altre celle non mi da nessun problema, e le formule vengono copiate nel modo corretto.. ma quando provo a inserire questa tramite macro, mi da errore sul vba.. un errore di sintassi.. eppure con il registratore di macro è quello il codice che ne è uscito fuori!



  • di Raffaele_53 data: 29/03/2016 16:56:21

    >>>che cosa intendi ?
    Semplice vorrei vedere la formula reale, lascia perdere il VBA ed modalità R1C1. Scrivi la formula come la scriveresti in una qualsiasi cella.
    Ex =Se(A1=B1;"uguale";"diverso")



  • di pellamy88 (utente non iscritto) data: 29/03/2016 17:00:37

    Ah ok, non avevo capito.. ti posto il codice come è scritto nella cella. La macro ad ogni avvio fa si che le celle contengano le formule giuste (per cambi accidentali).

    Il problema è, ripeto, che scritto in quel modo su vba (e ho usato il registra macro) non me l'accetta, probabilmente poichè è troppo lunga e va a capo (stesso problema con un altra formula ancora piu lunga, mentre con tutte le altre formule piu corte funziona benissimo)
     
    =SE.ERRORE(SE($F$4="LISTINO";SE(B8="Z";SE(VAL.NON.DISP(CERCA.VERT(C8;LISTINO!A:F;5;0));CERCA.VERT(C8;LISTINO!H:M;5;0);CERCA.VERT(C8;LISTINO!A:F;5;0));SE(VAL.NON.DISP(CERCA.VERT(A8;LISTINO!A:F;5;0));CERCA.VERT(A8;LISTINO!H:M;5;0);CERCA.VERT(A8;LISTINO!A:F;5;0)));0);0)



  • di Raffaele_53 data: 29/03/2016 18:03:31

    Per adesso lasciamo perdere il SE.ERRORE (dopo aggiungiamo)
    Di norma se metto diversi SE insieme, devo fare in modo che ogni possibilità mi dia una risposta valida. Stasera rivedo il tutto, però se può insegnarTi (senza nessuna pretesa), farei in questo modo....
    Io quando le formule sono lunghe le divido in diverse celle.
    =Se(A1=B1;"uguale";"diverso")
    EX adesso sè la risposta giusta sarà "uguale" , metterò all'interno un'altra.
    Cosi via finchè la risposta sarà veritiera sia in "uguale" ed "diverso".
    Ps. per me la formula Tua è errata.



  • di pellamy88 (utente non iscritto) data: 29/03/2016 19:40:43

    Ciao Raffaele, dove è che credi sia errata? Hmm probabilmente è un po' troppo lunga e macchinosa però fa egregiamente ciò che mi serve.... la logica è questa: se è selezionato "listino" in una data cella, allora c'è la condizione successiva: c'è Z in un altra cella ? se è Z allora vai a prendermi il codice scritto in un altra cella (C) all'interno del foglio listino, in un determinato range (se è disponibile) altrimenti prova il secondo range (se è disponibile); non è Z? allora prendimi il codice scritto nella cella originaria (A) all'interno dello stesso foglio listino, in un determinato (se è disp) altrimenti prova il secondo range. Tutto ciò da errore perchè non è disponibile? allora metti 0. Mi servirà poi per fare un check in un altra cella.. Un po' lunga ma funziona, la sto usando..



  • di Raffaele_53 data: 29/03/2016 21:25:22

    Sara come dici Tu, intanto
    >>>solo un minuto di buona volonta ed ecco un esempio (senza tante parole)
    Sono tornato adesso e se riesco ad scerverlarmi su cosa desideri fare, ti darò risposta (nella speranza che alleghi senza farmi diventarte scemo)



  • di pellamy88 (utente non iscritto) data: 29/03/2016 21:30:36

    Ciao raffaele.. grazie del tuo aiuto.. ma su questa problematica non ci sarebbe tanto bisogno di postare un esempio poichè ti posterei un file dove all'interno ha scritto quella formula.. che gia hai letto :) . Sopratutto perchè nel file esempio dovrei ricostruire un foglio e chiamarlo listino, una cella dove selezionare "listino" e via dicendo.. ma non è questo il "problema". Il solo problema è che la formula è -giusta-, funziona benissimo, ma quando provo a copiarla in VB per far si che ad ogni apertura del file mi vada a inserire le formule nelle rispettive celle, QUESTA e un altra (entrambe hanno in comune che son molto lunghe e nel vb VANNO A CAPO), nel vb mi da errore di sintassi... eppure io copio-incollo ciò che mi viene scritto tramite la registrazione macro..!



  • di Raffaele_53 data: 29/03/2016 21:36:55

    Molto loquace e pure svelto nel rispondere
    Forse dimentichi l'esperienza che "forse arriverà dopo 100 anni"
    Tu sei sulla strada che NON capirai mai.

    Ps. VANNO A CAPO non c'entra un ca..o



  • di pellamy88 (utente non iscritto) data: 29/03/2016 21:57:19

    Ciao raffaele, ti ho postato un file di esempio.. ti accorgerai che non era "necessario" .. ma ovviamente mi stai dando una mano, quindi eccoti il file : )



  • di Raffaele_53 data: 29/03/2016 22:43:01

    Ciao dimmi tu cosa rispondere?
    Preferisci una formula che non conosco?
    Oppure farti notare "che se non "listino" = 0
    Pensaci per bene e dividi le formule comew faccio io

    Ps. Oppure la risposta (cattiva)fatta prima del ultimo post



  • di pellamy88 (utente non iscritto) data: 29/03/2016 23:02:08

    Raffaele mica ti sto costringendo a risolvere il quesito :D ti chiedo scusa se ti sono sembrato insistente, avevo capito che avessi una soluzione sulla punta della lingua ma volevi pensarci meglio.. non importa ti ringrazio lo stesso del tempo che hai ci hai dedicato.. e grazie del consiglio di spezzare le formule, ma avendo gia fin troppe celle nella tabella piene di formule non penso di riuscire a crearne molte altre (dovrei anche nasconderle tutte ecc, e non voglio andare oltre ad AD dove sono per ora..)



  • di Oscar (utente non iscritto) data: 29/03/2016 23:28:54

    Prova la formula corretta è questa

    Ti allego anche il File
     
    Range("J9").FormulaR1C1 = _
            "=IFERROR(IF(R4C6=""LISTINO"",IF(RC[-2]=""Z"",IF(ISNA(VLOOKUP(RC[-1],LISTINO!C[-3]:C[2],5,0)),VLOOKUP(RC[-1],LISTINO!C[4]:C[9],5,0),VLOOKUP(RC[-1],LISTINO!C[-3]:C[2],5,0)),IF(ISNA(VLOOKUP(RC[-3],LISTINO!C[-3]:C[2],5,0)),VLOOKUP(RC[-3],LISTINO!C[4]:C[9],5,0),VLOOKUP(RC[-3],LISTINO!C[-3]:C[2],5,0))),0),0)"


  • Vedi cdhe
    di Raffaele_53 data: 29/03/2016 23:33:51

    Vedi che ho visto allegato e parte della Tua formula
    Come detto la Tua formula e sbagliata
    Adesso intervengono i maestri sulle formule (significa che sbaglio, OK mi sta bene,dopo in VBA)



  • di pellamy88 (utente non iscritto) data: 30/03/2016 00:06:40

    Grazie Oscar!!! Ora sul VBA non mi da piu' nessun errore... giusto per capire (poichè ho un altra formula che è ancora piu lunga da dover "correggere") che cosa hai dovuto cambiare ? Grazie



  • di Oscar (utente non iscritto) data: 30/03/2016 00:16:28

    Devi usare il registratore di Macro , manualmente è impossibile convertire una formula del genere
    1) attiva il registratore di Macro
    2) vai sulla formula in modo da vederla sulla barra delle formule , ci porti dentro il cursore e fai invio , poi termina la registrazione e copy la formula registrata correttemente nella Macro



  • di pellamy88 (utente non iscritto) data: 30/03/2016 00:20:43

    Però Oscar feci esattamente cosi .. usai il registratore macro! non so per quale motivo non me la prendeva per bene.. però ho notato che nella tua versione la formula è per esteso in una sola riga, mentre la mia era spezzata e andava a capo.. anche un altra formula che ho registrato è lunghissima e me la fa andare a capo automaticamente nel vba.. grazie comunque !



  • di Oscar (utente non iscritto) data: 30/03/2016 00:58:27

    Anche se torna a capo non cambia niente , si vede che hai qualche problema in Windows che non te la converte al modo giusto , comunque se non ti va bene la posti che ti faccio io la conversione



  • di Raffaele_53 data: 30/03/2016 13:13:53

    Analizzando la formula
    SE.ERRORE(.......);0) --qui presumo dovesse essere SE.ERRORE(.......);"")
    SE($F$4="LISTINO";SE(B8="Z"--Pensavo ad una condizione E($F$4="LISTINO";B8="Z")
    Nella condizione vera/falsa fà e qui mi ingarbuglio perchè con un'altro SE(VAL.NON.DISP(che prima risponde falso poi vero)

    Ex SE($F$4="LISTINO"-- OK, fosse falso cosa dovrebbe fare? in più aggiungi altra condizione
    SE(B8="Z"-- a questo punto abbiamo la prima in caso "falso" ed anche questa in caso "falso" e cosa dovrebbero fare?

    Adesso se riesci dirmi cosa desideri fare? E(F4="LISTINO";B8="Z") --OK fosse vero
    il SE(VAL.NON.DISP? A me sembra fuori contesto.
    Quella formula va semplificata, se mi dai altre info.



  • di pellamy88 (utente non iscritto) data: 30/03/2016 13:37:57

    Ciao Oscar, grazie mille.. Non capisco come mai, la formula è questa.. è un po lunga, e sicuramente potrebbe essere super semplificata, ma la mia conoscenza piuttosto basilare mi ha fatto partorire questa :D che comunque funziona e fa il suo lavoro.. Idem, come l'altra, sul VBA dato che va a capo (o almeno, è ciò che mi fa pensare), non me la copia bene.. Te la allego!


    Ciao Raffaele, hai ragione, è molto macchinosa come formula.. infatti vorrei poi mettermi a farla per bene, ma comunque per ora funziona. I SE VAL NON DISP serovno poichè ho due listini diversi, divisi in due blocchi, quindi "se il valore sul primo blocco non è disponibile, allora cercamelo nel secondo blocco". Per quanto riguarda le primissime condizioni, "se non è selezionato listino allora semplicemente metti 0 (mi serve per una condizione successiva su un altra cella); se non è "Z" allora cerca il secondo codice (preso da un altra cella) anzichè il primo..
     
    =SE($F$4="LIST";SE(AB8>0;AB8;SE(B8="Z";(SE.ERRORE(SE((SE.ERRORE(CERCA.VERT(CONCATENA(C8;"SP");DB!A:P;6;0);CERCA.VERT(CONCATENA(C8;"DEF");DB!A:P;6;0)))=0;CERCA.VERT(CONCATENA(C8;"DEF");DB!A:P;6;0);SE.ERRORE(CERCA.VERT(CONCATENA(C8;"SP");DB!A:P;6;0);CERCA.VERT(CONCATENA(C8;"DEF");DB!A:P;6;0)));""));(SE.ERRORE(SE((SE.ERRORE(CERCA.VERT(CONCATENA(A8;"SP");DB!A:P;6;0);CERCA.VERT(CONCATENA(A8;"DEF");DB!A:P;6;0)))=0;CERCA.VERT(CONCATENA(A8;"DEF");DB!A:P;6;0);SE.ERRORE(CERCA.VERT(CONCATENA(A8;"SP");DB!A:P;6;0);CERCA.VERT(CONCATENA(A8;"DEF");DB!A:P;6;0)));""))));SE(B8="Z";(SE.ERRORE(SE((SE.ERRORE(CERCA.VERT(CONCATENA(C8;"SP");DB!A:P;6;0);CERCA.VERT(CONCATENA(C8;"DEF");DB!A:P;6;0)))=0;CERCA.VERT(CONCATENA(C8;"DEF");DB!A:P;6;0);SE.ERRORE(CERCA.VERT(CONCATENA(C8;"SP");DB!A:P;6;0);CERCA.VERT(CONCATENA(C8;"DEF");DB!A:P;6;0)));0));(SE.ERRORE(SE((SE.ERRORE(CERCA.VERT(CONCATENA(A8;"SP");DB!A:P;6;0);CERCA.VERT(CONCATENA(A8;"DEF");DB!A:P;6;0)))=0;CERCA.VERT(CONCATENA(A8;"DEF");DB!A:P;6;0);SE.ERRORE(CERCA.VERT(CONCATENA(A8;"SP");DB!A:P;6;0);CERCA.VERT(CONCATENA(A8;"DEF");DB!A:P;6;0)));""))))



  • di Oscar (utente non iscritto) data: 30/03/2016 19:45:55

    Non mi va mancano i collegamenti al foglio DB , se puoi allegami il foglio completo dove funziona



  • di Oscar (utente non iscritto) data: 30/03/2016 19:48:13

    Non mi va mancano i collegamenti al foglio DB se ti è possibile mandami il foglio completo dove funziona tutto



  • di Raffaele_53 data: 31/03/2016 16:08:17

    Mi piacerebbe che pellamy88 apra un post con me.
    Penso, che servirebbe a tanti utenti