Введите дату в поле ввода и найдите дату за предыдущий месяц на VBA. - PullRequest
1 голос
/ 25 июня 2019

В настоящее время я работаю над кодом VBA, в котором вы вводите дату в поле ввода в следующей форме: ГГГГ-ММ.

Затем я использую функцию, которая находит ячейку, значение которой совпадает со значениемвведите поле и скопируйте информацию в строках ниже ячейки с указанной датой.Каждые 7 столбцов используются для данных за одну дату (1-й столбец - это значение риска, 2-й ряд - это изменение значения риска, 3-й столбец - рыночная стоимость, 4-й - изменение рыночной стоимости и т. Д.) И каждая строкапредставляет другое портфолио.Данные для каждого портфеля копируются из других рабочих книг.

Следующие 7 столбцов относятся к данным за предыдущий месяц.

Теперь я хочу рассчитать изменение значения риска в зависимости от месяца.

ВыполнениеИтак, мне нужно найти дату месяца, которая предшествовала дате, введенной в поле ввода, и скопировать значение риска из этого столбца, присвоить его переменной и, наконец, найти вариацию благодаря формуле: (текущее значениев группе риска - предыдущее значение в группе риска) / (предыдущее значение в группе риска).То же самое касается изменения рыночной стоимости.

Я понятия не имею, как это сделать, так как я очень плохо знаком с VBA.Любая помощь приветствуется.Вот что у меня есть:

Option Explicit

Function MatchHeader(strSearch As String) As Long
    Dim myRight As Long, Colcount As Long
    myRight = ActiveSheet.Cells(1, ActiveSheet.Columns.Count).End(xlToLeft).Column

    For Colcount = 1 To myRight
        If ActiveSheet.Cells(1, Colcount) = strSearch Then
            MatchHeader = Colcount
            Exit For
        End If
    Next Colcount
End Function


Sub StressTest()
    Dim index As Integer
    Dim dateColumn As Integer
    Dim portfolioName As Variant
    Dim portfolioDate As String
    Dim ParametricVar As Double
    Dim AuM As Double
    Dim strPath As String
    Dim strFilePath As String
    Dim wb As Workbook
    Dim sheet As Worksheet

    Set wb = ThisWorkbook
    Set sheet = ActiveSheet

    portfolioDate = InputBox("Please enter date under the following form : YYYY-MM", "Date at the time of Stress Test", "Type Here")
    Debug.Print "InputBox provided value is: " & portfolioDate

    For index = 3 To Cells(Rows.Count, "A").End(xlUp).Row
        dateColumn = MatchHeader(portfolioDate)
        portfolioName = ActiveSheet.Range("A" & index & "").Value

        strPath = "G:\Risk\Risk Reports\VaR-Stress test\" & portfolioDate & "\" & portfolioName & ""

        Set wb = Workbooks.Open(strPath)

        ParametricVar = Workbooks(portfolioName).Worksheets("VaR Comparison").Range("B19")
        AuM = Workbooks(portfolioName).Worksheets("Holdings - Main View").Range("E11")

        sheet.Cells(index, dateColumn).Value = ParametricVar / AuM
        sheet.Cells(index, dateColumn + 2).Value = AuM
        sheet.Cells(index, dateColumn + 5).Value = Application.WorksheetFunction.Min(Workbooks(wb).Worksheets("VaR Comparison").Range("P11:AA11"))
        sheet.Cells(index, dateColumn + 6).Value = Application.WorksheetFunction.Max(Workbooks(wb).Worksheets("VaR Comparison").Range("J16:J1000"))

        wb.Close Savechanges:=False
    Next index
End Sub

1 Ответ

1 голос
/ 25 июня 2019

Лично я бы оставил ваш portfolioDate в виде строки, а затем проверил бы содержимое того, что возвращается (я переименовал переменную InputBox в portfolioInputBox).Я поместил все это в цикл Do, чтобы, если пользователь не отменит или не нажмет ok с вводом по умолчанию («Введите здесь»), он продолжит открываться до тех пор, пока не будет введена правильная дата.

Dim portfolioInputBox As String

Do
    portfolioInputBox = InputBox("Please enter date under the following form : YYYY-MM", "Date at the time of Stress Test", "Type Here")

    If portfolioInputBox = "Type Here" Or portfolioInputBox = vbNullString Then Exit Sub
Loop Until IsDate(portfolioInputBox)

Оператор If предназначен для проверки того, нажал ли пользователь только что хорошо с текстом по умолчанию или нажал "Отмена", что приведет к выходу из Sub

. Затем я использовал бы другую переменную.в котором я бы преобразовал ввод portfolioInputBox в формат даты

Dim portfolioDate as Date
portfolioDate = cDate(portfolioInputBox)

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

portfolioDate = DateAdd("M", -1, CDate(portfolioInputBox))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...