Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - Помогите с задачей на VBA в MS Access

Ответить
Настройки темы
VBA - Помогите с задачей на VBA в MS Access

Новый участник


Сообщения: 46
Благодарности: 0

Профиль | Отправить PM | Цитировать


Здравствуйте, помогите пожалуйста переделать модуль на VBA, который используется для перевода числа в число прописью. Проблема заключается в том, что нужно в отчете Access подсчитать количество строк, а затем в следующем поле вывести это значение прописью. Раньше выводилась в отчете общая сумма в таком формате "суммапрописью(Module) рублей 00 коп." Вот отчет в Конструкторе отчетов




Вот код старого Module

Option Compare Database 'Использовать функции базы данных при сравнении строк
'Option Explicit ' Требует явного описания переменных перед их использованием.

Global Сумма As Currency, Остаток As Currency

Function Десятки(Разряд As Long) As String

Select Case Разряд
Case 2
Десятки = "двадцать "
Case 3
Десятки = "тридцать "
Case 4
Десятки = "сорок "
Case 5
Десятки = "пятьдесят "
Case 6
Десятки = "шестьдесят "
Case 7
Десятки = "семьдесят "
Case 8
Десятки = "восемьдесят "
Case 9
Десятки = "девяносто "
End Select

End Function

Function Единицы(Разряд As Long, Род As String) As String

Select Case Разряд
Case 1
If Род = "Мужской" Then
Единицы = "один "
Else
Единицы = "одна "
End If
Case 2
If Род = "Мужской" Then
Единицы = "два "
Else
Единицы = "две "
End If
Case 3
Единицы = "три "
Case 4
Единицы = "четыре "
Case 5
Единицы = "пять "
Case 6
Единицы = "шесть "
Case 7
Единицы = "семь "
Case 8
Единицы = "восемь "
Case 9
Единицы = "девять "
Case 10
Единицы = "десять "
Case 11
Единицы = "одиннадцать "
Case 12
Единицы = "двенадцать "
Case 13
Единицы = "тринадцать "
Case 14
Единицы = "четырнадцать "
Case 15
Единицы = "пятнадцать "
Case 16
Единицы = "шестнадцать "
Case 17
Единицы = "семнадцать "
Case 18
Единицы = "восемнадцать "
Case 19
Единицы = "девятнадцать "

End Select

End Function

Function Миллионы(Разряд As Long) As String

If Разряд = 1 Then
Миллионы = "миллион "
ElseIf Разряд > 1 And Разряд < 5 Then
Миллионы = "миллиона "
Else
Миллионы = "миллионов "
End If

End Function

Function Рубли(ДесяткиРублей As Long) As String
Select Case ДесяткиРублей
Case 0, 5 To 20
Рубли = "рублей"
Case Else
Select Case (ДесяткиРублей - Int(ДесяткиРублей / 10) * 10)
Case 0, 5 To 9
Рубли = "рублей"
Case 1
Рубли = "рубль"
Case 2 To 4
Рубли = "рубля"
End Select
End Select
End Function

Function Сотни(Разряд As Long) As String

Select Case Разряд
Case 1
Сотни = "сто "
Case 2
Сотни = "двести "
Case 3
Сотни = "триста "
Case 4
Сотни = "четыреста "
Case 5
Сотни = "пятьсот "
Case 6
Сотни = "шестьсот "
Case 7
Сотни = "семьсот "
Case 8
Сотни = "восемьсот "
Case 9
Сотни = "девятьсот "
End Select

End Function
Function СУММАПРОПИСЬЮ(СуммаСчета As Currency) As String

Dim Группа As Double, Разряд As Long, Длина As Long
Dim Пропись As String, Копейки As Integer, ДесяткиРублей As Long

If IsNull(СуммаСчета) Or IsEmpty(СуммаСчета) Or СуммаСчета = 0 Then
СУММАПРОПИСЬЮ = "Ноль рублей 00 коп."
Exit Function
End If
Сумма = Int(СуммаСчета)
Копейки = СуммаСчета * 100 - Int(СуммаСчета) * 100
ДесяткиРублей = 0

Rem Milions

Группа = СуммаСчета / 1000000
If Группа >= 1 Then
If Группа >= 100 Then
Разряд = Группа / 100
If Разряд > Группа / 100 Then Разряд = Разряд - 1
Пропись = Пропись & Сотни(Разряд)
Группа = Группа - Разряд * 100
End If
If Группа > 19 Then
Разряд = Группа / 10
If Разряд > Группа / 10 Then Разряд = Разряд - 1
Пропись = Пропись & Десятки(Разряд)
Группа = Группа - Разряд * 10
End If

Разряд = Группа
If Разряд > Группа Then Разряд = Разряд - 1
Пропись = Пропись & Единицы(Разряд, "Мужской")

Пропись = Пропись & Миллионы(Разряд)
End If

Rem Тыщи

Группа = СуммаСчета / 1000 - Int(СуммаСчета / 1000000) * 1000
If Группа >= 1 Then
If Группа >= 100 Then
Разряд = Группа / 100
If Разряд > Группа / 100 Then Разряд = Разряд - 1
Пропись = Пропись & Сотни(Разряд)
Группа = Группа - Разряд * 100
End If
If Группа > 19 Then
Разряд = Группа / 10
If Разряд > Группа / 10 Then Разряд = Разряд - 1
Пропись = Пропись & Десятки(Разряд)
Группа = Группа - Разряд * 10
End If

Разряд = Группа
If Разряд > Группа Then Разряд = Разряд - 1
Пропись = Пропись & Единицы(Разряд, "Женский")

Пропись = Пропись & Тысячи(Разряд)
End If

Rem десятки

Группа = СуммаСчета - Int(СуммаСчета / 1000) * 1000
If Группа >= 1 Then
If Группа >= 100 Then
Разряд = Группа / 100
If Разряд > Группа / 100 Then Разряд = Разряд - 1
Пропись = Пропись & Сотни(Разряд)
Группа = Группа - Разряд * 100
End If

If Группа > 19 Then
Разряд = Группа / 10
If Разряд > Группа / 10 Then Разряд = Разряд - 1
ДесяткиРублей = Остаток
Пропись = Пропись & Десятки(Разряд)
Группа = Группа - Разряд * 10
End If

Разряд = Группа
If Разряд > Группа Then Разряд = Разряд - 1
Пропись = Пропись & Единицы(Разряд, "Мужской")
End If

Длина = Len(Пропись)

Пропись = Пропись & Рубли(ДесяткиРублей)
Длина = Len(Пропись)
Пропись = UCase(Mid(Пропись, 1, 1)) & (Mid(Пропись, 2, Длина))

СУММАПРОПИСЬЮ = Пропись & IIf(Копейки < 10, " 0", " ") & Копейки & " коп."

End Function

Function Тысячи(Разряд As Long) As String

If Разряд = 1 Then
Тысячи = "тысяча "
ElseIf Разряд > 1 And Разряд < 5 Then
Тысячи = "тысячи "
Else
Тысячи = "тысяч "
End If

End Function




А теперь нужно "рублей 00 коп." убрать из кода и соответственно из отчета, чтобы выводилать не сумма в рублях, а только количество строк (записай) из таблицы прописью. Попытки найти готовый код в интернете привели в такому коду.


Option Compare Database

Function SUMMPROP(n As Double) As String

Dim Nums1, Nums2, Nums3, Nums4 As Variant

Nums1 = Array("", "один ", "два ", "три ", "четыре ", "пять ", "шесть ", "семь ", "восемь ", "девять ")
Nums2 = Array("", "десять ", "двадцать ", "тридцать ", "сорок ", "пятьдесят ", "шестьдесят ", "семьдесят ", _
"восемьдесят ", "девяносто ")
Nums3 = Array("", "сто ", "двести ", "триста ", "четыреста ", "пятьсот ", "шестьсот ", "семьсот ", _
"восемьсот ", "девятьсот ")
Nums4 = Array("", "одна ", "две ", "три ", "четыре ", "пять ", "шесть ", "семь ", "восемь ", "девять ")
Nums5 = Array("десять ", "одиннадцать ", "двенадцать ", "тринадцать ", "четырнадцать ", _
"пятнадцать ", "шестнадцать ", "семнадцать ", "восемнадцать ", "девятнадцать ")

If n <= 0 Then
PropisRus = "ноль"
Exit Function
End If
'разделяем число на разряды, используя вспомогательную функцию Class
ed = Class(n, 1)
dec = Class(n, 2)
sot = Class(n, 3)
tys = Class(n, 4)
dectys = Class(n, 5)
sottys = Class(n, 6)
mil = Class(n, 7)
decmil = Class(n, 8)

'проверяем миллионы
Select Case decmil
Case 1
mil_txt = Nums5(mil) & "миллионов "
GoTo www
Case 2 To 9
decmil_txt = Nums2(decmil)
End Select
Select Case mil
Case 1
mil_txt = Nums1(mil) & "миллион "
Case 2, 3, 4
mil_txt = Nums1(mil) & "миллиона "
Case 5 To 20
mil_txt = Nums1(mil) & "миллионов "
End Select
www:
sottys_txt = Nums3(sottys)
'проверяем тысячи
Select Case dectys
Case 1
tys_txt = Nums5(tys) & "тысяч "
GoTo eee
Case 2 To 9
dectys_txt = Nums2(dectys)
End Select
Select Case tys
Case 0
If dectys > 0 Then tys_txt = Nums4(tys) & "тысяч "
Case 1
tys_txt = Nums4(tys) & "тысячa "
Case 2, 3, 4
tys_txt = Nums4(tys) & "тысячи "
Case 5 To 9
tys_txt = Nums4(tys) & "тысяч "
End Select
If dectys = 0 And tys = 0 And sottys <> 0 Then sottys_txt = sottys_txt & " тысяч "
eee:
sot_txt = Nums3(sot)
'проверяем десятки
Select Case dec
Case 1
ed_txt = Nums5(ed)
GoTo rrr
Case 2 To 9
dec_txt = Nums2(dec)
End Select

ed_txt = Nums1(ed)
rrr:
'формируем итоговую строку
SUMMPROP = decmil_txt & mil_txt & sottys_txt & dectys_txt & tys_txt & sot_txt & dec_txt & ed_txt
End Function

'вспомогательная функция для выделения из числа разрядов
Private Function Class(M, I)
Class = Int(Int(M - (10 ^ I) * Int(M / (10 ^ I))) / 10 ^ (I - 1))
End Function

Пытаюсь сделать все по аналогии, создал резервную копию БД, из старого отчета все перенес в новое, незначительно изменив форму, изменил код модуля на новый. После чего пытаюсь вставить его в форму





Проверял его в качестве Module на Excel, всё отлично работает, указываешь адрес числовой ячейки, например E1, в текущей ячейке вставляешь функцию SUMMPROP из модуля с указанием на ячеёку E1 и вуаля, все цифры отображаются прописью. НО!

В Access при предварительном просмотре отчета выходит окно и требует ввести значение параметра для данного модуля SUMMPROP...В общем все изложил в скринах.




Результат



Уважаемые программисты, для кого это плёвое дело, дайте решение сей проблемы...

Отправлено: 09:24, 28-09-2011

 


Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - Помогите с задачей на VBA в MS Access

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBA - [решено] Помогите с задачей на VBA harleysoft Программирование и базы данных 2 09-12-2010 14:48
VBA - Access и VBA Scorpion666 Программирование и базы данных 6 01-04-2007 00:18
VBA - Access VBA Guest Программирование и базы данных 2 03-10-2004 21:31
VBA - VBA в MS Access Tanya Программирование и базы данных 2 30-03-2004 14:20
VBA - VBA for Access Stepan Программирование и базы данных 1 10-11-2003 19:19




 
Переход