Sunt situaţii când avem nevoie să folosim, în aplicaţii MS Office (spre ex. în Excel), anumite cuvinte fără diacritice. În VBA se poate realiza relativ uşor acest lucru, folosind o astfel de funcţie (ExtendOffice):
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Function StripAccent(thestring As String) Dim A As String * 1 Dim B As String * 1 Dim i As Integer Const AccChars= "ŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðñòóôõöùúûüýÿ" Const RegChars= "SZszYAAAAAACEEEEIIIIDNOOOOOUUUUYaaaaaaceeeeiiiidnooooouuuuyy" For i = 1 To Len(AccChars) A = Mid(AccChars, i, 1) B = Mid(RegChars, i, 1) thestring = Replace(thestring, A, B) Next StripAccent = thestring End Function |
Problema este că, dacă ne uităm cu atenţie, nu prea le găsim pe cele folosite în limba română (ş-urile, ţ-urile, nici chiar ă-ul „normal”). Dacă am încerca să le introducem în VBA am remarca că sunt automat convertite în alte caractere.
Pentru a nu avea un astfel de stres, o soluţie elegantă este să recurgem la codurile ASCII. Dar, pentru că nu toate diacriticile româneşti fac parte din setul original ASCII, vom recurge la setul extins de caractere Unicode. Ne ajută folosirea funcţiilor Chr$ (pentru ASCII) şi ChrW (pentru Unicode).
Aşadar, mi-am permis să adaptez codul de mai sus, „românizându-l” şi privitor la numele variabilei, pentru a fi cât mai de înţeles acţiunea lor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
Function diacrit(expresie As String) As String Dim litD As String ' diacritica Dim litS As String ' litera simpla Dim i As Integer Dim AsciiUnicode As String ' diacriticile vizate Dim litere As String ' literele corespondente diacriticilor ' Echivalente: ChrW(&H102) & ChrW(&H103) - Ăă ' Chr$(194) & Chr$(226) - Ââ ' Chr$(206) & Chr$(238) - Îî ' ChrW(&H218) & ChrW(&H219) - Șș, cu virgule, aferente tastaturii RO Standard ' ChrW(&H15E) & ChrW(&H15F) - Şş, cu sedile, aferente tastaturii RO Legacy ' ChrW(&H21A) & ChrW(&H21B) - Țț, cu virgule, aferente tastaturii RO Standard ' ChrW(&H162) & ChrW(&H163) - Ţţ, cu sedile, aferente tastaturii RO Legacy AsciiUnicode = ChrW(&H102) & ChrW(&H103) & _ Chr$(194) & Chr$(226) & _ Chr$(206) & Chr$(238) & _ ChrW(&H218) & ChrW(&H219) & ChrW(&H15E) & ChrW(&H15F) & _ ChrW(&H21A) & ChrW(&H21B) & ChrW(&H162) & ChrW(&H163) litere = "AaAaIiSsSsTtTt" For i = 1 To Len(AsciiUnicode) litD = Mid(AsciiUnicode, i, 1) litS = Mid(litere, i, 1) expresie = Replace(expresie, litD, litS) Next diacrit = expresie End Function |
Desigur, dacă suntem interesaţi şi de alte litere cu diferite accente la care vrem să le convertim, le putem adăuga în acei vectori.
Dacă în Excel putem folosi această funcţie, în cazul în care folosim Google Sheets, putem converti funcţia în cod compatibil. Pentru aceasta, ar trebui urmaţi paşii:
- În meniul
Extensions
alegemApps Script
. - În editorul Apps Script, adăugăm codul de mai jos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
function diacrit(expresie) { var litD; // diacritica var litS; // litera simpla var i; // diacriticile vizate var AsciiUnicode = String.fromCharCode(258) + String.fromCharCode(259) + String.fromCharCode(194) + String.fromCharCode(226) + String.fromCharCode(206) + String.fromCharCode(238) + String.fromCharCode(536) + String.fromCharCode(537) + String.fromCharCode(350) + String.fromCharCode(351) + String.fromCharCode(538) + String.fromCharCode(539) + String.fromCharCode(354) + String.fromCharCode(355); // literele corespondente diacriticilor var litere = "AaAaIiSsSsTtTt"; for (i = 0; i < AsciiUnicode.length; i++) { litD = AsciiUnicode.charAt(i); litS = litere.charAt(i); expresie = expresie.split(litD).join(litS); } return expresie; } |
- Salvăm scriptul şi proiectul.
- În Google Sheets, vom scrie în maniera aceasta: =diacrit("B2")