1

私はVBをあまり使用していませんが、スコープがC#と同じように機能することがわかる限りです。問題は、MS AccessでVBを使用しているため、ルールが少し異なるかどうかわからないことです(ただし、そうではないと思います)。次のコードは、関数パラメーター内でのみ宣言されている変数に割り当てられている値を示しています。特にPurchaseOrderIDを見ると、それが進行中の関数で使用するために割り当てられた値をどのように保持しているかがわかりません。

Function Create(SupplierID As Long, EmployeeID As Long, OrderID As Long, PurchaseOrderID As Long) As Boolean
    Dim rsw As New RecordsetWrapper
    If rsw.OpenRecordset("Purchase Orders") Then
        With rsw.Recordset
            .AddNew
            ![Supplier ID] = SupplierID
            If EmployeeID > 0 Then
                ![Created By] = EmployeeID
                ![Creation Date] = Now()
                ![Submitted By] = EmployeeID
                ![Submitted Date] = Now()
                ![Status ID] = Submitted_PurchaseOrder
            End If

            If OrderID > 0 Then
                ![Notes] = InsertString(PurchaseGeneratedBasedOnOrder, CStr(OrderID))
            End If
            If rsw.Update Then
                .Bookmark = .LastModified
                PurchaseOrderID = ![Purchase Order ID]
                Create = True
            End If
        End With
    End If
End Function


Function CreateLineItem(PurchaseOrderID As Long, ProductID As Long, UnitCost As Long, Quantity As Long) As Boolean
    Dim rsw As New RecordsetWrapper
    If rsw.OpenRecordset("Purchase Order Details") Then
        With rsw.Recordset
            .AddNew
            ![Purchase Order ID] = PurchaseOrderID
            ![Product ID] = ProductID
            ![Quantity] = Quantity
            ![Unit Cost] = UnitCost
            CreateLineItem = rsw.Update
        End With
    End If
End Function

誰かが私にこれについての洞察を与えることができますか?

4

3 に答える 3

2

VBAでは、プロシージャをどのように呼び出すかが重要になる場合があります。

「呼び出されたプロシージャがそのパラメータをByRefとして宣言している場合でも、各引数を括弧で囲むことにより、それらを強制的にByValにすることができます。」

-http ://www.cpearson.com/excel/byrefbyval.aspx

これは、すべてのOfficeアプリケーションのVBAに当てはまります。たとえば、次の2つの手順があるとします。

Sub SubByVal(ByVal Total As Integer)
    Total = 50
End Sub

Sub SubByRef(ByRef Total As Integer)
    Total = 50
End Sub

そして、いくつかのテストを実行します。

Dim Total As Integer
Total = 100

これらの3つのバージョンは期待どおりに機能し、合計は100になります。

Call SubByVal(Total)
SubByVal (Total)
SubByVal Total

これらの2つは期待どおりに機能し、合計は50に等しくなります

Call SubByRef(Total)
SubByRef Total

ただし、このバージョンでは、ByRefを呼び出しても、括弧によってByValに強制されるため、Totalは100に等しくなります。

SubByRef (Total)
于 2012-11-13T00:37:19.690 に答える
2

おそらく、これはタイプによって最も適切に処理されます。このようなもの:

Type PurchaseSet
   PurchaseOrderID As Long
   OrderCreated as boolean
End Type


Function Create(SupplierID As Long, EmployeeID As Long, OrderID As Long ) As PurchaseSet
    Dim rsw As New RecordsetWrapper
    Dim ps as PurchaseSet 
   ps.OrderCreated = false

    If rsw.OpenRecordset("Purchase Orders") Then
        With rsw.Recordset
            .AddNew
            ![Supplier ID] = SupplierID
            If EmployeeID > 0 Then
                ![Created By] = EmployeeID
                ![Creation Date] = Now()
                ![Submitted By] = EmployeeID
                ![Submitted Date] = Now()
                ![Status ID] = Submitted_PurchaseOrder
            End If

            If OrderID > 0 Then
                ![Notes] = InsertString(PurchaseGeneratedBasedOnOrder, CStr(OrderID))
            End If
            If rsw.Update Then
                .Bookmark = .LastModified
                ps.PurchaseOrderID = ![Purchase Order ID]
                ps.OrderCreated = True

            End If
        End With
    End If

    Create = ps
End Function
于 2012-11-15T22:05:26.553 に答える
1

引数は、値または参照によってVBAプロシージャに渡すことができます。プロシージャの宣言でByValまたはを指定しない場合、デフォルトで。になります。したがって、次の2つの宣言は同等です...ByRefByRef

Function DoSomething(PurchaseOrderID As Long) AS Boolean
Function DoSomething(ByRef PurchaseOrderID As Long) AS Boolean

ここで重要なのはByRef、プロシージャ内の引数への変更を呼び出し元に送信できるようにすることです。

于 2012-11-12T23:15:52.353 に答える