< návrat zpět

MS Excel


Téma: Porovnání řetězců ve VBA rss

Zaslal/a 20.1.2016 16:42

Ahoj, potřeboval bych porovnávat jména ve smyslu větší menší, hledám, kam přijde abecedně nové jméno do pole. Ve VBA mi to ale nekorektně porovnává. jde o znaky s diakritikou. Znáte někdo řešení tohoto problému?
Za pomoc děkuju.

Zaslat odpověď >

Strana:  1 2   další »
#029408
avatar
S tím jsem se potkal a "nějak" jsem to vyřešil. Ke své spokojenosti, ale už si nepamatuji, jak. Zkusím pohledat ve svém archlívu 1 .
Jen si matně vzpomínám, že vzorce na listu porovnávaly jinak, než to dělal VBA.citovat
#029409
avatar
Vzhledem k tomu, že sem zatím nenašel, co jsem hledal, udělal jsem si čtyřmi způsoby uspořádaný seznam znaků ASCII 32-255 a provedl jsem vyhodnocení jejich poradí testem na větší/menší pro sousedy. Nenašel jsem žádné standardní uspořádání znaků, které by v sobě neobsahovalo poruchy v pořadí při vyhodnocení sousedů. To je dost chlívek. Začínám být zvědavý, jak jsem se z toho kdysi vymotal! Snad to najdu...
Příloha: zip29409_razeniznaku.zip (33kB, staženo 34x)
citovat
#029410
Opičák
Jakési abecední řazení jsem řešil takto. Jsou tam dva různé způsoby se stejným výsledkem.
Příloha: zip29410_abecedni-razeni2.zip (10kB, staženo 41x)
citovat
#029411
avatar
Někde mezi mými 1500 archivovanýmí sešity to musím mít, ale nejspíš špatně hledám. Matně se mi vybavuje, že jsem svůj tříděný seznam dotřiďoval vlastním algoritmem, aby odpovídal českým lexigrafickým pravidlům. Formální chyby v pořadí sousedů to ještě zhoršovalo, ale slovníkově to bylo správnější. Můj úkol tehdy totiž zněl: udělej slovník podle české normy pro řazení hesel. S tím má Excel bohužel problém.
Opičákův způsob seřazení bude vytvářet správné pořadí sousedů pro funkce listu. To ale nemusí znamenat, že pro VBA toto řazení nebude mít "sousedské poruchy". A také si myslím, že vzorec ve sloupci F by se měl odvolávat na sloupec D, a ne na B 1 . Určitě to bude běhat na unikátních hodnotách. Duplicity v seznamu jsem nezkoušel.citovat
icon #029414
avatar
Pokiaľ by som to mal riešiť ja a podmienkou je, aby to bolo vo VBA, tak by som pole vykopíroval do nejakého temp sheetu, tam pomocou vlastnosti sort dáta v danom range zoradil a zoradený range načítal späť do poľa. Temp sheet potom zmazal pomocou kill. Sort na sheete (Data->Sort) radí korektne v závislosti na tom, aký jazyk je nastavený.

Inak ale, VBA dokáže reťazce radiť korektne, je ale potrebné poznať príslušnú metódu (funkciu), ktorou je StrComp, nie je možné dva reťazce porovnávať pomocou =, <, >

Reťazce na liste je možné vo VBA triediť pomocou nasledovného príkladu:Sub Sort()
Dim pole()
pole = WorksheetFunction.Transpose([L1:L20])
Call BubbleSort(pole)
[L1:L20] = WorksheetFunction.Transpose(pole)
End Sub

Function BubbleSort(List())
Dim i As Integer, j As Integer, Temp as string
For i = LBound(List) To UBound(List)
For j = LBound(List) To UBound(List)
If StrComp(List(i), List(j), vbTextCompare) = -1 Then
Temp = List(j)
List(j) = List(i)
List(i) = Temp
End If
Next j
Next i
End Function
Použil som bublinkové triedenie, pre malý rozsah dát postačuje. Uvedený kód bude fungovať i pre pole, v rutine BubbleSort je argumentom pole, hodnoty ktorého sú načítané v rutine Sort. Je ale možné v rutine BubbleSort pracovať i s poľom, ktoré do nej načítaš odinakadiaľ, nemusí sa jednať o dáta z range.citovat
#029415
Opičák
Abecední řazení ve VBA ještě jinak.
Příloha: zip29415_azeni-text-range-bublinova-metoda.zip (16kB, staženo 39x)
citovat
icon #029416
avatar
opičák, zapíš na koniec zoznamu:
žvatlal
želva
človíček
čenda

a uvidíš, že to asi nefunguje, ako si predpokladal

ako som už zmienil, reťazce vo VBA nie je možné porovnať pomocou znaku >
teda, je to možné, ale asi to nevedie ku kýženému výsledkucitovat
#029417
Opičák
AL, jo máš pravdu, už jdu spát, už nevnímám 9 9 9citovat
#029420
avatar
Děkuji Všem, ale bohužel akorát vovka.h mně pochopil. Trošku to rozvedu. Mám na listu seznam jmen abecedně řazený (to Excel na rozdíl od VBA umí). Ten samý seznam mám uložený v poli. Mám nové jméno, které potřebuji do toho seznamu vložit na správné místo. Tudíž potřebuji znát číslo řádku, pod (nebo nad) který budu nové jméno vkládat. NEMŮŽU! to ale udělat tak, že jej vložím na konec a setřídím Excelem. Jediné řešení, které mně napadá je, vložit TEMP list, na něj ten původní seznam, na konec vložit nové jméno a Excelem setřídit. Pak hledat, na kterém řádku to nové jméno je. Je to ale asi takový drbání levou rukou za pravým uchem.citovat
#029421
avatar
Ještě jednou, nedalo mi to a vyzkoušel jsem ještě porovnat řetězce metodou <>= v Excelu. A tam to funguje korektně! Proč to tedy ve VBA nejde? Vlastně jde, dokud se do toho nezapletou znaky s diakritikou .....

A já jsem Sparhawk, vzpomněl jsem si, že jsem se už registroval a dokonce i vyštrachal login a heslo 5
Příloha: rar29421_porovnani_retezcu.rar (6kB, staženo 51x)
citovat

Strana:  1 2   další »

Uživatelské menu

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

Menu

On-line nástroje

Formulář Faktura

Formulář Faktura IV

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

Aktivní diskuse

Vynásobit hodnoty kurzem - Power Query

Alfan • 26.4. 7:56

Relativní cesta - zdroje Power Query

Alfan • 26.4. 7:54

Vynásobit hodnoty kurzem - Power Query

elninoslov • 26.4. 7:54

Vynásobit hodnoty kurzem - Power Query

lubo • 25.4. 19:18

Relativní cesta - zdroje Power Query

elninoslov • 25.4. 15:12

Relativní cesta - zdroje Power Query

Alfan • 25.4. 15:08

Relativní cesta - zdroje Power Query

elninoslov • 25.4. 14:21