Преобразуйте формулу Excel в код VBA

=IF((effDate)-curDate>0,0,IF(curDate-(effDate)+1>nDays,0,nSpend/4))+IF((effDate+365/4*1)-curDate>0,0,IF(curDate-(effDate+365/$4*1)+1>nDays,0,nSpend/4))+IF((effDate+365/4*2)-curDate>0,0,IF(curDate-(effDate+365/4*2)+1>nDays,0,nSpend/4))+IF((effDate+365/4*3)-curDate>0,0,IF(curDate-(effDate+365/4*3)+1>nDays,0,nSpend/4)) effDate: 1/1/2017 (as value) curDate: 1/31/2017 (as value) nSpend: 1600 nDays: 60 Correct answer: 400 

Выше – длинная формула, которую я пытаюсь скрывать до кода VBA. Способ, которым я пытался это сделать, длинный, и я попытался разбить его на более мелкие функции, но это не дает мне правильного ответа. Мои навыки VBA очень новички, поэтому я не уверен, что еще попробовать. Я все время получаю неправильный ответ или вообще не отвечаю.

Это то, что я пытался:

 If effdate - curdate > 0 Then val1 = 0 Exit Function End If If curdate - effDate + 1 > nDays Then val1 = 0 Else val1 = nSpend / 4 End If If (effDate + (365 / 4)) - curdate > 0 Then val2 = 0 Exit Function End If If curdate - (effDate + (365 / 4)) + 1 > nDays Then val2 = 0 Else val2 = nSpend / 4 End If If effDate + (365 / (4 * 2)) - curdate > 0 Then val3 = 0 Exit Function End If If curdate - (effDate + (365 / (4 * 2))) + 1 > nDays Then val3 = 0 Else val3 = nSpend / 4 End If If effDate + (365 / (4 * 3)) - curdate > 0 Then val4 = 0 Exit Function End If If curdate - (effDate + (365 / (4 * 3))) + 1 > nDays Then val4 = 0 Else val4 = nSpend / 4 End If End If APFcst = val1 + val2 + val3 + val4 End Function 

Я все правильно затуманил, это фактическое преобразование, с которым у меня проблемы. Буду признателен за помощь! Это также огромное обучение для меня, так как я только начал изучать кодировку VBA. Спасибо!

Если вы знаете формулу, вы можете использовать Evaluate() для достижения желаемого.

 Sub Sample() Dim f1, f2, f3, f4 f1 = "=IF((effDate)-curDate>0,0,IF(curDate-(effDate)+1>nDays,0,nSpend/4))" f2 = "=IF((effDate+365/4*1)-curDate>0,0,IF(curDate-(effDate+365/4*1)+1>nDays,0,nSpend/4))" f3 = "=IF((effDate+365/4*2)-curDate>0,0,IF(curDate-(effDate+365/4*2)+1>nDays,0,nSpend/4))" f4 = "=IF((effDate+365/4*3)-curDate>0,0,IF(curDate-(effDate+365/4*3)+1>nDays,0,nSpend/4))" '~~> Change Sheet1 to the relevant sheet code name Debug.Print Sheet1.Evaluate(f1) + Sheet1.Evaluate(f2) + Sheet1.Evaluate(f3) + Sheet1.Evaluate(f4) End Sub 

введите описание изображения здесь

  DateAdd ( interval, number, date ) 

Вы должны исследовать это и применять его к тому, что вы пытаетесь сделать 🙂

https://www.techonthenet.com/excel/formulas/dateadd.php

Я был заинтригован этим, чтобы понять, почему он не работает. Я переписал логику if > else > else в if or > else но он достигает того же. Как говорит Doug Coats, вы можете использовать DateAdd для совместной работы с вычитанием / добавлением дат. Я только что преобразовал строки даты в double:

 Private Sub CommandButton1_Click() Dim x As Date: Dim y As Date Dim effDate As Double Dim curDate As Double Dim nSpend As Double Dim nDays As Double x = "1/1/17" y = "31/1/17" effDate = CDbl(x) curDate = CDbl(y) nSpend = 1600 nDays = 60 If (effDate - curDate > 0) Or (curDate - effDate + 1 > nDays) Then val1 = 0 Else val1 = nSpend / 4 End If If ((effDate + (365 / 4)) - curDate > 0) Or (curDate - (effDate + (365 / 4)) + 1 > nDays) Then val2 = 0 Else val2 = nSpend / 4 End If If (effDate + (365 / (4 * 2)) - curDate > 0) Or (curDate - (effDate + (365 / (4 * 2))) + 1 > nDays) Then val3 = 0 Else val3 = nSpend / 4 End If If (effDate + (365 / (4 * 3)) - curDate > 0) Or (curDate - (effDate + (365 / (4 * 3))) + 1 > nDays) Then val4 = 0 Else val4 = nSpend / 4 End If MsgBox (val1 + val2 + val3 + val4) End Sub 
  • Как подсчитать количество разных дат в одном столбце?
  • Как использовать результат одной функции в другой функции, чтобы получить значение, хранящееся в ячейке на другом листе в Excel?
  • Функция Excel о дате
  • excel: сумма валюты в двух столбцах
  • Force '2.1' отличается от «2.10» (для целей SUMIF)
  • Изменение функции Excel VBA для свойств файла
  • #Выберите ошибку, используя пользовательскую функцию в Excel
  • Можем ли мы сделать эту функцию vba excel быстрее?
  • Формула Excel содержит ошибку
  • Функция VLookup - ссылка на таблицу с другого листа
  • Запись значения в ячейку, которая не вызывает функцию, через функцию VBA
  • Interesting Posts

    VBA (Excel) ActiveX ListBox Изменение рекурсивного поведения событий

    Преобразование excel csv в обычный текст csv

    Форматирование даты потери формулы

    Excel: сумма столбцов и строк, если критерии выполнены

    Подсчитать данные на веб-странице по URL-адресу в Excel VBA

    Отправка почты в ASP.Net для подключения к SQL Server с вложением Excel

    Excel VBA – возврат выбранного элемента в slicer

    Excel не упрощает все дроби, как ожидалось

    Понимание того, как работает защитник паролей

    Копировать формулу через столбцы

    C # interop.excel workbooks.opentext метод fieldinfo не работает

    Изменение цвета шрифта для определенного символа в диапазоне ячеек

    Запись данных после последней ячейки, используемой в строке, и выполнения vlookup, идущего вниз по столбцу до определенной ячейки

    Excel: выберите каждую пятую колонку на другом листе, перетащите и автозаполнение

    удалить ссылки формулы в excel с помощью c #

    Давайте будем гением компьютера.