Доброго времени суток, Посетитель!
|
|
|
|
|
|
|
|
|
вид форума:
|
|
|
|
| xl.cells(row, 11).Value = Val((Nz(!Pay_Summa)))
xl.Range(xl.cells(row, 11), xl.cells(row, 11)).SELECT
xl.ActiveCell.NumberFormat = "#,##0.00"
рубли выводятся, а копейки - 00
19,43 = 19,00р. | |
|
| |
|
|
|
| Так у вас значение в ячейке 19,43, а видите 19,00? Или в ячейке уже 19,00?
Думаю - второе. И проблема из-зи десятичного разделителя ",". Функция VAL понимает только ".".
Попробуйте вместо Val((Nz(!Pay_Summa))):
CDbl(Nz(!Pay_Summa,0))
или
IIF(IsNumeric(!Pay_Summa), !Pay_Summa, 0)
PS. А зачем такая конструкция?:
xl.Range(xl.cells(row, 11), xl.cells(row, 11)).SELECT
xl.ActiveCell.NumberFormat = "#,##0.00"
Может так проще?
xl.cells(row, 11).NumberFormat = "#,##0.00" | |
|
| |
|
|
|
| Спасибо!!!!
Помогла Ваша функция CCur(Format([СуммаБезНалогов];"0,00"))
===============================================
PS. А зачем такая конструкция?:
эт я заморочился - сначала кидаю данные, затем выделяю ячейку и задаю ей формат
xl.cells(row, 11).Value = CCur(Format(Nz(!Pay_Summa), "0.00")) | |
|
| |
|
|
|
| CCur(Format(Nz(!Pay_Summa), "0.00"))
И зачем здесь Format?
Когда это я такое предлагал? Хочу видеть... | |
|
| |
|
|
|
| Вопрос: Маленькие секреты от Кривцова Анатолия
Совет:
Удобные комбинации клавиш:
Ctrl + '(апостроф) - вносится значение элемента из предыдущей записи
Ctrl + Alt + Пробел - вносится значение по умолчанию
Ctrl + ; - вносится текущая дата
Чтобы прочитать значение из несвязанного столбца ListBox или ComboBox используйте ссылку:
Me![Имя].Column(1) - второй столбец выбранной строки
Me![Имя].Column(1,0) - второй столбец первой строки в списке.
Ссылка =Form![Имя].Column(2) может быть использована в DataSource вычисляемого элемента для отображения значения третьего столбца выбранной строки.
Следует напомнить, что все возвращаемые значения - текстовые.
Если в запросе источника строк ListBox или ComboBox есть ссылки на элементы той же формы, то их лучше указывать в виде:
Form![Имя элемента]
Можно смело менять название формы или копировать в подобную форму.
Программное сохранение текущей записи в форме.Самый простой способ - применить метод Refresh, но если базовый запрос имеет поля на базе функций по подмножеству, да еще содержит большое количество записей,
процесс обновления может длиться до неприятного долго.К тому-же обновление данных мультиформы приводит к
перезапросу связанных подформ, а это, даже если и проис ходит быстро, приводит к переходу в первую запись.
Более быстрый способ - применить инструкцию
RunCommand acCmdSaveRecord '(выполнение команды меню)
Примечание:
Прочилал в умной книжке, что если запись не редактировалась - будет ошибка выполнения, и надо предварительно проверять свойство Dirty формы.
Попробовал - молчит.
* Рекомендую всем, кто этого еще не сделал, установить "СервисРелиз 2" (файл Dataacc.exe). Устраняются по меньшей мере следующие дефекты:
Если источником строк связанной подформы является запрос на основе нескольких таблиц, связанных "многие к одному" по цепочке и из промежуточных таблиц не выбираются поля, то набор записей - необновляемый, хотя сам запрос - обновляемый. Только не попадите в засаду, когда ваша вылизанная форма перестанет работать на другом компьютере без SR2.
При работе в многопользовательской среде может возникнуть ситуация, когда при попытке открыть базу выдается сообщение типа "База открыта другим пользователем в монопольном режиме". Обычно причиной этого является наличие файла с тем-же именем и расширением LDB,
который должен удаляться автоматически, но в данном случае этого нет, а базу открыть невозможно.
* Для автоматического добавления значения года при вводе даты в TextBox на форме предлагаю функцию:
Function AutoYearForInputDate() As Boolean
Dim ctl As Control, strText As String, _
strCurYear As String
On Error GoTo AutoYearForInputDate_err
strCurYear = Year(Date)
Set ctl = Screen.ActiveControl
strText = ctl.Text & ""
If strText Like "##.##.__" Then
strText = Left(strText, 6) & Right(strCurYear, 2)
ctl.Text = strText
AutoYearForInputDate = True
End If
AutoYearForInputDate_exit:
Exit Function
AutoYearForInputDate_err:
Resume AutoYearForInputDate_exit
End Function
TextBox должен иметь маску ввода ShortDate.Чтобы функция работала, необходимо по событию OnError
формы вставить код наподобие:
If DataErr = 2279 then
Response = acDataErrContinue
If AutoYearForInputDate Then
Exit Sub
End If
MsgBox "Введено некорректное значение! "
End If
Более правильным решением является создание универсальной функции обработки ошибок, на которую установить ссылки по событию OnError во всех формах, а при желании и из обработчиков ошибок в процедурах.
* Для работы с денежными единицами, где число знаков после запятой не больше 2 предлагаю функцию округления:
Public Function Round_2(anyValue As Variant) As Currency
' Аргументы: Значение типа Variant
' Назначение: Округляет значение до 2 зн. после запятой
' по правилам бухгалтерии.
' Возвращает: Ненулевое значение или 0 формате Currency
Dim dblResult As Double
If Not IsNumeric(anyValue) Then
Round_2 = 0
Exit Function
End If
dblResult = anyValue * 100 + 0.5 * Sgn(anyValue)
Round_2 = Fix(dblResult)/100
End Function
Функция всегда возвращает число(Currency) и может с успехом использоваться для точных вычислений в процедурах или вычисляемых полях.
* При работе с RecordSetClone формы возникают ситуации, когда значения свойств BOF и EOF не соответствуют действительности(Access97).
Например:
Обращаемся к RecordSetClone, затем накладываем фильтр или меняем RecordSource формы так, что нет записей; снова обращаемся к RecordSetClone, и получаем BOF = False и, как следствие - ошибку выполнения. Чтобы застраховаться - можно добавить строку
If Not [Ссылка].BOF Then [Ссылка].MoveFirst
После этого BOF имеет правильное зачение.
* В качестве критерия типа Дата для строки SQL или функции по подмножеству в процедуре можно использовать конструкцию "...=" & CDbl(Дата), т.к. значение даты в базе хранится в виде числа(Double).
Строковый параметр в виде:
"...=" & Chr(34) & Строковый параметр & Chr(34)
смотрится нагляднее, чем нагромождение кавычек.
Нелишним будет напомнить, что кавычки, содержащиеся в тексте параметра должны быть продублированы.
В любом случае предпочтительнее использование временного запроса с параметрами:
Dim dbs As Database, qdf As QueryDef, rst As Recordset
Set dbs = CurrentDB
Set qdf = dbs.CreateQueryDef("")
qdf.SQL= "Parameters .... Select ..."
qdf.Parameters("Начало периода") = Дата1
qdf.Parameters("Минимальная сумма") = Сумма
Set rst = qdf.OpenRecordset
qdf.SQL= "Parameters .... Delete ..."
qdf.Parameters("Конец периода") = Дата2
qdf.Execute
Такая конструкция делает ваш код независимым от региональных установок (формат даты, десятичные разделители) и исключает лишние преобразования типа Число - Строка - Число
* Вместо метода DoCmd.Echo False|True правильнее применять метод Application.Echo. Если запрет на пере-рисовку относится к одной форме или подформе - можно использовать свойство формы Painting.
... О методе DoCmd.SetWarnings False|True лучше вообще забыть. В основном он применяется вместе с методом DoCmd.RunSQL, о котором тоже лучше забыть и применять метод CurrentDB.Execute. Этод метод лучше во всех отношениях, как уже отмечали предыдущие ораторы.
... Вместо комбинации Chr(13) & Chr(10) для перевода строки удобнее использовать встроенную константу vbCrLf.
Для функции MsgBox еще лучше использовать символы "@" в тексте сообщения. Таких символов должно быть два. | |
|
| |
|
|
|
|
| Вопрос: Маленькие секреты от Кривцова Анатолия | |
|
| |
|
HiProg.com - Технологии программирования
|