Your own Solution doesn't work because the effect is wrong programmed. Change it like this :
Private Sub ListBox2_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox2.SelectedIndexChanged
If ListBox1.TopIndex <> ListBox2.TopIndex Then
ListBox1.TopIndex = ListBox2.TopIndex
End If
If ListBox1.SelectedIndex <> ListBox2.SelectedIndex Then
ListBox1.SelectedIndex = ListBox2.SelectedIndex
End If
End Sub
Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
If ListBox2.TopIndex <> ListBox1.TopIndex Then
ListBox2.TopIndex = ListBox1.TopIndex
End If
If ListBox2.SelectedIndex <> ListBox1.SelectedIndex Then
ListBox2.SelectedIndex = ListBox1.SelectedIndex
End If
End Sub
The Change appears at (for example) Listbox1 - so you should modify Listbox2. You did it the other way round ...