Trovata soluzione!
Mi autorispondo(!) Dopo una notte insonne, mi sono ricordato che, prima del 2000(!), avevo sviluppato qualcosa di simile. L'ho rintracciato (benedetti i Back-Up) e dopo qualche minuto l'ho adattato al mio programma. Ecco la soluzione:
'Conteggio ed "estrazione" elementi da List_Originale e inserimento in List_Supporto
For I = 0 To List_Originale.Items.Count - 1
X = 0
For J = I To List_Originale.Items.Count - 1
Buf1 = List_Originale.Items(I)
Buf2 = List_Originale.Items(J)
If Buf1 = Buf2 Then
' X = n. di ripetizioni; Y = 1/0 Flag presenza/assenza ripetizione
X = X + 1 : Y = 1
Else
Y = 0 ' Y=0 Stop presenza ripetizioni
End If
If Y = 1 Then W = J ' Inutile riprendere da X=0
Next J
I = W ' Per evitare errore: I=J provoca eccezione perché esterno al ciclo
If Y = 0 Then LIst_Supporto.Items.Add(X & " " & Buf1)
Next I
If (Y = 1) = True Then LIst_Supporto.Items.Add(X & " " & Buf1)
In effetti ero vicinissimo alla soluzione. L'errore che commettevo era legato alla sintassi del Visual Basic 5, cui ero abituato.
Con VB5, infatti, se Y> 0 (e quindi, anche se Y=1) il confronto...
If Y = 1 Then LIst_Supporto.Items.Add(X & " " & Buf1)
...viene riconosciuto TRUE.
Con Visual Studio Express, invece, il confronto è di tipo Boolean, quindi è indispensabile la forma If (Y = 1) = True altrimenti Y=1 viene riconosciuto come False.
E' la prima cosa che si impara passando da vecchie versioni VB a VSE 2013, ma - soprattutto nell'adattare vecchi listati - ci si abitua con difficoltà. Ovviamente il compilatore non segnala alcun errore né incongruenza.
L'altra novità (che, lo confesso, ancora non ho ben compreso) è la segnalazione di errore grave se si utilizza una variabile che "esce" (??) da un ciclo.
E' il motivo per cui ho dovuto usare W=J e poi I=W. Scrivendo "direttamente" I=J viene segnalato errore.