< návrat zpět

MS Excel


Téma: Odstranění částí textu v buňce Makrem rss

Zaslal/a 27.8.2012 22:37

Dotaz:
byl by někdo ochoten pomoci mně amatérovi s tímhle - určitě banálním problémem?
potřebuji nějak inteligentně - nejlépe pomocí makra nebo nějaké volané funkce vymazat z html textů uložených v jednom sloupci csv souborů (specifikace výrobků) - různé odkazy na externí obrázky a jiné weby ( viz. přiložený vzorek textu jedné buňky - v případě potřeby dodám vzorový csv soubor).
texty se nevyskytují ve všech buňkách, ale jde pouze o jeden sloupec
vysvětlivky:
- černý text chci zachovat
- červený a zelený text potřebuji odstranit nejlépe i s html konci řádků </br> před a za (nemusí být)
- červený je fixní v každé buňce
- zelený text je ale "omáčka" různé délky, struktury, která může být v každé buňce jiná...

umím vzorcem vyhledat červený, opakující se text, ale už nevím jak nastavit rozsah vymazání např. od <br>před ... až po <br>za ...

díky za každou pomoc nebo radu ...
Bery

(pro excel 2007 cz)

Příloha: rar9329_vzorek_textu.rar (5kB, staženo 28x)
stop Uzamčeno - nelze přidávat nové příspěvky.

#009335
Jeza.m
Jeden takový pokus :-)

Public Sub nahradit()
Dim zacatek, delka, sloupec As Single
Dim tstart, tkonec, ttext As String
Dim ind As Boolean

tstart = InputBox("počáteční text", "Hledání", "<br/><img src=")
tkonec = InputBox("koncový text", "Hledání", "<br/>")
sloupec = 1
ind = False

For rd = 2 To ActiveSheet.UsedRange.Rows.Count + 1
ttext = Cells(rd, sloupec).Value
For i = 1 To Len(ttext)
If Mid(ttext, i, Len(tstart)) = tstart Then
zacatek = i
ind = True
i = i + 1
End If
If Mid(ttext, i, Len(tkonec)) = tkonec And ind = True Then
delka = i + Len(tkonec) - zacatek
ttext = Replace(ttext, Mid(ttext, zacatek, delka), "")
i = zacatek
ind = False

End If
Next
Cells(rd, sloupec) = ttext
Next
End Sub


M@citovat
#009338
avatar
Jezo díky moc - funguje to moc dobře, ale můj problém to bohužel řeší jen částečně.
pokud jde o řetězec u kterého znám začátek a konec je to ok - tvůj odladěný připad s <br><img ...,
ale druhý případ je bohužel jiný:
- identifikovatelný odkaz na externí web je někde uprostřed mazaného textu - zjednodušeně
<br> text.... <a href= ....text <br>a tady nevím jak najít první <br> vlevo a první vpravo a tím nastavit rozsah pro smazání...
pro ilustraci přikládám testovací soubor (i s makrem) - sloupec a texty v buňkách jsou barevně označeny...
fakt nechci obtěžovat, nebo vypadat nevděčně, ale pokud bys měl ještě nápad jak to dotáhnout, byl bych fakt moc vděčný...
bohužel, když to nebude automat, nemůžu to moc použít, těch csv souborů je cca 100 a výrobků tisíce - kontrolovat pokaždé, jestli je všechno pryč je vlastně stejná pruda jako ruční editace ...
Příloha: zip9338_data-test.zip (35kB, staženo 21x)
citovat
#009342
Jeza.m
nejsem si moc jistej tou identifikací, třeba na řádku 5 nemáš označeno červeně nic byť je tam odkaz :-/.

Public Sub nahradit2()
Dim zacatek, delka, sloupec As Single
Dim tstart, tkonec, ttext, tkriterium As String
Dim ind1, ind2 As Boolean

tstart = InputBox("počáteční text", "Hledání", "<br/>")
tkonec = InputBox("koncový text", "Hledání", "</br>")
tkriterium = InputBox("hledaný text", "Hledání", "www")
sloupec = 5

For rd = 90 To ActiveSheet.UsedRange.Rows.Count + 1
ttext = Cells(rd, sloupec).Value
If InStr(1, ttext, tkriterium) > 0 Then
zacatek = 0
konec = 0
ind1 = False
ind2 = False

For p = 1 To Len(ttext)
If Mid(ttext, p, Len(tstart)) = tstart And ind2 = False Then
zacatek = p
ind1 = True
End If
If Mid(ttext, p, Len(tkriterium)) = tkriterium Then
ind2 = True
End If
If Mid(ttext, p, Len(tkonec)) = tkonec Then
konec = p + Len(tkonec)
If ind1 = True And ind2 = True Then
delka = konec - zacatek
MsgBox "Mažu na řádku " & rd & " text: " & vbNewLine & Mid(ttext, zacatek, delka)
ttext = Replace(ttext, Mid(ttext, zacatek, delka), "")
p = zacatek
ind1 = False
ind2 = False
End If
End If
Next
End If
Cells(rd, sloupec) = ttext
Next
End Sub


No zkus to a uvidíš.
Ten msgbox si pak kdyžtak smaž,

M@citovat
#009347
avatar
pořád tam nějaké neodchytané texty zůstávají, bohužel nevím proč ... po úpravě začátku makra na rd=2, všechno krokuje správně cca do rd=17, pak vynechá a skočí až kamsi na rd39 ...
tady je soubor po aplikaci makra - jsou vyfiltrované buňky, ve kterých se texty s "www" neodstranily - zůstaly v podstatě všechny odkazy na weby(href:)-modré, odkazy na obrázky (img.)-červené se taky neodstranily všechny...
ve sloupci "I" je kopie původních originál textů (pro porovnání ...
nechápu proč výběr někde funguje, někde ne...
Příloha: zip9347_data-test1.zip (40kB, staženo 23x)
citovat
#009348
Jeza.m
Momentálně je to nastaveno že:
začátek = <br/>
konec = </br>
v těch co zůstaly je začátek i konec stejný
začátek = <br/>
konec = <br/>
tudíž to s tím nepracuje.
Já teda s mými omezenými znalostmi html měl za to, že <br> je nepárový tag, tak mě tam to lomítko mate, ale na goolu vidím že správný tag pro xhtml je <br/> a pro html <br>, tak v podstatě v tvém souboru je ta syntaxe občas správně pro xhtml <br/> a občas špatně </br>. Tak si říkám jestli by nestálo za to nejprve hromadně nahradit stávající </br> za správné <br/>, tak aby to bylo všude stejné a pak v makru dosadit jako koncový parametr <br/>.

to nahrazení by mohlo jít i makrem:
nahradit stávající:
ttext = Cells(rd, sloupec).Value
za
ttext = replace(Cells(rd, sloupec).Value,"</br>","<br/>")

M@citovat
#009350
avatar
Hmmm... tak toho jsem si nevšiml - sory

stačilo pozměnit podmínky pro začátek a konec na "<br" a "/>" kterým končí každý tento řetězec a je po problému ...

bohužel ten dodávaný html kód je celý nějak podivný a nedá se na něj moc spolehnout, naštěstí náš editor je dostatečně "hloupý" a pokud formátování není košér, zahodí ho a zobrazí prostý text, takže ho nemusím čistit.

pak zkusím i tu náhradu znaků <br>

ještě otázku - nedají se v těchto textových operacích používat i sekvence ?,*? (jako u věstavěných funkcí Excelu Najít/Nahradit)

díky moc za pomoc ...
Berycitovat
#009351
Jeza.m
Podle mě nedají a pokud jo, tak nevím jak :-)citovat
#009354
avatar
jasně ...
stejně moc dík - funguje to "LUXUSNĚ"
Berycitovat
#009358
avatar
Jen dodatek ohledně úspory paměti.
Při deklaraci proměnných je třeba každé z nich přidělit svůj "as" zvlášť.
Kromě těch tří s "as" jsou ostatní proměnné typu Variant.
Alokace paměti:
Variant(s cisly) 16 bajty
Variant(se znaky)22 bajty
Single 4 bajty
String (s promennou delkou) 10bajt
Boolean 2 bajty
Taky je vhodné na prvním řádku modulů uvádět Option Explicit.
Debuger vás upozorní na nedeklarované proměnné, které jsou v opačném případě nastavené na Variant.
VBA Editor - Tools - Options - Editor - Require Variable Declaration

A k těm zástupným znakům:
"<br/><img" Like "<*g" = True
"<br/><img" Like "<*>*" = True
atd.citovat
#009364
avatar
díky za "lekci" a vysvětlení pojmů...
doteď jsem s VBA nepracoval, vždycky jsem si nějak poradil jen s pomocí vzorců, funkcí a tabulek...
tady už to nijak jednoduše nešlo - snad se mi podaří i do téhle problematiky časem trochu proniknout ...
Berycitovat

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Helios iNuvio

Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.

On-line nástroje