aiuto if else su row



  • aiuto if else su row
    di enrico (utente non iscritto) data: 04/12/2012 17:39:25

    Buonasera,

    il mese scorso sono riuscito a risolvere un problema con una macro grazie a voi, nonostante io non sia assolutamente un programmatore. Purtroppo ora mi e' stata chiesta un'altra cosa sulla stessa macro e speravo in un ulteriore aiuto...

    Allora in generale la parte della macro che devo modificare e' riportata sotto (il compito della macro e' quello di scrivere il contenuto di una parte del foglio di calcolo su un file di testo).

    Ora devo aggiungere una "p" all'ultima parte se si verificano alcune condizioni, ossia che ci sia un certo valore nella prima cella della riga in questione e che non ci sia il simbolo ":" nella settima cella della riga.

    Ho provato ad usare una cosa del tipo (da inserire al posto della riga 6 del codice riportato sotto):

    r = ActiveCell.Row

    If ActiveSheet.Cells(r, 7).Value <> ":" And (ActiveSheet.Cells(r, 1).Value = "txt1" Or ActiveSheet.Cells(r, 1).Value = "txt2" Or ActiveSheet.Cells(r, 1).Value = "txt3") Then
    s = s & Format(cella.Cells(7), "0") & "p" & vbTab
    Else
    s = s & Format(cella.Cells(7), "0") & vbTab
    End If


    Ma non funziona per niente. Immagino sia una cosa molto facile, ma apparentemente non per me...

    Grazie mille!
     
        If cella.Row > 3 And cella.Row <> n_rows Then
            s = ""
            For i = 1 To 6
                s = s & Trim(cella.Cells(i)) & vbTab
            Next
            s = s & Format(cella.Cells(7), "0") & vbTab
            Print #1, s
        End If



  • di Vecchio Frac data: 05/12/2012 21:56:57

    Ora, io a memoria non ricordo molto del codice precedente anche se ricordo la discussione quindi vado un po' a naso :)
    Secondo me è sbagliato r = ActiveCell.Row.
    E' molto probabile che ti avessi consigliato un ciclo For Each con "cella" come contatore.
    Quindi il riferimento di riga deve essere:
    r = cella.Row

    Ma probabilmente "cella" era un'intera riga e quindi non ti serve nemmeno il riferimento a "r":
    If cella.Cells(7) <> ":" And cella.Cells(1) Like "txt[1-3]" Then
    s = s & Format(cella.Cells(7), "0") & "p" & vbTab
    Else
    s = s & Format(cella.Cells(7), "0") & vbTab
    End If

    E guarda anche che finezza l'uso di Like in quel modo ^_^:
    se il valore della prima cella del range "cella" (che probabilmente è una riga) assomiglia a "txt" seguito da 1, 2 oppure 3, allora esegui il Then.





  • di enrico (utente non iscritto) data: 06/12/2012 12:04:18

    Perfetto!! Grazie mille, funziona una meraviglia :)

    Giusto una domandina per capire meglio io (cosi' magari prima o poi riusciro' a fare qualcosa anche da solo...)

    Nel mio codice c'e' il for di questo tipo: For Each cella In [a1].CurrentRegion.Rows

    Ora, avrei potuto fare questa parte che mi hai risolto anche con un for del tipo indicato sotto?

    For Each cella In [a1].CurrentRegion.Columns


    Grazie mille comunque!! :)



  • di Vecchio Frac data: 06/12/2012 15:40:54

    Hai visto? avevo ragione :D

    cit. " For Each cella In [a1].CurrentRegion.Rows "
    ---> è concettualmente sbagliato chiamare così una variabile che punta a una riga! sicuramente l'errore iniziale è mio e ti chiedo scusa. Se in futuro chiamerai una variabile di quel tipo come "aRow" oppure "una_riga" oppure "tutta_la_riga_di_valori" allora anche il flusso delle operazioni sarà più chiaro.

    In pratica stiamo scorrendo riga per riga l'intero range per valori.
    E ci riferiamo ad ogni singola cella di ogni riga con .Cells().
    Per questo *non* va bene pensare a riferirsi alle singole colonne di quella riga nel modo in cui ipotizzi che funzioni; bisognerebbe implementare un ciclo del tipo (mantengo il riferimento a "cella" intendendo per essa l'intera riga di valori):
    For Each singola_cella in cella.Cells
    if singola_cella<>":" and singola_cella Like "txt[1-3]" then
    ...
    else
    ...
    end if
    Next