2016-11-11 12 views
1

私はVBで味付けされていないし、これを理解するために私の脳を荒らしている...私は解決策を見た私がそのような初心者であるように、私の厚い頭蓋骨を包むように見える。Microsoft Access - フォームのリストレポートのデータ要件としてのリストボックス

私はフォームを持つデータベースを持っています。フォームには2つのリストボックス "List1"と "請求書タイプ"があります。それぞれ固有の値を持ちます。私はそれぞれの非バインドリストボックスに対して「すべて選択」と「選択をクリア」ボタンがあり、それらは機能します。

3つのレポートボタンのすべてに作用する「StartDate」と「EndDate」があります。これをクエリ自体の基準として使用してこれを達成しました。

私のレポートは「CompleteTransRPT」、「NoPaymentRPT」と「PaidRPT」です。各レポートにはボタンがあり、リストボックスで選択されているものの要件を通過する以外は現在3つすべてが機能しています。

私の現在のコードの構成は次のとおりです。

Private Sub Detail_Click() 

End Sub 

Private Sub BTNRunReport_Click() 
On Error GoTo BTNRunReport_Click_Err 

    DoCmd.OpenReport "CompleteTransRPT", acViewReport, "", "", acNormal 


BTNRunReport_Click_Exit: 
    Exit Sub 

BTNRunReport_Click_Err: 
    MsgBox Error$ 
    Resume BTNRunReport_Click_Exit 

End Sub 

Private Sub BTNPaidInvoices_Click() 
On Error GoTo BTNPaidInvoices_Click_Err 

    DoCmd.OpenReport "PaidRPT", acViewReport, "", "", acNormal 


BTNRunReport_Click_Exit: 
    Exit Sub 

BTNRunReport_Click_Err: 
    MsgBox Error$ 
    Resume BTNPaidInvoices_Click_Exit 

End Sub 

Private Sub DeSelectAllTeams_Click() 

    Dim varItm As Variant 

    With TeamName 

     For Each varItm In .ItemsSelected 
      .Selected(varItm) = False 
     Next varItm 

    End With 
End Sub 

Private Sub SelectAllTeams_Click() 

Dim i As Integer 

For i = 0 To Forms!InvoiceReporting!TeamName.ListCount - 1 
Forms!InvoiceReporting!TeamName.Selected(i) = True 
Next i 

End Sub 

Private Sub SelectAllInvoices_Click() 

Dim i As Integer 

For i = 0 To Forms!InvoiceReporting!InvoiceType.ListCount - 1 
Forms!InvoiceReporting!InvoiceType.Selected(i) = True 
Next i 

End Sub 

Private Sub DeSelectAllInvoices_Click() 

    Dim varItm As Variant 

    With InvoiceType 

     For Each varItm In .ItemsSelected 
      .Selected(varItm) = False 
     Next varItm 

    End With 
End Sub 

どのように私は報告書に示されているもののための要件として2つのリストボックスで選択されたフィールドを使用していますか? 編集:ここでの要求に応じて、レポートのクエリーになってしまった

SELECT Almost.[Invoice #], Almost.[Invoice Date], Almost.[Invoice Amount], 
    Almost.Payment, Almost.Expression AS Due, Almost.[Invoice Type], 
    Almost.[Invoice Comments], Almost.[Team Name] 
FROM Almost 
WHERE (((Almost.[Invoice Date]) Between [Forms]![INVOICEREPORTING]![txtBeginDate] 
            And [Forms]![INVOICEREPORTING]![txtEndDate])); 

です:

Option Compare Database 

Private Sub Detail_Click() 

End Sub 



Private Sub BTNRunReport_Click() 
On Error GoTo BTNRunReport_Click_Err 
    'DoCmd.OpenReport "CompleteTransRPT", acViewReport, , strFilter 
    Dim strFilter As String 
    Dim lSelCnt As Long 
    strFilter = "" 

    strWhere = GetValues(Me.TeamName, "Team Name", lSelCnt) 
    If lSelCnt >= 1 Then strFilter = strFilter & "(" & strWhere & ")" 

    lSelCnt = 0 
    strWhere = GetValues(Me.InvoiceType, "Invoice Type", lSelCnt) 
    If lSelCnt >= 1 Then 
     If Len(strFilter) > 0 Then 
      strFilter = strFilter & " AND (" & strWhere & ")" 
     Else 
      strFilter = strFilter & " (" & strWhere & ")" 
     End If 
    End If 


    Debug.Print strFilter 

    DoCmd.OpenReport "CompleteTransRPT", acViewReport, , strFilter 

BTNRunReport_Click_Exit: 
    Exit Sub 

BTNRunReport_Click_Err: 
    MsgBox Error$ 
    Resume BTNRunReport_Click_Exit 

End Sub 

Private Sub BTNPaidInvoices_Click() 
On Error GoTo BTNPaidInvoices_Click_Err 
'DoCmd.OpenReport "PaidRPT", acViewReport, , strFilter 
    Dim strFilter As String 
    Dim lSelCnt As Long 
    strFilter = "" 

    strWhere = GetValues(Me.TeamName, "Team Name", lSelCnt) 
    If lSelCnt >= 1 Then strFilter = strFilter & "(" & strWhere & ")" 

    lSelCnt = 0 
    strWhere = GetValues(Me.InvoiceType, "Invoice Type", lSelCnt) 
    If lSelCnt >= 1 Then 
     If Len(strFilter) > 0 Then 
      strFilter = strFilter & " AND (" & strWhere & ")" 
     Else 
      strFilter = strFilter & " (" & strWhere & ")" 
     End If 
    End If 


    Debug.Print strFilter 

    DoCmd.OpenReport "PaidRPT", acViewReport, , strFilter 

BTNPaidInvoices_Click_Exit: 
    Exit Sub 

BTNPaidInvoices_Click_Err: 
    MsgBox Error$ 
    Resume BTNPaidInvoices_Click_Exit 


End Sub 

Private Sub BTNUnPaidInvoices_Click() 
On Error GoTo BTNUnPaidInvoices_Click_Err 

    'DoCmd.OpenReport "CompleteTransRPT", acViewReport, , strFilter 
    Dim strFilter As String 
    Dim lSelCnt As Long 
    strFilter = "" 

    strWhere = GetValues(Me.TeamName, "Team Name", lSelCnt) 
    If lSelCnt >= 1 Then strFilter = strFilter & "(" & strWhere & ")" 

    lSelCnt = 0 
    strWhere = GetValues(Me.InvoiceType, "Invoice Type", lSelCnt) 
    If lSelCnt >= 1 Then 
     If Len(strFilter) > 0 Then 
      strFilter = strFilter & " AND (" & strWhere & ")" 
     Else 
      strFilter = strFilter & " (" & strWhere & ")" 
     End If 
    End If 


    Debug.Print strFilter 

    DoCmd.OpenReport "NoPaymentRPT", acViewReport, , strFilter 

    'DoCmd.OpenReport "NoPaymentRPT", acViewReport, "", "", acNormal 


BTNUnPaidInvoices_Click_Exit: 
    Exit Sub 

BTNUnPaidInvoices_Click_Err: 
    MsgBox Error$ 
    Resume BTNUnPaidInvoices_Click_Exit 

End Sub 

Private Sub DeSelectAllTeams_Click() 

    Dim varItm As Variant 

    With TeamName 

     For Each varItm In .ItemsSelected 
      .Selected(varItm) = False 
     Next varItm 

    End With 
End Sub 

Private Sub SelectAllTeams_Click() 

Dim i As Integer 

For i = 0 To Forms!INVOICEREPORTING!TeamName.ListCount - 1 
Forms!INVOICEREPORTING!TeamName.Selected(i) = True 
Next i 

End Sub 

Private Sub SelectAllInvoices_Click() 

Dim i As Integer 

For i = 0 To Forms!INVOICEREPORTING!InvoiceType.ListCount - 1 
Forms!INVOICEREPORTING!InvoiceType.Selected(i) = True 
Next i 

End Sub 

Private Sub DeSelectAllInvoices_Click() 

    Dim varItm As Variant 

    With InvoiceType 

     For Each varItm In .ItemsSelected 
      .Selected(varItm) = False 
     Next varItm 

    End With 
End Sub 


Function GetValues(lstbox As ListBox, lstField As String, lSelectedCnt As Long) As String 

    Dim varItem As Variant  'Selected items 
    Dim strWhere As String  'String to use as WhereCondition 
    Dim strDescrip As String 'Description of WhereCondition 
    Dim lngLen As Long   'Length of string 
    Dim strDelim As String  'Delimiter for this field type. 

    'strDelim = """" 

    'Loop through the ItemsSelected in the list box. 
    With lstbox 
     For Each varItem In .ItemsSelected 
      If Not IsNull(varItem) Then 
       'Build up the filter from the bound column (hidden). 
       strWhere = strWhere & "'" & strDelim & .ItemData(varItem) & strDelim & "'," 
       lSelectedCnt = lSelectedCnt + 1 
      End If 
     Next 
    End With 

    'Remove trailing comma. Add field name, IN operator, and brackets. 
    lngLen = Len(strWhere) - 1 
    If lngLen > 0 Then 
     GetValues = "[" & lstField & "] IN (" & Left$(strWhere, lngLen) & ")" 
    End If 

End Function 

それは動作しますが、誰もがすべての問題を見ているなら、私に知らせてください。私は、それが将来他の人を助けることができることを希望して、前と後を離れるつもりです...私は基本的に他の人のコードを使用し、異なるサイトからさまざまな投稿をまとめることによって働きました。

+1

を(それはあなたの質問に何らかの関連性のないので)私はそれを助けることができないという理由だけで、私はコメントするつもりです垂直空白とバナーコメント(絶対にゼロの目的を果たす)は非常に気を散らし、コードの可読性を損なうと言います。良いコメントは言うべきである*なぜ*、*ではない* *何が - コードが既に言っているかを文字どおり正確に言うコメントは、悪いコメントです。間違ったコメントは削除する必要があります。 –

+1

「レポートに表示されるものの要件」 - 検索用語は「フィルタ」となります;-)レポートクエリには、これらをパラメータ値とするWHERE句が必要です。そのため、レポートに使用しているクエリを含めることが重要です。 –

+0

神の愛のために、ボタン名を 'Command76'などから意味のあるものに変更してください。 – Andre

答えて

0

複数の選択リストボックスでは、これには少しのコードが必要です。

リストボックスから[請求書の種類]の動的フィルタを作成し、このフィルタでレポートを開く必要があります。

' if Invoice Types are ID numbers: 
strFilter = "[Invoice Type] IN (4, 15, 77)" 
' or if Invoice Types are text: 
strFilter = "[Invoice Type] IN ('xx', 'yy', 'zz')" 

DoCmd.OpenReport "CompleteTransRPT", acViewReport, "", strFilter, acNormal 

strFilterの入手方法は?すべてのリストボックス.ItemsSelected値を連結することにより
、以下を参照してください

MS Access - Multi Select Listbox to delete records from tableまたは

https://stackoverflow.com/a/6075399/3820271

+0

私は初心者であることを覚えておいてください... xx yyとzzは何を表していますか?テキスト値であるためです。 –

+0

"Invoice Type"リストボックスから選択された値です。上記のコードは単なる静的な例です。リンクされた質問に示されているように、strFilterを動的にビルドするだけです。 – Andre

+0

あまり記事や投稿を消化しようとしています –

関連する問題