togliere celle vuote



  • togliere celle vuote
    di gio (utente non iscritto) data: 24/09/2012 09:17:33

    ciao,
    col codice qua sotto vado a selezionare alcuni valori e copiarli in un altro foglio..
    il problemaè che questi valori non sono consecutivi ma [generalmente] ogni 4 righe..e di conseguenza anche quando li copio nell'altro foglio mi trovo 4 o piu buchi tra un valore e l'altro..come posso metterli tutti vicini senza celle vuote in mezzo?

    grazie
     
    Sheets("foglio1").Select                                
    For i = 30 To 300
        With Sheets("fogliox")
         If IsNumeric(Cells(i, 2)) Then
            .Cells(1, i) = Cells(i, 2)                     
         End If
         End With
    Next i
    



  • di HarryBosch data: 24/09/2012 09:29:15

    Ciao Gio!
    sai perchè ti lascia gli spazi? perchè anche sul fogliox usi la stessa variabile e quindi, la colonna (in questo caso) di riferimento, sarà determinata dal valore di "i".
    Dovresti usare una variabile diversa e, ogni volta che copi, farla aumentare di una unità, in modo da determinare la colonna successiva.
    Vedi sotto
     
    Sheets("foglio1").Select
    'colonna di partenza
    y=1                              
    For i = 30 To 300
        With Sheets("fogliox")
         If IsNumeric(Cells(i, 2)) Then
            .Cells(1, y) = Cells(i, 2)
    	  y=y+1                  
         End If
         End With
    Next i



  • di gio (utente non iscritto) data: 24/09/2012 09:40:03

    ganiale...comunque lo sapevo che era per quel contatore..però non mi era venuto in mente di usarne un altro..ho cercato mille modi per riuscire a ridurlo quando saltavo sull'altro foglio ma non ci ero arrivato a usarne un altro xd..

    comunque mi salta ancora una casella ogni valore..non capisco perchè



  • di HarryBosch data: 24/09/2012 09:49:35

    Non è che hai spostato quel
    y = y +1
    fuori dall' IF vero?
    Altrimenti, così come ti ho scritto, non salta le colonne nel foglio dove riporta i valori...
    Oppure potresti avere delle celle vuote nel foglio dove prendi i dati



  • di gio (utente non iscritto) data: 24/09/2012 09:55:18

    eh si ci sono celle vuote, ma non dovrebbe considerarle come numeriche!
    o forse sbaglio?



  • di gio (utente non iscritto) data: 24/09/2012 09:59:10

    forse ho risolto cosi:

    faccio 2 prove e poi ti dico

    per intanto grazie...come al solito ho perso mezza giornata su una cavolata del genere xd
     
    y = 1
    For i = 30 To 300                   'copia valori teorici
        With Sheets("foglio4")
         If IsNumeric(Cells(i, 3)) Then
            If Cells(i, 3) <> "" Then
            .Cells(1, y) = Cells(i, 3)
          y = y + 1
          End If
         End If
         End With
    Next i
    



  • di HarryBosch data: 24/09/2012 10:08:16

    Puoi scrivere la condizione anche sulla stessa riga, senza costruire due IF annidati
     
    .
     If IsNumeric(Cells(i, 3)) And Cells(i, 3) <> "" Then
    .
    



  • di Vecchio Frac data: 24/09/2012 11:21:15

    Attenti a IsNumeric, a volte non dà dei risultati corretti.
    Può riconoscere come valido un numero anche se questo è scritto in formati apparentemente sbagliati. Ad esempio "13+" è considerato valido mentre "13a" no!
    Generalmente il problema è nella presenza dei segni o della notazione esponenziale (provate "123+E-2" oppure "123-E-2", e confrontateli con "+123E-2" oppure "-123E-2"). Problemi si hanno anche nell'internazionalizzazione: se nelle impostazioni internazionali si pone come Simbolo di raggruppamento la lettera 'A', ciò che viene riportato nell'esempio viene considerato numerico (provate "12A5666A56.089").
    Insomma ci sono alcune incongruenze di cui tener conto :)






  • di gio (utente non iscritto) data: 24/09/2012 11:26:29

    harry: avevo provato a mettere tutte le condizioni nell'IF...ma invece che scrivere AND mettevo &... ahaahah

    frac:ho notato ce fa un po di casini sta funzione...ma a me va bene perchè dove ci sono numeri sono puliti, senza caratteri in mezzo o simboli



  • di Vecchio Frac data: 24/09/2012 11:42:25

    Se usi il modello solo tu e sei sicuro che ci sono solo numeri va bene, ma potresti costruirti la tua funzione is_numeric() che faccia le verifiche giuste... sarebbe un ottimo esercizio :)

    Il simbolo "&" al posto di And si usa in altri linguaggi (ad esempio Python) :)





  • di gio (utente non iscritto) data: 24/09/2012 11:45:55

    quel simbolo non so da dove l'ho tirato fuori..xd
    comquneu adesso come adesso devo finire in fretta sti programmi...per quello vi sto rompendo continuamente le scatole...gli esercizi li farò piu avanti...

    e per fortuna ho trovato gente come voi se no a sto punto sarei ancora fermo a funzioni banalissime che non funzionavano perchè scritte sbagliate xd..



  • di Vecchio Frac data: 24/09/2012 11:53:19

    In Excel si potrebbe utilizzare la funzione predefinita Application.IsNumber:

    application.isnumber("1232") --> falso (è una stringa)
    application.isnumber(1232) --> vero (è un numero)
    application.isnumber(13+) --> errore! (attesa espressione)





  • di gio (utente non iscritto) data: 24/09/2012 12:18:16

    curiosità

    mi capita spesso di fare cicli FOR che vanno da 1 a 200 però devono saltar l'intervallo ad esempio da 50 a 80...
    c'è un modo per fare un ciclo unico o devo per forza farne 2 uguali con range diversi?
    [premetto che non mi cambia niente farne 2...è solo una curiosità...non scervellatevi troppo a pensare a soluzioni]



  • di HarryBosch data: 24/09/2012 13:01:10

    Non mi sono mai servito di una cosa di questo tipo, ma potresti risolvere in questa maniera:
    in pratica quando la variabile del ciclo arriva a 50 gli assegni il valore che ti interessa, ad esempio 80;
    quando il ciclo riparte, continuerà da 81...
     
    For i = 1 To 200
    'istruzioni
    .
    .
    If i = 50 Then i = 80
    Next
    



  • di gio (utente non iscritto) data: 24/09/2012 14:19:46

    grazie...funziona

    altra domanda:

    questa parte di codice in teoria dovrebbe prendere 11 celle e copiarle in una cella unica di un altro foglio...[deve farlo per tutte le righe del foglio e incollarle sulle celle di una riga...]
    temo sia un po troppo pretensivo come comando..
    nel senso che devo copiare una stringa ma questa è divisa su più celle..
     
    Sheets("foglio1").Select
    y = 1
    For i = 28 To 80 Step 4
        With Sheets("eCAV")
        For n = 1 To 11
         .Cells(6, 5 + y) = Cells(i, n)
          y = y + 1
         Next n
         End With
    Next i



  • di Vecchio Frac data: 24/09/2012 14:39:29

    Bè il problema è nella "y" che ti sposta di una colonna a destra la destinazione.
    Se non ho capito male basta spostare l'incremento dovuto a y fuori dal ciclo for su n e impostare per ogni n la cella corrente uguale al valore della n-esima cella del foglio di partenza (con un ritorno a capo per separare i diversi elementi).
     
    Sheets("foglio1").Select
    y = 1
        For i = 28 To 80 Step 4
            With Sheets("eCAV")
                For n = 1 To 11
                    .Cells(6, 5 + y) = .Cells(6, 5 + y) & Cells(i, n) & vbLf
                Next n
                y = y + 1
            End With
        Next i






  • di gio (utente non iscritto) data: 24/09/2012 14:52:20

    l'errore della Y me ne ero accorto..

    e la funzione per concatenare è quella...però deve fermarsi alla colonna 11 a concatenare celle...altrimenti va a prendere anche le celle degli altri file che importo e mi crea un nome enorme

    visto che sono 11 celle da concatenare le posso fare anceh con a mano senza ciclo..però è molto piu figo con la funzione apposta xd



  • di gio (utente non iscritto) data: 24/09/2012 14:54:15

    cosi funziona..
     
    .Cells(6, 5 + y) = Cells(i, 2) & Cells(i, 3) & Cells(i, 4) & Cells(i, 5) & Cells(i, 6) & Cells(i, 7) & Cells(i, 8) & Cells(i, 9) & Cells(i, 10) & Cells(i, 11)



  • di Vecchio Frac data: 24/09/2012 16:09:18

    Ah ok, allora avevo capito male.
    Ovviamente puoi con un - molto più elegante e "figo" - ulteriore ciclo nidificato.
     
    For j = 2 to 11
        .Cells(6, 5 + y) = .Cells(6, 5 + y) & Cells(i, j)
    Next






  • di gio (utente non iscritto) data: 24/09/2012 17:08:55

    esatto era quello che avevo tentato di fare..
    da buon programmatore [quale NON sono] odio dover fare 10 volte copia-incolla...preferisco scrivermi un sano ciclo for che fa la stessa cosa..xd
    peccato che non sapevo come si facesse...xd

    io tentavo di farlo cosi:
    .Cells(6, 5 + y) = Cells(i, n)
    e la teoria non era sbagliatissima..solo che invece che concatenarmi le celle me le metteva semplicemete una dopo l'altra nella stessa riga..