Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Inserimento di uno spazio nel contenuto di un range

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Inserimento di uno spazio nel contenuto di un range

Postdi zanatta77 » 15/02/14 16:04

Sto cercando di inserire uno spazio per tutto il contenuto di un range che va da "C1" a "C1000" ma non riesco a uscirne fuori,potreste dirmi dove sbaglio.
Grazie
Mettendo un solo range, funziona.
Codice: Seleziona tutto
Dim parola As String, carattere As String, ctr As Long, finale As String
parola = Range(Cells(1, 4), Cells(1000, 4)).Value
For inter = 1 To Len(parola)
carattere = Mid(parola, inter, 1)
If inter = Len(parola) Then
finale = finale & carattere
Else
finale = finale & carattere & " "
End If
Next
Range(Cells(1, 4),Cells(1000, 4)) = finale
Windows 8
Office 2010
Avatar utente
zanatta77
Utente Senior
 
Post: 114
Iscritto il: 01/12/12 16:12

Sponsor
 

Re: Inserimento di uno spazio nel contenuto di un range

Postdi ricky53 » 15/02/14 16:14

Ciao,
non verrei interpretare cosa ti occorre dal tuo codice perchè potrei non capire la tua reale necessità, quindi, puoi esporre in modo più chiaro cosa ti occorre.

In particolare
... inserire uno spazio per tutto il contenuto di un range ...


Sicuro che il tuo codice funzioni e non dia errori?

Comunque guardando il tuo codice ma non ho voluto, per il motivo su esposto, approfondirlo molto vedo che aggiungi uno spazio fra le varie ...


Chiarisci e ne usciremo
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Inserimento di uno spazio nel contenuto di un range

Postdi zanatta77 » 15/02/14 16:24

Grazie per la celere risposta.
Praticamente nella colonna"C" di un foglio dove all'interno di ogni cella ci sono numeri a partire dalla cells(1,4) fino ad arrivare alla cells(1000,4) vorrei inserire uno spazio per ogni numero contenuto nelle celle.
Esempio se nella "C1" c'è 12563 deve diventare 1 2 5 6 3.
Windows 8
Office 2010
Avatar utente
zanatta77
Utente Senior
 
Post: 114
Iscritto il: 01/12/12 16:12

Re: Inserimento di uno spazio nel contenuto di un range

Postdi scossa » 15/02/14 16:26

Ciao,

quando si condivide un codice lo si deve postare completo: da SUB miaSub() a End Sub
Bye!
scossa

Se tu hai una mela, e 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)
Avatar utente
scossa
Utente Senior
 
Post: 424
Iscritto il: 01/04/12 16:40
Località: Provincia di Verona

Re: Inserimento di uno spazio nel contenuto di un range

Postdi ricky53 » 15/02/14 16:35

Caio,
dopo aver letto quanto scritto da Scossa

adesso si capisce però il tuo codice, che avevi detto che funzionava, non fa questo oltre al fatto che va in errore appena lo esegui

Quindi i dati sono solo in colonna "C" e tu vuoi, in colonna "D", il risultato con "uno" spazio tra le varie cifre che compongono ogni numero delle colonna "C" il tutto solo per le righe da 4 a 10?


Sicuro che questa sia la tua reale esigenza oppure non hai semplificato la problematica per poter esporre il quesito?
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Inserimento di uno spazio nel contenuto di un range

Postdi ricky53 » 15/02/14 17:03

Ciao,
prima ho scritto 4 ma intendi 1, 10 ma volevo scrivere 1000 ... avevo fatto le prove su queste aree.

Ho riadattato il tuo codice ... ma si può ottimizzare ancora cosa che lascio a te se la vuoi fare.
Per esempio va impostato il foglio su cui agire e le corrispondenti aree e celle altrimenti si va a modificare un altro foglio


Ecco quanto ho modificato
Codice: Seleziona tutto
Option Explicit

Sub Elabora()
    Dim Carattere As String, Inter As Long, Finale As String
    Dim Intervallo As Range, Cella As Range
   
    Set Intervallo = Range("C1:C1000") ' <<===== Qui imposti l'intervallo su cui agire
    For Each Cella In Intervallo
        Finale = ""
        For Inter = 1 To Len(Cella)
            Carattere = Mid(Cella, Inter, 1)
            If Inter = Len(Cella) Then
                Finale = Finale & Carattere
            Else
                Finale = Finale & Carattere & " "
            End If
        Next
        Cella.Offset(0, 1) = Finale ' <<==== Qui imposti la colonna su cui scrivere i dati modificati
    Next Cella
   
    MsgBox "Elaborazione Effettuta", vbInformation
End Sub
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Inserimento di uno spazio nel contenuto di un range

Postdi zanatta77 » 15/02/14 17:20

Scusate ma non pensavo fossero fondamentali inizio e fine procedura.
Nella fretta ho scritto
Codice: Seleziona tutto
Range(Cells(1, 4), Cells(1000, 4))
mentre invece quella corretta è
Codice: Seleziona tutto
Range(Cells(1, 3), Cells(1000, 3))
stavo facendo varie prove di macro e mi è rimasta copiata quella errata.
Vi spiego esattamente cosa dovrebbe fare la macro associata a un pulsante.
Premo il pulsante e dovrebbe andare nelle celle di un foglio excel che vanno da "C1" a "C1000" e dare uno spazio per ogni carattere/numero contenuto nelle celle stesse.
esempi; se nella cella "C7" c'è "456987" premendo il pulsante nella stessa posizione si avrà "4 5 6 9 8 7 " - se nella cella "C100" c'è "252525" premendo il pulsante nella stessa posizione si avrà "2 5 2 5 2 5 "
Windows 8
Office 2010
Avatar utente
zanatta77
Utente Senior
 
Post: 114
Iscritto il: 01/12/12 16:12

Re: Inserimento di uno spazio nel contenuto di un range

Postdi zanatta77 » 15/02/14 17:33

Grazie ricky53
adesso esegue esattamente quanto richiesto,la devo solo adattare alla mia esigenza.
Buon week end.
Windows 8
Office 2010
Avatar utente
zanatta77
Utente Senior
 
Post: 114
Iscritto il: 01/12/12 16:12

Re: Inserimento di uno spazio nel contenuto di un range

Postdi scossa » 15/02/14 18:37

ricky53 ha scritto:Ho riadattato il tuo codice ... ma si può ottimizzare ancora cosa che lascio a te se la vuoi fare.
Per esempio va impostato il foglio su cui agire e le corrispondenti aree e celle altrimenti si va a modificare un altro foglio


Ciao Ricky,
giusto per stimolare un po' l'ambiente, visto che abbiamo solo una colonna direi che una ottimizzazione potrebbe essere quella di usare una matrice: ovviamente per 1000 celle il miglioramento è impercettibile, ma provata su 32000 celle si passa da quasi 5 secondi a 0,48 secondi!

Poi una soluzione interessante sarebbe quella di usare le reg-exp.
Bye!
scossa

Se tu hai una mela, e 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)
Avatar utente
scossa
Utente Senior
 
Post: 424
Iscritto il: 01/04/12 16:40
Località: Provincia di Verona

Re: Inserimento di uno spazio nel contenuto di un range

Postdi Anthony47 » 15/02/14 21:05

Avendo zanatta confermato la soluzione del suo problema, mi piace l' idea del "contest" su come svolgere piu' efficientemente il lavoro, e sparo il mio miglior codice:
Codice: Seleziona tutto
Sub elabora2()
Dim mySorg(), myOut(), I As Long, LastC As Long, myTim As Single

Range("C:C").ClearContents
Range("B3").Resize(Range("B1").Value, 1).Copy Destination:=Range("C3")

myTim = Timer
LastC = Cells(Rows.Count, 3).End(xlUp).Row
ReDim mySorg(1 To LastC)
ReDim myOut(1 To LastC)
mySorg = Range("C3:C" & LastC).Value
For I = 1 To LastC - 2
    myOut(I) = Replace(StrConv(mySorg(I, 1), 64), Chr(0), " ")
Next I
Range("E3").Resize(LastC - 2, 1) = Application.WorksheetFunction.Transpose(myOut)
MsgBox ("Completato in " & (Timer - myTim))
End Sub

Per provare:
-creare da B3 in giu' un elenco lungo 5-65mila righe di numeri vari, di lunghezza 3-6 crt. Io ho usato la formula =INT(CASUALE()*100000)+1000 e poi ho fatto Copia /Incolla valori
-in B1 scrivere su quante righe provare
-lanciare la macro

La macro prima popola la colonna C (da C3 in giu') per il numero di righe scritto in B1, poi fa l' inserimento dello spazio tra i crt, mettendo i risultati in colonna E (in col D c' erano quelli di Ricky, per confrontare se i miei risultati erano analoghi).

I risultati mi sembrano "competitivi"...

L' obiettivo non e' trovare la migliore soluzione, ma scambiarci le idee.

Ciao!
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13904
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Inserimento di uno spazio nel contenuto di un range

Postdi scossa » 15/02/14 21:56

Ciao,

mi sono accorto solo ora di non aver messo nel mio post precedente il codice della sub modificata con l'array, scusate.

Avevo preparato due sub.
La prima è appunto una modifica, a quella proposta, con l'uso di una matrice.
L'altra utilizza sempre una matrice, ma fa ricorso alle reg-exp per la inserire lo spazio tra un carattere e l'altro.

Poi, cogliendo l'ottimo spunto di Anthony (Replace(StrConv(mySorg(I, 1), 64), Chr(0), " ")) ho aggiunto una terza sub sostituendo le reg-exp con StrConv.

I dati sono in C1:C64000 e comprendono numeri da 123 a 332790 variamente mescolati.
Ho modificato quella di Anthony per adeguarla al range che avevo impostato (C1:C64000).

I risultati sono praticamente identici (mediamente 1 secondo su 4 ripetizioni) per tutte e 4 le soluzioni.


Riepilogo i tre codici usati:

Sub originale-modificata:
Codice: Seleziona tutto
Sub Elabora()
    Dim Carattere As String, Inter As Long, Finale As String
    Dim Intervallo As Range, Cella As String
    Dim aRng As Variant
    Dim nStart As Single
    Dim j As Long
   
    Set Intervallo = Range("C1:C" & Cells(Rows.Count, 3).End(xlUp).Row) ' <<===== Qui imposti l'intervallo su cui agire
    aRng = Intervallo
    Application.ScreenUpdating = False
    nStart = Timer
    For j = LBound(aRng) To UBound(aRng)
        Finale = ""
        Cella = aRng(j, 1)
        For Inter = 1 To Len(Cella)
            Carattere = Mid(Cella, Inter, 1)
            If Inter = Len(Cella) Then
                Finale = Finale & Carattere
            Else
                Finale = Finale & Carattere & " "
            End If
        Next
        aRng(j, 1) = Finale ' <<==== Qui imposti la colonna su cui scrivere i dati modificati
    Next j
    Intervallo.Offset(0, 1) = aRng
    Application.ScreenUpdating = True
    MsgBox "Elaborazione Effettuta in " & Timer - nStart, vbInformation
End Sub




Sub Anthony:
Codice: Seleziona tutto
Sub elabora2()
Dim mySorg(), myOut(), I As Long, LastC As Long, myTim As Single

'Range("C:C").ClearContents
'Range("B3").Resize(Range("B1").Value, 1).Copy Destination:=Range("C3")
Application.ScreenUpdating = False
 
myTim = Timer
LastC = Cells(Rows.Count, 3).End(xlUp).Row
ReDim mySorg(1 To LastC)
ReDim myOut(1 To LastC)
mySorg = Range("C1:C" & LastC).Value
For I = 1 To LastC
    myOut(I) = Replace(StrConv(mySorg(I, 1), 64), Chr(0), " ")
Next I
Range("E1").Resize(LastC, 1) = Application.WorksheetFunction.Transpose(myOut)
Application.ScreenUpdating = True
MsgBox ("Completato in " & (Timer - myTim))
End Sub


Sub Scossa con Reg-exp:
Codice: Seleziona tutto
'---------------------------------------------------------------------------------------
' Procedure : Ingrassa
' Author    : scossa
' Date      : 15/02/2014
' Purpose   : sostituisce un carattere con se stesso ed uno spazio: 123 -> 1 2 3
'---------------------------------------------------------------------------------------
'
Public Sub Ingrassa()

  Dim wb As Workbook
  Dim ws As Worksheet
  Dim rng As Range
  Dim Cella As Range
  Dim re As Object
  Dim aRng As Variant
  Dim sParsed As String
  Dim sPatt As String
  Dim nStart As Single
  Dim j As Long
 
  On Error GoTo Ingrassa_Error
 
  Set re = CreateObject("vbscript.regexp")
  Set wb = ThisWorkbook
  Set ws = wb.ActiveSheet
 
  Application.ScreenUpdating = False
  nStart = Timer
  Set rng = ws.Range("C1:C" & Cells(Rows.Count, 3).End(xlUp).Row)
  aRng = rng
  With re
    .Global = True
    sPatt = "."
    .IgnoreCase = True
    .Pattern = sPatt
    For j = LBound(aRng) To UBound(aRng)
      aRng(j, 1) = Trim(.Replace(aRng(j, 1), "$& "))
    Next
  End With
  rng.Offset(0, 3) = aRng
  On Error GoTo 0

Ingrassa_Error:
  Application.ScreenUpdating = True

  If Err.Number <> 0 Then
    MsgBox "Error: " & Err.Description, vbCritical, "ERRORE"
  Else
      MsgBox "Elaborazione Effettuta in " & Timer - nStart, vbInformation
  End If
  Set rng = Nothing
  Set ws = Nothing
  Set wb = Nothing
  Set re = Nothing
End Sub



Sub scossa con Replace(StrConv(aRng(j, 1), 64), Chr(0), " ")
Codice: Seleziona tutto
'---------------------------------------------------------------------------------------
' Procedure : Ingrassa2
' Author    : scossa
' Date      : 15/02/2014
' Purpose   : sostituisce un carattere con se stesso ed uno spazio: 123 -> 1 2 3
'---------------------------------------------------------------------------------------
'
Public Sub Ingrassa2()

  Dim wb As Workbook
  Dim ws As Worksheet
  Dim rng As Range
  Dim Cella As Range
  Dim bCalc As XlCalculation
  Dim aRng As Variant
  Dim nStart As Single
  Dim j As Long
 
  On Error GoTo Ingrassa_Error
 
  Set wb = ThisWorkbook
  Set ws = wb.ActiveSheet
 
  Application.ScreenUpdating = False
  nStart = Timer
  Set rng = ws.Range("C1:C" & Cells(Rows.Count, 3).End(xlUp).Row)
  aRng = rng
  For j = LBound(aRng) To UBound(aRng)
      aRng(j, 1) = Replace(StrConv(aRng(j, 1), 64), Chr(0), " ")
  Next
  rng.Offset(0, 4) = aRng
  On Error GoTo 0

Ingrassa_Error:
  Application.ScreenUpdating = True

  If Err.Number <> 0 Then
    MsgBox "Error: " & Err.Description, vbCritical, "ERRORE"
  Else
      MsgBox "Elaborazione Effettuta in " & Timer - nStart, vbInformation
  End If
  Set rng = Nothing
  Set ws = Nothing
  Set wb = Nothing

End Sub
Bye!
scossa

Se tu hai una mela, e 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)
Avatar utente
scossa
Utente Senior
 
Post: 424
Iscritto il: 01/04/12 16:40
Località: Provincia di Verona

Re: Inserimento di uno spazio nel contenuto di un range

Postdi ricky53 » 16/02/14 03:37

Caspita che confronti che hai prodotto.

E' importante il fatto che i tempi siano confrontabili.

Solo come commento anche nel codice proposto da Zanatta, (da me modificato) che utilizzava l'aggiornamento diretto delle celle della colonna "D", sostituendo questo aggiornamento diretto delle celle con una matrice fornisce, con 65.000 righe, risultati uguali o di poco inferiori al secondo.
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4223
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Inserimento di uno spazio nel contenuto di un range

Postdi scossa » 16/02/14 11:35

ricky53 ha scritto:Caspita che confronti che hai prodotto.


Ho provato a portare a 128.000 rughe per scovare dei limiti e, come sospettavo, quella di Anthony fallisce (*).

I tempi, per le altre sono rimasti del tutto simili tra loro (1,9 - 2 secondi): attenzione non intendo che una impiega 1,9 un'altra 2 ma che eseguendole più volte, tutte alcune volte impiegano meno di 2 secondi altre volte 2 o 2,05 secondi (sul mio pc).

(*) il problema della sub di Anthony è Application.WorksheetFunction.Transpose(myOut) che va in errore per matrici superiori a 65.536 elementi

In conclusione, le varie routine si equivalgono come efficienza ma, uscendo dal caso specifico, la versione con le reg-exp ha il vantaggio di una notevole flessibilità: se si vuole aggiungere uno spazio ogni due cifre, anziché ogni una, basta cambiare la sola istruzione
Codice: Seleziona tutto
sPatt = "."

in
Codice: Seleziona tutto
sPatt = ".."
Bye!
scossa

Se tu hai una mela, e 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)
Avatar utente
scossa
Utente Senior
 
Post: 424
Iscritto il: 01/04/12 16:40
Località: Provincia di Verona

Re: Inserimento di uno spazio nel contenuto di un range

Postdi scossa » 16/02/14 11:54

scossa ha scritto:
ricky53 ha scritto:Caspita che confronti che hai prodotto.


Ho provato a portare a 128.000 rughe per scovare dei limiti e, come sospettavo, quella di Anthony fallisce (*).


Opss, ho dimenticato di precisare perchè lo "sospettavo": mi ci ero imbattuto qualche tempo addietro proprio usandolo in una sub che funzionava solo finché non venivano superate le 65.536 righe!
Bye!
scossa

Se tu hai una mela, e 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)
Avatar utente
scossa
Utente Senior
 
Post: 424
Iscritto il: 01/04/12 16:40
Località: Provincia di Verona

Re: Inserimento di uno spazio nel contenuto di un range

Postdi Anthony47 » 17/02/14 01:18

Sapevo che .Transpose(myOut) era limitata a 65k posizioni, per questo avevo parlato di "5-65mila righe di numeri vari"; anche a me era successo di scoprire che le WorksheetFunctions, anche in XL2010, si rifiutano di digerire matrici oltre le 65mila e spicciole righe.
Fortunatamente l' uso di un secondo Array (myOut) e' assolutamente inutile nell' algoritmo che poi ho adottato, potendo quindi inserire l' esito nella stessa matrice iniziale (mySorg), gia' correttamente dimensionata in verticale e pertanto senza bisogno di trasposizione.

Ho voluto anche io fare un confronto tra le varie proposte, per questo ho preparato i file allegato:
http://rapidshare.com/share/24146764AFF ... BEC631D739

In colonna B sono presenti 100mila righe di numeri a 4-5 cifre; la colonna C e' quella che sara' usata per i test.
Nel progetto vba sono presenti tutte le macro presentate piu' l' aggiornamento del mio codice per evitare l' uso di Transpose e piu' una variante a una macro di scossa (variante che ritenevo furba, ma che alla prova furba non lo e' stata; vedi N° 6):
1) ANTelabora2: e' la mia macro di ieri (**) che usa la conversione Unicode
2) ANTelabora3: e' la stessa macro senza l' uso di Transpose (**)
3) SC1Elabora: e' la macro di scossa che lavora col doppio loop
4) SC2Ingrassa: e' la macro di scossa che usa le Regular Expressions (la genesi del nome e' ignota)
5) SC3Ingrassa2: e' una variante di scossa che usa la conversione Unicode
6) ElaboraSC1MOD: e' una variante mia alla macro "doppio loop" di scossa (ha un IF in meno nel loop ma e' sistematicamente piu' lenta della macro originale... boh)

Le macro marcate ** compilano prima la colonna B per tante righe quante impostate in B1

Per poter confrontare i tempi di esecuzione in modalita' automatica ho inserito in ogni macro:
verso l' inizio
Codice: Seleziona tutto
myTim = Timer
LogCol = 10    'il numero varia da 10 a 15, corrispondenti alle colonne J:O

In coda (al posto del MsgBox)
Codice: Seleziona tutto
Cells(Rows.Count, LogCol).End(xlUp).Offset(1, 0) = Timer - myTim

Questo consente a ogni macro di scrivere in una colonna specifica il proprio tempo di esecuzione.

Nelle colonne J:O sono presenti 6 pulsanti, che attivano ognuna la macro indicata in riga 1 e scrive il risultato nella prima cella libera della colonna.
Questi pulsanti possono essere usati per avere una prima idea di tempi di esecuzione delle singole macro, ma il vero test e' stato fatto con la sequente macro, che si avvia col pulsante "TUTTE", e che tra l' altro congela nella tabella S1:Y12 i tempi di esecuzione calcolati nell' area J3:O12
Codice: Seleziona tutto
Sub testt()
Dim LogCol As Long, Dimens As Range, I As Long
'size
Range("A1").Select
Application.Calculation = xlCalculationManual
For Each Dimens In Range("S2:S12")
If Dimens = 0 Then Exit For
Range("J3").Resize(30, 6).ClearContents    'Area accumulo risultati
[B1] = Dimens.Value         'imposta N° righe
    For I = 1 To [R1]
        Call ANTelabora2    '(compila anche N° di righe)
        Call ANTelabora3
        Call SC1Elabora
        Call SC2Ingrassa
        Call SC3Ingrassa2
        Call ElaboraSC1MOD
     Next I
DoEvents
'accumula risultati in col T:
Application.Calculate
Cells(Rows.Count, "U").End(xlUp).Offset(1, -1).Resize(1, 6) = Range("J2:O2").Value
Next Dimens
Application.Calculation = xlCalculationAutomatic
Application.Calculate
End Sub

Cosa fa la macro:
-azzera il contenuto della tabella J3:O30, in cui saranno scritti gli esiti degli N cicli delle 6 macro
-Poi, per ognuno dei valori presenti in S2:S12 (valori che rappresentano il numero di righe con cui collaudare le macro)
-.e per il numero di cicli scritto in R1 (io ho usato 10)
-..lancia ognuna delle 6 macro, che scrivono il tempo di esecuzione nella tabella J3:J12 (se parliamo di 10 cicli)
-Le formule in J2:O2 sommano i valori sottostanti
-.e a completamento dei 10 cicli la somma dei tempi viene copiata da J2:O2 alla tabella in colonna T:Y

Ergo a completamento della macro avremo in T2:Y12 i tempi necessari alle macro per eseguirsi 10 volte (valore in R1) sul numero di righe scritte in colonna S.
Si ricordi che la compilazione di colonna C e' fatta dalle macro 1-2.

INFINE in colonne AA:AG ho creato un riepilogo che potesse confrontare i tempi di esecuzione delle varie macro. Tra i metodi di confronto possibile ho scelto di individuare per ogni riga il tempo migliore e calcolare il delta di ogni risultato rispetto a questo tempo. Quindi 0 corrisponde alla performance migliore, tempi crescenti sono performance peggiori.
Il risultato e' questo grafico:
Immagine
upload immagini

Sull' asse X ci sono il numero di righe usate per il test (io ho provato da 1k a 100k in 11 step); sull' asse Y ci sono i tempi in secondi calcolati come descritto sopra.
Dai grafici sembrerebbe che fino a 50mila righe la conversione Unicode sia la piu' performante; oltre 50mila la macro a doppio loop batte tutti. Le altre sono comprimarie. Comunque parliamo di differenze, in un ciclo 60mila righe, contenute entro 100msec tra la migliore e la peggiore...
Strana la performance della SC3Ingrassa2, che pure usa la stessa tecnica della conversione Unicode; e della ElaboraSC1MOD, che pur con un IF in meno va molto peggio dell' originale (SC1Elabora). L' uso delle RegExp sembra competitivo fino a 60k righe, poi le performance peggiorano velocemente.

Il foglio contiene anche un secondo grafico che pero' e' stato realizzato in condizione meno documentata; non guardatelo.

Ora sarebbe bello trovare quale e' la combinazione che, nell' esercizio attuale, sia la piu' performante sia a bassi che alti numero di righe...

Se volete ripetere il test (e vi pregherei di farlo, per confrontare gli esiti non in termini di tempi assoluti ma di confronto tra le varie condizioni) tenete presente che:
-la macro ANTelabora2 (quella che usa Transpose) non scrive nella colonna dei risultati se il numero righe e' superiore a 65mila (per poterla inserire nel benchmark ho inserito una IF prima della Transpose); quindi i suoi tempi sono fasulli e vanno cancellati a mano nella tabella T:Y, altrimenti risulterebbero i migliori...
-in tabella AB:AG, le celle AB10:AB12 (corrispondondenti ai valori >65mila della suddetta ANTelabora2) sono prive di formule proprio perche' non significative; se pero' cambiate i valori in colonna S bisogna ripristinare alcune o toglierne altre (di formule), in funzione della scaletta che inserirete.
-mentre la tabella J3:J10 viene azzerata prima dell' esecuzione della macro di test, la tabella T2:Yxx deve essere cancellata a mano, altrimenti i dati si accoderanno agli esistenti, risultando slegati dal numero di righe di colonna S.
-la riga J2:O2 non va cancellata in quanto contiene formule.

Se ripetete i test, credo che possa essere sufficiente pubblicare solo le tabelle dei tempi di esecuzione (diciamo R1:Y12. R1 visualizza quanti cicli ogni macro ha fatto nel test; le altre celle sono i tempi di esecuzione per ogni numero di righe testate, colonna S.

So che quanto detto, oltre che detto confusamente, e' tutt' altro che ingegnerizzato, ma il tempo e' scarso (le cognizioni le lasciamo stare...).

Ciao a tutti.
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13904
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Inserimento di uno spazio nel contenuto di un range

Postdi scossa » 18/02/14 15:20

Ciao,

scusate il ritardo con cui rispondo ma sono piuttosto impegnato in questi giorni.

@Anthony: hai fatto un bel lavoro, purtroppo non ho potuto gurdarlo a fondo).

Io ho fatto questa controporova:
Ho "fissato" i numeri nelle celle C3:C119.994
Ho preso le 5 routine del prospetto sotto, e le ho eseguite, ciascuna, 4 volte di fila.
Questo il risultato:
Codice: Seleziona tutto
   ANTelabora3____ SC1Elabora____SC2Ingrassa____SC3Ingrassa2____ElaboraSC1MOD
             1,141 ____1,063 _____________1,172 __________1,199____________1,152
           1,1250 ____1,0781____________ 1,1523 _________1,2188 __________ 1,1367
           1,1367 ____1,0586 ____________1,1367 _________1,2188 ___________1,1406
           1,1250 ____1,0781 ____________1,1406 _________1,1992 ___________1,1563
Come vedi il risultato tra la peggiore prestazione (1,288) e la migliore (1,0586) è di 16 centesimi di secondo quindi corrisponde a quanto risulta a te:
Comunque parliamo di differenze, in un ciclo 60mila righe, contenute entro 100msec tra la migliore e la peggiore...

Quindi, considerate le prestazioni velocistiche del tutto simili, direi che la indiscussa flessibilità della versione con Reg-Exp, abbia un peso notevole a suo favore.
Bye!
scossa

Se tu hai una mela, e 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)
Avatar utente
scossa
Utente Senior
 
Post: 424
Iscritto il: 01/04/12 16:40
Località: Provincia di Verona

Re: Inserimento di uno spazio nel contenuto di un range

Postdi scossa » 18/02/14 16:08

Ho fatto un ulterioere test c0n 10 ripetizioni:

Immagine
Bye!
scossa

Se tu hai una mela, e 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)
Avatar utente
scossa
Utente Senior
 
Post: 424
Iscritto il: 01/04/12 16:40
Località: Provincia di Verona

Re: Inserimento di uno spazio nel contenuto di un range

Postdi Anthony47 » 19/02/14 00:49

Mi fai quando hai tempo anche un paio di prove con 40mila e 60mila righe (vorrei vedere se anche a te torna una inversione di prestazioni tra in quell' intervallo).
E poi una curiosita': hai una spiegazione per il fatto che la ElaboraSC1MOD sia sistematicamente piu' lenta (di "ben" 5 centesimi di secondo, s' intende) della SC1Elabora (la tua con doppio loop) di cui dovrebbe essere una semplificazione??

Ciao!
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13904
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "Inserimento di uno spazio nel contenuto di un range":


Chi c’è in linea

Visitano il forum: alfrimpa e 5 ospiti