Array di caratteri speciali



  • Array di caratteri speciali
    di Mangusta (utente non iscritto) data: 05/01/2013 14:11:06

    ho fatto un ciclo per concatenare in un foglio pieno di dati 3 valori dai quali ho tolto tutti gli spazi (erano inseriti in maniera approssimativa) con replace.

    Adesso dovrei togliere dalle stringhe e ottenute una serie di caratteri : virgola, punto virgola, slash ecc

    vorrei usare un array!

    quindi alla fine del ciclo che concatena e toglie gli spazi inserico un ciclo che mi toglie i caratteri non graditi in base alla array! sbaglio?
     
    For Each v In Array(".", ":", "", "/", "?", "*", "+", Chr$(34), "<", ">", "|", "(", ")")
                    stringa = Replace(stringa, CStr(v), "")
                Next



  • di Mangusta (utente non iscritto) data: 05/01/2013 14:24:45

    mi sto demoralizzando mi sembra una sciocchezza e non ci riesco !!!
     
    Sub concatena()
        Dim ur As Integer, rng As Range, stringa As String, cella As Range, v As Variant
    
        With Sheets("anagrafica")
            ur = .Cells(Rows.Count, 3).End(xlUp).Row
            Set rng = Range(.Cells(2, 3), .Cells(ur, 3))
    
        End With
    
        For Each cella In rng
    
            stringa = cella & cella.Offset(0, 1) & cella.Offset(0, 2)
    
            
        For Each v In Array(" ", ",", ".", ":", "", "/", "?", "*", "+", Chr$(34), "<", ">", "|", "(", ")", Chr$(252), Chr$(220))
            cella.Offset(0, 5) = Replace(stringa, CStr(v), "")
        
       Next
       Next
    End Sub
    



  • di HarryBosch data: 05/01/2013 17:18:36

    Mai demoralizzarsi! A volte l'errore è talmente piccolo che si nasconde molto bene.
    Non sai quanto tempo perdo a volte a capire perché alcune istruzioni non funzionino come vorrei.

    Non riesci a sostituire i segni presenti nell'array perché prendi come riferimento sempre la stessa stringa! Invece ad ogni sostituzione va poi assegnata la stringa precedente.
    Vedi sotto
     
    Sub concatena()
        Dim ur As Integer, rng As Range, stringa As String, cella As Range, v As Variant
        Dim r As Integer, a
    
        With Sheets("anagrafica")
            ur = .Cells(Rows.Count, 3).End(xlUp).Row
            Set rng = Range(.Cells(2, 3), .Cells(ur, 3))
    
        End With
    
        For Each cella In rng
    
            stringa = cella & cella.Offset(0, 1) & cella.Offset(0, 2)
    
            For Each v In Array(" ", ",", ".", ":", "", "/", "?", "*", "+", Chr$(34), "<", ">", "|", "(", ")", Chr$(252), Chr$(220))
                stringa = Replace(stringa, CStr(v), "")
            Next
                cella.Offset(0, 5) = stringa
        Next
    End Sub
    



  • di HarryBosch data: 05/01/2013 17:21:16

    Quelle due variabili (r,a) aggiunte nelle dichiarazioni sono un residuo di un mio test...
    da cancellare ovviamente



  • di Mangusta (utente non iscritto) data: 05/01/2013 17:23:53

    IN effetti mi sono proprio perso in un bicchire acqua!!! Infatti il codice è uguale al mio tranne per l'assegnazione a cella.offset(0,5) della nuova stringa!

    mi tiro un pochino su ^_^



  • di HarryBosch data: 05/01/2013 17:29:13

    Si. In sostanza nel tuo codice, il valore della cella "cella.Offset(0, 5)" veniva di volta in volta sostituito da ogni segno, ma prendeva come origine sempre la stringa di partenza.
    Pertanto alla fine, rimaneva soltanto la stringa sostituita con l'ultimo carattere presente dell'array.

    In questo modo invece, la stringa che va a prendere sarà di volta in volta quella alla quale sono stati sostituiti tutti i caratteri, uno per uno. E al termine, uscito da ciclo, posso assegnarla alla cella "cella.Offset(0, 5)"



  • di Vecchio Frac data: 05/01/2013 23:28:41

    Mi permetto di aggiungere qui, visto che è pertinente, una proposta di funzione "strip" che elimina da una stringa i caratteri specificati nel pattern, mediante l'uso di un'espressione regolare.
    La funzione allegata accetta una stringa e ne restituisce un'altra depurata dei caratteri specificati.
    I caratteri virgolette ("), ü e Ü sono codificati mediante il loro codice esadecimale (rispettivamente 22, FC e DC).
    Come esempio, inseritela in un Modulo e poi in una cella del foglio di lavoro la formula:
    =STRIP("ciao; io, sono überalles :)")
     
    Option Explicit
    
    Function strip(s As String) As String
    Dim re As Object, matches As Object
    
        Set re = CreateObject("vbscript.regexp")
        With re
            .MultiLine = False
            .Global = True
            .IgnoreCase = True
            .Pattern = "[,;.:\/?*+<>|()x22xFCxDC]*"
        End With
    
        strip = re.Replace(s, "")
    
    End Function






  • di Mangusta (utente non iscritto) data: 06/01/2013 10:34:49

    Vecchio Frac come ti odio!!! (scherzo ovvio ^_^ )
    non faccio in tempo ad usare un array che in un lampo mi trovo altro da imparare ...... ehhhh come farei senza di voi!!!

    IoI

    una curiosità più tecnica il VBA viene compilato o eseguito? (uno di voi è un programmatore?)



  • di Vecchio Frac data: 06/01/2013 12:06:31

    Bè le regular expressions sono un argomento ostico per chiunque :)
    Io sto sforzandomi di impararle ma sono sempre molto complesse da affrontare.
    Comunque sono uno strumento potentissimo.

    Per rispondere alla tua domanda, in realtà VBA è sia interpretato che (pre)compilato a seconda dell'ambiente utilizzato.
    Alcuni linguaggi tradizionali obsoleti, ad esempio QBasic, sono detti interpretati perchè l'interprete legge ogni riga di codice e lo converte in istruzioni mentre si scrive. Così funzionano anche Word e Excel. Il vantaggio di questo metodo è che l'interprete quando possibile tenta di eseguire il codice mentre lo si scrive (ciò rallenta l'esecuzione del programma) ed è per questo che vengono segnalati immediatamente gli errori di sintassi (ad esempio prova a scrivere If a=1 e premere Invio).

    Visual Basic Applications Edition (VBA) incorpora elementi sia dei linguaggi compilati che di quelli interpretati. VBA per Excel e Word è tipicamente interpretato e controlla il codice mentre lo si scrive; in Access questa interpretazione viene eseguita in background e ciò ha il vantaggio di non ridurre le prestazioni a causa di questa interpretazione. Tuttavia anche il codice interpretato viene comunque memorizzato per usi futuri (nella stessa sessione): ecco il motivo per cui la prima esecuzione di una macro (procedura o funzione) in Excel è lenta, ma le successive sono notevolmente più veloci.
    Ti preciso anche che Access consente di compilare il codice in una combinazione di codice compilato e interpretato noto come pseudo-codice (p-code). Questo p-code è una fase intermedia e risulta molto più veloce del codice interpretato. La compilazione viene eseguita quando si esegue il codice per la prima volta o quando si fa clic su Compila Database dal menu Debug; è anche la versione che viene distribuita con i file MDE (motivo per cui risulta impossibile risalire al codice sorgente da un file MDE).

    Io non sono programmatore di professione, sono solo un appassionato :)
    So che Harry invece mastica più linguaggi di me.





  • di HarryBosch data: 07/01/2013 13:15:46

    Anch'io sono solo (mooolto) appassionato, ma un pò per tutta l'informatica in generale, quindi non solo programmazione pura.
    E VecchioFrac è troppo buono: mi diletto con alcuni linguaggi, ma non so se li mastico troppo bene. Oltre al vba mi piace molto il vb .net (successore del Vb6 e "fratello maggiore" del vba), che ti consiglio vivamente se ti piace appunto il vba.
    Puoi scaricare gratuitamente "Microsoft Visual Basic Express 2010" e provare i diversi tutorial che non sono difficili.
    Tra l'altro è disponibile anche "microsoft Visual C++", altro linguaggio di cui ho appreso le basi (ma che da tempo non rispolvero).
    Da qualche tempo sto seguendo l'XHTML, evoluzione del classico HTML, per il linguaggio del Web.
    E da poco, sull'ottimo consiglio di VecchioFrac, mi sto dilettando con il Python, ma sono proprio alle prime armi ^_^



  • di Mangusta (utente non iscritto) data: 08/01/2013 11:21:58

    Io sono molto indietro e le mie basi risalgono a un decennio fa!
    un pochiono di pascal, java, (ormai rimossi dalla mia mente) abbastanza fresco ho HTML (che è una schiocchezza) e adesso il vba!
    le sue potenzalità nel mondo del lavoro sono molto ampie!