Changed stored procedure causes VB runtime error
So many problems with this code.  The error is right here:

.PrintString(MNth(J), 9, DosPrint.Align.Left)


Since J is a number between 2 and 13 when it returns from sql and then in the set 0,2..11,13 after the if statement, when it is 13 MNth(13) will throw an array out of bounds.

The fix is in - add the following line (if statement for context.)

 J = J - 1  ' now J goes from 1-12
 If J = 12 
      Then J = 0 
 End If 




Another note (I can't resist pointing this one out but there are many...)

This part of your query:

Case 
When Month(P.FromDate) in(4,5,6,7,8,9,10,11,12) then  Month(P.FromDate)
when Month(P.FromDate) in(1,2,3) then  Month(P.FromDate)
end as Mnth


could be written as:

Month(P.FromDate) as Mnth


Since Month() is defined to return a value from 1..12