1

我没有编码背景,但一直很想尝试一下。到目前为止我一直很享受,但最近被难住了。我已经用尽了我有限的理解和研究来试图解决这个问题,所以非常感谢任何帮助!

我的函数接受一个字符串并将其创建为一个数组。然后我在数组中搜索特定字符串并将它们输出为数字和日期。我已经成功做到了这一点,但无法弄清楚如何让 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

这是我想要得到的:
有希望的结果

4

2 回答 2

4

Excel 在计算工作表时会调用用户定义函数 (UDF)。

您可以像使用任何其他 Excel 工作表函数一样使用它们,例如:

=MyUDF("foo!bar")

像每个 Excel 工作表函数一样,UDF 接受一些输入,用它做一些事情,然后返回一个结果;Excel 获取该结果并将其显示在调用该函数的单元格中。

UDF 被明确禁止更改其他单元格中的任何内容,因此 a 不可能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 的代码检查都受到 Stack Overflow 问题的启发!)

享受你的旅程!

于 2017-09-30T01:06:06.270 回答
0

这是解决问题的代码:

    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

最后的结果:

最后结果

于 2017-09-30T15:24:15.657 回答