Перенос vba (excel) в microsoft access expression builder

Я пытаюсь дословно перевести следующий код для Excel в построитель выражений в Access, но все время получаю сообщение об ошибке, в котором говорится, что мне не хватает конечной скобки / скобки.

Код Excel (правильный):=IFERROR(IF($DH3=0,0,IF(OR($CM3="Live",$CM3="Policy Adjustment"),(($AY3/VLOOKUP($AM3,Maintenance!$A$3:$B$14,2,FALSE))*((VLOOKUP($AM3,Maintenance!$A$3:$B$14,2,FALSE))-DATEDIF($BC3,TODAY(),"M"))),0)),0)

Код доступа (неверный):IIf(IsError([Input - Altus]![Months Remaining]=0,0,IIf([Input - Altus]![Status]="Live" OR [Input - Altus]![Status]="Policy Adjustment",(([Input - Altus]![Net Annual Earnings]/[Input - Commission Type]![Indemnity Period (months)])*[Input - Commission Type]![Indemnity Period (months)])-DateDiff("m",[Input - Altus]![Expected Payment Date YTD],Date(),2),0)

Я новичок в этом, поэтому любая помощь будет оценена,

Спасибо!

Расшифровать это одной сплошной линией довольно сложно. И я очень надеюсь, что у вас нет поля под названием [Срок возмещения (месяцев)]? Может быть, простым английским языком опишите, чего вы пытаетесь достичь?

Minty 10.08.2018 15:07

Похоже, у вас 8 ( и 6 ). Вам не хватает скобок.

Foxfire And Burns And Burns 10.08.2018 15:37

Две вещи. Во-первых, разбейте его на более мелкие части и тестируйте индивидуально, вместо того, чтобы пытаться перевести все это целиком. Во-вторых, не используйте IsError для учета значений NULL или деления на ноль или полей в неправильном формате. Используйте Nz для тестирования NULL, IIF([expression]=0), чтобы избежать деления на ноль, и специальные правила для любого другого тестирования.

SunKnight0 10.08.2018 15:53

Кроме того, как упоминалось выше, у вас неправильные скобки. Возможный пример: DateDiff("m",[Input - Altus]![Expected Payment Date YTD],Date(),2). DateDiff использует только 3 параметра для "m" (месяцев), в конце ,2 быть не должно. Я предполагаю, что это было частью предыдущего IIF

SunKnight0 10.08.2018 15:56

@ SunKnight0 Я включил, 2, потому что считаю, что он указывает на понедельник (воскресенье - первый день, 1) в параметрах DateDiff (интервал, дата 1, дата 2, [firstdayofweek], [firstweekofyear]. Может быть, мне нужно тоже введите значение [firstweekofyear]?

mcibirka1 14.08.2018 10:37

@ SunKnight0 Кроме того, я отредактировал код на: IIf (Nz ([Input - Altus]! [Осталось месяцев] = 0,0, IIf ([Input - Altus]! [Status] = "Live" OR [Input - Altus] ]! [Статус] = "Корректировка политики", (([Ввод - Альтернативный]! [Чистый годовой доход] / [Ввод - Тип комиссии]! [Срок выплаты (месяцев)]) * ([Ввод - Тип комиссии]! [ Срок выплаты (месяцев)]) - DateDiff ("m", [Input - Altus]! [Ожидаемая дата платежа с начала года], Date (), 2)), 0)), 0) Скобки / скобки совпадают в моих глазах и на бумаге, но теперь выдает ошибку: выражение, которое вы ввели, имеет функцию, содержащую неправильное количество аргументов.

mcibirka1 14.08.2018 10:46

@Minty Не могли бы вы объяснить, что не так с полем [Срок выплаты (мес.)]?

mcibirka1 14.08.2018 10:49

Использование специальных символов, пробелов и зарезервированных слов в именах полей или именах таблиц значительно усложняет вашу жизнь. Использование круглых скобок, например (месяц) и зарезервированное имя в имени поля вызовут у вас бесконечные головные боли, поскольку где-то в конце строки, когда доступ думает, что вы обращаетесь к массиву с именем функции, когда вы его ошибочно набираете. Это также означает, что вы все время набираете ужасно длинные имена и должны заключать имена полей в []. Прочтите здесь несколько советов access-diva.com/d1.html и здесь access-programmers.co.uk/forums/showthread.php?t=225837

Minty 14.08.2018 11:05

@ mcibirka1 На самом деле ошибка все еще существует и, вероятно, ряд других ошибок. То, что количество открытых скобок совпадает с количеством закрытых, не означает, что они в нужном месте. Вы можете продолжать пытаться найти проблему благодаря чистой удаче или можете последовать моему первому и самому важному совету, который состоит в том, чтобы разбить это 5-строчное выражение на мельчайшие индивидуально проверяемые части (например, только последний DateDiff) и строить оттуда. .

SunKnight0 14.08.2018 19:57

@ SunKnight0 Хорошо, я попробую это сделать. Должен ли я начинать с конца выражения при тестировании каждой отдельной части и наращивать его, двигаясь влево, пока не дойду до начала? Спасибо за помощь!

mcibirka1 15.08.2018 17:26

@Minty Хорошо, я буду иметь это в виду, большое спасибо!

mcibirka1 15.08.2018 17:26

Цель состоит в том, чтобы иметь возможность сделать минимальный старт и шаги и при этом получить поддающиеся проверке и значимые результаты. Я не знаю точно, как настроена ваша среда, но я обычно настраиваю запрос, который получает каждую отдельную часть как отдельное поле, а затем начинаю объединять их, сохраняя при этом каждый шаг. Это позволяет вам следовать своей логике и убедиться, что результаты соответствуют вашим ожиданиям, а не просто проверять синтаксические ошибки. С помощью сложных выражений вы можете легко получить без ошибок, но по-прежнему получать неверные результаты.

SunKnight0 15.08.2018 17:37
0
12
100
0

Другие вопросы по теме