Ciao, intanto grazie.
L'idea sarebbe questa. Ho circa 5000 descrizioni di prodotto in una colonna di excel che sono formattate con corsivi, grassetti, sottolineati, link, elenchi e colori del testo. La formattazione è come in un file di word quindi è dentro la cella. Ora per gestire il mio sito su Shopify ho bisogno che queste descrizioni siano scritte in html per caricarle sopra. Sto cercando di fare una macro che riesca a convertirmi il testo formattato nella colonna susseguente, così da darlo poi in pasto a Shopify. Di seguito vi riporto come deve essere il testo formattato (testo1), come lo converte il backend di shopify (testo 2) e a che punto sono arrivato alla scrittura della macro, che funziona ma mi da ancora dei piccoli errori da mettere a posto ma che io non rieco. Per scrivere la macro mi sono fatto aiutare da chatgpt. Se vi può essere di aiuto partire da qui. Grz
TESTO 1
RENOFRESH MURO 150 è un'unità di recupero calore residenziale murale composto da ventola di mandata, ventola di ritorno, scambiatore di calore, filtro primario, filtro a carboni attivi e filtri HEPA. La rapidità e la semplicità di installazione permettono un montaggio e messa in funzione in meno di un'ora, con la possibilità di orientare il flusso d'aria sul retro o sul fianco.
RENOFRESH MURO può svolgere le seguenti funzioni:
- Purificazione dell'aria di mandata: dopo che l'aria esterna veicolata dal ventilatore passerà attraverso il filtro primario e sullo scambiatore di calore, subirà un'ulteriore filtrazione dal filtro HEPA, in modo da migliorare la qualità dell'aria interna.
- Modalità "Auto": per garantire una quantità sufficiente di aria fresca interna, la velocità di funzionamento aumenterà autonomamente dopo che la funzione "Auto" verrà attivata.
- Modalità Timer, in cui è possibile impostare l'orario di accensione e spegnimento direttamente dal comodo telecomando incluso, e Modalità Sleep, che permette di abbassare a velocità minima il ventilatore per il massimo della silenziosità.
- Funzione "Pure" permette un ricambio aria ambientale ultra rapido.
CARATTERISTICHE TECNICHE:
- Portata aria nominale 150 mc/h
- Alimentazione elettrica 230 / 1 / 50-60 V/Ph/Hz
- Potenza elettrica assorbita massima 35 W
- Classificazione IP IPX2
- Volume di utilizzo 20- 45 mq
- Tipologia motore DC / 8 speeds
- Efficienza termica 0,82 %
- Efficacia di filtrazione 99% HEPA
- Tipologia di installazione Retro / Lato
- Livello di pressione sonora irradiato dall’involucro 36 dB (A)
[url]prova link[/url]
TESTO 2
"<p><strong>RENOFRESH MURO 150</strong> è un'unità di recupero calore residenziale murale composto da ventola di mandata, ventola di ritorno, scambiatore di calore, filtro primario, filtro a carboni attivi e filtri HEPA. La rapidità e la semplicità di installazione permettono un montaggio e messa in funzione in meno di un'ora, con la possibilità di orientare il flusso d'aria sul retro o sul fianco.<br><strong><em>RENOFRESH MURO</em></strong> può svolgere le seguenti funzioni:</p>
<ul style="text-align: left;">
<li class="MsoNormal" style="line-height: normal;">Purificazione dell'aria di mandata: dopo che l'aria esterna veicolata dal ventilatore passerà attraverso il filtro primario e sullo scambiatore di calore, subirà un'ulteriore filtrazione dal filtro HEPA, in modo da migliorare la qualità dell'aria interna.</li>
<li class="MsoNormal" style="line-height: normal;">Modalità "Auto": per garantire una quantità sufficiente di aria fresca interna, la velocità di funzionamento aumenterà autonomamente dopo che la funzione "Auto" verrà attivata.</li>
<li class="MsoNormal" style="line-height: normal;">Modalità Timer, in cui è possibile impostare l'orario di accensione e spegnimento direttamente dal comodo telecomando incluso, e Modalità Sleep, che permette di abbassare a velocità minima il ventilatore per il massimo della silenziosità.</li>
<li class="MsoNormal" style="line-height: normal;">Funzione "Pure" permette un ricambio aria ambientale ultra rapido.</li>
</ul>
<p style="text-align: left;"><span style="text-decoration: underline;"><em><strong>CARATTERISTICHE</strong></em></span><em><strong> </strong><strong>TECNICHE</strong></em><em><strong>:</strong></em></p>
<ul style="text-align: left;">
<li>Portata aria nominale 150 mc/h</li>
<li>Alimentazione elettrica 230 / 1 / 50-60 V/Ph/Hz</li>
<li>Potenza elettrica assorbita massima 35 W</li>
<li>Classificazione <strong><span style="color: rgb(255, 42, 0);">IP <span style="color: rgb(128, 255, 0);">IPX2</span></span></strong>
</li>
<li>Volume di utilizzo 20- 45 mq</li>
<li>Tipologia motore DC / 8 speeds</li>
<li>Efficienza termica 0,82 %</li>
<li>Efficacia di filtrazione 99% HEPA</li>
<li>Tipologia di installazione Retro / Lato</li>
<li>Livello di pressione sonora irradiato dall’involucro 36 dB (A)</li>
</ul>
<p style="text-align: left;"><a href="www.dynergysrl.it" rel="noopener" target="_blank">prova link</a><br></p>"
TESTO 3
Sub FormattaTestoInHtml()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("input")
Dim htmlText As String
Dim i As Integer
Dim char As String
Dim bold As Boolean, italic As Boolean, underline As Boolean
Dim prevBold As Boolean, prevItalic As Boolean, prevUnderline As Boolean
Dim color As Long, prevColor As Long
Dim htmlChunk As String
Dim cell As Range
Dim totalRows As Long
Dim currentRow As Long
Dim inList As Boolean
Dim isInLink As Boolean
totalRows = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row ' Calcola il numero totale di righe
currentRow = 1 ' Inizia dalla prima riga
inList = False
isInLink = False
' Scansiona ogni cella nella colonna B
For Each cell In ws.Range("B1:B" & ws.Cells(ws.Rows.Count, "B").End(xlUp).Row)
htmlText = "<p>" ' Inizia il paragrafo
prevBold = False
prevItalic = False
prevUnderline = False
prevColor = cell.Characters(1, 1).Font.Color
' Legge ogni carattere singolarmente
For i = 1 To Len(cell.Value)
char = Mid(cell.Value, i, 1)
' Verifica se la riga inizia con "-" per l'elenco
If Left(Trim(cell.Value), 1) = "-" Then
If Not inList Then
htmlText = htmlText & "<ul>" ' Inizia una lista non ordinata
inList = True
End If
htmlText = htmlText & "<li>" & Trim(Mid(cell.Value, i + 1)) & "</li>" ' Aggiungi l'elemento dell'elenco
Exit For ' Esce dal ciclo per l'elenco
ElseIf char = vbLf Then
' Gestione a capo (inserisce <br> quando trova un a capo)
htmlText = htmlText & "<br>"
Else
' Ottieni le proprietà di formattazione del carattere
bold = cell.Characters(i, 1).Font.Bold
italic = cell.Characters(i, 1).Font.Italic
underline = (cell.Characters(i, 1).Font.Underline <> xlUnderlineStyleNone)
color = cell.Characters(i, 1).Font.Color
' Apre tag HTML se cambia formattazione
If bold <> prevBold Then htmlChunk = htmlChunk & IIf(bold, "<strong>", "</strong>")
If italic <> prevItalic Then htmlChunk = htmlChunk & IIf(italic, "<em>", "</em>")
If underline <> prevUnderline Then htmlChunk = htmlChunk & IIf(underline, "<u>", "</u>")
' Gestione colore (legge il colore effettivo applicato)
If color <> prevColor Then
If color <> RGB(0, 0, 0) Then ' Se non è nero, applica il colore
htmlChunk = htmlChunk & "<span style='color:#" & Right("000000" & Hex(color), 6) & "'>"
Else ' Se torna nero, chiude lo span
htmlChunk = htmlChunk & "</span>"
End If
End If
' Aggiunge il carattere
htmlText = htmlText & htmlChunk & char
htmlChunk = "" ' Reset per il prossimo carattere
' Aggiorna i valori precedenti
prevBold = bold
prevItalic = italic
prevUnderline = underline
prevColor = color
End If
Next i
' Chiude eventuali tag aperti
If prevBold Then htmlText = htmlText & "</strong>"
If prevItalic Then htmlText = htmlText & "</em>"
If prevUnderline Then htmlText = htmlText & "</u>"
If prevColor <> RGB(0, 0, 0) Then htmlText = htmlText & "</span>"
' Chiude la lista
If inList Then
htmlText = htmlText & "</ul>"
inList = False
End If
' Gestione dei link separata (aggiungi link se presente)
If InStr(cell.Value, "http://") > 0 Or InStr(cell.Value, "https://") > 0 Then
Dim regex As Object
Set regex = CreateObject("VBScript.RegExp")
regex.IgnoreCase = True
regex.Global = True
regex.Pattern = "(http[s]?://[^\s<>]+)"
htmlText = regex.Replace(htmlText, "<a href='$1' target='_blank' rel='noopener'>$1</a>")
End If
htmlText = htmlText & "</p>" ' Chiude il paragrafo
' Scrive il risultato in colonna C
cell.Offset(0, 1).Value = htmlText
currentRow = currentRow + 1
Next cell
End Sub
Gli errori che non riesco a risolvere sono:
non gestisce gli elenchi (mi piacerebbe che se a inizio riga e dopo un a capo c'è il segno "-" individua che è un elenco;
non gestisce bene i colori (nella formattazione IP è rosso e lui lo riporta come blu; mentre il verde è a posto);
la macro è molto lenta (forse il problema è l'AI che complica la macro inserendo del codice superfluo);
mi piacerebbe che ci fosse un avanzamento della macro per sapere che la macro sta lavorando, quanto manca in percentuale e quando ha finito.
grazie!