2014-08-27 64 views
0

因此,在我的數據庫中,我有一個交匯表,其中列出了所有人的貸款「目的」。代碼只是在顯示值(以數字形式)時工作,但在我的第二個循環中,我在第二個表中搜索實際名稱的目的,我遇到了問題。它顯示了正確的號碼的用途,但不幸的是,該文本重複了第一次發現的次數,而不是顯示所有適用的目的。使用VBA將ID轉換爲名稱

這裏是代碼我使用:

Private Sub cmdMsgBox_Click() 

Dim DB As Database 
Dim tblOpp2LP As Recordset 
Dim tblLoanPurpose As Recordset 
Dim ctlFindRecord As Control 
Dim lngHoldOpportunityID As Variant 
Dim intRecordCount As Integer 
Dim valTestBox As String 
Dim valLP As String 
Dim valName As String 

Set DB = CurrentDb 
Set tblInputOpp2LP = DB.OpenRecordset("Opp2LP") 

Set tblLoanPurpose = DB.OpenRecordset("LoanPurpose") 
Set ctlFindRecord = Me.ctlFindRecord 


lngHoldOpportunityID = CLng(ctlFindRecord) 
valTestBox = "" 

On Error GoTo ErrorHandling_Err: 

tblInputOpp2LP.FindFirst "[OpportunityID] = " & lngHoldOpportunityID 

If tblInputOpp2LP.NoMatch Then 
    MsgBox "No Matching Record Found" 
    Exit Sub 
Else 
Do Until tblInputOpp2LP.EOF 
    If lngHoldOpportunityID = tblInputOpp2LP![OpportunityID] Then 
     valLP = tblInputOpp2LP![LPID] 
     intCounter = intCounter + 1 

     Do Until tblLoanPurpose.EOF 
      If valLP = tblLoanPurpose![LPID] Then 
       valName = tblLoanPurpose![Name] 
      End If 
      tblLoanPurpose.MoveNext 
     Loop 

     If valTestBox = "" Then 
      valTestBox = valName 
     Else 
      valTestBox = valTestBox & ", " & valName 
     End If 
    End If 

    tblInputOpp2LP.MoveNext 
Loop 

txtMsgbox = valTestBox 

End If 

ErrorHandling_Exit: 
    Exit Sub 

ErrorHandling_Err: 
    MsgBox Err.Description & " - " & Err.Number 
    Resume ErrorHandling_Exit 
End Sub 

的思考?提前致謝!

回答

0

我明白了!

事實證明,我需要做的是在第二個循環中添加一個「exit do」。

請參閱下面的代碼示例。

Private Sub cmdMsgBox_Click() 

Dim DB As Database 
Dim tblOpp2LP As Recordset 
Dim tblLoanPurpose As Recordset 
Dim ctlFindRecord As Control 
Dim lngHoldOpportunityID As Variant 
Dim intRecordCount As Integer 
Dim valTestBox As String 
Dim valLP As String 
Dim valName As String 

Set DB = CurrentDb 
Set tblInputOpp2LP = DB.OpenRecordset("Opp2LP") 

Set tblLoanPurpose = DB.OpenRecordset("LoanPurpose") 
Set ctlFindRecord = Me.ctlFindRecord 


lngHoldOpportunityID = CLng(ctlFindRecord) 
valTestBox = "" 

On Error GoTo ErrorHandling_Err: 

tblInputOpp2LP.FindFirst "[OpportunityID] = " & lngHoldOpportunityID 

If tblInputOpp2LP.NoMatch Then 
    MsgBox "No Matching Record Found" 
    Exit Sub 
Else 
Do Until tblInputOpp2LP.EOF 
    If lngHoldOpportunityID = tblInputOpp2LP![OpportunityID] Then 
     valLP = tblInputOpp2LP![LPID] 
     intCounter = intCounter + 1 

     Do Until tblLoanPurpose.EOF 
      If valLP = tblLoanPurpose![LPID] Then 
       valName = tblLoanPurpose![Name] 
       exit do 
      End If 
      tblLoanPurpose.MoveNext 
     Loop 

     If valTestBox = "" Then 
      valTestBox = valName 
     Else 
      valTestBox = valTestBox & ", " & valName 
     End If 
    End If 

    tblInputOpp2LP.MoveNext 
Loop 

txtMsgbox = valTestBox 

End If 

ErrorHandling_Exit: 
    Exit Sub 

ErrorHandling_Err: 
    MsgBox Err.Description & " - " & Err.Number 
    Resume ErrorHandling_Exit 
End Sub 
+0

太棒了!我想建議你用幾行重寫整個分支。你可以通過以下方式打開一個記錄集:Set tblLoanPurpose = DB.OpenRecordset(「SELECT * FROM LoanPurpose WHERE LPID =」&valLP)''然後遍歷它,而不是所有額外的匹配和ifs – ashareef 2014-08-27 18:01:33

+0

我不確定我明白。這似乎是肯定會更有效率,因爲它是通過較少的數據解析,但它不會仍然需要循環?如果您提交了我所輸入內容的另一個版本,並舉例說明您的意思,並且它很有用,我很樂意將您的標記標記爲正確的答案! – LarrySteeze 2014-08-27 20:16:40

+0

所以我現在正在運行代碼的另一個問題。 有時它似乎重複了它反覆發現的最後貸款目的,而不是使用第一和第二等,它似乎重複正確的次數,而不是正確的值。思考?它偶爾會正常工作,但並非總是如此,這對我來說很奇怪。 – LarrySteeze 2014-09-05 15:06:46