VBA: вернуть строки из функции For в 2 столбца

У меня нет опыта программирования, но мне всегда было любопытно попробовать. Я наслаждался этим пока, но недавно был в тупике. Я исчерпал свое ограниченное понимание и исследования, пытаясь понять это, поэтому любая помощь очень ценится!

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

Вот код с использованием Excel 2016 и VBA:

    Function test() As Variant

    Dim data As String: data = "push.29Sep17 and 333>! push.28Sep17 and 55555>! push.27Sep17 and 4444>!"
    Dim day() As String: day() = Split(data, "!")
    Dim num As Integer: num = UBound(day) - 1

    For i = 0 To num
     Dim p1 As Integer: p1 = InStr(1, day(i), "and ")
     Dim p2 As Integer: p2 = InStr(p1, day(i), ">")
     Dim p3 As Integer: p3 = p1 + 4
     Dim p4 As Integer: p4 = p2 - p3
     Dim price1 As String: price1 = Mid(day(i), p3, p4)
     Dim d1 As Integer: d1 = InStr(1, day(i), "push.")
     Dim d2 As Integer: d2 = d1 + 5
     Dim date1 As String: date1 = Mid(day(i), d2, 7)
    test = price1 & " " & date1
     Debug.Print price1, date1
    Next i

    End Function

Вот что я получаю, когда использую функцию в электронной таблице:test = price1 & " " & date1

Вот что я хочу получить:
обнадеживающий результат

2 ответа

Пользовательские функции (UDF) вызываются Excel при вычислении листа.

Вы используете их точно так же, как и любую другую функцию листа Excel, например:

=MyUDF("foo!bar")

Как и любая функция листа Excel, UDF принимают некоторые данные, что-то с ними делают и возвращают результат; Excel берет этот результат и отображает его в ячейке, вызвавшей функцию.

UDF явно запрещено изменять что-либо в других ячейках, поэтому это невозможно Function воздействовать на любую ячейку, кроме той, которая его вызывала. Функции не форматируют ячейки, они вычисляют значение ячейки - ни больше, ни меньше.

Если вам нужен некоторый код VBA, который должен делать больше, чем это (например, влиять на содержимое нескольких ячеек, форматировать их и т. Д.), Тогда вам не нужно Function, но макрос - без параметров Sub Процедура, которую можно вызвать из меню макросов или прикрепить к кнопке / фигуре на листе:

Public Sub DoSomething()
    Sheet1.Range("A1").Value = 42
    Sheet1.Range("A2").Formula = "=A1+12"
    Sheet1.Range("A1:A2").NumberFormat = "$#,##0.00"
End Sub

Вы быстро обнаружите, что возможности практически безграничны - не огорчайтесь, мы здесь, чтобы помочь, если исследования вас ни к чему не приведут, и вы застряли на конкретной проблеме, и знаете, что есть Rubberduck (дополнение VBIDE - в проекте OSS, которым я управляю), который может помочь вам избежать некоторых распространенных ловушек для новичков (и некоторых не очень начинающих), с которыми вы неизбежно столкнетесь (многие проверки кода Rubberduck были вдохновлены вопросами переполнения стека!)

Приятного путешествия!

Вот код, который решает проблему:

    Sub test()

    Dim data As String: data = "push.29Sep17 and 333>! push.28Sep17 and 55555>! push.27Sep17 and 4444>!"
    Dim day() As String: day() = Split(data, "!")
    Dim num As Integer: num = UBound(day) - 1

    For i = 0 To num
     Dim p1 As Integer: p1 = InStr(1, day(i), "and ")
     Dim p2 As Integer: p2 = InStr(p1, day(i), ">")
     Dim p3 As Integer: p3 = p1 + 4
     Dim p4 As Integer: p4 = p2 - p3
     Dim price1 As String: price1 = Mid(day(i), p3, p4)
     Dim d1 As Integer: d1 = InStr(1, day(i), "push.")
     Dim d2 As Integer: d2 = d1 + 5
     Dim date1 As String: date1 = Mid(day(i), d2, 7)
     Sheet1.Range("A3:A5").Cells(i) = price1
     Sheet1.Range("B3:B5").Cells(i) = date1
    Next i

    End Sub

И конечный результат:

конечный результат

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