Private Sub cmbEnter_Click()
' Input known soldier's number and enlistment date to add to selected Regiment / Battalion
Dim LastRow As Integer, LastCol As Integer, Cnt As Integer, Cnt2 As Integer
Dim Sht As Worksheet, SortRange As Range
Dim SplitDate As Variant
If frmEnlistment.lboRegiment.ListIndex = -1 Then
MsgBox "Select Regiment!", vbExclamation + vbOKOnly, "Soldier Enlistment"
Exit Sub
End If
If frmEnlistment.lboBattalion.ListIndex = -1 Then
MsgBox "Select Battalion!", vbExclamation + vbOKOnly, "Soldier Enlistment"
Exit Sub
End If
If Not IsNumeric(frmEnlistment.txtSoldierNumber.Value) Or _
frmEnlistment.txtSoldierNumber.Text = vbNullString Then
MsgBox "Enter Soldier Number!", vbExclamation + vbOKOnly, "Soldier Enlistment"
Exit Sub
End If
If Not IsDate(frmEnlistment.txtEnlistmentDate.Text) Or _
frmEnlistment.txtEnlistmentDate.Text = vbNullString Then
MsgBox "Enter date in Day-Month-Year format!", vbExclamation + vbOKOnly, "Soldier Enlistment"
Exit Sub
End If
SplitDate = Split(frmEnlistment.txtEnlistmentDate.Text, "/")
If Len(SplitDate(0)) <> 2 Or Len(SplitDate(1)) <> 2 Or Len(SplitDate(2)) <> 4 Then
MsgBox "Enter date in dd/mm/yyyy format!", vbExclamation + vbOKOnly, "Soldier Enlistment"
Exit Sub
End If
If InStr(frmEnlistment.txtEnlistmentDate.Text, "/") <> 3 Or _
InStr(frmEnlistment.txtEnlistmentDate.Text, "/") <> 6 Then
MsgBox "Enter date in dd/mm/yyyy format!", vbExclamation + vbOKOnly, "Soldier Enlistment"
Exit Sub
End If
For Each Sht In ThisWorkbook.Sheets
If frmEnlistment.lboRegiment.List(frmEnlistment.lboRegiment.ListIndex) = Sht.Name Then
With Sheets(Sht.Name)
LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
For Cnt = 1 To LastCol
If Sheets(Sht.Name).Cells(1, Cnt) = frmEnlistment.lboBattalion.List(frmEnlistment.lboBattalion.ListIndex) Then
LastRow = .Cells(.Rows.Count, Cnt).End(xlUp).Row
For Cnt2 = 3 To LastRow
If CInt(Sheets(Sht.Name).Cells(Cnt2, Cnt)) = CInt(frmEnlistment.txtSoldierNumber.Value) Then
frmEnlistment.txtEnlistmentDate.Text = vbNullString
MsgBox "Soldier number already exists!", vbExclamation + vbOKOnly, "Soldier Enlistment"
frmEnlistment.txtEnlistmentDate.Text = CStr(Sheets(Sht.Name).Cells(Cnt2, Cnt + 1))
Exit Sub
End If
Next Cnt2
.Cells(LastRow + 1, Cnt) = frmEnlistment.txtSoldierNumber.Value
.Range(.Cells(3, Cnt + 1), .Cells(LastRow + 1, Cnt + 1)).NumberFormat = "@"
.Cells(LastRow + 1, Cnt + 1) = CStr(frmEnlistment.txtEnlistmentDate.Text)
Exit For
End If
Next Cnt
Exit For
End With
End If
Next Sht
With Sheets(Sht.Name)
Set SortRange = .Range(.Cells(3, Cnt), .Cells(LastRow + 1, Cnt + 1))
End With
With SortRange
.Sort Key1:=Cells(3, Cnt), Order1:=xlAscending, _
Header:=xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End With
frmEnlistment.txtSoldierNumber.Text = vbNullString
frmEnlistment.txtEnlistmentDate.Text = vbNullString
frmEnlistment.lboRegiment.ListIndex = -1
frmEnlistment.lboBattalion.ListIndex = -1
End Sub
Private Sub cmbEnquiry_Click()
Dim LastRow As Integer, LastCol As Integer, Cnt As Integer, Cnt2 As Integer
Dim Sht As Worksheet, SortRange As Range, Flag As Boolean, RowSpot As Integer
Dim SplitDate As Variant
' Enlistment date query
' If number already exists, then show it and the date in txtEstEnlistmentDateResult
' If number doesn't exist, then show 4 nearest numbers and their date either side in lboEnlistBefore and lboEnlistAfter
If frmEnlistment.lboRegiment.ListIndex = -1 Then
MsgBox "Select Regiment!", vbExclamation + vbOKOnly, "Soldier Enlistment"
Exit Sub
End If
If frmEnlistment.lboBattalion.ListIndex = -1 Then
MsgBox "Select Battalion!", vbExclamation + vbOKOnly, "Soldier Enlistment"
Exit Sub
End If
If frmEnlistment.txtSoldierNumberEnq.Text = vbNullString Then
MsgBox "Input Soldier Number to Query!", vbExclamation + vbOKOnly, "Soldier Enlistment"
Exit Sub
End If
frmEnlistment.lboEnlistBefore.Clear
frmEnlistment.lboEnlistAfter.Clear
frmEnlistment.txtEstEnlistmentDateResult.Text = vbNullString
SplitDate = Split(frmEnlistment.txtEnlistmentDate.Text, "/")
If Len(SplitDate(0)) <> 2 Or Len(SplitDate(1)) <> 2 Or Len(SplitDate(2)) <> 4 Then
MsgBox "Enter date in dd/mm/yyyy format!", vbExclamation + vbOKOnly, "Soldier Enlistment"
Exit Sub
End If
If InStr(frmEnlistment.txtEnlistmentDate.Text, "/") <> 3 Or _
InStr(frmEnlistment.txtEnlistmentDate.Text, "/") <> 6 Then
MsgBox "Enter date in dd/mm/yyyy format!", vbExclamation + vbOKOnly, "Soldier Enlistment"
Exit Sub
End If
For Each Sht In ThisWorkbook.Sheets
If frmEnlistment.lboRegiment.List(frmEnlistment.lboRegiment.ListIndex) = Sht.Name Then
With Sheets(Sht.Name)
LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
For Cnt = 1 To LastCol
If Sheets(Sht.Name).Cells(1, Cnt) = frmEnlistment.lboBattalion.List(frmEnlistment.lboBattalion.ListIndex) Then
LastRow = .Cells(.Rows.Count, Cnt).End(xlUp).Row
For Cnt2 = 3 To LastRow
If CInt(Sheets(Sht.Name).Cells(Cnt2, Cnt)) = CInt(frmEnlistment.txtSoldierNumberEnq.Value) Then
If Left(CDate(Sheets(Sht.Name).Cells(Cnt2, Cnt + 1)), 4) <> 1900 Then
frmEnlistment.txtEstEnlistmentDateResult.Text = Format(Sheets(Sht.Name).Cells(Cnt2, Cnt + 1), "dd/mm/yyyy")
Else
frmEnlistment.txtEstEnlistmentDateResult.Text = CStr(Sheets(Sht.Name).Cells(Cnt2, Cnt + 1))
End If
Flag = True
Exit For
Else
If CInt(Sheets(Sht.Name).Cells(Cnt2, Cnt)) < CInt(frmEnlistment.txtSoldierNumberEnq.Value) Then
RowSpot = Cnt2
End If
End If
Next Cnt2
If Not Flag Then
frmEnlistment.txtEstEnlistmentDateResult.Text = "Enlistment Date Not Known!"
With frmEnlistment.lboEnlistBefore
.ColumnCount = 2
.ColumnWidths = "80;60"
.Clear
End With
With frmEnlistment.lboEnlistAfter
.ColumnCount = 2
.ColumnWidths = "80;60"
.Clear
End With
On Error Resume Next
With frmEnlistment.lboEnlistBefore
.AddItem
If RowSpot >= 6 Then
.List(0, 0) = CStr(Sheets(Sht.Name).Cells(RowSpot - 3, Cnt))
.List(0, 1) = CStr(Sheets(Sht.Name).Cells(RowSpot - 3, Cnt + 1))
Else
.List(0, 0) = vbNullString
.List(0, 1) = vbNullString
End If
.AddItem
If RowSpot >= 5 Then
.List(1, 0) = CStr(Sheets(Sht.Name).Cells(RowSpot - 2, Cnt))
.List(1, 1) = CStr(Sheets(Sht.Name).Cells(RowSpot - 2, Cnt + 1))
Else
.List(1, 0) = vbNullString
.List(1, 1) = vbNullString
End If
.AddItem
If RowSpot >= 4 Then
.List(2, 0) = CStr(Sheets(Sht.Name).Cells(RowSpot - 1, Cnt))
.List(2, 1) = CStr(Sheets(Sht.Name).Cells(RowSpot - 1, Cnt + 1))
Else
.List(2, 0) = vbNullString
.List(2, 1) = vbNullString
End If
.AddItem
If RowSpot >= 3 Then
.List(3, 0) = CStr(Sheets(Sht.Name).Cells(RowSpot, Cnt))
.List(3, 1) = CStr(Sheets(Sht.Name).Cells(RowSpot, Cnt + 1))
Else
.List(3, 0) = vbNullString
.List(3, 1) = vbNullString
End If
End With
If RowSpot = 0 Then
RowSpot = 2
End If
With frmEnlistment.lboEnlistAfter
.AddItem
.List(0, 0) = CStr(Sheets(Sht.Name).Cells(RowSpot + 1, Cnt))
.List(0, 1) = CStr(Sheets(Sht.Name).Cells(RowSpot + 1, Cnt + 1))
.AddItem
.List(1, 0) = CStr(Sheets(Sht.Name).Cells(RowSpot + 2, Cnt))
.List(1, 1) = CStr(Sheets(Sht.Name).Cells(RowSpot + 2, Cnt + 1))
.AddItem
.List(2, 0) = CStr(Sheets(Sht.Name).Cells(RowSpot + 3, Cnt))
.List(2, 1) = CStr(Sheets(Sht.Name).Cells(RowSpot + 3, Cnt + 1))
.AddItem
.List(3, 0) = CStr(Sheets(Sht.Name).Cells(RowSpot + 4, Cnt))
.List(3, 1) = CStr(Sheets(Sht.Name).Cells(RowSpot + 4, Cnt + 1))
End With
On Error GoTo 0
End If
Exit For
End If
Next Cnt
End With
End If
Next Sht
End Sub