Rimozione apostrofo...
 
Notifiche
Cancella tutti

La consultazione del forum è libera per tutti.

Per poter porre un quesito è invece necessario essere un utente registrato (clicca qui se non lo sei).

Tutti gli utenti che richiedono un supporto, come da REGOLAMENTO, sono caldamente invitati ad allegare un file di esempio con l'indicazione di quello che si desidera ottenere.

[Risolto] Rimozione apostrofo "nascosto" in VBA

17 Post
3 Utenti
0 Reactions
519 Visualizzazioni
Forum 1
(@bruno227)
Post: 0
New Member
Avviatore di Topic
 

Ciao a tutti,

ho scritto una macro in VBA per elaborare dei file Excel che vengono generati da un programma terzo. 
La macro essenzialmente fa delle operazioni di copia-incolla-separazione di celle su file molto lunghi.

Uno dei primi controlli che viene fatto consiste nel verificare se la cella da elaborare è vuota con la funzione IsEmpty. Nel momento in cui la cella però contiene solo il valore " ' " (apostrofo) la funzione IsEmpty restituisce valore "false" e il successivo passo viene quindi saltato. 

Ho provato in diversi modi, ma non riesco a far trovare questo carattere speciale in VBA. Qualcuno sa come risolvere?
Vi allego il file su cui sto facendo delle prove, il problema nasce sul primo "IF"

Grazie a tutti

 

Versione di Excel
Sistema operativo
 
Postato : 08/01/2024 15:43
gianfranco55
(@gianfranco55)
Post: 1797
Moderatore
 

ciao

il fatto è che quella '

non è un carattere 39

seleziona la colonna

DATI IN COLONNE

non toccare niente

e clicca su FINE

 

ecco che la macro funziona

 
Postato : 09/01/2024 11:45
Forum 1
(@bruno227)
Post: 0
New Member
Avviatore di Topic
 

@gianfranco55 ciao e grazie della risposta! 

Si è proprio quello il problema, ho provato sia cercando il carattere 39 sia facendo un incolla valori delle celle su se stesse ma non funziona (l'incolla valori funziona solo incollando su nuove celle completamente vuote).

Non ho però capito il tuo suggerimento, quando parli di "dati in colonne" cosa intendi?

Grazie ancora

 
Postato : 09/01/2024 12:57
gianfranco55
(@gianfranco55)
Post: 1797
Moderatore
 

ciao

seleziona la colonna A (basta cliccare sulla A)

barra multifunzione

DATI

TESTO IN COLONNE

si apre una form

non toccare niente e clicca su

FINE

 

lo devi fare per le colonne con la '

la A e la F mi pare

 

 
Postato : 09/01/2024 13:02
Forum 1
(@bruno227)
Post: 0
New Member
Avviatore di Topic
 

Grazie mille funziona perfettamente! 
Però a questo punto mi è venuta la curiosità, ho registrato la macro mentre facevo quanto mi hai consigliato: 

let selectedSheet = workbook.getActiveWorksheet();
// Text to columns on range O1:O38702 on selectedSheet
for (let row = 0; row < selectedSheet.getRange("O1:O38702").getRowCount() ; row++) {
	let sourceRange = selectedSheet.getRange("O1:O38702");
	let destinationRange = selectedSheet.getRange("P1");
	let sourceRangeValues = sourceRange.getRow(row).getValues()[0][0].toString().split(/[\t]/)
	destinationRange.getOffsetRange(row, 0).getResizedRange(0, sourceRangeValues.length - 1).setValues([sourceRangeValues]);
}

 

Sbaglio o sta facendo una conversione dei valori in stringa? 
Per automatizzarlo nella macro dovrei però sapere quali valori interpretare come stringhe e quali effettivamente come numeri.

 
Postato : 09/01/2024 13:12
gianfranco55
(@gianfranco55)
Post: 1797
Moderatore
 

ciao

no non serve se sono numeri non vengono toccati

se stringhe li converte

 
Postato : 09/01/2024 15:06
tanimon
(@tanimon)
Post: 0
New Member
 

ciaotàin alternativa a quanto suggerito da Gianfranco(ciao 😉 ) puoi provare ad utilizzare la proprietà

PrefixCharacter

 

ciao

Frank

 
Postato : 09/01/2024 16:43
Forum 1
(@bruno227)
Post: 0
New Member
Avviatore di Topic
 

Non riesco a capire come funziona lo script registrato

per ciascuna riga (ciclo for) identifica die range uno di origine e uno di destinazione, non capisco che elaborazione fa con questa istruzione

getValues()[0][0].toString().split(/[\t]/)

 e nemmeno questa:

destinationRange.getOffsetRange(row, 0).getResizedRange(0, sourceRangeValues.length - 1).setValues([sourceRangeValues]);
}

che funzioni dovrei usare nella mia macro?

 
Postato : 09/01/2024 17:14
Forum 1
(@bruno227)
Post: 0
New Member
Avviatore di Topic
 

Postato da: @tanimon

ciaotàin alternativa a quanto suggerito da Gianfranco(ciao 😉 ) puoi provare ad utilizzare la proprietà

PrefixCharacter

 

ciao

Frank

 

Grazie, sembra abbastanza semplice e lineare

Provo a implementare anche questo

 

 
Postato : 09/01/2024 17:16
gianfranco55
(@gianfranco55)
Post: 1797
Moderatore
 

ciao

Tanimon

era ora di vederti anche in questo forum 👍 

 
Postato : 09/01/2024 17:33
tanimon
(@tanimon)
Post: 0
New Member
 

@gianfranco55 

🍻 👍 

 
Postato : 09/01/2024 17:38
Forum 1
(@bruno227)
Post: 0
New Member
Avviatore di Topic
 

Grazie, confermo che la soluzione con PrefixCharacter funziona, in pratica ho eseguito un controllo di questo tipo: se la lunghezza della stringa è zero ma la lunghezza di PrefixCharacter è 1 allora la cella contiene solo l'apostrofo "nascosto".
Secondo voi devo comunque lasciare la verifica sulla condizione IsEmpty o non serve più?

Ora la condizione è cosi

 If IsEmpty(Cells(riga + 1, col)) Or (Len(Range(Cells(riga + 1, col), Cells(riga + 1, col))) = 0 And Len(Range(Cells(riga + 1, col), Cells(riga + 1, col)).PrefixCharacter) = 1) Then

 

Grazie ancora!

 
Postato : 09/01/2024 17:51
gianfranco55
(@gianfranco55)
Post: 1797
Moderatore
 

ciao

io userei solo

Len(Range(Cells(riga + 1, col),

visto che sia vuota o abbia ' sempre 0 è la lunghezza

 
Postato : 09/01/2024 18:53
tanimon
(@tanimon)
Post: 0
New Member
 

 

Ciao,

riallego il tuo file senza PrefixCharacter e ti allego la tua macro inserita in un modulo standard con le modifiche 

Frank

Option Explicit

Sub FindMergedcells()
Dim riga, ultima_riga, righe_unite As Integer 'indice per scorrere le righe del file
Dim col As Integer 'indice per scorrere le colonne del file

'=================================

Dim ultima_col As Integer, I As Long

Application.ScreenUpdating = False
  Range("M2:M39000").Select
    Selection.Copy
    
    Range("T2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
    
    
    
    Range("T2:T39000").Select
    Selection.Copy
    
    
    Range("M2").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Range("T2:T39000").ClearContents
    
    
   
    
'=========================================




'riga = InputBox("Inserisci la prima riga non vuota")
'col = InputBox("Inserisci la colonna da separare")
'ultima_riga = InputBox("Inserisci l'ultima riga non vuota")
'MsgBox (riga)
'MsgBox (col)
'MsgBox (ultima_riga)

' *********** DATI DA MODIFICARE ***************'

riga = 1            ' prima riga non vuota del file
col = 13              'colonna da separare
ultima_riga = 38703   'ultima riga non vuota del file
ultima_col = 13      'ultima colonna da unire

' **********************************************'

While col < ultima_col + 1
        
    While riga < ultima_riga
        
        'MsgBox (col)
        'MsgBox (riga)
        
        If IsEmpty(Cells(riga + 1, col)) Or (Cells(riga + 1, col) = Chr(39)) Then
        
        'se la cella successiva è vuota allora verifico se è unità
            
            If Cells(riga + 1, col).MergeCells = True Then
            
            'la cella successiva è vuota ed è unita
            'MsgBox ("la cella è vuota e unita")
            righe_unite = Cells(riga + 1, col).MergeArea.Rows.Count
            'MsgBox ("le righe unite sono" & righe_unite)
            
            ' qui devo copiare quello che c'è su riga!!!
            For I = 1 To righe_unite
                Cells(riga + I, col).UnMerge
                Cells(riga + I, col) = Cells(riga, col)
            Next
            
            riga = riga + righe_unite
            
            Else
            'la cella successiva è vutoa ma è singola
            'MsgBox ("la cella è vuota e singola")
            
            
            'qui copio la precedente e basta
            
            Cells(riga + 1, col) = Cells(riga, col)
            
            riga = riga + 1
            
            End If
                    
        Else
        
        'se la cella non è vuota allora non faccio nulla e incremento la riga
        'MsgBox ("la cella non è vuota, vado avanti")
        riga = riga + 1
            
        End If
    
    Wend
    
    col = col + 1
    riga = 1
    
Wend

 
Application.ScreenUpdating = True
Range("M2").Select
End Sub









 
Postato : 09/01/2024 19:33
Forum 1
(@bruno227)
Post: 0
New Member
Avviatore di Topic
 

@gianfranco55 Grazie hai ragione! Molto più semplice!

 
Postato : 10/01/2024 09:12
Pagina 1 / 2
Condividi:
My Agile Privacy
Questo sito utilizza cookie tecnici e di profilazione. Cliccando su accetta si autorizzano tutti i cookie di profilazione. Cliccando su rifiuta o la X si rifiutano tutti i cookie di profilazione. Cliccando su personalizza è possibile selezionare quali cookie di profilazione attivare.
Attenzione: alcune funzionalità di questa pagina potrebbero essere bloccate a seguito delle tue scelte privacy
     Scarica il nostro ebook gratuito     

Unisciti a oltre 35.000 professionisti
che hanno già scelto di semplificare il proprio lavoro
e aumentare la produttività con la nostra newsletter!

Scarica l’ebook con i
migliori trucchi e suggerimenti per Excel
selezionati per te da Excel Academy

Download