2012-11-12 28 views
1

我還沒有使用過VB,但據我所知,範圍的工作方式與C#中的相同。問題是,我在MS Access中使用VB,所以我不確定規則是否有點不同(儘管我認爲它們不是)。以下代碼顯示分配給只在函數參數內聲明的變量的值。特別是在查看PurchaseOrderID時,我不確定它是如何保留它在分配函數中使用的值。在MS Access中使用VB的變量範圍

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 

有人可以給我一些見解嗎?

回答

1

您可以通過值或引用將參數傳遞給VBA過程。如果您在程序聲明中未指定ByValByRef,則默認爲ByRef。所以,下面的兩個聲明是等價的...

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

這裏的關鍵是,ByRef允許更改過程中的參數傳回給調用者。

+0

我以爲龍是不可變的,即只傳遞值? – Nate

+0

在VBA/VB6中,任何類型的過程參數都通過引用傳遞,除非被限定爲「ByVal」。 – prprcupofcoffee

+0

@Nate檢查ByRef關鍵字和函數聲明的訪問幫助主題。 – HansUp

2

在VBA中,如何調用過程可能很重要。

「即使被調用過程已宣佈其參數爲ByRef,你 可以強制那些被封閉 括號內的每一個參數被BYVAL。」

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

這是在所有Office應用程序VBA的真實。例如,讓我們說你有兩個步驟:

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 

如預期總數等於這三個版本一起使用100

Call SubByVal(Total) 
SubByVal (Total) 
SubByVal Total 

這兩個按預期工作,Total等於50

Call SubByRef(Total) 
SubByRef Total 

但是,在這個版本中,儘管調用了ByRef,但Total等於100,因爲它被括號強制爲ByVal。

SubByRef (Total) 
+0

謝謝,好消息。 – Nate

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