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.
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
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
@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
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
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.
ciao
no non serve se sono numeri non vengono toccati
se stringhe li converte
ciaotàin alternativa a quanto suggerito da Gianfranco(ciao 😉 ) puoi provare ad utilizzare la proprietà
PrefixCharacter
ciao
Frank
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?
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
ciao
Tanimon
era ora di vederti anche in questo forum 👍
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!
ciao
io userei solo
Len(Range(Cells(riga + 1, col),
visto che sia vuota o abbia ' sempre 0 è la lunghezza
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