vettore Ubound



  • vettore Ubound
    di almanegrita (utente non iscritto) data: 22/12/2017 16:28:31

    ciao a tutti voi e buone festività natalizie prima di tutto.
    Ho un problema con un vettore...
    Sul foglio dove lavoro ho una routine che mi genera un file csv...
    quando nel foglio sono presenti solo i dati sulla prima rica ( escludendo l'intestazione ) il sistema mi da errore.
    quando nel foglio sono presenti almeno 2 righe ( escludendo l'intestazione ) il sistema fila liscio.
    dove sbaglio ?
    Graziie
     
    Sub gnocchete_sgt()
    Sheets("TRACK_SGT").Select
    LR = Cells(Rows.Count, "A").End(xlUp).Row
    sn = Range("AA2:AA" & LR)
    For J = 1 To UBound(sn)
        c00 = c00 & Join(Application.Index(sn, J, 0), ",") & ",SOGETRAS" & vbCrLf
    Next
    CreateObject("scripting.filesystemobject").createtextfile(ThisWorkbook.Path & "GNOCCHETEGNOCCHETE_SGT.csv").Write c00
    Sheets("CARICO").Select
    End Sub



  • di oregon (utente non iscritto) data: 22/12/2017 16:43:10

    Prova a visualizzare il valore di Lr con un msgbox e cosi' ti renderai conto nei vari casi cosa devi fare



  • di Albatros54 data: 22/12/2017 18:42:13

    prova a sostituire il ciclo for partendo da 0(zero), perche i vettori cominciano il conteggio da Zero,quindi in una matrice con dieci elementi saranno numerati non da 1 a 10 , ma da 0 a 9.
    ciao
    albatros54





  • di scossa data: 22/12/2017 20:35:08

    cit.: "... perche i vettori cominciano il conteggio da Zero ..."

    Ciao,

    quando si assegna un range ad una matrice, la matrice ha base 1 e non 0.


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)


  • vettore Ubound
    di almanegrita (utente non iscritto) data: 23/12/2017 07:39:05

    si, sono a conoscenza che i vettori conteggiano partendo da zero, provai a farla la modifica ma nulla di che....



  • di Albatros54 data: 23/12/2017 08:13:48

    @scossa

    cit:...perche i vettori cominciano il conteggio da Zero

    cit:..quando si assegna un range ad una matrice, la matrice ha base 1 e non 0

    Forse ho sbagliato ad esternare il mio pensiero


    ciao
    albatros54





  • di patel data: 23/12/2017 08:23:28

    inoltre è strano calcolare LR sulla colonna "A" e poi definire il range sulla "AA"




  • vettore Ubound
    di almanegrita (utente non iscritto) data: 23/12/2017 09:17:00

    grazie per le risposte datemi....
    per farvi capire meglio la situazione ho allegato il file excel ed un csv che utilizzo per importare delle spedizioni, che poi verrranno elaborate nello stesso file.
    Le operazioni che eseguo sono
    1 - importo il csv con la macro.
    2 - viene generata una stringa che viene composta con il famoso ciclo for .....
    quando nel file csv c'è solo 1 riga il sistema genera un errore..mentre se nel csv ci sono almeno 3 righe non da problemi.
    vi saluto cordialmente.



  • di scossa data: 23/12/2017 09:35:31

    Ciao Albatros,

    cit. Albatros54: ".. Forse ho sbagliato ad esternare il mio pensiero"

    assolutamente non hai sbagliato ad esternare il tuo pensiero, solo che l'informazione era, in questo contesto, inesatta, e mi è sembrato giusto fare quella precisazione.



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee.
    (George Bernard Shaw)


  • hai fatto
    di patel data: 23/12/2017 10:39:36

    allegare il file è sempre consigliato, ma in questo caso mi sembra che tu non abbia voglia di seguire i consigli dati da chi cerca di farti ragionare per arrivare alla soluzione




  • vettore Ubound
    di almanegrita (utente non iscritto) data: 24/12/2017 08:59:25

    ho provato a sostituire il ciclo for ma mi da sempre errore debug.
    Il file viene letto correttamente, sia con 2 righe ( dando errore ) ma importando correttamente i dati, sia con 3 o piu righe ( non dando errori ).
    il problema è che poi non mi scrive il file.
    L'ho capito che il ciclo for cicla da 1 alla fine del pedice maggiore dichiarato su ubound.
    Non capisco perche solo su una matrice 1 x 3 da errore.



  • di oregon (utente non iscritto) data: 24/12/2017 10:16:58

    Quando non si capisce da cosa deriva un errore, si fanno i controlli che ti ho detto nel mio primo post e a cui non hai neanche risposto.

    La situazione è banale, ma se non la affronti nel modo corretto, facendo un po' di debugging ma attendendo la manna dal cielo, probabilmente ci starai un po' più di tempo a risolvere ...



  • di patel data: 24/12/2017 17:46:55

    almanegrita, quando hai una sola riga e quindi il range sn è composto da una sola cella la funzione ubound ti dà errore perché un array con un solo dato non ha senso, quindi devi gestire questa possibilità con un IF
     
    Sub gnocchete_sgt()
    Sheets("TRACK_SGT").Select
    LR = Cells(Rows.Count, "A").End(xlUp).Row
    sn = Range("AA2:AA" & LR)
    If LR > 2 Then
      For J = 1 To UBound(sn)
        c00 = c00 & Join(Application.Index(sn, J, 0), ",") & ",SOGETRAS" & vbCrLf
      Next
    Else
      c00 = sn & ",SOGETRAS"
    End If
    CreateObject("scripting.filesystemobject").createtextfile(ThisWorkbook.Path & "GNOCCHETEGNOCCHETE_SGT.csv").Write c00
    Sheets("CARICO").Select
    End Sub






  • di Zer0Kelvin data: 24/12/2017 18:04:29

    Ciao.
    Il problema sembra questo: quando la riga è una sola, l'istruzione
    sn = Range("AA2:AA" & LR)
    non crea un vettore come ci si aspetterebbe, ma assegna alla variabile sn (che è Variant, dal momento che NON E' STATA DICHIARATA) la stringa contenuta in AA2.
    A questo punto, ovviamente, la successiva istruzione
    For J = 1 To UBound(sn)
    restituisce un errore, dal momento che non esiste l'Ubound di una stringa!
    Ti conviene distinguere il caso in cui ci sia una sola riga e trattarlo diversamente.
    Potresti usare VarType(sn) per determinare se la variabile contiene un vettore o una stringa.
    Poi l'istruzione
    c00 = c00 & Join(Application.Index(sn, J, 0), ",") & ",SOGETRAS" & vbCrLf
    mi sembra insensata dato che, credo, sia equivalente a
    c00 = c00 & sn(J,1) & ",SOGETRAS" & vbCrLf


    PS: ciao Patel, hai risposto mentre scrivevo.
    In sostanza diciamo la stessa cosa



  • di Zer0Kelvin data: 24/12/2017 18:14:13

    Eliminando la variabile sn, che secondo me non serve a nulla, il tutto si riduce a 
     
    Sub gnocchete_sgt()
    Dim Lr As Long, J As Long
    Dim C00 As String
    With Sheets("TRACK_SGT")
        Lr = .Cells(Rows.Count, "A").End(xlUp).Row
        For J = 2 To Lr
            C00 = C00 & .Cells(J, "AA") & ",SOGETRAS" & vbCrLf
        Next
    End With
    CreateObject("scripting.filesystemobject").createtextfile(ThisWorkbook.Path & "GNOCCHETEGNOCCHETE_SGT.csv").Write C00
    Sheets("CARICO").Select
    End Sub
    



  • di patel data: 24/12/2017 19:25:59

    Così però non vale
    è troppo più semplice e comprensibile




  • vettore Ubound
    di almanegrita (utente non iscritto) data: 26/12/2017 08:19:06

    grazie dell'aiuto...avevo intuito che ci fosse un problema con l'array.......
    una cosa.....perche ci mettete un Long per ciclare ?
    non sarebbe piu oppirtuno un int ?
    tanto al massimo ho 300 righe piene...l'ho modficata e credo vada bene ugualmente.
    cmq grazie a tutti voi....apro un altro 3d ora perche ho un altro problemino che vorrei affrontare con voi.
    Buone festività a tutti voi.
     
    Sub gnocchete_sgt()
    Dim Lr As Integer, J As Integer
    Dim C00 As String
    With Sheets("TRACK_SGT")
        Lr = .Cells(Rows.Count, "A").End(xlUp).Row
        For J = 2 To Lr
            C00 = C00 & .Cells(J, "AA") & ",SOGETRAS" & vbCrLf
        Next
    End With
    CreateObject("scripting.filesystemobject").createtextfile(ThisWorkbook.Path & "GNOCCHETEGNOCCHETE_SGT.csv").Write C00
    Sheets("CARICO").Select
    End Sub



  • di Zer0Kelvin data: 26/12/2017 10:39:04

    ".perche ci mettete un Long per ciclare ? "
    Perchè la grandezza da ciclare (n° di riga) ha le dimensioni di un long e sarebbe concettualmente scorretto fare diversamente.

    "tanto al massimo ho 300 righe piene"
    Sì, ma siamo in un forum, e non è detto che qualcun altro non usi questo codice in un contesto differente con un n° di righe molto superiore.
    E' successo molte volte che un integer usato per ciclare una riga provocasse un errore.
    E non è che sia un gran risparmio usare un Integer invece di un Long.