【问题标题】:Access VBA Classes Arrays访问 VBA 类数组
【发布时间】:2013-06-05 16:34:27
【问题描述】:

我正在尝试使用一些可以保存发票数据的类,但我似乎无法正常工作。我只是希望它将发票的详细信息保存在数组中。这是代码,也许有人可以弄清楚。 也像 LineItems 一样可以随机获取产品项目的数量,但还不知道该怎么做。我这样做是为了最终通过 ms 访问的 Web 服务发送数据。

这是 struct_XOrder 的其他代码:

Public OrderNumber As String 
Public ClientShortName As String 
'"LineItems" is an array with elements defined as struct_LineItem
'See Complex Types: Arrays in Microsoft Office 2003 Web Services Toolkit Help
'for details on implementing arrays.
Public LineItems As Variant 
Public OrderError As String 

这是 struct_LineItem:

Public ProductSKU As String 
Public Qty As Long 
Public UnitPrice As Variant 
Public ItemComment As String 
Public ItemError As String

这是我的主要代码

Sub webservicetest()

Dim NewOrder As struct_XOrder
Dim LineItems(1 To 2) As Variant
Dim Xline(1 To 2) As Variant

Set Xline() = struct_LineItem

Set NewOrder = New struct_XOrder

Set NewOrder.LineItems() = New struct_LineItem
Set NewOrder.LineItems() = New Xline
'Xline = New struct_LineItem


Xline(1).ItemComment = "items" 
Xline(1).Qty = 10
NewOrder.LineItems() = Xline()


NewOrder.ClientShortName = "DemoClient"
NewOrder.OrderNumber = "12345"

'Xline(1).ItemComment = "item1"
'Xline(1).Qty = 5

Debug.Print NewOrder.ClientShortName
Debug.Print NewOrder.OrderNumber

'For i = LBound(Xline) To UBound(Xline): Debug.Print Xline(i): Next

'Debug.Print Xline(1).ItemComment
'Debug.Print Xline(1).Qty

End Sub

【问题讨论】:

    标签: class vba service web module


    【解决方案1】:

    请参阅 cmets 以获得解释。

    在 VBA 中使用 Type 来创建结构。此外,您不需要像现在这样使用Set

    此外,在使用 VBA 时,请使用 Option Explicit 来要求变量声明,除非您想要做噩梦。

    这一切都可以放在同一个模块中。


    'use this
    Option Explicit
    
    'VBA structs are defined like the following
    'and do not need "new" (similar to other languages)
    'when creating them
    
    Type struct_LineItem
        ProductSKU As String
        Qty As Long
        UnitPrice As Variant
        ItemComment As String
        ItemError As String
    
    End Type
    
    Type struct_XOrder
        OrderNumber As String
        ClientShortName As String
    
        'make this more clear
        LineItems() As struct_LineItem
        OrderError As String
    End Type
    
    
    Sub webservicetest()
    
        Dim NewOrder As struct_XOrder
        Dim LineItems(1 To 2) As Variant
        Dim Xline(1 To 2) As struct_LineItem
    
        'you can't do this, you need to specify which element
        'in XLine you want to set
        'Set Xline() = struct_LineItem
    
        Dim myStruct As struct_LineItem
        Xline(1) = myStruct
    
        'you don't need "set"
        NewOrder.LineItems = Xline()
    
        'this won't update as if it's a reference, btw
        Xline(1).ItemComment = "items"
        Xline(1).Qty = 10
        NewOrder.LineItems = Xline()
    
    
        NewOrder.ClientShortName = "DemoClient"
        NewOrder.OrderNumber = "12345"
    
        Debug.Print NewOrder.ClientShortName
        Debug.Print NewOrder.OrderNumber
    
        'don't do ":" as this makes code unbearably not readable...
        'For i = LBound(Xline) To UBound(Xline): Debug.Print Xline(i): Next
    
        Dim i As Integer
        For i = 1 To UBound(NewOrder.LineItems)
            Debug.Print NewOrder.LineItems(i).ItemComment
        Next i
    
    End Sub
    

    【讨论】:

    • 非常感谢。这更有意义。我会玩弄它,让它做我想做的事。
    • struct_xorder 类模块已更改,有没有办法将其保留为“lineitems as variant”?它导致错误。 @enderland
    • BTY 网络服务位于 webservices.p3pl.com/WSOrder.asmx?WSDL,如果这有助于任何人更好地理解。
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-28
    • 2021-10-27
    • 2014-01-07
    相关资源
    最近更新 更多