E come pensi di identificare un input da tastiera (che deve essere processato con il codice esistente che lavora con Select Case) da un input da pistola (che deve essere gestito in un modo nuovo)?
A questo dovevano servire i marcatori tipo #ZcZx# in testa a una lettura da pistola.
B) Hai detto che vuoi usare la "virgola" come separatore di campi; ma sei sicuro che i tuoi campi non conterranno mai la Virgola? Forse sarebbe meglio usare un carattere o una stringa che offra maggiori garanzia di unicità; e la scelta va concordata con chi da qualche parte deve stampare i messaggi in codice a barre.
C) Insomma secondo me serve un po' più di analisi prima di arrivare al codice.
Veniamo alla tua segnalazione...
Probabilmente che la Sub Pusher usi una variabile I e che l'esempio che ti avevo fatto per chiamare Pusher (Call Pusher(Cells(I, "A").Value, "#", I)) usasse anche lei una variabile I ti hanno fatto pensare che ci sia una permeabilità tra il chiamante e il chiamato, che in realtà non c'è: ogni variabile in genere "vive" solo all'interno della Sub o della Function in cui e' usata, salvo che non sia impostato altrimenti all'atto della dichiarazione delle variabili. Per approfondire cerca "vba area di validità di una variabile site:microsoft.com" (senza le virgolette)
Ora e' evidente che la WorksheetChange deve essere ripensata a fronte dei commenti A-B-C (sopra) ma, per quanto appena detto, dovrebbe esserti chiaro che non puoi usare nella prima istruzione di una Sub delle variabili che non hanno nessun valore, come invece vedo in testa della tua WorksheetChange:
- Codice: Seleziona tutto
Call Pusher(Cells(I, "A").Value, "#", I)
Solo per prova, ripristina il codice originale della WorksheetChange del primo foglio e usa questo codice per la WorksheetChange in un secondo foglio di prova:
- Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
'
If Target.Count = 1 Then
If Target.Column = 1 Then
Application.EnableEvents = False
Call Pusher(Target.Value, ",", Target.Row)
Application.EnableEvents = True
End If
End If
End Sub
Poi vai in una cella di colonna A di questo secondo foglio e "sparagli" da pistola la stringa "uno,due,tre,quattro,cinque"; oppure (perche' credo che la pistola te l'abbiano ancora fornita) scrivi quella stringa da tastiera.
Se nella Sub Pusher hai usato la mia Mappa, ti ritroverai in colonna A-C-F di quella riga le stringhe uno/due/tre (quattro e cinque vanno invece perduti perche' la mia "Mappa" contiene solo tre colonne)
Ovviamente questa WorksheetChange ha perduto la prestazione di saltare alla "prossima colonna"; se vuoi mantenere (come credo sia prudente) la possibilita' di inserire i singoli campi da tastiera, allora devi creare una WorksheetChange ibrida: non e' difficile, ma è subordinata all'analisi C (vedi sopra). Comunque la soluzione che sceglierete puo' essere anche diversa, ma deve essere sviluppata in proprio e presa in carico dal vostro reparto IT; se così non fosse va a pallino tutto il vostro Sistema della Qualità.
E per evitare di metterti in una brutta situazione, per il futuro io ti darò solo chiarimenti e singoli pezzi di istruzioni, ma niente macro funzionanti.
Puoi invece usare in Foglio2 la Sub Worksheet_Change che ti ho dato in questo messaggio e in Foglio1 la Sub Worksheet_Change precedente (quella che usava Select Case) per creare un prototipo dimostrativo per stimolare chi deve decidere se ha senso investire per passare a un prodotto aziendale funzionante.
Ciao