Velocizzare procedimento



  • Velocizzare procedimento
    di Hellboy (utente non iscritto) data: 28/10/2015 17:12:51

    Ciao ragazzi, ultimamente sto popolando il forum di richieste :)

    Ho un problemino, leggo un file di dati, rigo per rigo, per ogni rigo trovo una coppia di caratteri Numero+Lettera e lo assegno
    alle celle su un foglio excel.

    La scrittura di quello che leggo nelle celle è molto lenta, allego il codice con la speranza che si possa velocizzare in qualche modo tutto il procedimento che ho scritto.
    Questa procedura viene chiamata all'interno di un ciclo di lettura del file.
    Se elimino la parte dove viene scritto il valore nelle celle, va una cannonata ... quando scrive nelle celle invece (soprattutto per molte righe) , vedo che il foglio excel fa uno strano effetto di "ondulazione", si capisce che sta caricando i dati ma è brutto da vedere e lento come attesa.

    HELP !!

     
    ''Con questa funzione trovo le coppie caratteri+numeri nel rigo letto
    Public Function DividiStringa(i As Long, Str As String)
    
    Dim RigoOrizzontale As Long
    Dim DivSt As String
    DivSt = ""
    RigoOrizzontale = 1 ' inizia dalla cella 1
    For i = 1 To Len(Str)
    If (Asc(Mid(Str, i, 1)) >= 48 And Asc(Mid(Str, i, 1)) <= 57) Or Mid(Str, i, 1) = "." Or Mid(Str, i, 1) = "-" Then ' qui leggo il valore numerico
      If DivSt <> "" Then
         DivSt = DivSt & Mid(Str, i, 1) ' qui compongo la stringa
      End If
    Else
       If DivSt <> "" Then
          Foglio2.Cells(RigoVerticale, RigoOrizzontale) = DivSt
          RigoOrizzontale = RigoOrizzontale + 1
          DivSt = ""
          DivSt = DivSt & Chr(10) & Mid(Str, i, 1)
       Else
          DivSt = DivSt & Chr(10) & Mid(Str, i, 1)
       End If
    End If
    Next i
    Foglio2.Cells(RigoVerticale, RigoOrizzontale) = DivSt
    ''eseguo un controllo per verificare la grandezza massima delle celle sugli assi X e Y
    If RigoOrizzontale >= RigoOrizzonataleMax Then
       RigoOrizzonataleMax = RigoOrizzontale
    End If
    RigoVerticaleMax = RigoVerticale
    
    End Function



  • di Mister_x (utente non iscritto) data: 28/10/2015 17:32:33

    ciao

    prima cosa devi dire cosa fa questa funzione

    Function DividiStringa(i As Long, Str As String) as Cosa_ritorna??? Manca

    passi un valore intero (i) , passi una stringa
    DividiStringa= a cosa questo manca in ritorno di stinga

    altra cosa For i = 1 To Len(Str) pasi un parametro a (i) e dopo lo fai diventare 1

    inserisci un file e spiega veramente coso vuoi fare con tutto questo pastrocchio

    ciao


     
    Public Function DividiStringa(i As Long, Str As String)
    
    Dim RigoOrizzontale As Long
    Dim DivSt As String
    DivSt = ""
    RigoOrizzontale = 1 ' inizia dalla cella 1
    For i = 1 To Len(Str)
    If (Asc(Mid(Str, i, 1)) >= 48 And Asc(Mid(Str, i, 1)) <= 57) Or Mid(Str, i, 1) = "." Or Mid(Str, i, 1) = "-" Then ' qui leggo il valore numerico
      If DivSt <> "" Then
         DivSt = DivSt & Mid(Str, i, 1) ' qui compongo la stringa
      End If
    Else
       If DivSt <> "" Then
          Foglio2.Cells(RigoVerticale, RigoOrizzontale) = DivSt
          RigoOrizzontale = RigoOrizzontale + 1
          DivSt = ""
          DivSt = DivSt & Chr(10) & Mid(Str, i, 1)
       Else
          DivSt = DivSt & Chr(10) & Mid(Str, i, 1)
       End If
    End If
    Next i
    Foglio2.Cells(RigoVerticale, RigoOrizzontale) = DivSt
    ''eseguo un controllo per verificare la grandezza massima delle celle sugli assi X e Y
    If RigoOrizzontale >= RigoOrizzonataleMax Then
       RigoOrizzonataleMax = RigoOrizzontale
    End If
    RigoVerticaleMax = RigoVerticale
    
    DividiStringa=   qui quello che deve ritornare alla funzione
    
    End Function






  • di hellby (utente non iscritto) data: 29/10/2015 07:51:45

    In effetti, al posto si FUNCTION andava bene anche SUB. Non ritorna nessun valore, passo io una stringa, la elaboro e la incollo nelle celle excel.

    Mentre For i = 1 To Len(Str), significa per i=1 fino alla LUNGHEZZA della STRINGA ELEBORATA, quindi un valore numerico .....LEN(STR) è un valore intero (4,100,8 aq seconda della stringa esaminata)



  • di Mister_x (utente non iscritto) data: 29/10/2015 09:19:31

    ciao

    manca sempre il file di prova e le dovute spiegazioni di cosa bisogna fare o far fare alla function() o sub()

    ciao





  • di Hellboy (utente non iscritto) data: 30/10/2015 09:01:21

    Ho allegato il file.
    Nella cartella del file scrivere un file di testo, dal nome, File.tap.
    All'interno incollare N volte queste cifre:

    G0X0.000Y0.000S15000M3
    G0X-85.828Y-57.373Z4.000
    G0X-85.828Y-57.373Z4.000
    G0X-85.828Y-57.373Z4.000
    G0X-85.828Y-67.373Z4.000
    G1Z1.000F70.0

    piu' voltre si incolla il codice, piu' si accentua il problema.



  • di isy data: 30/10/2015 13:07:18

    Ciao Hellboy

    Sostitiusci il tuo codice con questo che utilizza Replace per separare i codici.
    Nel caso mancassero altre "sigle" devi aggiungerle nella riga di codice

    Fai una prova
     
    Private Sub CommandButton12_Click()
      Application.ScreenUpdating = False
      Application.EnableEvents = False
      Application.Calculation = xlCalculationManual
      
      Dim testo As String
      Dim t As String
      Dim RigoVerticale
      Foglio2.Cells.Clear
      t = ActiveWorkbook.path & "File.tap" '(file completo di percorso)
      Dim A, K, Ar As String
      
      Open t For Input As #1
        Do While Not EOF(1)
          Line Input #1, testo   'testo linea per linea dal file
          Ar = Ar & testo & Chr$(13)
          A = Split(Trim(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(testo, _
                 "F", " F"), "G", " G"), "M", " M"), "S", " S"), "T", " T"), "X", " X"), "Y", " Y"), "Z", " Z")))
          RigoVerticale = RigoVerticale + 1
          For K = 0 To UBound(A)
            Cells(RigoVerticale, K + 1).Value = Chr$(10) & A(K)
          Next
        Loop
      Close #1  ' chiudo il file e libero la memoria
      GCode = Ar
      
      Application.EnableEvents = True
      Application.Calculation = xlCalculationAutomatic
      Application.ScreenUpdating = True
    End Sub
    



  • di hellboy (utente non iscritto) data: 30/10/2015 17:51:06

    Si, in effetti è migliorata notevolmente la lettura, ora in pratica è una scheggia.


    Ora, mi servirebbe capire posso determinare quante vengono scritte (ma penso che devo solo mettere un contatore ad ogni rigo letto come avevo fatto io ) ed il numero massimo di colonne scritte. Per le colonne ho qualche perplessità, come faccio ?



  • di hellboy (utente non iscritto) data: 31/10/2015 14:36:53

    If K >= RigoOrizzonataleMax Then ' qui eseguo un confronto e mi mantengo il numero MAX di Colonne
    RigoOrizzonataleMax = K
    End If

    ' Grazie, procedimento velocizzato e ho risolto inserendo questo codice sotto il rigo
    For K = 0 To UBound(A)
    Cells(RigoVerticaleMax, K + 1).value = Chr$(10) & A(K)
    Next

    ora, alla fine della lettura del file ho il n°Massimo di colonne ed il N°massimo di righe che mi servono per altre operazioni.
    Grazie della disponibilità.
    A presto.