Excel Invoicer

If you look for a simple and straight-forward invocing tool. Try Excel Invoicer. It’s an excel file embeded with VBA. You simply need to fill the ‘clients’ tab with clients information, and and then the clients drop-down is shown in the ‘jobs’ tab. After filling in the details of a job, a invoice number is automatically generated and click ‘create invoice’ button, an invoice is then generated.
To design an invoice, simply edit the ‘invoice template’ tab.
I have used for like 7 or 8 years and I find it can fufill all my invocing, accounting and job management needs.
The best thing about managing invoice in an excel file is that you can use the excel features like calculation and sorting.

It’s a freeware. Check out the video here:
Download here:


Word Macro VBA: Capitalize 1st letter of each line

Don’t miss out the translator’s productivity tool that can genuinely increase your translation speed and quality: GT4T!!
Check it out here: GT4T website


My name is ABC
- I am from XYZ
-he works on a word document
1. hello there


My name is abc
- I am from xyz
-He works on a word document
1. Hello there
Sub captalize()
' captalize the first letter of each line and uncaptitalize the rest

para_count = ActiveDocument.Paragraphs.Count
For i = 1 To para_count
    para_length = ActiveDocument.Paragraphs(i).Range.Characters.Count
    first_char = True
     For j = 1 To para_length
          Set current_char = ActiveDocument.Paragraphs(i).Range.Characters.Item(j)
          If IsLowerChar(current_char.Text) Then
            If first_char Then
                Selection.TypeText (UCase(current_char.Text))
            End If
            first_char = False
          ElseIf IsUpperChar(current_char.Text) Then
            If Not first_char Then
                Selection.TypeText (LCase(current_char.Text))
            End If
            first_char = False
          End If
    Next j
Next i
End Sub
Function IsLowerChar(CHR As String) As Boolean
    'by Rolf Keller
    CHR = Left(CHR, 1)
    X1 = (LCase(CHR) = CHR)
    X2 = (UCase(CHR) = CHR)
    IsLowerChar = X1 And (Not X2)
End Function
Function IsUpperChar(CHR As String) As Boolean
    'by Rolf Keller
    CHR = Left(CHR, 1)
    X1 = (LCase(CHR) = CHR)
    X2 = (UCase(CHR) = CHR)
    IsUpperChar = (Not X1) And (X2)
End Function

Excel VBA: move matching rows to another sheet

This VBA moves my paid jobs in my job list sheet (sheet1) to the sheet named “history” (sheet4).

If the value of sixth column (Column F) of a row in sheet1 is “closed”, that row is then moved to the end of sheet4.

Sub Button_Remove_Closed_Click()
With Sheet1
'    For Each rw In .UsedRange.Rows
'        If rw.Cells(6).Value = "Closed" Then
'            Target = Sheet4.UsedRange.Rows.Count + 1
'            rw.Copy Destination:=Sheet4.Rows(Target)
'            rw.Delete
'        End If
'    Next
'the above doens't work well as when for example row 5 is deleted, the old row 6 becomes row 5.
'this works :-)
Dim i, j
j = .UsedRange.Rows.Count
For i = 1 To j
    If .Cells(i, 6).Value = "Closed" Then
        Target = Sheet4.UsedRange.Rows.Count + 1
        .Rows(i).Copy Destination:=Sheet4.Rows(Target)
        i = i - 1
    End If
End With
End Sub

Word VBA: randomize paragraphs

Sub ran_para()
    n = ActiveDocument.Paragraphs.Count
    ReDim a(1 To 2, 1 To n)
    For i = 1 To n
        a(1, i) = Rnd
        a(2, i) = i
    For i = 1 To n - 1
        For j = i + 1 To n
            If a(1, j) > a(1, i) Then
                t = a(2, i)
                a(2, i) = a(2, j)
                a(2, j) = t
            End If
    For i = 1 To n
        Set p = ActiveDocument.Paragraphs.Add
        p.Range.Text = ActiveDocument.Paragraphs(a(2, i)).Range.Text
End Sub

SSL certificate chain order

Contrary to what you may find on the Internet, the trust chain of ssl certificate is actually from BIG to small.
It may not be matter to some browsers but matters to others. I installed the chain in reverse order but chrome and IE don’t complain. Firefox is more picky.

The merge command line goes like

COMODORSADomainValidationSecureServerCA (intermediate) > COMODORSAAddTrustCA (intermediate) > AddTrustExternalCARoot (root)

Resulting something like

<signer for your cert signer>
<your cert signer>