Ho risolto da me..
invece del ciclo for ho utilizzato un ciclo do while loop

codice:
    Public Sub Controlla_Data(ByVal selectedDate As Date)
        Dim controlla As Odbc.OdbcCommand
        Dim List As Odbc.OdbcDataReader
        Dim SQL As String = "select message from promemoria where data = '" + DataOnly(selectedDate).ToString + "'"
        controlla = New Odbc.OdbcCommand(SQL, Conn)
        Conn.Open()
        List = controlla.ExecuteReader()
        If List.HasRows Then
            Label3.Text = "Numero promemoria per il giorno selezionato : " + List.RecordsAffected.ToString
            ListBox1.Items.Clear()
            Do While List.Read
                ListBox1.Items.Add(List.GetValue(0).ToString())
                MessageBox.Show(List.GetValue(0).ToString())
            Loop
        Else
            ListBox1.Items.Clear()
            Label3.Text = "Nessun promemoria presente per il giorno selezionato"
        End If
        List.Close()
        Conn.Close()
    End Sub
Continuo a non capire perchè prima facesse il duplicato, ed anche se adesso non lo fa più sarei curioso di sapere il perchè, per evitare di ripetere l'errore in futuro