【问题标题】:VBA: Return Strings from For Function in 2 ColumnsVBA:从 2 列中的 For 函数返回字符串
【发布时间】:2018-03-11 22:09:06
【问题描述】:

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

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

这是我想要得到的:

【问题讨论】:

  • UDF 只能(或至少应该只能)更新使用它的单元格。如果您希望此 UDF 更新工作表的 3 行 x 2 列区域,那么您将 (a) 作为数组公式输入 Excel,并且 (b) 需要返回一个二维 Variant 数组(标注1 To 3, 1 To 2

标签: vba excel for-loop excel-udf


【解决方案1】:

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

您可以像使用任何其他 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

您很快就会发现可能性实际上是无穷无尽的 - 不要感到不知所措,如果研究无法解决您的问题并且您遇到特定问题,我们会为您提供帮助,并且知道有 @987654321 @(我管理的一个 VBIDE 插件 OSS 项目)可以帮助您避免一些常见的初学者(和一些不那么初学者)陷阱,这些陷阱您将不可避免地遇到(很多 Rubberduck 的代码检查受到 Stack Overflow 问题的启发!)

享受您的旅程!

【讨论】:

    【解决方案2】:

    解决问题的代码如下:

        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
    

    最后的结果:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多