1. Здраво и добредојдовте на форумот на IT.mk.

    Доколку сеуште не сте дел од најголемата заедница на ИТ професионалци и ентузијасти во Македонија, можете бесплатно да се - процесот нема да ви одземе повеќе од 2-3 минути, а за полесна регистрација овозможивме и регистрирање со Facebook и Steam.
    Сокриј

Unicode во VB? И Preserve Case?

Дискусија во форумот 'Visual Basic' започната од Metuzalem, 19 Мај 2019.

  1. Metuzalem

    Metuzalem
    Epic

    6,207
    11,242
    28 ноември 2010
    Машко
    Tootle puffer
    Се работи за обичен search/replace што го снимив како макро, но не ми дава да пастирам non-ANSI карактери во самиот VB Editor (инаку е Word 2003, ги избегнувам подоцнежните верзии затоа што ДРАСТИЧНО го успорија извршувањето на VB команди).

    Ова е пример, не мора да се баш овие стрингови, но сакам да покажам дека има спејсови, ентери и најважното, букви со српско/хрватски квачици. Засега не ми требаат македонски букви, иако можеби ќе ми затребаат во иднина. Инаку се над 40 стрингови за замена што ќе бидат заменети во повеќе документи, како што доаѓаат.

    Код:
    Sub Macro()
    
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
    .Text = " što "
    .Replacement.Text = "^što "
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    With Selection.Find
    .Text = " već "
    .Replacement.Text = "^pveć "
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    End Sub
    
    Значи, овој пример не можам да го пастирам во VB едиторот, ги кине квачиците и š станува s. Постои ли начин да се зачуваат? Веројатно може да внесувам Unicode кодови, ама тогаш треба да го преправам целиот стринг и не знам дали и како се прави тоа со search/replace наредбава.

    Исто така, при првиот обид, стринговиве ми ги заменува со мали букви, односно не го зачувува кејсот - и sto и Sto ги претвора во sto (само пример, има спејсови околу). Мислам дека Match Case ќе ги наоѓа само sto, а нема Sto, но уште не сум пробал, поважен ми е првиот проблем. Во моментов не можам да пробам пак, но ме интересира дали Match Case ќе го реши проблемот или потребно е нешто повеќе? Сакам sto да го претвори во sto, а Sto во Sto (со спејсовите што ќе бидат додадени/одземени, а тие си работат беспрекорно). Инаку ќе треба да ги дуплирам срчовите, од 40 да станат 80...
     
  2. Metuzalem

    Metuzalem
    Epic

    6,207
    11,242
    28 ноември 2010
    Машко
    Tootle puffer
    За првиот проблем проверив како тој снима такво макро и видов дека и тој додава карактер кодови:

    Код:
    .Text = " " & ChrW(353) & "to "
    .Replacement.Text = "^p" & ChrW(353) & "to "
    
    па веројатно ќе одам со тоа.

    И вториот проблем реков како веројатно ќе биде, со дуплирање, ОСВЕН ако некој нема идеја како да направам loop (најголем проблем ми е што не знам каде да ги складирам паровите стрингови и како да ги влечам по два). Тоа би било и многу поелегантно и пофлексибилно, но немам толкаво знаење/искуство во VB.
     
    На bxxxn му/ѝ се допаѓа ова.
  3. bxxxn

    bxxxn
    Practice makes perfect

    993
    1,128
    11 Март 2011
    За VBA ти треба процедура или функција која што ќе се извршува како макрото од погоре.

    Во примерот подолу процедура на кликање на копче CommandButton1.

    Потоа ти требаат две еднодимензионални променливи и еден loop што ќе го изврши кодот сличен од макрото неколку пати.

    Со апострофи се коментрарите. Пример ....

    Фајлот е во атачмент.

    Код:
    Private Sub CommandButton1_Click()
    Dim sFrom(100), sTo(100) As String
    Dim iloop1 As Integer
    
    '' dodavam 5 random vrednosti za primer
    
    sFrom(1) = " " & ChrW(353) & "to "
    sTo(1) = "^p" & ChrW(353) & "to "
    sFrom(2) = " " & ChrW(354) & "to "
    sTo(2) = "^p" & ChrW(354) & "to "
    sFrom(3) = " " & ChrW(355) & "to "
    sTo(3) = "^p" & ChrW(355) & "to "
    sFrom(4) = " " & ChrW(356) & "to "
    sTo(4) = "^p" & ChrW(356) & "to "
    sFrom(5) = " " & ChrW(357) & "to "
    sTo(5) = "^p" & ChrW(357) & "to "
    
    ActiveDocument.Range.Select
    
    For iloop1 = 1 To 5 '' zgolemi go 5 po potreba
    With Selection.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = sFrom(iloop1)
    .Replacement.Text = sTo(iloop1)
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    
    Next iloop1
    
    End Sub
     

    Прикачени датотеки:

    На JensenInterceptor и Metuzalem им се допаѓа ова.
  4. Metuzalem

    Metuzalem
    Epic

    6,207
    11,242
    28 ноември 2010
    Машко
    Tootle puffer
    Фала многу, сега го довршувам ова моето по груба сила да се уверам дека работи, па за неколку дена ќе го пробам твоето.
     
    На bxxxn му/ѝ се допаѓа ова.
  5. mmarko

    mmarko
    Gaining Experience

    82
    55
    1 Март 2013
    Машко
    Би требало да можеш и да ги ставиш зборовите и нивните замени во нов sheet (пр. во првата колона оригиналните, во втората замените). И после со loop да ги изминеш зборовите во sheet2 и да ги заменуваш во првиот sheet. Така би го избегнал и проблемот со Unicode во кодот.
     
    На Metuzalem му/ѝ се допаѓа ова.
  6. bxxxn

    bxxxn
    Practice makes perfect

    993
    1,128
    11 Март 2011
    Се работи за Word, секако би можел и со Excel да го направи истото
     
    На Metuzalem му/ѝ се допаѓа ова.
  7. mmarko

    mmarko
    Gaining Experience

    82
    55
    1 Март 2013
    Машко
    Не прочитав убаво, моја грешка :)
     
    На bxxxn му/ѝ се допаѓа ова.
  8. Metuzalem

    Metuzalem
    Epic

    6,207
    11,242
    28 ноември 2010
    Машко
    Tootle puffer
    Пораснаа побарувањата на 70+ стрингови. :mad: Ќе морам со loop. Најмногу ме плаши тоа што бројачот (iloop1) ќе мора да го ускладувам секогаш со бројот на стринговите (не смее да брљави и да заменува празни стрингови или да дуплира). А и стринговите често ќе се менуваат во прво време, додека пробувам се` и сешто.

    Нема начин тоа да се реши поелегантно? Знам дека при толку пати броење ќе утнам некогаш. :D
     
  9. Triology

    Triology
    Gaining Experience

    177
    173
    30 Јуни 2008
    Машко
    евентуално прво да изброиш колку стрингови имаш да го сместиш бројот во променлива и во loop-от да ја ставиш променливата со бројот на стринговите.
     
    На goranzoran и Metuzalem им се допаѓа ова.
  10. mmarko

    mmarko
    Gaining Experience

    82
    55
    1 Март 2013
    Машко
    Можеш вака нешто

    Код:
    Sub Main()
    
    Dim Zbor As Variant
    Dim Zborovi
    
    Zborovi = Array(Array("zbor1", "nov_zbor1"), _
                    Array("zbor2", "nov_zbor2"), _
                    Array("zbor3", "nov_zbor3"))
    
    For Each Zbor In Zborovi
        Debug.Print Zbor(0), Zbor(1)
    Next
    
    End Sub
    
    едит: во 2016 го пробав ова, ваљда работи и во 2003
     
    На Metuzalem му/ѝ се допаѓа ова.
Слични теми
  1. MetalGear
    Одговори:
    2
    Прегледи:
    1,324
  2. Martinovski
    Одговори:
    0
    Прегледи:
    341
  3. SpiritBond
    Одговори:
    4
    Прегледи:
    520
  4. AleksandarT
    Одговори:
    1
    Прегледи:
    278
  5. VerGer
    Одговори:
    2
    Прегледи:
    415
Вчитување...

Сподели

Вчитување...