Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/47: Рейтинг темы: голосов - 47, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 19.02.2018
Сообщений: 67

Проверка в VBA на NULL

29.03.2018, 09:21. Показов 10056. Ответов 43
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Проблема такая в макросе VBA есть такая строка:

Visual Basic
1
2
ME.ОС_внеш.Caption = ос_внеш
ос_внеш = DLookup("[всего ос]", "[Итоги для отчета по ПАБ(внеш)]", "[всего ос]")
Хорошо прочитав значение - оно выводится вместо надписи, но когда значения NULL то выходит ошибка - invalid of is null в vba.

Хорошо делал проверку такого плана:
Visual Basic
1
2
3
4
if (ос_внеш) = 0 OR ISNull (ос_внеш) then
ос_внеш = "0"
Else
ос_внеш = DLookup("[всего ос]", "[Итоги для отчета по ПАБ(внеш)]", "[всего ос]")
Данная проверка выполняется но всегда теперь выходит пусто даже если есть значения. Что не так ? как поправить можно?
И у меня еще возник вопрос каким образом в vba можно прочитать значение из поля со списком в котором источником строк является запрос.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.03.2018, 09:21
Ответы с готовыми решениями:

Проверка на 0 или NULL
Читаю SQL для простых смертный. В конце каждого параграфа небольшие задачки, одна из них звучит так: Запишите запрос, который выбирает...

Проверка запроса SELECT на null
Помогите, пожалуйста, разобраться. В общем, в зависимости от того, какой ответ получится от запроса SELECT, нужно производить выбор, типа...

Проверка значения на Null подчиненной формы в виде таблицы
Всем привет. Голову ломал два дня, и все-же решил обратиться снова на форум. Раньше у меня работал цикл с проверкой на пустое значение, но...

43
Модератор
Эксперт MS Access
 Аватар для shanemac51
12231 / 5078 / 814
Регистрация: 07.08.2010
Сообщений: 14,941
Записей в блоге: 4
29.03.2018, 09:48
попробуйте
Visual Basic
1
2
3
4
5
6
7
8
9
s1 = "" & DLookup("[всего ос]", "[Итоги для отчета по ПАБ(внеш)]", "[всего ос]")
''если это число или дата --преобразуйте строку как надо
if len(s1)>0 then
ос_внеш =s1
или ос_внеш =val(s1)
....
else
ос_внеш =""
endif
для символьной достаточно
ос_внеш = "" & DLookup("[всего ос]", "[Итоги для отчета по ПАБ(внеш)]", "[всего ос]")
0
0 / 0 / 0
Регистрация: 19.02.2018
Сообщений: 67
29.03.2018, 10:24  [ТС]
shanemac51, добрый день. попробовал как сказали но выходит ошибка такого плана:
Sub or Function not defined - это я так понимаю проблема с объявлением переменных.
ошибка горит на строке : Private Sub Report_Open(Cancel As Integer)
Что значит:
Цитата Сообщение от shanemac51 Посмотреть сообщение
''если это число или дата --преобразуйте строку как надо
не совсем этот момент понял.
0
Модератор
Эксперт MS Access
 Аватар для shanemac51
12231 / 5078 / 814
Регистрация: 07.08.2010
Сообщений: 14,941
Записей в блоге: 4
29.03.2018, 10:29
вы ошиблись, а я не заметила
ос_внеш = "" & DLookup("[всего ос]", "[Итоги для отчета по ПАБ(внеш)]", "[всего ос]")
к конце должно быть условие поиска, а у вас непонятно что

Добавлено через 1 минуту
Цитата Сообщение от Kucha88 Посмотреть сообщение
Private Sub Report_Open(Cancel As Integer)
это я не понимаю, что-то не так в вашем отчете
0
0 / 0 / 0
Регистрация: 19.02.2018
Сообщений: 67
29.03.2018, 10:55  [ТС]
Цитата Сообщение от shanemac51 Посмотреть сообщение
к конце должно быть условие поиска, а у вас непонятно что
исправил
ос_внеш = "" & DLookup("[всего ос]", "[Итоги для отчета по ПАБ(внеш)]", "[код_подр]=" & текПодразделение)
где,
текПодразделение = [Forms]![Отчеты по ПАБ]![Подразделение_А].Value

Но все равно выходит пусто хотя данные в результатах запроса есть
0
Эксперт MS Access
 Аватар для Eugene-LS
13183 / 5881 / 1506
Регистрация: 05.10.2016
Сообщений: 16,507
29.03.2018, 11:02
Цитата Сообщение от Kucha88 Посмотреть сообщение
Но все равно выходит пусто хотя данные в результатах запроса есть
Поле: текПодразделение - точно не текстовое?
0
Модератор
Эксперт MS Access
 Аватар для shanemac51
12231 / 5078 / 814
Регистрация: 07.08.2010
Сообщений: 14,941
Записей в блоге: 4
29.03.2018, 11:03
надо смотреть в базе(и какая форма)
0
0 / 0 / 0
Регистрация: 19.02.2018
Сообщений: 67
29.03.2018, 11:16  [ТС]
Цитата Сообщение от Eugene-LS Посмотреть сообщение
Поле: текПодразделение - точно не текстовое?
нет не должно
Цитата Сообщение от shanemac51 Посмотреть сообщение
надо смотреть в вазе(и какая форма)
базу приложил
откройте форму Отчеты по ПАБ далее выбираем подразделение ЭП 2018 Март и нажать отчет по подразделению на форме выведутся данные. Данные подтягиваются через VBA из двух запросов по строке "Внутренние" идет из запроса "Итоги для отчета по ПАБ(внутр)" ; по строке "Внешние" идут из запроса "Итоги для отчета по ПАБ(внеш)"
В марте есть все данные а вот по другим месяцам нет данных по внешним, так как это только внедряем в базу.
Вложения
Тип файла: zip база тест (2).zip (291.0 Кб, 7 просмотров)
0
Модератор
Эксперт MS Access
 Аватар для shanemac51
12231 / 5078 / 814
Регистрация: 07.08.2010
Сообщений: 14,941
Записей в блоге: 4
29.03.2018, 11:42
каждый раз, как смотрю базу --приходится комментить вызов функций
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Sub Надпись16_Click()
''ЭкспЖурExcel
End Sub
 
 
Private Sub Надпись17_Click()
''ЭкспЖурExcel
 
End Sub
 
Private Sub Надпись19_Click()
''ЭксКолПАБExcel
End Sub
1
Эксперт MS Access
 Аватар для Eugene-LS
13183 / 5881 / 1506
Регистрация: 05.10.2016
Сообщений: 16,507
29.03.2018, 11:42
Цитата Сообщение от Kucha88 Посмотреть сообщение
далее выбираем подразделение ЭП 2018 Март
Нет такого подразделения у вас в примере ("ЭП 2018 Март")
В модуль отчёта добавьте "Option Explicit" и исправьте ошибки
Должно быть так (сверху модуля) и лучше всех модулей:
Visual Basic
1
2
Option Compare Database
Option Explicit
Дальше исправьте вызовы типа:
DLookup("[кол-во]", "[Итоги для отчета по ПАБ]", "[кол-во]")
DLookup("[план]", "[Итоги для отчета по ПАБ]", "[план]")
DLookup("[выполн]", "[Итоги для отчета по ПАБ]", "[выполн]")
Они не верны - третьим аргументом идёт выражение условия отбора
Читайте пожалуйста Функция DLookup

... потом можно будет продолжить ...
Вот насобирал для вас:
Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Sub Report_Open(Cancel As Integer)
Dim s1 As Variant
Dim текПодразделение As Variant
Dim текГод As Variant
Dim текМесяц As Variant
 
Dim внешний As Variant
Dim внешний2 As Currency
Dim ос_внеш As Variant, иос_внеш As Variant, иос_внеш1 As Variant
' ...
0
Модератор
Эксперт MS Access
 Аватар для shanemac51
12231 / 5078 / 814
Регистрация: 07.08.2010
Сообщений: 14,941
Записей в блоге: 4
29.03.2018, 11:47
а здесь где условия поиска
Visual Basic
1
2
3
4
5
6
 внешний2 = DLookup("[кол-во]", "[Итоги для отчета по ПАБ(внеш)]", "[кол-во]")
    If (внешний2 = 0) Or IsNull(внешний2) Then
            внешний = "0"
            Else
            внешний = DLookup("[кол-во]", "[Итоги для отчета по ПАБ(внеш)]", "[кол-во]")
        End If
0
0 / 0 / 0
Регистрация: 19.02.2018
Сообщений: 67
29.03.2018, 12:13  [ТС]
Цитата Сообщение от Eugene-LS Посмотреть сообщение
Нет такого подразделения у вас в примере ("ЭП 2018 Март")
это не подразделение а = Подразделение, год выбираем с той же формы и месяц.

Добавлено через 8 минут
Цитата Сообщение от shanemac51 Посмотреть сообщение
а здесь где условия поиска
стоп давайте не все сразу а разберемся с тем полем про которое я писал, просто разберусь и пойму с одним другие уже сам исправлю, в коде там черти что занесено, я там всяко уже пробовал изменял но никак не получается.
Нужно понять на одном поле и потом я все по другим поправлю.
0
Эксперт MS Access
 Аватар для Eugene-LS
13183 / 5881 / 1506
Регистрация: 05.10.2016
Сообщений: 16,507
29.03.2018, 12:15
Цитата Сообщение от Kucha88 Посмотреть сообщение
это не подразделение а = Подразделение, год выбираем с той же формы и месяц
А понял!: Подразделение : "ЭП", а дальше год и месяц.
Но остальной картины это не меняет.
0
0 / 0 / 0
Регистрация: 19.02.2018
Сообщений: 67
29.03.2018, 12:25  [ТС]
Цитата Сообщение от Eugene-LS Посмотреть сообщение
А понял!: Подразделение : "ЭП", а дальше год и месяц.
Но остальной картины это не меняет.
Почему же ? это и есть условие отбора - или я не прав ?
0
Эксперт MS Access
 Аватар для Eugene-LS
13183 / 5881 / 1506
Регистрация: 05.10.2016
Сообщений: 16,507
29.03.2018, 12:27
Цитата Сообщение от Kucha88 Посмотреть сообщение
стоп давайте не все сразу а разберемся с тем полем про которое я писал
Visual Basic
1
?DLookup("[всего ос]", "[Итоги для отчета по ПАБ(внеш)]", "[Код_подр]=" & "52")
Возвращает : 10
Правильно - нет не знаю, но так DLookup работает.
Примечание: "52" - Значение из Подразделение_А по "ЭП"
0
0 / 0 / 0
Регистрация: 19.02.2018
Сообщений: 67
29.03.2018, 12:37  [ТС]
Цитата Сообщение от Eugene-LS Посмотреть сообщение
Возвращает : 10
Правильно - нет не знаю, но так DLookup работает.
Примечание: "52" - Значение из Подразделение_А по "ЭП"
все верно Всего ОС по внешнему равно 10, я скорректировал данные в базе убрал пока все лишние поля, оставил только
Visual Basic
1
2
3
4
5
6
7
Me.внешние_а.Caption = ос_внеш
    s1 = DLookup("[кол-во]", "[Итоги для отчета по ПАБ(внеш)]", "[Код_подр]=" & текПодразделение)
    If Len(s1) > 0 Then
            ос_внеш = s1
            Else
            ос_внеш = ""
        End If
Возвращает значение = 1 но в отчете опять пусто получается (базу приложил)
Вложения
Тип файла: zip база тест (2).zip (312.9 Кб, 7 просмотров)
0
Эксперт MS Access
 Аватар для Eugene-LS
13183 / 5881 / 1506
Регистрация: 05.10.2016
Сообщений: 16,507
29.03.2018, 12:58
Цитата Сообщение от Kucha88 Посмотреть сообщение
Возвращает значение = 1 но в отчете опять пусто получается (базу приложил)
... Телега должна быть позади лошади
Так работает:
Visual Basic
1
2
3
4
5
6
7
8
9
    'Me.внешние_а.Caption = ос_внеш 'Телега должна быть позади лошади :)
    s1 = DLookup("[кол-во]", "[Итоги для отчета по ПАБ(внеш)]", "[Код_подр]=" & текПодразделение)
    If Len(s1) > 0 Then
        ос_внеш = s1
    Else
        ос_внеш = ""
    End If
    Me.внешние_а.Caption = ос_внеш
   Exit Sub
Там сверху только отключите:
Visual Basic
1
    'Me.ПАБ_Факт_План.Caption = DLookup("[кол-во]", "[Итоги для отчета по ПАБ]", "[кол-во]") & "/" & DLookup("[план]", "[Итоги для отчета по ПАБ]", "[план]") & "  выполнение " & FormatPercent(DLookup("[выполн]", "[Итоги для отчета по ПАБ]", "[выполн]"))
Добавлено через 10 минут
Kucha88, если не понятно про "Лошадь" и "Телегу", то вот краткое пояснение:
01. Сначала устанавливаем значение переменной:
Visual Basic
1
2
3
4
5
6
    s1 = DLookup("[кол-во]", "[Итоги для отчета по ПАБ(внеш)]", "[Код_подр]=" & текПодразделение)
    If Len(s1) > 0 Then
        ос_внеш = s1
    Else
        ос_внеш = ""
    End If
02. И только потом присваиваем её значение свойству:
Visual Basic
1
    Me.внешние_а.Caption = ос_внеш
А у вас было наоборот.
1
Модератор
Эксперт MS Access
 Аватар для shanemac51
12231 / 5078 / 814
Регистрация: 07.08.2010
Сообщений: 14,941
Записей в блоге: 4
29.03.2018, 13:03
Цитата Сообщение от Kucha88 Посмотреть сообщение
Возвращает значение = 1 но в отчете опять пусто получается (базу приложил)
а что должно возвратить
....ведь надписи ос_внеш в отчете нет, значение сосчитали, но не вставили в отчет

достаточно и так
s1 = "" & DLookup("[кол-во]", "[Итоги для отчета по ПАБ(внеш)]", "[Код_подр]=" & текПодразделение)
Me.внешние_а.Caption = s1
если найдет -вставит значение, иначе вставит пробел

но это не всегда допустимо --у вас есть деление одного значения на другое
в этом случае надо
--найти оба значения в s1 и s2
--если первое пустое len(s1)=0, то значение1=0, иначе значение1=val(s1)
--если второе пустое len(s2)=0 --значение2=1 , иначе значение2=val(s2)

не знаю только что делать, если первое не пустое, а второе пустоу
1
Эксперт MS Access
 Аватар для Eugene-LS
13183 / 5881 / 1506
Регистрация: 05.10.2016
Сообщений: 16,507
29.03.2018, 13:20
Kucha88, если хотите, вот пара советов как минимально подготовить MSA к работе разработчика.
01. В настройках VBE установите опцию "Require Variable Declaration"
02. На панель кнопок VBE выведите кнопку Compile - и нажимайте её после редакции кода.
Миниатюры
Проверка в VBA на NULL   Проверка в VBA на NULL  
1
0 / 0 / 0
Регистрация: 19.02.2018
Сообщений: 67
29.03.2018, 13:54  [ТС]
Eugene-LS, и shanemac51, - большое спасибо.... буду править сейчас по всем полям и разбираться дальше... если вдруг возникнут вопросы знаю к кому обратиться

Добавлено через 21 минуту
Ну вот и возникли опять вопросы, делаю все так как вы писали. по Подразделению ЭП например за март 2018 года поле
ОС_Аудитор выводится подтянув данные из запроса, но когда ставлю например подразделение ПБСи2ЭГ то тогда по внутренним строка заполняется вся кроме второго столбца а при ЭП все заполняется, почему так ?
код такой:
Visual Basic
1
2
3
4
5
6
7
s3 = DLookup("[кол-во]", "[Итоги для отчета по ПАБ(внутр)]", "[Код_подр]=" & текПодразделение)
    If Len(s3) > 0 Then
        ос_всего = s3
    Else
        ос_всего = ""
    End If
    Me.ОС_Аудитор.Caption = ос_всего
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.03.2018, 13:54
Помогаю со студенческими работами здесь

Проверка корректности ввода на VBA
Бд:книги кафедры. При этом в схеме данных у меня кольцо. Как реализовать проверку: Хотя бы один автор должен работать на кафедре на которой...

VBA. Проверка на наличие таблиц
Здравствуйте! Нужно, чтобы при запуске БД выполнялась проверка на наличие в ней таблиц, в случае их отсутствия выводилось сообщение о...

Проверка введенных данных VBA
Здравствуйте! Есть две таблицы: input, scan input - там находятся все данные scan - в эту таблицу сканером добавляются значения ...

Проверка нового поля Access VBA
Коллеги доброго времени суток, Подскажите пожалуйста как можно проверить новую строку. К примеру, при нажатии: Если нажали на новую...

БД проверка корректности вводимых значений VBA
Уважаемые форумчане, возник вопрос. Есть таблица Водители, каждому водителю соответствует свой автомобиль(т.е гос номер) Есть также таблица...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Контроль корректности заполнения дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru