selezione tra spazi



  • selezione tra spazi
    di gio (utente non iscritto) data: 19/09/2012 12:03:14

    domanda veloce..
    come faccio un ciclo for per copiare da un colonna un tot di righe [non definito] comprese tra 2 righe vuote?

    es:

    __________________



    aaa
    aaa
    aaa
    aaa

    (altro testo inutile)

    bbb
    bbb

    (altro testo inutile)

    ccc
    ccc
    ccc
    ___________
    risultato: aaaaaaaaaaaabbbbbbccccccccc



  • di Vecchio Frac data: 19/09/2012 13:29:16

    Risposta veloce:
    (i dati si trovano in A1:A10)

    for each ac in [a1:a10]
    s = s + trim(ac)
    next

    La variabile "s" contiene il risultato voluto.





  • di Vecchio Frac data: 19/09/2012 14:00:39

    Risposta articolata:
    il codice che segue esamina un range di celle senza sapere a priori la sua esatta estensione. Quindi a partire dalla cella passata in argomento, prende in esame il primo range contiguo (senza righe vuote) che incontra, lo scorre e recupera i valori delle celle, attaccandoli l'uno all'altro come hai chiesto tu, fornendo il risultato finale come stringa.
    Utilizzo:
    risultato = concat([a1])

     
    Option Explicit
    
    Function concat(r As Range) As String
    Dim ac As Range, s As String, i As Long
        If r.CurrentRegion.Cells.Count = 1 Then
            Set r = r.End(xlDown).CurrentRegion
        Else
            i = Evaluate("=countblank(" & r.CurrentRegion.Address & ")")
            If i > 0 Then
                Set r = r.Resize(r.CurrentRegion.Rows.Count - 1).Offset(1)
            Else
                Set r = r.CurrentRegion
            End If
        End If
        For Each ac In r
            s = s + Trim(ac)
        Next
        
        concat = s
    End Function






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

    grazie per la risposta..ma temo che sia ben oltre le mie conoscenze di excel..ergo se uso questa funzione il programma potrebbe anche funzionare ma non avrei minimanete idea di come correggerlo se dovessi adattarlo a qualcos altro o correggerlo..
    quindi prima di prendere la tua soluzione ti cheiderei di aiutarmi a sviluppare la mia modesta e limitata idea di partenza..

    guarda qua sotto...
    il codice funziona ma solo fino alla prima serie..
    riesci a correggermelo?
     
    'le celle che mi interessano vanno dalla cella D21 in giu...100 l'ho messo per far continuare il ciclo in modo da prendere tutte le celle..poi andrà sistemato per farlo fermarsi a fine file..
    
    For i = 21 To 100
       If Cells(i, 3) <> " " Then
         With Sheets("Foglio2")
         .Cells(1, i - 20) = Cells(i, 3)
         End With
        Else: i = i + 4        
    'questa riga in teoria dovrebbe saltare da una serie di numeri all'altra..in  pratica no
       End If
    Next i



  • di Vecchio Frac data: 19/09/2012 15:39:03

    Il mio codice non è così impossibile da capire, in pratica cerca di indovinare dove un range di valori inizia e finisce (in pratica se è compreso tra una riga vuota sopra [oppure se inizia dalla prima riga] e una riga vuota sotto).
    Quindi prende il contenuto delle celle e le concatena in una variabile stringa.
    Ma tu, col tuo codice (e non potevi postarlo prima? :D), mi fai capire che vuoi copiare dei valori da una cella (di un foglio) ad un'altra cella (di un altro foglio)... il che non è esattamente la stessa cosa!
    A prima vista l'approccio sbagliato è
    If Cells(i, 3) <> " " Then ...
    che dovrebbe essere
    If Trim(Cells(i, 3)) <> "" Then ...

    Non mi piace molto poi che la variabile "i" venga modificata in corso di ciclo, piuttosto usiamo uno Step.

    E se è una trasposizione dei dati quella che vuoi, perché non usare Copy con Transpose := True?
    (ma prima di illustrarti questa possibilità, confermami che vuoi una copia con trasposizione altrimenti continuo a infarcirti di cose magari inutili ;) )







  • di Vecchio Frac data: 19/09/2012 15:50:48

    Ti do lo stesso l'idea per usare Transpose, vedi codice allegato.
    Lo commento per miglior comprensione :)
     
    Sub test2()
    
        'attiva il foglio1
        Sheets("Foglio1").Activate
    
        'copia in memoria l'intero intervallo di celle tra C21 e l'ultima cella valorizzata in colonna C
        'per far questo estende la selezione dal fondo del foglio a ritroso simulando la pressione del tasto End
        Range(Cells(21, 3), Cells(65535, 3).End(xlUp)).Copy
    
        'incolla quanto copiato in precedenza a partire dalla cella A1 del foglio2
        'operando una trasposizione dei dati, invertendo cioè righe e colonne
        Sheets("Foglio2").Range("a1").PasteSpecial Transpose:=True
    
        'disattiva la modalità "Copiaincolla" di Excel
        Application.CutCopyMode = False
    
    End Sub






  • di gio (utente non iscritto) data: 19/09/2012 16:32:31

    dunque..i dati li metto su un altro foglio per comodità..per poterli rielaborare senza disordine in giro..[mi servono trasposti in orizzontale i dati]

    la funzione come l'ho scritta io fa quello che mi serve...al di là che non sia ottimizzata magari il cambio di valore della "i" lo fa solo [in teoria] quando la condizione If Cells(i, 3) <> " " risulta vera...ovvero quando trova una cella vuota...e da quella in teoria dovrebbe saltare giu di 4 caselle..in modo che trova esattametne l'inizio della seconda sequenza di numeri...
    la funzione end non so se va bene nel mio caso..perchè sotto una 20ina di righe ci sono altre celle piene ma di valori che nno mi servono..quindi magari andrebbe a pescare anceh quei valori..per cui preferisco dargli un limite [che adesso è 100 ma in seguito vedrò di adattare in base a quanto serve] in modo che non vada a pescare valori inutili...

    la funazione trim non l'ho mai usata...
    If Trim(Cells(i, 3)) <> "" Then
    e sincerametne questa funzione non l'ho mai usata..non la capisco...toglie gli spazi?

    PS: il codice non potevo postarlo prima perchè l'ho scritto dopo aver già messo il post xd...mi è venuto un colpo di genio e ho buttato giu 2 righe...e con enorme stupore funzionava anceh!!!!



  • di Vecchio Frac data: 19/09/2012 17:21:23

    Attenzione, la cella vuota non è una cella con uno spazio!
    *NON*
    If Cells(i, 3) <> " " Then ...

    *MA*
    If Cells(i, 3) <> "" Then

    La vedi la differenza?
    Il Trim serve a rimuovere gli spazi a sinistra e destra di una stringa
    Pertanto con If Trim(Cells(i, 3)) <> "" Then ... sei arcisicuro che intercetti il valore di "cella vuota".
    E comunque come hai constatato bisogna solo provare a sperimentare :)





  • di gio (utente non iscritto) data: 20/09/2012 11:19:59

    ah ok ho capito! perfetto!

    sto iniziando a divertirmi a programmare! xd

    caso risolto!

    PS: abbiate pietà se aprirò altri topic..ma sto facendo una serie di programmi per lavoro tutti diversi..e sto imparando da solo a progammare..

    PS2: riusciresti a eliminare i file allegati del topic "doppio ciclo"...sono dati di lavoro e preferirei se non girassero mezzo internet, grazie



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

    un solo dettaglio non capisco..

    For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
    If Cells(26, i) = "" Then
    Cells(26, i).Select
    Selection.EntireColumn.Delete
    End If
    Next i

    dunque..dopo varie rielaborazioni ho creato una tabella con tutta una serie di valori che mi servono.. a causa di un ciclo for [non ottimale]che mi compila la tabella..tra una serie di valori e un altra mi trovo 4 colonne vuote,o per meglio dire inutili, ma comuqneu contennti valori [vale sempre il discorso che i dati potrebbero aumentare e quindi non sono sicuro che in futuro magari ne saltano fuori di piu di colonne vuote]
    con questa funzione io vado a cercare in una precisa cella di tutte le colonne se ci sono dei valori o meno...e se non trovo nietne vuol dire che la colonna è una di quelle inutili..e quindi la cancello..

    il problema è che questo ciclo devo eseguirlo almeno 3 volte...siccome a ogni passata è come se mi cancella solamente la metà delle colonne vuote..ma non capisco perchè..



  • di Vecchio Frac data: 20/09/2012 17:58:07

    Per quanto riguarda i file dell'altro post, "doppio ciclo", si elimineranno da soli dopo tre giorni dall'inserimento. Io pur essendo moderatore non posso intervenire per rimuovere gli allegati. Raccomandiamo sempre di non inserire dati privati, ma solo dati di esempio, proprio per questo motivo.

    Per il codice che hai postato, questo prende in esame le righe della colonna A dalla prima fino all'ultima valorizzata, ne prende il numero (di riga), ma poi controlla la cella che si trova in: riga 26, colonna corrispondente a quel numero di riga (!). Seleziona la colonna e la cancella.
    Quindi c'è qualcosa che non va nel codice... è corretto cancellare la colonna che si trova al n° di riga corrispondente all'ultima cella valorizzata in colonna A? rivedi il tuo ragionamento, scrivilo in pseudocodice e trascrivilo con la sintassi corretta.





  • di gio (utente non iscritto) data: 21/09/2012 12:50:31

    non mi serve piu eliminare le colonne..

    adesso sto facendo un altro programma.. sono bloccato su una funzione stupida..

    situazione: ogni 4 celle in verticale ho un valore che devo copiare su una riga di un altro foglio..però devono essere tutti attaccati in quella riga [e non staccati di 4 come succede a me]..le celle da selezionare [ogni 4] sono divise in 2 intervalli nella stessa colonna..
    il secondo intervallo dovrei concatenarlo al primo sull'altro foglio

    Esempio:

    aaa

    aaa

    aaa

    aaa

    afwevwevawegawg
    wegawgawgawgaw
    gawgawgwg
    awegawg
    awg

    bbb

    bbb

    bbb

    bbb

    risultato [su altro foglio]: aaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbb

    [riesci a capire vagamente cosa devo fare?]
    questo è il codice che ho fatto fino a adesso:
     
    For i = 30 To 84 Step 4         'valori misurati
        With Sheets("fogliox")
           .Cells(1, i - 29) = Cells(i, 2)
        End With
    Next i
    
    For i = 104 To 172 Step 4         'valori misurati
        With Sheets("fogliox")
            If IsNumeric(Cells(i, 2)) Then
           .Cells(2, i - 103) = Cells(i, 2)
           End If
        End With
    Next i
    



  • di gio (utente non iscritto) data: 21/09/2012 12:52:28

    ps: nel codice che ho scritto io faccio spostare il primo intervallo sulla riga 1 e il secondo sulla riga 2 per capire se fa guisto il ciclo..ma mi servono tutti e 2 sulla stessa riga concatenati



  • di gio (utente non iscritto) data: 21/09/2012 15:30:29

    anche sto problemino risolto..mi è bastato far selezionare tutte le celle che contengono solo numeri e copiarle..