Програма с отворен код, за пресмятане на резултатите от изборите на 12 май, както и за тяхното персонифициране по изборни райони

cik

В нощта на 15 срещу 16 март 2013г. (петък срещу събота), в 23ч16мин (!), Централната избирателна комисия, с Решение № 2163-НС, публикува Методика за изчисляване на резултатите от изборите за НС на 12 май 2013 г. https://www.cik.bg/?resh=2385

Срокът за обжалване на решението беше 72 часа (включвайки два почивни дни).

 За пръв път в новата българска история, един от най-важните елементи на Изборния закон се приема при закрити врати, без обществено обсъждане, и без да бъдат консултирани водещите експерти по изборно право в България.

 Един от най-съществените недостатъци на предходния Изборен закон бе изкривяването на гласа на избирателя, дължащо се на необяснимото отсъствие на пълноценен 32-ри избирателен район в чужбина, както и на неравнопоставеността на различните избирателни райони. Вместо да реши тези стари проблеми, НС и ЦИК създадоха нови, като пътьом отвориха възможност за манипулиране на избора на кандидатите за депутати на „малките партии“. Определянето на изборните резултати занапред ще се извършва със специален софтуер, чийто код бе засекретен от ЦИК с непубликувано протоколно решение от 8 април 2013 (разполагаме с видеозапис от гласуването). След като изчисленията стават непроверяеми, това може да постави под въпрос дори самото признаване на изборния резултат от опозицията.

Васил Цанов* писа през далечната 1997 г,

„най-безспорно установеният факт от българския социален опит през последните петдесетина години е, че зад секретността има само корупция и некомпетентност“

Публикуваната тук програма за пресмятане на изборните резултати, както и за тяхното персонифициране по изборни райони, е принос на български специалисти живеещи в чужбина, към въвеждането на нови стандарти за прозрачност в изборния процес в България.

 Програмата можете да изтеглите тук http://dl.free.fr/kCNOer9im

*Васил Цанов, Изборите през 1990г. Основаване на Третата Република, в сборника статии « Българските избори 1990 –1996 ». Деметра, София 1997г.

По-долу публикуваме пълния VBA код на програмата за пресмятане на изборните резултати. JAVA версия достъпна онлайн ще бъде публикувана преди изборите на 12 май 2013, на страницата на в-к Бивол (https://www.bivol.bg/)

‘Institut de Mathématiques – Université de Toulouse – France

‘Version 4

Sub BgElections2013codeV4()

‘Copy the code.

‘Choose Insert –> Module.

‘Paste code into the right pane.

‘Close the Project

‘Save workbook before any other changes.

‘Choose Tools –> Macro –> Macros –> BgElections2013 –> Run

‘INPUT DATA is a table containing the results of the vote

‘(X,Y) are the coordinates of the left upper cell of the INPUT DATA

‘let MIR be the number of circonsriptions, and Parties be the number of paries participating in the election

‘the results of party I are in cells (X+I-1,J), where $1\leq J \leq MIR$, and $1\leq I \leq Parties$

‘Line „X-1″ contains the seats atributed before the elections to each circonsription. Thus the number of seats in constituency J is in cell (X-1,J)

‘ The above data is the InputData as defined in the program

Dim InputData As Range

Dim x, Y, MIR, Parties As Integer

Dim Total As Long

On Error Resume Next

Application.DisplayAlerts = False

Set InputData = Application.InputBox(Prompt:=“Please select Input Data with your Mouse“, Title:=“SPECIFY RANGE“, Type:=8)

On Error GoTo 0

Application.DisplayAlerts = True

If InputData Is Nothing Then

Exit Sub

Else

End If

Debug.Print InputData.Address

Y = InputData.Cells(1, 1).Column

x = InputData.Cells(1, 1).Row

MIR = InputData.Columns.Count

Parties = InputData.Rows.Count

Dim NewTable As Integer

Dim Ret_type As Integer

NewTable = Parties + 6

Range(Cells(x + NewTable – 2, Y – 1), Cells(x + 7 * NewTable, Y + MIR + 4)).Clear

‘first distrubution of seats by circonscription and by parties (vertical distribution)

For I = 1 To Parties

For J = 1 To MIR

If Application.Sum(Range(InputData.Cells(1, J), InputData.Cells(Parties, J))) = 0 Then

MsgBox „Choose an Input Data“

Exit Sub

Else

End If

Cells(x + I – 1 + 2 * NewTable, Y + J – 1).Value = Cells(x – 1, Y + J – 1) * InputData.Cells(I, J) / Application.Sum(Range(InputData.Cells(1, J), InputData.Cells(Parties, J)))

Next J

Next I

‘decoration

For J = 1 To MIR

Cells(x – 1 + 2 * NewTable, Y + J – 1) = Cells(x – 1, Y + J – 1)

Cells(x – 2 + 2 * NewTable, Y + J – 1) = Cells(x – 2, Y + J – 1)

Next J

For I = 1 To Parties

Cells(x + I + 2 * NewTable – 1, Y – 1).Value = Cells(x + I – 1, Y – 1).Value

Next I

Cells(x + 2 * NewTable – 1, Y – 1).Value = Cells(x – 1, Y – 1).Value

Cells(x – 1 + 2 * NewTable, Y + MIR) = Application.Sum(Range(Cells(x – 1, Y), Cells(x – 1, Y + MIR – 1)))

Cells(x – 2 + 2 * NewTable, Y + MIR) = „Total“

Cells(x – 1 + 2 * NewTable, Y + MIR + 1) = Application.Sum(Range(Cells(x – 1, Y), Cells(x – 1, Y + MIR – 1)))

Cells(x – 2 + 2 * NewTable, Y + MIR + 1) = AsciiToUnicode(„Спечелени“) ‘specheleni

‘Range(Cells(X – 1 + 2*NewTable, Y), Cells(X – 1 + 2*NewTable, Y + MIR + 1)).BorderAround

For J = Y To Y + MIR – 1

Cells(x + Parties, J) = Application.Sum(Range(Cells(x, J), Cells(x + Parties – 1, J))) ‘last line, obshto

Next J

For I = x To Parties + x – 1

Cells(I, Y + MIR + 1) = Application.Sum(Range(Cells(I, Y), Cells(I, Y + MIR – 1))) ‘column obshto

Next I

Cells(x + Parties, Y + MIR + 1) = Application.Sum(Range(Cells(x, Y), Cells(x + Parties – 1, Y + MIR – 1))) ‘obshto

Cells(x – 1, Y + MIR + 1) = AsciiToUnicode(„Общо“) ‘Obshto

‘end of decoration

‘distribution of seats by parties on a national level – 1th step

For I = 1 To Parties

Cells(x + I – 1 + 2 * NewTable, Y + MIR).Value = Application.Sum(Range(Cells(x – 1, Y), Cells(x – 1, Y + MIR – 1))) * Application.Sum(Range(InputData.Cells(I, 1), InputData.Cells(I, MIR))) / Application.Sum(InputData)

Next I

‘integer parts and fractions are separated in two new tables

For I = 1 To Parties

For J = 1 To MIR + 1

Cells(x + I – 1 + 3 * NewTable, Y + J – 1).Value = Int(Cells(x + I – 1 + 2 * NewTable, Y + J – 1).Value) ‘Table 2 with integer values

Cells(x + I – 1 + 5 * NewTable, Y + J – 1).Value = Cells(x + I – 1 + 2 * NewTable, Y + J – 1).Value – Int(Cells(x + I – 1 + 2 * NewTable, Y + J – 1).Value) ‘Table 3 with fractional values

Next J

Next I

‘Here in line X-1 of Table 3 we compute the non-distributed seats by constituency (MIR)

For J = 1 To MIR + 1

Cells(x – 1 + 5 * NewTable, Y + J – 1).Value = Cells(x – 1 + 2 * NewTable, Y + J – 1).Value – Application.Sum(Range(Cells(x + 3 * NewTable, Y + J – 1), Cells(x + 3 * NewTable + Parties – 1, Y + J – 1)))

Next J

‘Here some of the cells will be bolded

Dim RangeJ As Range

For J = Y To Y + MIR

Set RangeJ = Range(Cells(x + 5 * NewTable, J), Cells(x + 5 * NewTable + Parties – 1, J))

For I = x + 5 * NewTable To x + 5 * NewTable + Parties – 1

Debug.Print I & J & „I,J“

If Application.WorksheetFunction.Rank(Cells(I, J), RangeJ) < Cells(x – 1 + 5 * NewTable, J).Value + 1 Then

Cells(I, J).Font.Bold = True

End If

Next I

Next J

‘number of seats by party (STEP1)

For I = 1 To Parties

If Cells(x + I – 1 + 5 * NewTable, Y + MIR).Font.Bold = True Then

Cells(x + I – 1 + 2 * NewTable, Y + MIR + 1) = Int(Cells(x + I – 1 + 2 * NewTable, Y + MIR)) + 1

Else

Cells(x + I – 1 + 2 * NewTable, Y + MIR + 1) = Int(Cells(x + I – 1 + 2 * NewTable, Y + MIR))

End If

‘seats to be distributed

Next I

For I = 1 To Parties

Cells(x + I – 1 + 5 * NewTable, Y + MIR) = Cells(x + I – 1 + 2 * NewTable, Y + MIR + 1) – Application.Sum(Range(Cells(x + I – 1 + 3 * NewTable, Y), Cells(x + I – 1 + 3 * NewTable, Y + MIR – 1)))

If Cells(x + I – 1 + 5 * NewTable, Y + MIR) < 0 Then

MsgBox „Sorry, we have a problem in STEP2“ & Chr(10) & „we can not distribute a negative number of seats“ & Chr(10) & „Please send a message to CIK“ & Chr(10) & „cik@cik.bg“

Exit Sub

End If

Next I

Cells(x – 1 + 5 * NewTable, Y + MIR).Clear

Dim Counter As Integer

For I = 1 To Parties

Counter = 0

For J = Y To Y + MIR – 1

If Cells(I + x – 1 + 5 * NewTable, J).Font.Bold = True Then

Counter = Counter + 1

End If

Next J

Cells(I + x – 1 + 5 * NewTable, Y + MIR + 1).Value = Counter – Cells(I + x – 1 + 5 * NewTable, Y + MIR).Value ‘ here we compute the excedence

Next I

‘Massages

Cells(x + NewTable – 3, Y).Value = AsciiToUnicode(„1ва стъпка“) ‘1va stypka

Cells(x + 2 * NewTable – 4, Y).Value = AsciiToUnicode(„2ра стъпка“) ‘2ra stypka

Cells(x + 5 * NewTable – 4, Y).Value = AsciiToUnicode(„3та стъпка“) ‘3ta stypka

Cells(x + NewTable – 5, Y – 1).Value = AsciiToUnicode(„Изборни резултати“) ‘Izborni rezultati

Range(Cells(x + NewTable, Y – 1), Cells(x + NewTable + Parties – 1, Y – 1)).Value = Range(Cells(x, Y – 1), Cells(x + Parties – 1, Y – 1)).Value

Range(Cells(x + NewTable, Y), Cells(x + NewTable + Parties – 1, Y)).Value = Range(Cells(x + 2 * NewTable, Y + MIR + 1), Cells(x + 2 * NewTable + Parties – 1, Y + MIR + 1)).Value

Range(Cells(x + 3 * NewTable, Y – 1), Cells(x + 3 * NewTable + Parties – 1, Y – 1)).Value = Range(Cells(x, Y – 1), Cells(x + Parties – 1, Y – 1)).Value

Range(Cells(x + 4 * NewTable, Y – 1), Cells(x + 4 * NewTable + Parties – 1, Y – 1)).Value = Range(Cells(x, Y – 1), Cells(x + Parties – 1, Y – 1)).Value

Range(Cells(x + 5 * NewTable, Y – 1), Cells(x + 5 * NewTable + Parties – 1, Y – 1)).Value = Range(Cells(x, Y – 1), Cells(x + Parties – 1, Y – 1)).Value

Cells(x + NewTable – 1, Y – 1).Value = AsciiToUnicode(„Партии“) ‘partii

Cells(x + NewTable – 1, Y).Value = AsciiToUnicode(„Спечелени мандати“) ‘specheleni mandati

Cells(x + 3 * NewTable – 2, Y).Value = AsciiToUnicode(„Първоначални (цели) мандати“) ‘pyrvonachalni (celi) mandati

Cells(x + 4 * NewTable – 2, Y).Value = AsciiToUnicode(„Раздадени първоначални (цели) и допълнителни (дробни) мандати“) ‘razdadeni pyrvonachalni + dopylnitelni

Cells(x + 6 * NewTable – 4, Y).Value = AsciiToUnicode(„Окончателно разпределение на мандатите по партии и MИР“) ‘okonchatelno razpredelenie

‘Table 4

For I = x To x + Parties – 1

For J = Y To Y + MIR – 1

Cells(I + 4 * NewTable, J).Borders.Value = 1 ‘bordure

If Cells(I + 5 * NewTable, J).Font.Bold = True Then

Cells(I + 4 * NewTable, J) = 1 + Cells(I + 3 * NewTable, J)

Else: Cells(I + 4 * NewTable, J) = Cells(I + 3 * NewTable, J)

End If

Next J

Next I

Cells(x + 4 * NewTable – 1, Y + MIR).Value = AsciiToUnicode(„Раздадени“) ‘razdadeni

Cells(x + 4 * NewTable – 1, Y + MIR + 1).Value = AsciiToUnicode(„Спечелени“) ‘specheleni

For I = x To x + Parties – 1

Cells(I + 4 * NewTable, Y + MIR) = Application.Sum(Range(Cells(I + 4 * NewTable, Y), Cells(I + 4 * NewTable, Y + MIR – 1)))

Cells(I + 4 * NewTable, Y + MIR + 1) = Cells(I + 2 * NewTable, Y + MIR + 1)

Next I

‘Table 3

Cells(x + 3 * NewTable – 1, Y + MIR) = AsciiToUnicode(„Раздадени“) ‘razdadeni

For I = x To x + Parties – 1

Cells(I + 3 * NewTable, Y + MIR) = Application.Sum(Range(Cells(I + 3 * NewTable, Y), Cells(I + 3 * NewTable, Y + MIR – 1)))

Next I

Cells(x + 3 * NewTable – 1, Y + MIR + 1) = AsciiToUnicode(„оставащи за раздаване“) ‘ostavashti za razdavane

For I = x + 3 * NewTable To x + Parties + 3 * NewTable – 1

Cells(I, Y + MIR + 1) = Cells(I – NewTable, Y + MIR + 1) – Cells(I, Y + MIR)

Next I

‘STEP 3

‘STEP 3

‘STEP 3

Ret_type = MsgBox(„Batch mode (yes) or Expert mode (No)?“, vbYesNo, „Execution Mode“)

If Ret_type = 7 Then

MsgBox „Ready for Step 3?“

End If

Dim Iplus As Integer ‘on echange les mandats Cells(Iplus,Jplus) contre Cells(Imin,Jmin)

Dim Jplus As Integer ‘, Iminus, Jminus As Integer

Dim Iminus, Jminus As Integer

Dim K As Integer ‘parametre libre

Dim PlusCounter As Integer ‘compteur des mandats excédentaires

Dim BoldCellsPlus As Range ‘les mandats excédentaires

Dim CellsMinus As Range ‘les mandats non-marqués de la ligne I

Dim BoldCellsMinus As Range

Dim c As Range

Dim Min As Single

x = x + 5 * NewTable

‘MsgBox X

For I = x To x + Parties – 1

Counter = 0

For J = Y To Y + MIR – 1

If Cells(I, J).Font.Bold = True Then

Counter = Counter + 1

End If

Next J

Cells(I, Y + MIR + 1).Value = Counter – Cells(I, Y + MIR).Value ‘ here we compute the excedence

Next I

‘PlusCounter est le nombre des parties excédentaires (ont récus trop de mandats)

Dim Timer As Integer

Do While Timer < 50

‘MsgBox Timer

PlusCounter = 0

For I = x To x + Parties – 1

If Cells(I, Y + MIR + 1).Value > 0 Then

PlusCounter = PlusCounter + 1

End If

Next I

If PlusCounter = 0 Then

MsgBox „After “ & Timer & “ cycles in Step 3″ & “ you are almost finished !“ & Chr(10) & „PRESS RETURN“

‘If Ret_type = 6 Then ‘Batch Mode

For I = x To x + Parties – 1 ‘Expert Mode

For J = Y To Y + MIR – 1

Cells(I, J).Borders.Value = 1 ‘bordure

Cells(I + NewTable, J).Borders.Value = 1 ‘bordure

If Cells(I, J).Font.Bold = True Then

Cells(I + NewTable, J) = 1 + Cells(I – 2 * NewTable, J) ‘final table

Else: Cells(I + NewTable, J) = Cells(I – 2 * NewTable, J) ‘final table

End If

Next J

Next I

Range(Cells(x + NewTable – 2, Y – 1), Cells(x + NewTable – 1, Y + MIR)).Style = „Output“

Range(Cells(x + NewTable – 2, Y – 1), Cells(x + NewTable + Parties – 1, Y – 1)).Style = „Output“

Range(Cells(x + NewTable – 2, Y + MIR), Cells(x + NewTable + Parties – 1, Y + MIR)).Style = „Output“

‘decoration

For J = Y To Y + MIR – 1

Cells(x – 1 + NewTable, J) = Cells(x – 1 – 3 * NewTable, J)

Cells(x – 2 + NewTable, J).Value = Cells(x – 2 – 3 * NewTable, J).Value

Next J

Cells(x – 1 + NewTable, Y + MIR) = Cells(x – 1 – 3 * NewTable, Y + MIR)

Cells(x – 2 + NewTable, Y + MIR) = „Total“

For I = x To x + Parties – 1

Cells(I + NewTable, Y + MIR) = Cells(I – 3 * NewTable, Y + MIR + 1)

Next I

For I = 1 To Parties

Cells(x + I – 1 + NewTable, Y – 1).Value = Cells(x + I – 1 – 3 * NewTable, Y – 1).Value

Next I

Cells(x – 1 + NewTable, Y – 1).Value = Cells(x – 1 – 3 * NewTable, Y – 1).Value

‘end of decoration

Exit Do ‘End

Else:

End If

‘on compte les mandats supplémentaires marqués en gras Article 24

For I = x To x + Parties – 1

For J = Y To Y + MIR – 1

If Cells(I, J).Font.Bold = True And Cells(I, Y + MIR + 1).Value > 0 And Cells(I, J).Font.ColorIndex <> 3 Then

If BoldCellsPlus Is Nothing Then

Set BoldCellsPlus = Cells(I, J)

Else

Set BoldCellsPlus = Union(Cells(I, J), BoldCellsPlus)

End If

End If

Next J

Next I

‘Debug.Print „Min“ & Min

If BoldCellsPlus Is Nothing Then

MsgBox „Sorry, we have a problem after “ & Timer & “ cycles in Step 3!“ & Chr(10) & „We can not continue: please send a message to CIK cik@cik.bg“

Exit Sub

End If

Debug.Print BoldCellsPlus.Address

Min = Application.WorksheetFunction.Min(BoldCellsPlus)

‘MsgBox Min & “ valeur minimale“

Debug.Print BoldCellsPlus.Address & „BoldCellsPlus.Address “

Iplus = MinAddressRow(BoldCellsPlus)

Jplus = MinAddressColumn(BoldCellsPlus) ‘MIR

‘Cells(Iplus,MIR) est le plus petit nombre parmi les nombres marqués en gras

Set CellsMinus = Nothing

For K = x To x + Parties – 1

‘Debug.Print Cells(K, Jplus) & „Jplus“ & Jplus

If Cells(K, Jplus).Font.Bold = False And Cells(K, Jplus).Font.ColorIndex <> 3 Then

If CellsMinus Is Nothing Then

Set CellsMinus = Cells(K, Jplus)

Else

Set CellsMinus = Union(Cells(K, Jplus), CellsMinus)

End If

End If

Next K

‘CellsMinus.Select

‘Debug.Print “ CellsMinus.Address“ & CellsMinus.Address

‘Debug.Print „MaxAddressRow(CellsMinus) :“ & MaxAddressRow(CellsMinus)

If Not CellsMinus Is Nothing Then

Iminus = MaxAddressRow(CellsMinus)

‘Jminus = MaxAddressColumn(CellsMinus)

‘Cells(Iminus,Jplus) est le plus grand nombre non-marqué dans la colonne MIR

Counter = Jplus

If Ret_type = 7 Then

MsgBox “ ready for MIR _ “ & Jplus – Y + 1 & “ ?“

End If

Cells(Iplus, Jplus).Font.Bold = False

Cells(Iplus, Jplus).Font.ColorIndex = 3 ‘couleur rouge

‘Cells(Iplus, Jplus).Borders.Value = 1 ‘bordure

Cells(Iminus, Jplus).Font.ColorIndex = 5 ‘couleur bleu

Cells(Iminus, Jplus).Font.Bold = True

Timer = Timer + 1

‘computation of column Y+MIR+1 (excendences)

For I = x To x + Parties – 1

Counter = 0

For J = Y To Y + MIR – 1

If Cells(I, J).Font.Bold = True Then

Counter = Counter + 1

End If

Next J

Cells(I, Y + MIR + 1).Value = Counter – Cells(I, Y + MIR).Value ‘ here we compute the excedence

‘TestCounter = Counter

‘MsgBox TestCounter

Next I

Else

Range(Cells(x, Jplus), Cells(x + Parties – 1, Jplus)).Font.ColorIndex = 3 ‘ red color according to art. 26

‘MsgBox „Sorry, after “ & Timer & “ cycles in Step 3″ & Chr(10) & „we have a problem in MIR“ & Jplus – Y + 1 & Chr(10) & „Art 26“

End If

Set BoldCellsPlus = Nothing

Loop

End Sub

Function MinAddress(ByRef ThisRange As Range) As String

Dim cel As Range

For Each cel In ThisRange

If cel = Application.WorksheetFunction.Min(ThisRange) Then MinAddress = cel.Address

Next cel

End Function

‘Sub TestFunction()

‘ MsgBox MinAddress(Range(„B53:F56“))

‘End Sub

Function MinAddressColumn(ByRef ThisRange As Range) As Long

Dim cel As Range

For Each cel In ThisRange

If cel = Application.WorksheetFunction.Min(ThisRange) Then MinAddressColumn = cel.Column

Next cel

End Function

Function MinAddressRow(ByRef ThisRange As Range) As Long

Dim cel As Range

For Each cel In ThisRange

If cel = Application.WorksheetFunction.Min(ThisRange) Then MinAddressRow = cel.Row

Next cel

End Function

Function MaxAddress(ByRef ThisRange As Range) As String

Dim cel As Range

For Each cel In ThisRange

If cel = Application.WorksheetFunction.Max(ThisRange) Then MaxAddress = cel.Address

Next cel

End Function

‘Sub TestFunctionTest()

‘ MsgBox MaxAddress(Range(„B53:F56“))

‘End Sub

Function MaxAddressColumn(ByRef ThisRange As Range) As Long

Dim cel As Range

For Each cel In ThisRange

If cel = Application.WorksheetFunction.Max(ThisRange) Then MaxAddressColumn = cel.Column

Next cel

End Function

Function MaxAddressRow(ByRef ThisRange As Range) As Long

Dim cel As Range

For Each cel In ThisRange

If cel = Application.WorksheetFunction.Max(ThisRange) Then MaxAddressRow = cel.Row

Next cel

End Function

Public Function UnicodeToAscii(sText As String) As String

Dim x As Long, sAscii As String, ascval As Long

If Len(sText) = 0 Then

Exit Function

End If

sAscii = „“

For x = 1 To Len(sText)

ascval = AscW(Mid(sText, x, 1))

If (ascval < 0) Then

ascval = 65536 + ascval ‘ http://support.microsoft.com/kb/272138

End If

sAscii = sAscii & „&#“ & ascval & „;“

Next

UnicodeToAscii = sAscii

End Function

Public Function AsciiToUnicode(sText As String) As String

Dim saText() As String, sChar As String

Dim sFinal As String, saFinal() As String

Dim x As Long, lPos As Long

If Len(sText) = 0 Then

Exit Function

End If

saText = Split(sText, „;“) ‘Unicode Chars are semicolon separated

If UBound(saText) = 0 And InStr(1, sText, „&#“) = 0 Then

AsciiToUnicode = sText

Exit Function

End If

ReDim saFinal(UBound(saText))

For x = 0 To UBound(saText)

lPos = InStr(1, saText(x), „&#“, vbTextCompare)

If lPos > 0 Then

sChar = Mid$(saText(x), lPos + 2, Len(saText(x)) – (lPos + 1))

If IsNumeric(sChar) Then

If CLng(sChar) > 255 Then

sChar = ChrW$(sChar)

Else

sChar = Chr$(sChar)

End If

End If

saFinal(x) = Left$(saText(x), lPos – 1) & sChar

ElseIf x < UBound(saText) Then

saFinal(x) = saText(x) & „;“ ‘This Semicolon wasn’t a Unicode Character

Else

saFinal(x) = saText(x)

End If

Next

sFinal = Join(saFinal, „“)

AsciiToUnicode = sFinal

Erase saText

Erase saFinal

End Function

Advertisements

Вашият коментар

Попълнете полетата по-долу или кликнете върху икона, за да влезете:

WordPress.com лого

You are commenting using your WordPress.com account. Log Out / Промяна )

Twitter picture

You are commenting using your Twitter account. Log Out / Промяна )

Facebook photo

You are commenting using your Facebook account. Log Out / Промяна )

Google+ photo

You are commenting using your Google+ account. Log Out / Промяна )

Connecting to %s

%d bloggers like this: