Avatar billede Camacho Novice
10. april 2024 - 12:25 Der er 13 kommentarer og
2 løsninger

Indsætte html koder i Excel ark.

Hej eksperter,

Nybegynder her :).

Jeg skal importere en stor mængde data i et PIM-system, der kun tager imod HTML-kodet data, men dataen jeg har er i normal tekst.

Derfor har jeg brug for en funktion - gætter på VBA kode - der kan rette dette til.

Eksempel:

Praktisk maskine, der kan køre selv.

Skal ikke bruge andet end rugbrødsmotor

• 120 mm
• Støbejern
• God til xxx

Ændres til:

<p>Praktisk maskine, der kan køre selv.</p>

<p>Skal ikke bruge andet end rugbrødsmotor</p>

<ul>
    <li>&nbsp;120 mm</li>
    <li>&nbsp;Støbejern</li>
    <li>&nbsp;God til xxx</li>
</ul>



Jeg håber, at I kan hjælpe :).

Mvh,
Marco
Avatar billede kim1a Ekspert
10. april 2024 - 13:13 #1
Du kan tekstmanipulere linjer ved at skrive ="<p>"&A1&"</p>

Men om dine data er så kongruente at du nemt kan gøre dette hele vejen ved jeg ikke.
Avatar billede ebea Ekspert
10. april 2024 - 13:18 #2
Nu skriver du ikke noget om området, som skal dækkes. Er det en enkelt kolonne, eller ? og hvordan er teksten opdelt (samme kolonne, eller) ?
Avatar billede Camacho Novice
10. april 2024 - 13:46 #3
Hej kim1a & ebea,

Mange tak, for de hurtige svar :)

Testen står i én celle og området der skal dækkes er 3 kolonner (I-K), da der er 3 sproglag.

Dermed duer løsningen med ="<p>"&A1&"</p> desværre heller ikke. For der vil jeg kun have koder i start og slutningen:

<p>Praktisk maskine, der kan køre selv.

Skal ikke bruge andet end rugbrødsmotor

• 120 mm
• Støbejern
• God til xxx</p>
Avatar billede ebea Ekspert
10. april 2024 - 14:01 #4
#3 - Du giver stadig ikke svar på, hvor hver af de enkelte tekster som skal HTML kodes, befinder sig.

Selvom der laves en VBA kode, så er den jo ikke i stand til at finde de enkelte linjer, som skal være det ene, eller det andet.
Et område i dit eks. er det <p>xxx</p>
og i et andet er det så hvor der skal defineres en punkt markering <ul>

Og endnu er VBA ikke AI dreven ;-)
Avatar billede kim1a Ekspert
10. april 2024 - 14:13 #5
Så må du vise os helt konkret evt uploade via Dropbox.

Hvis det står i et felt og der er noget med linjeskift der skal bygges kræver det nok lidt mere.
Avatar billede Camacho Novice
11. april 2024 - 12:32 #6
#4: Igen - nybegynder i HTLM. Er det disse koder, du ønsker defineret? Det er dem, der kommer med ud, hvis jeg eksportere en tekst fra vores PIM.

Koder:
<p> = start afsnit
</p> = slut afsnit
<ul> = start liste
</ul> = slut liste
<li> = start element i liste
</li> = slut element i i liste
&nbsp; = tvunget mellemrum

#5: Jeg tror det er en god ide med filen :). Her er linket: https://www.dropbox.com/scl/fi/oxl31g7c0e5onm0ig178j/Inds-tte-html-koder-i-Excel-ark..xlsm?rlkey=y65vciiqv57h94g7nbftpn55g&dl=0

Kolonne A er som teksten er pt.
Kolonne B er som den skal rettes til (som den ud, hvis man eksporterer nuværende tekster fra vores PIM).
Kolonne C er måske en løsning, hvis ikke man kan kode sig til kolonne A.

Linie 2 er eksempel.
_____________________________________________________

Det tætteste, jeg er kommet på en kode er denne:

Sub createHTML()
j = 1
x = Cells(j, 1)
Do While x <> ""
    y = Split(x, Chr(10))
              If UBound(y) > 0 Then
                        For i = 1 To UBound(y)
                Cells(i, 1).Value = "<p>" & y(i) & "</p>"
            Next i
        Cells(i, 1).Value = ""
        End If
    j = j + 1
    x = Cells(j, 1)
Loop
End Sub

Problemet med denne kode er, at den retter ændrer teksten fra ét felt 1 felt pr. linie (og den laver kun <p></p> kodning)
Avatar billede ebea Ekspert
11. april 2024 - 14:09 #7
#6 - Der er jo flere aspekter i dit "problem".
Som du med den viste kode, allerede har konstateret, så ved koden ikke hvor de forskellige tekster som skal HTML kodes, befinder sig.

At de står i én kolonne (A), og flere tekstlinjer i en (Excel) defineret linje, gør at dette opfattes af Excel, som én lang linje, og ikke separate linjer.
Næste er, at de forskellige markeringer for ny HTML kodning, ikke er separeret ud (det var det jeg efterlyste).

Og kommer der så andre tekster som skal HTML kodes til ny formatering! ?

Hvis alt det skal laves, bliver det en længere VBA kode, som skal tage højde for flere ting, som stadig ikke er defineret.
Avatar billede MaxZpaD Professor
11. april 2024 - 16:06 #8
Hvis alt dit indhold står i kolonne A, så prøv med nedenstående VBA-kode, som du skal indsætte i arkets kodemodul.
Teksterne med html-tags skrives direkte til en tekstfil.
Du skal selvfølgelig rette filstien til, så den passer med dine filmapper

Sub make_tags()
    Dim str_tag As String
    Dim str_tab As String
    Dim str_html As String
    Dim str_html_file As String
    Dim i_last_row As Integer
    Dim i_loop_row As Integer
    Dim i_file_no As Integer
    i_file_no = FreeFile()
    str_tag = "<p>"
    str_html_file = "C:\Users\xxx\OneDrive - XXX\Documents\Excel\Udvikling\test.html"
    Open str_html_file For Output As i_file_no
    With Me
        i_last_row = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i_loop_row = 1 To i_last_row
            If Left(.Cells(i_loop_row, 1), 1) = Chr(149) Then
                str_tag = "<li>"
                str_tab = WorksheetFunction.Rept(" ", 4)
            End If
            If WorksheetFunction.Trim(.Cells(i_loop_row, 1)) <> "" Then
                Print #i_file_no, str_tab & str_tag & Replace(.Cells(i_loop_row, 1), Chr(149) & " ", "&nbsp;", , , vbTextCompare) & Replace(str_tag, "<", "</", , , vbTextCompare)
            End If
            If str_tag <> "<li>" Then
                If Left(.Cells(i_loop_row + 1, 1), 1) = Chr(149) Then
                    str_tag = "<ul>"
                    Print #i_file_no, str_tab & str_tag
                    GoTo next_i_loop_row
                End If
            ElseIf str_tag = "<li>" Then
                If Left(.Cells(i_loop_row + 1, 1), 1) <> Chr(149) Then
                    str_tab = ""
                    str_tag = "</ul>"
                    Print #i_file_no, str_tab & str_tag
                    GoTo next_i_loop_row
                End If
            End If
next_i_loop_row:
        Next i_loop_row
    End With
    Close #i_file_no
End Sub
Avatar billede Camacho Novice
12. april 2024 - 09:36 #9
Hej MaxZpaD,

Tusind tak, for din hjælp - det sætter jeg stor pris på :)

Jeg har rettet stien og indsat koden.

Først fik jeg fejl "Compile error: invalid use of Me keyword" på "With Me"- Jeg prøvede at læse mig frem til rettelse og indsatte mit navn i stedet. Jeg er ikke helt sikker på, at det er den korrekte måde at gøre det på, men fejlen forsvandt.

Nu får jeg fejl "Run-time error´424´: Object reqired" på "i_last_row = .Cells(.Rows.Count, 1).End(xlUp).Row"

Jeg har prøvet at læse mig frem til løsning på error 24 bl.a. her https://www.stellarinfo.com/article/fix-runtime-error-424-object-required-error-in-excel.php, men må indse, at det hurtigt bliver russísk for mig.

(Linier med fejl er de to sidste her):

Sub make_tags()
    Dim str_tag As String
    Dim str_tab As String
    Dim str_html As String
    Dim str_html_file As String
    Dim i_last_row As Integer
    Dim i_loop_row As Integer
    Dim i_file_no As Integer
    i_file_no = FreeFile()
    str_tag = "<p>"
    str_html_file = "L:\_MFN\Skrivebord\I gang\test.html"
    Open str_html_file For Output As i_file_no
    With Me
        i_last_row = .Cells(.Rows.Count, 1).End(xlUp).Row
Avatar billede MaxZpaD Professor
12. april 2024 - 09:49 #10
#9 - Du skal indsætte koden i arkets kodemodul, hvorved "Me" bliver opfattet som "arket selv" af VBA.
Når du står i Visual Basic-editoren, så dobbelt-klik på arket for at åbne dets kodemodul.
Avatar billede Camacho Novice
12. april 2024 - 10:20 #11
#10 - så faldt 10'øren og jeg fik flyttet koden til det korrekte sted :)

Din kode virker super godt - tusind tak!

Eneste problem nu er, at jeg skal bruge dem i hver deres celle i excel - lige kolonne B i https://www.dropbox.com/scl/fi/oxl31g7c0e5onm0ig178j/Inds-tte-html-koder-i-Excel-ark..xlsm?rlkey=y65vciiqv57h94g7nbftpn55g&dl=0

Er det muligt at kode sig ud af det?
Avatar billede MaxZpaD Professor
12. april 2024 - 12:20 #12
Ok - jeg havde ikke lige fået kigget på filen tidligere, så jeg havde ikke bemærket, at hver enkelt celle indeholdt al teksten adskilt af linjeskift.

Prøv med denne tilpassede kode:

Sub make_tags()
    Dim str_tag As String
    Dim str_tab As String
    Dim str_txt As String
    Dim str_html As String
    Dim str_html_file As String
    Dim i_last_row As Integer
    Dim i_loop_row As Integer
    Dim i_loop_arr As Integer
    Dim i_file_no As Integer
    Dim arr_split As Variant
    i_file_no = FreeFile()
    str_tag = "<p>"
    str_html_file = "L:\_MFN\Skrivebord\I gang\test.html"
    Open str_html_file For Output As i_file_no
    With Me
        i_last_row = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i_loop_row = 1 To i_last_row
            If WorksheetFunction.Trim(.Cells(i_loop_row, 1)) <> "" Then
                arr_split = Split(.Cells(i_loop_row, 1), Chr(10), , vbTextCompare)
                For i_loop_arr = LBound(arr_split) To UBound(arr_split)
                    If Left(arr_split(i_loop_arr), 1) = Chr(149) Then
                        str_tag = "<li>"
                        str_tab = WorksheetFunction.Rept(" ", 4)
                    End If
                    If WorksheetFunction.Trim(arr_split(i_loop_arr)) <> "" Then
                        str_txt = Replace(arr_split(i_loop_arr), Chr(149) & " ", "&nbsp;", , , vbTextCompare)
                        str_txt = Replace(str_txt, Chr(149) & vbTab, "&nbsp;", , , vbTextCompare)
                        Print #i_file_no, str_tab & str_tag & str_txt & Replace(str_tag, "<", "</", , , vbTextCompare)
                        str_txt = ""
                    End If
                    If str_tag <> "<li>" Then
                        If i_loop_arr < UBound(arr_split) Then
                            If Left(arr_split(i_loop_arr + 1), 1) = Chr(149) Then
                                str_tag = "<ul>"
                                Print #i_file_no, str_tab & str_tag
                            End If
                        End If
                    ElseIf str_tag = "<li>" Then
                        If i_loop_arr < UBound(arr_split) Then
                            If Left(arr_split(i_loop_arr + 1), 1) <> Chr(149) Then
                                str_tab = ""
                                str_tag = "</ul>"
                                Print #i_file_no, str_tab & str_tag
                                str_tag = "<p>"
                            End If
                        Else
                            If str_tag = "<li>" Then
                                str_tab = ""
                                str_tag = "</ul>"
                                Print #i_file_no, str_tab & str_tag
                            End If
                            str_tab = ""
                            str_tag = "<p>"
                        End If
                    End If
                Next i_loop_arr
            End If
        Next i_loop_row
    End With
    Close #i_file_no
End Sub
Avatar billede Camacho Novice
15. april 2024 - 09:53 #13
#12 - tusind tak! Nu står det hele med HTML koder, når jeg åbner med et tekstprogram! Og dermed markerer jeg som løsning.

Jeg kan dog ikke helt gennemskue, om jeg kan få det over i excel, så den indsætter i hver sin celle, for jeg kan ikke åbne HTML-filen med excel.
Avatar billede MaxZpaD Professor
15. april 2024 - 10:36 #14
#13 - okay. Havde egentlig fået den opfattelse, at HTML-dataene skulle leveres til et eksternt system, dvs. uden for Excel.

Den tilrettede kode neden for skriver HTML-dataene i kolonnen til højre for dine data.

Jeg har "udkommenteret" de linjer, som vedrører print af dataene til en fil.

Sub make_tags()
    Dim str_tag As String
    Dim str_tab As String
    Dim str_txt As String
    Dim str_html As String
    Dim str_html_file As String
    Dim i_last_row As Integer
    Dim i_loop_row As Integer
    Dim i_loop_arr As Integer
    'Dim i_file_no As Integer
    Dim arr_split As Variant
    'i_file_no = FreeFile()
    str_tag = "<p>"
    'str_html_file = "L:\_MFN\Skrivebord\I gang\test.html"
    'Open str_html_file For Output As i_file_no
    With Me
        i_last_row = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i_loop_row = 1 To i_last_row
            If WorksheetFunction.Trim(.Cells(i_loop_row, 1)) <> "" Then
                arr_split = Split(.Cells(i_loop_row, 1), Chr(10), , vbTextCompare)
                For i_loop_arr = LBound(arr_split) To UBound(arr_split)
                    If Left(arr_split(i_loop_arr), 1) = Chr(149) Then
                        str_tag = "<li>"
                        str_tab = WorksheetFunction.Rept(" ", 4)
                    End If
                    If WorksheetFunction.Trim(arr_split(i_loop_arr)) <> "" Then
                        str_txt = Replace(arr_split(i_loop_arr), Chr(149) & " ", "&nbsp;", , , vbTextCompare)
                        str_txt = Replace(str_txt, Chr(149) & vbTab, "&nbsp;", , , vbTextCompare)
                        'Print #i_file_no, str_tab & str_tag & str_txt & Replace(str_tag, "<", "</", , , vbTextCompare)
                        str_html = str_html & str_tab & str_tag & str_txt & Replace(str_tag, "<", "</", , , vbTextCompare) & vbNewLine
                        str_txt = ""
                    End If
                    If str_tag <> "<li>" Then
                        If i_loop_arr < UBound(arr_split) Then
                            If Left(arr_split(i_loop_arr + 1), 1) = Chr(149) Then
                                str_tag = "<ul>"
                                'Print #i_file_no, str_tab & str_tag
                                str_html = str_html & str_tab & str_tag & vbNewLine
                            End If
                        End If
                    ElseIf str_tag = "<li>" Then
                        If i_loop_arr < UBound(arr_split) Then
                            If Left(arr_split(i_loop_arr + 1), 1) <> Chr(149) Then
                                str_tab = ""
                                str_tag = "</ul>"
                                'Print #i_file_no, str_tab & str_tag
                                str_html = str_html & str_tab & str_tag & vbNewLine
                                str_tag = "<p>"
                            End If
                        Else
                            If str_tag = "<li>" Then
                                str_tab = ""
                                str_tag = "</ul>"
                                'Print #i_file_no, str_tab & str_tag
                                str_html = str_html & str_tab & str_tag & vbNewLine
                            End If
                            str_tab = ""
                            str_tag = "<p>"
                        End If
                    End If
                Next i_loop_arr
            End If
            .Cells(i_loop_row, 1).Offset(, 1) = str_html
            str_html = ""
        Next i_loop_row
    End With
    'Close #i_file_no
End Sub
Avatar billede Camacho Novice
15. april 2024 - 12:27 #15
#14 - helt perfekt. Du er min nye helt :). Tusind tak, for hjælpen!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester