Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: VBA MS Office

Программирования для MS Office кроме ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: сумма прописью в Word'е
 
 автор: jaw   (22.02.2008 в 06:58)   личное сообщение
 
 

В Ворд из акцесса слиянием добавляется сумма (32,25). Надо, чтоб она писалась прописью (тридцать два руб. 25 коп.). Имеется код на VB выполняющий эту операцию. Если его вставить в Акцесс, то в нем он работает, но тогда слияние с этим запросом невозможно. (этот вариант отпадает). Надо сделать как-то это дело в Ворде. Для каждого листа выполнять макрос напряжно. (Это всё, что я нашел в инете) Хотелось бы что-нибудь типа {MERGEFIELD "Сумма" \* DollarText}. Только чтоб был не DollarText, а свой обработчик.
Очень надеюсь на вашу помощь!!!

  Ответить  
 
 автор: час   (23.02.2008 в 21:42)   личное сообщение
 
 

А импортировать уже готовую строку - пропись - не реально?

  Ответить  
 
 автор: jaw   (26.02.2008 в 04:24)   личное сообщение
 
 

Нереально. Я выше писал, что этот запрос становится недоступным для слияния.
Можно исп. другой драйвер (или как это называется), но тогда скорость поиска становится невыносимо низкой. Поэтому нехотелось бы использовать этот извращенный метод.

  Ответить  
 
 автор: osmor   (26.02.2008 в 09:33)   личное сообщение
38 Кб.
 
 

Самый простой вариант, создать шаблон с функцией "строкаПрописью" в модуле книги
Данные писать в этот шаблон
в ячейки где ужно вствлять вызов это функции.
Можно программно создавать функцию в новом листе, но это сложнее.

  Ответить  
 
 автор: jaw   (26.02.2008 в 12:18)   личное сообщение
 
 

Прошу прощения, но я работаю с Вордом. В целом идею понял, но уточните, как это все будет работать не в Excel'e. Вот с Microsoft.com скачал я исходник, создал с ним макрос. Но вот как его сделать чтоб, он работал как "код поля". А не чтоб каждый раз щелкать макрос-выполнить. Очень рпошу не бросайте - откликнитесь!

  Ответить  
 
 автор: osmor   (26.02.2008 в 12:49)   личное сообщение
 
 

но я работаю с Вордом
Прошу прощения.... не внимателен был. Посмотрю.

  Ответить  
 
 автор: osmor   (27.02.2008 в 08:52)   личное сообщение
 
 

C вордом как с экселем - не получилось. Пытался поля использовать - что-то не понимает он пользовательских функций. а какой исходник Вы с Microsoft.com скачали? можно его посмотреть?

  Ответить  
 
 автор: jaw   (27.02.2008 в 10:19)   личное сообщение
 
 

уф... Я уж думал вы про меня забыли..)
Вот исходник (он составной, не весь с Microsoft.com)

Public Function funSupr(xsu As Variant, Optional mb As Byte) As String
On Error GoTo ersupr
If Not IsNumeric(xsu) Then
funSupr = ""
Exit Function
End If
If xsu >= 10000000000000# Then
funSupr = "слишком большое число"
Exit Function
End If
Dim ssu As String, nsu, edi, des, sot, ind As Byte, i As Integer
If Fix(xsu) = 0 Then
'funSupr = "ноль рублей "
funSupr = "ноль руб. "
Else
ssu = Mid$(Str$(Fix(xsu)), 2) ' строка рублей без знака
nsu = (Len(ssu) + 2) \ 3 ' количество троек цифр
ssu = Right$("00", nsu * 3 - Len(ssu)) + ssu ' добавляем нулями
For i = nsu To 1 Step -1
sot = Val(Mid$(ssu, (nsu - i) * 3 + 1, 1)) ' сотни
des = Val(Mid$(ssu, (nsu - i) * 3 + 2, 1)) ' десятки
edi = Val(Mid$(ssu, (nsu - i) * 3 + 3, 1)) ' единицы
If sot + des + edi > 0 Or i = 1 Then
If sot > 0 Then
funSupr = funSupr + Choose(sot, "сто", "двести", "триста", _
"четыреста", "пятьсот", "шестьсот", "семьсот", "восемьсот", _
"девятьсот") + " "
End If
If des = 1 Then
funSupr = funSupr + Choose(edi + 1, "десять", "одиннадцать", _
"двенадцать", "тринадцать", "четырнадцать", "пятнадцать", "шестнадцать", _
"семнадцать", "восемнадцать", "девятнадцать") + " "
ind = 3
Else
If des <> 0 Then
funSupr = funSupr + Choose(des - 1, "двадцать", _
"тридцать", "сорок", "пятьдесят", "шестьдесят", "семьдесят", "восемьдесят", _
"девяносто") + " "
End If
If edi <> 0 Then ' вычисляем индекс для тысяч (одна,две)
If i = 2 And (edi = 1 Or edi = 2) Then
ind = 9
Else
ind = 0
End If
funSupr = funSupr + Choose(edi + ind, "один", "два", _
"три", "четыре", "пять", "шесть", "семь", "восемь", "девять", "одна", _
"две") + " "
End If
Select Case edi
Case 1
ind = 1
Case 2, 3, 4
ind = 2
Case Else
ind = 3
End Select
End If
'funSupr = funSupr + Choose((i - 1) * 3 + ind, "рубль", "рубля", "рублей",'_

funSupr = funSupr + Choose((i - 1) * 3 + ind, "руб.", "руб.", "руб.", _
"тысяча", "тысячи", "тысяч", "миллион", "миллиона", "миллионов", _
"миллиард", "миллиарда", "миллиардов", "триллион", "триллиона", _
"триллионов") + " "
End If
Next i
End If
ssu = Right$(Format$(xsu, "0.00"), 2)
des = Val(Left$(ssu, 1))
edi = Val(Right$(ssu, 1))
If des = 1 Then
ind = 3
Else
Select Case edi
Case 1
ind = 1
Case 2, 3, 4
ind = 2
Case Else
ind = 3
End Select
End If
'funSupr = funSupr + ssu + Choose(ind, " копейка", " копейки", " копеек")
funSupr = funSupr + ssu + Choose(ind, " коп.", " коп.", " коп.")
If mb = 0 Then
funSupr = UCase$(Left$(funSupr, 1)) + Mid$(funSupr, 2)
End If
Exit Function
ersupr:
funSupr = "ошибка"
End Function


Sub ЧислоПрописью2()
Dim Summa$
Summa$ = funSupr(Selection.Text, 1)
If Summa$ <> "" Then ' допустимое значение
Selection.Text = Selection.Text + " (" + Summa$ + ") "
End If
End Sub

  Ответить  
 
 автор: osmor   (27.02.2008 в 10:26)   личное сообщение
 
 

а-а-а, я то думал там пример какой, как в ворде такое сделать...
Нет не забыл, просто ворда нет не работе

  Ответить  
 
 автор: jaw   (27.02.2008 в 10:49)   личное сообщение
 
 

Ну этот код и в ворде работает. Создаешь макрос с этим кодом. Выделяешь курсором цифры которые надо преобразовать. Затем макрос->выполнить. Только вот слишком это неудобно. А во вторых, он заменяет поле слияния с цифрой на "просто цифру".

  Ответить  
 
 автор: osmor   (27.02.2008 в 10:59)   личное сообщение
 
 

Вопрос как это еще и со "слиянием" скрестить... В общем еще вечером посмотрю

  Ответить  
 
 автор: jaw   (27.02.2008 в 12:45)   личное сообщение
 
 

ВСЁ!!! тема закрыта.
Написал в самом Ворде код:

{SET summa {MERGEFIELD "сумма"}}

{SET S {Ref summa}}
{SET zel {=INT(S}}
{SET dr {=({s}- {zel}) * 100} }
{QUOTE {zel \*CARDTEXT} " руб."}{QUOTE {dr} " коп."}

И всего делов то... Мож кому надо будет.
А за помощь и моральную поддержку всем огромное спасибо, особенно Osmor'у

  Ответить  
 
 автор: osmor   (27.02.2008 в 12:59)   личное сообщение
 
 

Да мне собственно за что ж... если только за моральную :-)
вот большой пробел в знаниях связан именно со слиянием... дальше "мастера слияния" не пошел :-)

  Ответить  
 
 автор: jaw   (27.02.2008 в 12:47)   личное сообщение
 
 

Хотя до сих пор интересно, можно ли писать свои коды полей, команды...

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList