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
И конечный результат: