Moderatori: Anthony47, Flash30005
Riprendo questa informazione per darti una ulteriore possibile scelta (che io pero' ritengo una pratica scorretta e quindi sconsiglio).Anthony ha scritto:E' possibile impostare la convalida in modo che non segnali nessun errore, senza pero' poter fare distinzione tra i vari casi.
Il mio suggerimento e' che imposti lo stile=Informazione, che ti propone come risposta di default "Ok" facilitando in questo modo la conferma (che puo' anche essere data con il lettore a barre, leggendo una "label" con solo 1 carattere)
Anthony47 ha scritto:Dipende da due cose:
A) quanto riesci a far leggere in un colpo solo al tuo lettore
B) quanta capacità implementativa ha lo staff del tuo boss
Per A devi verificare tu
Anthony47 ha scritto:Su B puoi usare qualche trucco, che andrai a gestire nella WorksheetChange di excel. Ad esempio:
-se la lettura contiene N "chiave di separazione campo" allora significa che la lettura contiene N+1 campi che la WorksheetChange individua e usa per splittare i campi su altrettante celle a seguire
Insomma proprio come avevi pensato di fare!
Application.OnKey "{ENTER}"
Application.SendKeys "{ENTER}"
Secondo me devi vedere la lettura del codice a barre come 1 solo input ; e' nella WorksheetChange che decidi cosa fare del dato, e cioe'Riflettevo che in fin dei conti basterebbe associare al "carattere speciale" la digitazione del tasto Enter per farlo passare da una cella ad un altra..
Dylan666 ha scritto:Purtroppo capita spesso... in molte aziende l'uso del Cloud, dei web-meeting, delle VPN e lo smart-working sono arrivati "grazie" al COVID... Cioè parliamo di una catastrofe planetaria per introdurre in Italia metodologie e strumenti che altrove sono la norma da anni...
Si attribuisce a Grace Murray Hopper questa celebre massima:
La frase più pericolosa in assoluto è: abbiamo sempre fatto così.
Option Explicit
Private Const SourceColumn As String = "A"
Private Const Separator As String = ","
Public Sub SplitString()
Dim SheetName As String
Dim iSheet As Worksheet
Dim EndRow As Long
Dim MaxULimit As Integer
Dim Output
On Error GoTo SplitStringErr
SheetName = VBA.InputBox("Please Enter Worksheet Name")
If SheetName = "" Then Exit Sub
Set iSheet = Worksheets(SheetName)
With iSheet
EndRow = .Range(SourceColumn & .Rows.Count).End(xlUp).Row
Output = SplittedStrings(iRng:=.Range(.Cells(1, SourceColumn), .Cells(EndRow, SourceColumn)), MaxLength:=MaxULimit)
If Not IsEmpty(Output) Then
.Range(.Cells(1, SourceColumn), .Cells(EndRow, MaxULimit)).value = Output
End If
End With
SplitStringErr:
If Err.Number <> 0 Then MsgBox Err.Description, vbCritical
End Sub
Private Function SplittedStrings(iRng As Range, ByRef MaxLength As Integer) As Variant
Dim i As Integer
Dim Item As Variant
Dim iData As Variant
Dim iValue As Variant
Dim Result As Variant
If Not IsArray(iRng) Then
ReDim iData(1 To 1, 1 To 1)
iData(1, 1) = iRng.value
Else
iData = iRng.value
End If
ReDim Result(LBound(iData) To UBound(iData))
For i = LBound(iData) To UBound(iData)
iValue = iData(i, 1)
If IsEmpty(iValue) Then
GoTo continue
End If
Item = VBA.Split(iValue, Separator)
Result(i) = Item
If UBound(Item) + 1 > MaxLength Then
MaxLength = UBound(Item) + 1
End If
continue:
Next i
If MaxLength = 0 Then
Exit Function
End If
Dim Substring As Variant
Dim x As Integer
ReDim Substring(LBound(Result) To UBound(Result), LBound(Result) To MaxLength)
For i = LBound(Result) To UBound(Result)
Item = Result(i)
For x = 0 To UBound(Item)
Substring(i, x + 1) = Item(x)
Next x
Next i
SplittedStrings = Substring
End Function
Sub SplitStringRange()
Dim iValue As String
On Error Resume Next
If Err.Number <> 0 Then
If iValue = vbRetry Then SplitStringRange
Exit Sub
End If
On Error GoTo 0
End Sub
Sub Pusher(ByVal iStr As String, pSep As String, oRow As Long)
Dim Mappa, mySplit, I As Long
'
Mappa = Array("A", "C", "F") '<<< Colonne di destinazione
mySplit = Split(iStr & pSep, pSep, , vbTextCompare)
If UBound(mySplit) > 0 Then
For I = 0 To UBound(mySplit) - 1
Cells(oRow, Mappa(I)).Value = mySplit(I)
If I >= UBound(Mappa) Then Exit For
Next I
End If
End Sub
Call Pusher(Cells(I, "A").Value, "#", I)
Anthony47 ha scritto:Non so inquadrare il codice della Sub SplitStringRange, così come è non fa niente.
Sub SplitStringRange()
Dim iSheet As Worksheet
Dim iRng As Range
Dim iValue As String
On Error Resume Next
Set iSheet = Worksheets(Application.InputBox(Prompt:="Please Enter Worksheet Name", Title:="Worksheet Name", Default:=ActiveSheet.Name, Type:=2))
If Err.Number <> 0 Then
iValue = MsgBox("Worksheet Not Available", vbRetryCancel)
If iValue = vbRetry Then SplitStringRange
Exit Sub
End If
On Error GoTo 0
Set iRng = (Application.InputBox(Prompt:="Please Select Range to Split", Title:="Range Selection", Default:=Selection.Address, Type:=8))
Set iRng = iSheet.Range(iRng.Address)
iRng.TextToColumns DataType:=xlDelimited, textqualifier:=xlTextQualifierDoubleQuote, consecutivedelimiter:=False, Tab:=False, semicolon:=False, comma:=True, Space:=False, other:=False, fieldinfo:=Array(Array(1, xlYMDFormat))
End Sub
Anthony47 ha scritto:Ma secondo me la cosa e' piu' complicata che arrivare alla codifica vba.
Per quel che vedo, tu (voi) dovete innanzitutto definire uno standard per qualificare il tipo di lettura che si va a fare.
Esempi della mia fantasia, slegati dalla vostra situazione e slagati dai tracciati record che hai pubblicato e di cui mi sono dimenticato:
-Stringa unica (a) per la cella corrente (1)
-stringa unica (a) per la colonna VETTORE (2)
-stringa unica (a) per la colonna TARGA (3)
-stringa unica (a) per la colonna PESO (4)
-stringa multipla (b) per VETTORE /TARGA (5)
-etc
Il tipo di messaggio e relativo attributo devono essere poi inseriti all'interno del codice a barre, e devono rispettare sia lo standard di codifica (non so quali caratteri il codice a barre supporta) che lo standard di lettura excel (es il tasto Esc cancella la scrittura precedente)
Esempio di tipo=a #ZcZ1#U#
Esempio di tipo=b #ZcZ1#M#
Esempio per tipo=1 #ZcZ2##
Esempio per tipo=2 #ZcZ2#VETTORE#
Esempio per tipo=3 #ZcZ2#TARGA#
Etc
Quindi, un paio di esempi di lettura da pistola:
#ZcZ1#U#UniCorriere Milano (ipotetico messaggio che mette nella cella corrente "UniCorriere Milano")
#ZcZ1#M# #ZcZ2#TARGA#CZ111AB #ZcZ2#PESO#10 #ZcZ2#VETTORE#Uniservizi Pisa (ipotetico messaggio che mette CZ111AB nella colonna TARGA, 10 nella colonna PESO e Uniservizi Pisa nella colonna VETTORE
Questa passa al "Pusher" il contenuto di cella A della riga "i", dice che il separatore usato è "#" e il contenuto va rimesso in riga i (nella colonne indicate su Mappa)
Mappa = Array("A", "C", "F") '<<< Colonne di destinazione
Mappa = Array("B", "C", "F", "H") '<<< Colonne di destinazione
If UBound(mySplit) > 0 Then
For I = 0 To UBound(mySplit) - 1
Cells(oRow, Mappa(I)).Value = mySplit(I)
If I >= UBound(Mappa) Then Exit For
Next I
Se il progetto fa fatica a diventare un progetto aziendale
Call Pusher(Cells(I, "B").Value, ",", I)
Torna a Applicazioni Office Windows
Inserimento parziale valore cella in MessageBox Autore: Ricky0185 |
Forum: Applicazioni Office Windows Risposte: 6 |
Inserire dati filtrati da 2 file ad un terzo file Autore: Ricky0185 |
Forum: Applicazioni Office Windows Risposte: 14 |
Codice VBA per stampare UserForm attiva Autore: Carletto Ribolla |
Forum: Applicazioni Office Windows Risposte: 8 |
Perchè l'importazione dati con Selenium non fuziona? Autore: aggittoriu |
Forum: Applicazioni Office Windows Risposte: 7 |
Visitano il forum: Nessuno e 12 ospiti