database per prelievo materiali



  • database per prelievo materiali di andsal data: 12/11/2016 20:03:31

    Salve a tutti,
    devo chiedervi un grande aiuto in ambito VBA per la realizzazione di una cartella excel che mi permetta di (1) registrare la posizione di allocazione di determinati materiali con codice, (2) interrogare il database per sapere dove questi materiali si trovano e (3) registrare la data di prelievo di questi materiali.
    Tale cartella mi servirebbe sul lavoro, dove l'attività di allocazione di questi materiali avverrebbe servendosi di uno scanner ottico per la lettura del codice a barre dei materiali e del codice a barre degli scaffali dove tali materiali si collocano e di un tablet sul quale gira excel in cui inserisco i codici scansionati all'interno di una tabella. Al momento del prelievo, dispongo di un foglio cartaceo su cui sono stampati i codici a barre dei materiali da prelevare: scansionando questi codici a barre (inserendoli su excel), dovrebbe essermi restituita l'informazione di dove tali materiali si trovano. Per prelevarli poi, ci deve essere un tasto di conferma o di annullamento dell'operazione.
    Tale attività dovrebbe essere svolta nella maniera più user friendly possibile.

    So che si tratta di un'attività abbastanza impegnativa, ma qualsiasi aiuto in merito sarà bene accetto.

    Io finora sono riuscito a realizzare rispettivamente:
    - per il punto (1) la tabella in cui inserisco i codici materiali con lo scaffale dove il singolo materiale è riposto con la cella a fianco in cui automaticamente si scrive l'istante in cui è stata effettuata tale allocazione;
    - per il punto (2) una griglia in cui scrivo i codici e che attraverso una semplice vlookup mi cerca il rispettivo scaffale.

    A questo punto incontro la prima difficoltà: siccome ci sono più materiali identici con lo stesso codice come fare perchè nella griglia in cui inserisco i codici da prelevare la vlookup mi restituisca il codice dello scaffale del secondo materiale e non sempre del primo che la funzione incontra?
    Dopodichè, come posso creare una macro che con un tasto mi faccia prelevare la sequenza di materiali inserita nella griglia, e quindi scaricarli dalla tabella di allocazione registrandoli in quella di prelievo avvenuto?

    Se non sono stato chiaro, prego chiedetemi.

    Vi ringrazio anticipatamente per l'aiuto.

    Buona serata


  • di tanimon data: 13/11/2016 10:22:51

    ciao, allega il tuo file con poche righe per foglio se presenti più fogli e senza dati sensibili
    specificando il risultato che intendi ottenere.

    Per i materiali con stesso codice, bisognerà renderli univoci.....
    con quale criterio, l'operatore umano, ne discerne le differenze?
    La risposta alla domanda potrebbe essere una alternativa per farlo.

    Per quanto riguarda l'intero progetto, che per quanto ho capito è relativamente complesso,
    come detto allega un file esplicativo ricordando che il problema maggiore consiste nella tua conoscenza
    di Vba sia per crearlo che per la successiva gestione in caso di cambiamenti e/o correzioni/migliorie vorrai apportare.

    Considera infine,
    che un Forum aiuta per piccole porzioni di progetti e non per il progetto che si intende realizzare.
    Per questo c'è chi lo fa bene a pagamento tant'è che fornisce spesso anche l'assistenza post vendita

    Ciao
    Frank


  • di andsal data: 13/11/2016 13:24:19

    ciao tanimon, grazie per la risposta innanzitutto...

    non c'è un criterio di prelievo da parte dell'operatore se non ottimizzare un percorso di prelievo e utilizzare una logica fifo dello stock di materiale...

    il file in allegato è la prima versione che ho realizzato: la sua evoluzione deve essere che nel foglio "PRELIEVO" ci dovrebbero essere almeno 20 righe così da poter prelevare le buste di materiale in una sola sequenza di prelievo...

    In effetti, anche se il progetto è complesso nell'insieme, l'aiuto che vi chiedo è in prima istanza circoscrivibile alla parte di creazione della sequenza di prelievo...cioè dove al momento mi sono impantanato

    grazie ancora


  • di tanimon data: 14/11/2016 22:07:01

    ciao
    cit.
    ........non c'è un criterio di prelievo da parte dell'operatore se non ottimizzare un percorso di prelievo e utilizzare una logica fifo dello stock di materiale... "

    ed il criterio quindi lo abbiamo trovato...

    non ho provato,
    ma se con questo criterio ed a pari data, è almeno diverso l'orario di carico,
    una volta ordinata la colonna data/orario dal più vecchio al più recente (fifo),
    il materiale con stesso codice diventa univoco con il criterio della data/orario di carico.

    Imposta il Find con criterio la data/orario e dovrebbe funzionare.......

    un passo alla volta...... e vedrai che ci arrivi


    Ciao
    Frank


  • di andsal (utente non iscritto) data: 15/11/2016 15:58:15

    ciao Frank,
    e se su stessi codici di materiali ho anche stessa data e orario di carico (cosa molto probabile in realtà)?
    Anche in questo caso il find mi permetterebbe di creare una sequenza con più materiali con lo stesso codice?

    Io ho pensato ad un espediente del tipo: una volta scritto il codice del materiale nella cella per il prelievo, la funzione match trova il primo valore e poi una private sub mi taglia quella riga e la incolla momentaneamente in un foglio di appoggio. In un secondo momento, se il prelievo viene confermato, la riga dal foglio di servizio deve essere spostata nel foglio database di prelievo; altrimenti riscritta nella tabella dei materiali stoccati.

    Cosa ne pensi?


  • di tanimon data: 15/11/2016 22:54:55

    ciao
    innanzi tutto penso che i materiali devono essere resi univoci:
    il Find sicuramente, e per quello che ne so anche il Match (anche se non ho mai avuto la necessità di usarlo), fermano la ricerca al primo risultato che rispetta il criterio di ricerca......
    potresti renderli univoci assegnando un Id nella fase di carico..... ed impostare un find
    a due criteri Id/materiale

    per il passaggio successivo, l'uso di un foglio di appoggio può essere una valida scelta che deve essere però dettata dall'obiettivo da realizzare ed in ogni caso dopo avere risolto il primo punto.

    Spezza il problema in problemi più piccoli e risolvili uno alla volta senza dimenticarne
    la priorità/sequenza di elaborazione.

    Ciao
    Frank


  • di andsal (utente non iscritto) data: 06/12/2016 17:07:19

    Buonasera,
    allora sono riuscito a avere qualche risultato dal codice sotto.
    Tuttavia per i record inseriti dalla riga 10 in poi mi salta di due in due.
    Quale può essere il motivo?

    Grazie mille
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    
        Dim rng As Range
        Dim valore As Integer
        Dim check As Integer
        Dim valore2 As Integer
        
        Set rng = Me.Range("A:A")
        
        
        
        On Error Resume Next
        check = Range("A1", "A" & Target.Row).Find(Target.Value, After:=Range("A" & Target.Row), SearchDirection:=xlPrevious, MatchCase:=True).Row
        valore = Application.WorksheetFunction.Match(Target.Value, Sheets("ALLOCAZIONE").Range("A1", "A" & Rows.Count), 0)
        valore2 = Sheets("ALLOCAZIONE").Range("A" & Range("G" & check).Value + 1, "A" & Rows.Count).Find(Target.Value, MatchCase:=True).Row
    
        
        If Not Intersect(rng, Target) Is Nothing Then
        Target.Offset(0, 3).Value = check
        If check = Target.Row Then
        Target.Offset(0, 6).Value = valore
        Target.Offset(0, 10).Value = Sheets("ALLOCAZIONE").Range("B" & valore).Value
        ElseIf Range("G" & check).Value = 0 Then
        ActiveSheet.Select
        Else
        Target.Offset(0, 6).Value = valore2
        Target.Offset(0, 5).Value = Range("G" & check).Value + 1
        Target.Offset(0, 11).Value = Sheets("ALLOCAZIONE").Range("B" & valore2).Value
        End If
        End If
     End Sub
    


  • di andsal (utente non iscritto) data: 06/12/2016 17:27:19

    Di nuovo buonasera,
    mi sembra di aver risolto il problema modificando di poco il codice.
    Qui di seguito il nuovo codice, con qualche abbreviazione.

    Ora segue la fase del prelievo delle buste.

    Ditemi cosa ne pensate e se vi sembra abbastanza robusto...

     
    Private Sub Worksheet_Change(ByVal Target As Range)
    
        Dim rng As Range
        Dim valore As Integer
        Dim check As Integer
        Dim valore2 As Integer
        
        Set rng = Me.Range("A:A")
        
        
        
        On Error Resume Next
        check = Range("A1", "A" & Target.Row).Find(Target.Value, After:=Range("A" & Target.Row), SearchDirection:=xlPrevious, MatchCase:=True).Row
        valore = Application.WorksheetFunction.Match(Target.Value, Sheets("ALLOCAZIONE").Range("A1", "A" & Rows.Count), 0)
        valore2 = Sheets("ALLOCAZIONE").Range("A" & Range("G" & check).Value, "A" & Rows.Count).Find(Target.Value, MatchCase:=True).Row
    
        
        If Not Intersect(rng, Target) Is Nothing Then
        If check = Target.Row Then
        With Target
        .Offset(0, 6).Value = valore
        .Offset(0, 1).Value = Sheets("ALLOCAZIONE").Range("B" & valore).Value
        .Offset(0, 2).Value = Sheets("ALLOCAZIONE").Range("C" & valore).Value
        End With
        ElseIf Range("G" & check).Value = 0 Then
        ActiveSheet.Select
        ElseIf valore2 = Range("G" & check).Value Then
        ActiveSheet.Select
        Else
        With Target
        .Offset(0, 6).Value = valore2
        .Offset(0, 1).Value = Sheets("ALLOCAZIONE").Range("B" & valore2).Value
        .Offset(0, 2).Value = Sheets("ALLOCAZIONE").Range("C" & valore2).Value
        End With
        End If
        End If
     End Sub