ФИО и сумма прописью.

Автор Irina18, 31 августа 2017, 18:06

0 Пользователи и 1 гость просматривают эту тему.

Irina18

Всем привет. Перешла на новую работу, а там нет Office только LibreOffice. На старом месте работы у меня были шаблоны договоров, сделанных в Word, помог сделать один добрый человек на одном из форумов. Тут же ничего толком нет  :'(, вот и обращаюсь к вам за помощью. Надо мне в Write сделать так чтобы, в одном поле я ввела фамилию, имя и отчество, а в нескольких местах договора, пусть их будет три, это же продублировалось, а так же в трех местах отобразились фамилия и инициалы. Нужно так же после ввода в поле числовой суммы, в тех местах отобразилась сумма прописью. Функцию суммы прописью для Calc я нашла, но как ее использовать в  Write не знаю. Образец того, что мне надо, я прилагаю в файле Word. Всем, откликнувшимся, спасибо.

Yakov

#1
CyrrilicTools поможет сделать число прописью?

Irina18

Про Cirrilic я знаю, но хотелось бы макросом решать эту проблему, ввел в одном месте один раз и все продублировалось в других участках договора. Есть  длинный код по сумме прописью для Calc он же, думаю, должен подойти и для Write.

Irina18

Вот такой код функции в CalcPublic Function SUMTEX (ByVal vSumma as Variant, _
Optional sIntImya As String, Optional sIntImeni As String, Optional sIntImen As String, Optional iIntSex As Integer, _
Optional sFrcImya As String, Optional sFrcImeni As String, Optional sFrcImen As String, Optional iFrcRate As Integer _
) As String
On Error Goto Er_SUMTEX
Dim cDevi As String
Dim iCorrect As Integer
Dim iKop As Long
Dim sKop As String
Dim aNumsy(1) As String
Dim iPower As Integer
Dim sBalance As String
Dim dBalance As Double
Dim iOrder As Integer
Dim sMomentResult As String
Dim sResult As String
Dim iRemainder As Integer
Dim sEnd As String
cDevi = Left(Right(CStr(2.7), 2), 1)
Dim iUnits As Integer, sUnits As String
Dim iTens As Integer, sTens As String
Dim iHundreds As Integer, sHundreds As String
Dim sOrderName As String
If Not (IsMissing (iFrcRate)) then
If iFrcRate > 9 or iFrcRate < 0  then
SUMTEX = "#INVALIDFR!"
Exit Function
End If
End If
If VarType(vSumma)<>8 then
If vSumma > 999999999999999 Then
If MsgBox ("Внимание! При обработке чисел более 999'999'999'999'999 может происходить потеря точности в результате возвращаемом функцией. Чтобы избежать этого необходимо передавать параметр как текст. Продолжить вычисление?", 52, "SUMTEX")=7 then
SUMTEX = "#USERABORT!"
Exit Function
End If
End If
sBalance = ""
If IsMissing (iFrcRate) then
iFrcRate = 2
End if
iCorrect = 10 ^ iFrcRate
iKop = Int ((vSumma - Int (vSumma)) * iCorrect + 0.5)
If iKop > 0 Then
dBalance = Int (vSumma)
If iKop = 10 ^ iFrcRate Then
dBalance = dBalance + 1
iKop = 0
End If
Else
dBalance = Int (vSumma + 0.5)
iKop = 0
End If
Else
dBalance = 0
If InStr(vSumma,"E+") <> 0 then
aNumsy() = Split(vSumma, "E+")
iPower = aNumsy(1)
aNumsy() = Split(aNumsy(0), cDevi)

If UBound (aNumsy()) < 1 then
vSumma = aNumsy(0)
Else
vSumma = aNumsy(0) & aNumsy(1)
End if
vSumma = vSumma & String(iPower+1-Len(vSumma), "0")
End If
aNumsy() = Split(vSumma, cDevi)
If UBound (aNumsy()) < 1 then
sBalance = aNumsy(0)
sKop = ""
Else
sBalance = aNumsy(0)
If Len(aNumsy(1)) > 9 then
Goto Er_SUMTEX
end if
sKop = aNumsy(1) & String(9-Len(aNumsy(1)),"0")
End if
If IsMissing (iFrcRate) then
iFrcRate = 2
End if
iKop = Left(sKop,iFrcRate)
end if
If Not (IsMissing (sIntImya)) then
Select Case sIntImya
Case 0
iIntSex = 1
sIntImya = ""
sIntImeni = ""
sIntImen = ""
sEnd = ""
Case 1
iIntSex = 1
sIntImya = " рубль"
sIntImeni = " рубля"
sIntImen = " рублей"
If Int(iKop/10) = 1 Then
sEnd = " " & Format (iKop, String (iFrcRate, "0")) & " копеек"
Else
Select Case (iKop mod 10)
Case 1
sEnd = " " & Format (iKop, String (iFrcRate, "0")) & " копейка"
Case 2
sEnd = " " & Format (iKop, String (iFrcRate, "0")) & " копейки"
Case 3
sEnd = " " & Format (iKop, String (iFrcRate, "0")) & " копейки"
Case 4
sEnd = " " & Format (iKop, String (iFrcRate, "0")) & " копейки"
Case Else
sEnd = " " & Format (iKop, String (iFrcRate, "0")) & " копеек"
End Select
End If
Case 2
iIntSex = 1
sIntImya = " руб."
sIntImeni = " руб."
sIntImen = " руб."
sEnd = " " & Format (iKop, String (iFrcRate, "0")) & " коп."
Case Else
If (Not (IsMissing (sIntImya))) _
And (Not (IsMissing (sIntImeni)))_
And (Not (IsMissing (sIntImen)))_
And (Not (IsMissing (iIntSex)))_
And (IsMissing (sFrcImya))_
And (IsMissing (sFrcImeni))_
And (IsMissing (sFrcImen))_
And (IsMissing (iFrcRate))_
then
If iIntSex < 0 Or iIntSex > 2 Then
SUMTEX = "#INVALIDMALE!"
Exit Function
End if
sIntImya = " " & sIntImya
sIntImeni = " " & sIntImeni
sIntImen = " " & sIntImen
sEnd = ""
Else
If (Not (IsMissing (sIntImya))) _
And (Not (IsMissing (sIntImeni)))_
And (Not (IsMissing (sIntImen)))_
And (Not (IsMissing (iIntSex)))_
And (Not (IsMissing (sFrcImya)))_
And (Not (IsMissing (sFrcImeni)))_
And (Not (IsMissing (sFrcImen)))_
And (Not (IsMissing (iFrcRate)))_
then
If iIntSex < 0 Or iIntSex > 2 Then
SUMTEX = "#INVALIDMALE!"
Exit Function
End if
sIntImya = " " & sIntImya
sIntImeni = " " & sIntImeni
sIntImen = " " & sIntImen
If Int((iKop mod 100)/10) = 1 Then
sEnd = " " & Format (iKop, String (iFrcRate, "0")) & " " & sFrcImen
Else
Select Case (iKop mod 10)
Case 1
sEnd = " " & Format (iKop, String (iFrcRate, "0")) & " " & sFrcImya
Case 2
sEnd = " " & Format (iKop, String (iFrcRate, "0")) & " " & sFrcImeni
Case 3
sEnd = " " & Format (iKop, String (iFrcRate, "0")) & " " & sFrcImeni
Case 4
sEnd = " " & Format (iKop, String (iFrcRate, "0")) & " " & sFrcImeni
Case Else
sEnd = " " & Format (iKop, String (iFrcRate, "0")) & " " & sFrcImen
End Select
End If
Else
SUMTEX = "#INVALIDNA!"
Exit Function
End If
End If
End Select
Else
iIntSex = 1
sIntImya = " руб."
sIntImeni = " руб."
sIntImen = " руб."
sEnd = " " & Format (iKop, String (iFrcRate, "0")) & " коп."
End If
iOrder = 1
iOrder2= ""
Do While sBalance <> "" or dBalance <> 0
If VarType(vSumma) <> 8 then
iRemainder = dBalance - Int(dBalance/1000)*1000
dBalance = Int (dBalance / 1000)
Else
iRemainder =  Right(sBalance, 3)
If Len(sBalance) > 2 then
sBalance = Left(sBalance,Len(sBalance)-3)
Else
sBalance = ""
End If
If iRemainder = 0 then
If iOrder = 1 Then
sOrderName = sIntImen
End If
Goto Lp_SUMTEX
End If
End If
iUnits = iRemainder Mod 10
iTens = (Int (iRemainder / 10) Mod 10)
iHundreds = Int(iRemainder/100)
If iTens = 1 Then
iUnits = iUnits + 10
iTens = 0
End if
Select Case iUnits
Case 1
If iOrder = 2 then
sUnits = "одна"
Else
If iOrder = 1 then
Select Case iIntSex
Case 0
sUnits = "одна"
Case 1
sUnits = "один"
Case 2
sUnits = "одно"
End Select
Else
sUnits = "один"
End If
End If
Case 2
If iOrder = 2 then
sUnits = "две"
Else
If iOrder = 1 then
If iIntSex = 0 Then
sUnits = "две"
Else
sUnits = "два"
End If
Else
sUnits = "два"
End If
End If
Case 3
sUnits = "три"
Case 4
sUnits = "четыре"
Case 5
sUnits = "пять"
Case 6
sUnits = "шесть"
Case 7
sUnits = "семь"
Case 8
sUnits = "восемь"
Case 9
sUnits = "девять"
Case 10
sUnits = "десять"
Case 11
sUnits = "одиннадцать"
Case 12
sUnits = "двенадцать"
Case 13
sUnits = "тринадцать"
Case 14
sUnits = "четырнадцать"
Case 15
sUnits = "пятнадцать"
Case 16
sUnits = "шестнадцать"
Case 17
sUnits = "семнадцать"
Case 18
sUnits = "восемнадцать"
Case 19
sUnits = "девятнадцать"
End Select
Select Case iTens
Case 2
sTens = "двадцать"
Case 3
sTens = "тридцать"
Case 4
sTens = "сорок"
Case 5
sTens = "пятьдесят"
Case 6
sTens = "шестьдесят"
Case 7
sTens = "семьдесят"
Case 8
sTens = "восемьдесят"
Case 9
sTens = "девяносто"
End Select
Select Case iHundreds
Case 1
sHundreds = "сто"
Case 2
sHundreds = "двести"
Case 3
sHundreds = "триста"
Case 4
sHundreds = "четыреста"
Case 5
sHundreds = "пятьсот"
Case 6
sHundreds = "шестьсот"
Case 7
sHundreds = "семьсот"
Case 8
sHundreds = "восемьсот"
Case 9
sHundreds = "девятьсот"
End Select
sMomentResult = sHundreds & " " & sTens & " " & sUnits
If sMomentResult = "  " and iOrder > 1 then
sMomentResult = ""
Else
Select Case iOrder
Case 1
sOrderName = sIntImen
If iUnits = 1 then
sOrderName = sIntImya
Else
if iUnits > 1 And iUnits < 5 then
sOrderName = sIntImeni
End If
End If
Case 2
sOrderName = " тысяч"
If iUnits = 1 then
sOrderName = " тысяча"
Else
if iUnits > 1 And iUnits < 5 then
sOrderName = " тысячи"
End If
End If
Case 3
sOrderName = " миллионов"
If iUnits = 1 then
sOrderName = " миллион"
Else
if iUnits > 1 And iUnits < 5 then
sOrderName = " миллиона"
End If
End If
Case 4
sOrderName = " миллиардов"
If iUnits = 1 then
sOrderName = " миллиард"
Else
if iUnits > 1 And iUnits < 5 then
sOrderName = " миллиарда"
End If
End If
Case 5
sOrderName = " триллионов"
If iUnits = 1 then
sOrderName = " триллион"
Else
if iUnits > 1 And iUnits < 5 then
sOrderName = " триллиона"
End If
End If
Case 6
sOrderName = " квадриллионов"
If iUnits = 1 then
sOrderName = " квадриллион"
Else
if iUnits > 1 And iUnits < 5 then
sOrderName = " квадриллиона"
End If
End If
Case 7
sOrderName = " квинтиллионов"
If iUnits = 1 then
sOrderName = " квинтиллион"
Else
if iUnits > 1 And iUnits < 5 then
sOrderName = " квинтиллиона"
End If
End If
Case 8
sOrderName = " секстиллионов"
If iUnits = 1 then
sOrderName = " секстиллион"
Else
if iUnits > 1 And iUnits < 5 then
sOrderName = " секстиллиона"
End If
End If
Case 9
sOrderName = " септиллионов"
If iUnits = 1 then
sOrderName = " септиллион"
Else
if iUnits > 1 And iUnits < 5 then
sOrderName = " септиллиона"
End If
End If
Case 10
sOrderName = " октиллионов"
If iUnits = 1 then
sOrderName = " октиллион"
Else
if iUnits > 1 And iUnits < 5 then
sOrderName = " октиллиона"
End If
End If
Case 11
sOrderName = " нониллионов"
If iUnits = 1 then
sOrderName = " нониллион"
Else
if iUnits > 1 And iUnits < 5 then
sOrderName = " нониллиона"
End If
End If
Case 12
sOrderName = " дециллионов"
If iUnits = 1 then
sOrderName = " дециллион"
Else
if iUnits > 1 And iUnits < 5 then
sOrderName = " дециллиона"
End If
End If
Case 13
Goto Er_SUMTEX
End Select
sOrderName=sOrderName+iOrder2
End If
Lp_SUMTEX:
sMomentResult = sMomentResult & sOrderName
sOrderName = ""
sResult = sMomentResult & " " & sResult
sMomentResult = ""
sHundreds = ""
sTens = ""
sUnits = ""
If iOrder = 12 then ' :)
iOrder = 2
iOrder2 = iOrder2+" дециллионов"
Else
iOrder = iOrder + 1
End If
Loop
sResult = sResult & sEnd
Do While InStr(sResult, "  ")<>0
Mid(sResult,InStr(sResult, "  "),2," ")
Loop
SUMTEX = Trim(sResult)
Exit Function
Er_SUMTEX:
SUMTEX = "#UE!"
End Function

economist

#4
Irina18 - в OpenOffice|LibreOffice есть прекрасный механизм Полей пользователя (см. скрин)

Ctrl+F2 - Переменные - ПоляПользователя

Вставив поле Сторона1 - ООО "Ромашка" вы можете скопировать его в любое место документа много раз.
Двойной щелчок по нему (по любому экземрпляру этого поля в любом месте)  - откроет похожее окно и там можно задать новое значение - скажем, ООО "Березка". И березки заколосятся сразу во всем документе!

Но OpenOffice|LibreOffice гораздо сильнее. Вот как у меня делаются договоры. Из 1С, системы контроля доступа, ЕГРЮЛ - ежеутренне и по требованию - выгружаются многое, в т.ч. списки контрагентов со всеми реквизитами в TXT-файл, включая доверенности рук-лей, задолженность итп.

Данные эти "отражаются" в СУБД SQLite, к которой подключены 30 файлов баз данных OpenOffice|LibreOffice BASE (свободный аналог Access). Пользователь (один из 30-ти) открывает шаблон договора, жмет F4 (Ctrl+Shift+F4), выделяет нужную строку и жмет ОДНУ кнопку - Договор заполнен! Причем не просто договор, а со спецификациями, информацией об объемах сделок за прошлый год, актом сверки, письмом-благодарностью итп. 30 секунд на результат. Эта технология настолько изменила работу предприятия, что экономэффект давно перерос "10 млн. руб."-ную отметку.

Шаблон является "самоконструирующимся" - то есть в нем автоматически появляются/исчезают абзацы/таблицы в зависимости от содержимого базы данных и "слов" в тексте, меняется текст, появляются приложения итд. Например, хроническим должникам/"обещалкиным" - выйдет условие о 100% предоплате, а порядочным - с рассрочкой. И думать об этом не надо - бизнес-логика реализована в Шаблоне.

Шаблон договора я сделал настолько универсальным, насколько это вообще физически возможно (купли-продажи, поставки, мены, аренды, займа, уступки - в одном файле), хотя если у вас будут помощники - можно сделать в нескольких файлах, так будет проще.

Это же самое можно сделать и в MS Word, но работа со стилями документа в нем отвратительна, а макросы ненамного проще. Кстати, они для договоров не нужны. Единственное для чего я их использую - "аудиторский след", т.е. фиксацию факта что кто-то формировал договор с "Ромашкой".
 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Irina18

Спасибо за ответ и рекомендации. Про Ctrl+F2 - Переменные - ПоляПользователя, я пару дней назад нашла эту информацию (приложенный файл), но это дублирование 1:1, а надо к примеру в одном поле Иванов Иван Иванович в других нескольких Иванов И.И. и в следующих опять Иванов Иван Иванович. И с суммой прописью тоже надо в одном месте вводишь, а нескольких местах отображается. По поводу СУБД SQLite. ИП, где я начала работать, только начал свою деятельность в наверное не захочет с этим связываться. Придется мне по старинке работать с обычными простыми шаблонами. Еще раз спасибо за участие.

economist

#6
Перфекционизм детектед!

Нужно всего 3 поля (три штуки), размноженные сотнями где надо, ведь надо править только в 3-х любых местах - обновится в трехстах:
- Иванов Иван Иванович
- Иванов И.И.
- (четырнадцать миллионов)

Я, например, тоже перфекционист и сын писателя, и вставляю еще и поле в род падеже - Иванову Ивану Ивановичу, мой макрос неплохо умеет сам склонять. Но одно региональное подразделение Газпрома не захотело мне платить 100 тыс. руб. за спрягалку, и они задушили свой перфекционизм. В письмах они пишут "Абоненту: Иванов Иван Иванович", и не парятся. Берите пример с этого жмотья, и будьте проще! Русский язык великолепен - всегда можно перестроить фразу под именительный/винительный падеж. Или забить.

Кстати, если вас пугает слова "база даных, SQLite итп" - это ерунда, и вовсе неоябзательно. Вести "базу данных" Контрагентов лучше в 1С (так делают 99%), экспортировать её оттуда по утрам (весь справочник) в Excel/Calc-формат (дел на 30 сек), а уже его использовать в OpenOffice|LibreOffice как "базу данных". Недостаток этой схемы - тяжело ворочается, если больше 5 тыс строк в списке. Т.к. у меня 40+ тыс. и миллиарды - то SQLite. Вам, наверное, хватит цепочки 1С-XLS/ODS-ODB-Writer. Если нужно - могу пояснить пошагово, хотя на Форуме это писалось не раз, в т.ч. и мною.

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Irina18

В молодости, а мне еще совсем не много лет, я думаю, все нормальные люди стремятся к совершенству, правда не всегда получается. А по поводу этого
ЦитироватьБерите пример с этого жмотья, и будьте проще!
, так это не ко мне, а к руководителю, я простой нанятый сотрудник. Рабочий день начался, пойду работать.

maksvlad

Цитата: Irina18 от 31 августа 2017, 20:17
Вот такой код функции в Calc
расширение SUMTEX
https://extensions.openoffice.org/project/sumtex
использую вот такую связку:
=CONCATENATE($BY299;" руб.(";SUMTEX($BY299;1);")")
результат:
3022,09 руб.(Три тысячи двадцать два рубля 09 копеек)

rami

Цитата: maksvlad от  3 сентября 2017, 06:06использую вот такую связку:
=CONCATENATE($BY299;" руб.(";SUMTEX($BY299;1);")")
результат:
3022,09 руб.(Три тысячи двадцать два рубля 09 копеек)
Это для Calc, а для указанной задачи не подойдёт.

maksvlad

Цитата: rami от  3 сентября 2017, 09:31
Это для Calc, а для указанной задачи не подойдёт.
Честно говоря, предлагал расширение вместо портянки функции для Calc.
А по теме. Использую поля в документе и таблицу Calc через odb как источник записей.
Вычисления полей производится в Calc. В том числе и при помощи названного расширения и супер-функции vlookup

Irina18

Не ожидала, что в этом Writer, так все проблематично. :o

mikekaganski

Позвольте.

Некто сделал для Вас программу в Word (прикреплённый Вами к первому сообщению документ нашпигован макросами), и Вы работали, не задумываясь. Теперь пришло время сделать нечто похожее (не обязательно макросы, но некую подготовительную работу, требующую умений) в новой программе. Но поскольку Вы не делаете это сами, то обратились к сообществу. Здесь Вам, вместо того, чтобы сделать всю работу, дают советы, рассчитанные на то, что Вы самостоятельно разберётесь и обойдётесь без "одного доброго человека". Вы же в ответ поражаетесь, что "так всё проблематично". Где логика?
С уважением,
Михаил Каганский

kompilainenn

Цитата: mikekaganski от  4 сентября 2017, 17:23Здесь Вам, вместо того, чтобы сделать всю работу, дают советы, рассчитанные на то, что Вы самостоятельно разберётесь и обойдётесь без "одного доброго человека". Вы же в ответ поражаетесь, что "так всё проблематично". Где логика?
Логика есть. Кто-то решит со скуки реализовать что-то подобное для Writer и ТС воспользуется результатом...
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

economist

#14
Дык в том-то и дело, что требуемое ТС уже есть "искаропки". Но программа Writer - новая и сложная, и в ней нельзя сходу (как и в Word) "просто работать", нужно усвоить базовые принципы: стили, поля, связь с источниками данных, циркулярные рассылки. Мне чтобы объяснить новичку - приходится тратить день. Зато потом - договор за 20 секунд, 50 договоров - 10 минут. И я полностью уверен, когда говорю что Writer удобнее, быстрее, умнее и дешевле чем Microsoft Word, в котором я набрал ручками за 22 года >10000 страниц.

Irina18 - вас трудности не должны смущать, все проблемы - решаемы.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...