2017-11-16 8 views
0

VBAを使用して従業員コース記録をソートする。私は従業員クラスを持っており、条件を満たしている人を特定しようとしています。私はコードを踏んで、BlsHasIssue()での私の状態テストを除いて、すべてうまく動作します。関連コード:VBA - Excelクラス機能 - ロジック

''''''''''''' 
'clsEmployee' 
''''''''''''' 
Option Explicit 

Private empID As String 
Private name As String 
Private hasBLSComp As Boolean 
Private hasBLSAssignment As Boolean 

Public Property Let id(value As String) 
    empID = value 
End Property 

Property Get id() As String 
    id = empID 
End Property 

Public Property Let setName(value As String) 
    name = value 
End Property 

Public Property Get getName() As String 
    getName = name 
End Property 

Public Sub addResusRecord(value As String) 'accepts name of course 
    Select Case value 
     Case "BLS Assignment": 
      hasBLSAssignment = True 
     Case "BLS Competency": 
      hasBLSComp = True 
    End Select 
End Sub 

Public Function BlsHasIssue() As Boolean 
    If hasBLSComp And Not hasBLSAssignment Then 
     BlsHasIssue = True 
    Else 
     BlsHasIssue = False 
    End If 
End Function 

'''''''' 
'Module' 
'''''''' 
Option Explicit 

Const STUDENT_NAME_COL As Integer = 3 
Const USER_ID_COL As Integer = 4 
Const COURSE_NAME_COL As Integer = 5 

Public Function Contains(col As Collection, key As Variant) As Boolean 
    Dim obj As Variant 
    On Error GoTo err 
    Contains = True 
    IsObject (col(key)) 
    Exit Function 
err: 
    Contains = False 
End Function 

    Sub ResusCardAudit() 

    Dim row As Long 
    Dim currEmpID As String 
    Dim employees As New Collection 
    Dim emp As Object 

    For row = 2 To 5 'change to be last row of data 
     'Check to see if user exists in collection 
     currEmpID = Cells(row, USER_ID_COL).value 

     If Not Contains(employees, currEmpID) Then 
      'create User and add it to collection 
      Set emp = New clsEmployee 
      emp.id = currEmpID 
      emp.setName = Cells(row, STUDENT_NAME_COL) 
      emp.addResusRecord Cells(row, COURSE_NAME_COL) 
      employees.Add emp, currEmpID 
     Else 
      employees.Item(currEmpID).addResusRecord Cells(row, COURSE_NAME_COL) 
     End If 

    Next row 

    'cycle through all employees and determine if any have a comp but not an assignment 
    Set emp = New clsEmployee 
    row = 2 
    For Each emp In employees 
     If emp.BlsHasIssue Then 

      row = row + 1 
     End If 
    Next emp 

    'if they do, add their details to a new sheet named "Results" 


End Sub 

私は問題がemp.BlsHasIssueをテストする場合、論理エラーのようですhasBLSAssignment.適切hasBLSCompを設定するコードを残しています。ここで私をもたらしたテストは、hasBLSCompがTrueでhasBLSAssignmentがFalseの場合 - >BlsHasIssue()の結果がFalseになったときです。

注:hasBLSAssignmentはTrue、hasBLSCompはFalseであっても構いません。

思考?

+1

あなたの 'BlsHasIssue'関数にエラーがありますか?あなたの 'ResusCardAudit'サブルーチンは現時点では何もしていません(空のコレクションを繰り返すことは少し意味がありません)ので、おそらく**あなたの関数は呼び出されていないので機能していないと思うかもしれません。 **あなたがそのコレクションに何かを持っているなら、それがどのように設定されているかを私たちに示すことが考えられるかもしれません。 (必ずしもすべてのコードではなく、問題を再現できるほど十分です。) – YowE3K

+0

ここに表示されるロジックは良いです。だから問題は他の場所にあるはずです。 –

+0

私はもっとコードを追加します –

答えて

0

すべての助けをいただきありがとうございます。私のテストケースではのエラーでした - 私は私が持っていると思ったものと逆のテストを設定しました。これは何かが問題であると判断する前に(複数の)有効なテストケースの重要性を認識するのに役立ちました。

私の質問に対する回答に基づいて、レコードの問題をテストしてモジュールレベルに持っていく単純なロジックを隠すのをやめます。私はこれが、コードが拡大するにつれて問題が進むのを避けるのに役立つだろうと信じています。