< 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:  « předchozí  1 2
icon #029422
avatar
Nechcem sa hádať, kto čo pochopil, myslím ale, že nápad s temp a triedenie na liste som uviedol. Okrem toho, som naznačil i cestu vo VBA prostredníctvom funkcie StrComp. Stačí k existujúcemu poľu pridať nový záznam a zotriediť. Pokiaľ je stávajúce pole už zotriedené, tak stačí v cykle porovnať nový záznam s existujúcimi hodnotami (opäť pomocou StrComp) a nový záznam potom priradiť do poľa na patričnú pozíciu, predtým všetkým nasledujúcim priradiť pozíciu o jednu vyššiu.

StrComp nie je stopercentný, ale ani triedenie na liste nefunguje vždy korektne. Príklady, kedy to nezafunguje presne ani v jednom z uvedených prípadov, sú napr. dvojice slov:
môj - mojmír
můj - muller

neporadí si to pravdepodobne vždy ani s dvojicou znakov c a h, napr v slove viachlavý sa nejedná o ch, ale o c a h..

Každopádne, moja rutina dáva rovnaný výsledok, ako dosiahneš triedením na liste.citovat
icon #029423
eLCHa
Já jen tak na okraj.
AL to tu už uvedl - StrComp a je to vyřešené (ikdyž nachápu, proč do toho tahá tempsheet a Kill ;)) ). Mě to jen zajímalo, a tak jsem zkusil následující. Pokud víme, že na listu to funguje a ve VBA ne, můžeme použít nástroje z listu - a pak trošku komplikovaně "=", ">", "<".

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 Evaluate("""" & List(i) & """<""" & List(j) & """") Then
Temp = List(j)
List(j) = List(i)
List(i) = Temp
End If
Next j
Next i
End Function


Nebo "nebublinkově"Sub subSort()
Dim sSorted() As String
ReDim sSorted(1 To Selection.Rows.Count)

Dim i As Long
For i = 1 To UBound(sSorted)
sSorted(Evaluate("=SUMPRODUCT((" & Selection.Cells(i).Address & ">" & Selection.Address & ")/1)") + Application.WorksheetFunction.CountIf(Selection.Resize(i, 1), Selection.Cells(i))) = Selection.Cells(i).Value
Next i

Selection.Value = Application.Transpose(sSorted)
End Sub
citovat
icon #029425
avatar
@eLCHa: ikdyž nachápu, proč do toho tahá tempsheet a Kill
buď temp sheet, triedenie na liste prostredníctvom vlastnosti sort, potom kill temp
alebo celé pomocou bubble sort bez temp sheetu
t.j. uviedol som dva postupycitovat
icon #029426
eLCHa
@AL
worksheet a Kill? Opravdu? A proč budeš ten tempsheet vůbec ukládat. ;))

@Chatar
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.
Vložte hodnotu nakonec a pak použijte seřazení pomocí VBA s přepsáním hodnot. Použijte ALovu proceduru.citovat
icon #029427
avatar
@eLCHa: A proč budeš ten tempsheet vůbec ukládat.
V tomto prípade skutočne nemusím, stačí použiť alternatívne workbooks.add, urobiť to v ňom a potom zavrieť, ale to je detail. Ide o to, že sa dá použiť triedenie priamo v liste. Nebuď hnidopich :)citovat
icon #029428
eLCHa
@AL
Nebuď hnidopich :)

2 10citovat
#029430
avatar
@AL
@eLCHa
Děkuju za pomoc, už to mám, použil jsem StrComp - dříve jsem nějak přehlédnul ty návratové hodnoty - stydím se .....citovat
#029433
avatar

AL napsal/a:

StrComp nie je stopercentný, ale ani triedenie na liste nefunguje vždy korektne. Príklady, kedy to nezafunguje presne ani v jednom z uvedených prípadov, sú napr. dvojice slov:
môj - mojmír
můj - muller


Excel dodržuje doporučení pro abecední třídění (pokud mi to nesedlo, zpravidla jsem něco přehlédl):

http://prirucka.ujc.cas.cz/?id=900

Totéž řeší ČSN 97 6030 (nevím jestli je poslední)

Uvedené příklady odpovídají tomuto doporučení:
? strcomp("môj", "mojmír", vbBinaryCompare)
1
? strcomp("môj", "mojmír", vbTextCompare)
-1

? strcomp("můj", "muller", vbBinaryCompare)
1
? strcomp("můj", "muller", vbTextCompare)
-1


Pokud jsou slova stejná, nastoupí řazení podle diakritiky:


? strcomp("muj", "můj", vbTextCompare)
-1


Problémem může být konvence o velkých znacích:


? strcomp("muller", "Muller", vbTextCompare)
0
? strcomp("muller", "Muller", vbBinaryCompare)
1


Tj. při shodě můžeme pořadí upřesnit binárně nebo jinak.

AL napsal/a:


neporadí si to pravdepodobne vždy ani s dvojicou znakov c a h, napr v slove viachlavý sa nejedná o ch, ale o c a h..


Toto ale vyžaduje slovník. Slovenský excel nemám, v češtině mne slovo s c-h nenapadlo.

Předpokládám, že i slovenština má podobné doporučení. Výsledek ale závisí na jazyce.citovat
icon #029434
avatar
@lubo
kód som písal v noci, ráno pred odchodom do práce som prišiel na problém s vbTextCompare, tak som na to upozornil. Podvedome som tušil, že riešením by mohlo byť binárne porovnanie, ale už som sa k tomu nedostal, páč som valil do práce. Problém c+h by som tiež riešil slovníkom.

Každopádne, díky za dobrý point a osvetlenie problému.citovat

Strana:  « předchozí  1 2

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