Ricerca dati partendo da numero



  • Ricerca dati partendo da numero
    di Danros3 (utente non iscritto) data: 15/11/2017 18:13:31

    Buon giorno a tutti.
    Ho un file Excel creato con lo scopo di generare un file CSV contenente variabili per un configuratore di sistema.
    I dati di input da digitare a mano sono molti ma in particolare mi serve aiuto per il codice genset, ad esempio LIM680

    cella A1= codice genset
    dal quale si capisce

    - il costruttore : LI = Mia Ditta
    - il motore: M = MTU
    - la potenza: 680 = 680kVA

    Dalla Potenza, in base al n.s. listino definiamo:
    1.modello di motore.: ho inserito del codice che alla pressione di un tasto apre il file dei motori corretto (in base al codice) e copia tutto il contenuto in un foglio di appoggio "motori_temp". Purtoppo tale tabella per esigenze esterne si sviluppa in orizzontale.
    Mi manca il filtrare i motori che sicuramente non possono essere usati

    2.modello alternatore. Qui ho risolto con un accrocchio di formule e elenchi a discesa in quanto le tabelle sono nel foglio "Dati alternatori"
    3.Vari accessori.: definizione eseguita con semplici formule nel file Excel o nel programma di disegno che legge le variabili a valle delle lavorazioni.

    Per velocizzare la cosa avrei bisogno di un codice che al cambio della cella b2 sul foglio "Dati Input Ge" apra il file dei motori corretto in sola lettura, copi i dati sul fogli temporaneo e mi popoli un elenco a discesa dei vari codici motori che si trovano nel range "Engine model" in c4:c100 selezionando in automatico solo i motori della potenza (riga "KVA PRP ISO8528-3046") che si discosta di un -5:+15% da quella impostata. (ad esempio un genset da 680 può avere un motore MTU da 670, da 700 o da 800). Inoltre nell'elenco a discesa devono comparire anche altri valori per identificare la potenza del motore come "Engine power PRP". Una volta selezionato il motore corretto il codice deve copiare tutti i dati relativi a questo presenti sul foglio "Motori" anch'esso presente sul file XLM (che avrei potuto allegare ma non ho trovato il bottone attivo, forse perché non sono registrato?).


     
    Sub Copia_dati_motori()
    
    Dim MOT As String
    Dim LIA As String
    Dim LIC As String
    Dim LID As String
    Dim LII As String
    Dim LIM As String
    Dim LIO As String
    Dim LIP As String
    Dim LIR As String
    Dim LIS As String
    Dim LIT As String
    Dim LIV As String
    
    Windows("generazione schema automatica.xlsm").Activate
    '   pulisce foglio temporaneo
            Sheets("motori_temp").Select
            Cells.Select
            Cells.Delete
    
    Application.ScreenUpdating = False
    
    MOT = Worksheets("NN touch").Range("b3").Value
    
    LIA = Worksheets("NN touch").Range("b4").Value
    LIC = Worksheets("NN touch").Range("b5").Value
    LID = Worksheets("NN touch").Range("b6").Value
    LII = Worksheets("NN touch").Range("b7").Value
    LIM = Worksheets("NN touch").Range("b8").Value
    LIO = Worksheets("NN touch").Range("b9").Value
    LIP = Worksheets("NN touch").Range("b10").Value
    LIR = Worksheets("NN touch").Range("b11").Value
    LIS = Worksheets("NN touch").Range("b12").Value
    LIT = Worksheets("NN touch").Range("b13").Value
    LIV = Worksheets("NN touch").Range("b14").Value
    
    If MOT = LIA Then
    LIA_1
    GoTo Fine_Ricerca
    End If
    If MOT = LIC Then
    LIC_1
    GoTo Fine_Ricerca
    End If
    If MOT = LID Then
    LID_1
    GoTo Fine_Ricerca
    End If
    If MOT = LII Then
    LII_1
    GoTo Fine_Ricerca
    End If
    If MOT = LIM Then
    LIM_1
    GoTo Fine_Ricerca
    End If
    If MOT = LIO Then
    LIO_1
    GoTo Fine_Ricerca
    End If
    If MOT = LIP Then
    LIP_1
    GoTo Fine_Ricerca
    End If
    If MOT = LIR Then
    LIR_1
    GoTo Fine_Ricerca
    End If
    If MOT = LIS Then
    LIS_1
    GoTo Fine_Ricerca
    End If
    If MOT = LIT Then
    LIT_1
    GoTo Fine_Ricerca
    End If
    If MOT = LIV Then
    LIV_1
    GoTo Fine_Ricerca
    Else: MsgBox ("Tipo o file motore non trovato")
    GoTo Fine_Sub
    End If
    
    Fine_Ricerca:
    
    Windows("generazione schema automatica.xlsm").Activate
    Sheets("motori_temp").Select
    
    'Ordinamento dati
        Columns("A:AG").Select
            ActiveWorkbook.Worksheets("motori_temp").Sort.SortFields.Clear
            ActiveWorkbook.Worksheets("motori_temp").Sort.SortFields.Add Key:=Range( _
                "A1:A43"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
                xlSortNormal
            With ActiveWorkbook.Worksheets("motori_temp").Sort
                .SetRange Range("A1:BA200")
                .Header = xlGuess
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
            End With
    
    Range("A1").Select
    
    Sheets("Dati input GE").Select
    Fine_Sub:
    
    Application.ScreenUpdating = True
    
    End Sub



  • di patel data: 15/11/2017 19:29:43

    Secondo me sarebbe meglio avere tutti i dati su fogli diversi dello stesso documento invece che su file diversi, comunque non ho capito su quale punto ti sei arenato





  • di Zer0Kelvin data: 16/11/2017 03:00:19

    Ciao.
    Come PAtel non ho capito dove si trova l'intoppo.
    Riguardo al codice che hai postato, se ho capito bene il meccanismo, penso che lo puoi semplificare così (vedi sotto).
    La procedura LI_GEN sostituisce tutte le procedure contenute in Modulo9.
    Dopotutto l'unica differenza è la stringa di percorso del file da aprire e la parte variabile del percorso viene passata come parametro.
    Il parametro viene ricavato dai valori in colonna A del foglio NN touch.
    Purtroppo, non avendo a disposizione i files necessari non ho modo di testarla, ma dovrebbe funzionare senza problemi.
     
    Sub LI_GEN(lCod As String)
    Dim Riepilogo As Workbook
        Set Riepilogo = Workbooks.Open(Filename:= _
            "\srvdatidati su Serveruff.tecnicoSCHEDE TECNICHE GRUPPI 2017Tabelle motori " & lCod & _
            "Riepilogo " & lCod & ".xlsx", Notify:=False, ReadOnly:=True)
        Rows("1:100").Copy
        Windows("generazione schema automatica.xlsm").Activate
        Sheets("motori_temp").Range("a1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
                SkipBlanks:=False, Transpose:=False
        Cells.EntireColumn.AutoFit
        Cells.EntireRow.AutoFit
        With Application
            .DisplayAlerts = False
            Riepilogo.Close SaveChanges:=False
            .DisplayAlerts = True
        End With
        Set Riepilogo = Nothing
    End Sub
    
    Sub Copia_dati_motori()
    Dim MOT As String, LIcod As String, LIfind As Range
        Windows("generazione schema automatica.xlsm").Activate
    '   pulisce foglio temporaneo
        Sheets("motori_temp").Cells.Delete
        Application.ScreenUpdating = False
        With Worksheets("NN touch")
            MOT = .Range("b3").Value
            Set LIfind = .Range("B4:B" & .Range("B4").End(xlDown).Row).Find(MOT, LookIn:=xlValues)
        End With
        If LIfind Is Nothing Then
            MsgBox ("Tipo o file motore non trovato")
        Else
            LI_GEN (LIfind.Offset(0, -1))
            Windows("generazione schema automatica.xlsm").Activate
            Sheets("motori_temp").Select
    'Ordinamento dati
            Columns("A:AG").Select
            ActiveWorkbook.Worksheets("motori_temp").Sort.SortFields.Clear
            ActiveWorkbook.Worksheets("motori_temp").Sort.SortFields.Add Key:=Range( _
                "A1:A43"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
                xlSortNormal
            With ActiveWorkbook.Worksheets("motori_temp").Sort
                .SetRange Range("A1:BA200")
                .Header = xlGuess
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
            End With
            Range("A1").Select
            Sheets("Dati input GE").Select
        End If
        Application.ScreenUpdating = True
    End Sub
    



  • di Zer0Kelvin data: 16/11/2017 03:10:46

    PS: Inoltre, in questo modo, se si aggiungono altre righe nell'elenco del foglio NN touch, non c'è bisogno di modificare le macro.



  • di danros3 data: 16/11/2017 08:55:09

    Grazie per il codice. Purtroppo mi sto appassionando ora della cosa e non dimestichezza quindi sicuramente quanto fatto è perfettibile.
    Per rispondere a Patel : devo avere i file su zone del server distinte in quanto accedono anche utenti esterni all'azienda (costruttori dei motori) e non possiamo fornire accesso alla "zona del server" con i file operativi. Mi sono arenato nel filtro.

    Ringrazio moltissimo Zer0Kelvin per il codice allegato, lo implementerò subito. I file mancanti possono anche non essere inviati in quanto nel foglio "motori_temp" è già presente una tabella dei motori Mitsubishi esattamente come si presenta sul file originale. Come notate il mio codice originale copiava i dati e li ordinava in base al contenuto della colonna A. I dati che a me servono al momento sono le prime 21 righe (anche se vuote)

    Ho la necessità che al cambio della cella b2 foglio "Dati input GE" la macro si attivi in automatico e copi i dati dal file esterno.
    Partendo da quanto allegato e confermando che quanto sopra (automazione del cambio cella b2 a parte) è già stato fatto, mi serve aiuto nel codice per ricercare quanto presente sul foglio "Dati input GE" cella B3.
    Vorrei ottenere nel foglio principale "Dati input GE" un elenco a discesa dei vari codici motori presenti nel foglio "motori_temp" che si trovano nel range "Engine model" in c4:c100 filtrandolo in automatico solo con i motori della potenza (riga "KVA PRP ISO8528-3046") che si discosta di un -5:+15% da quella impostata. (ad esempio un genset da 680 può avere un motore Mitsubishi da 670, da 700 o da 800). Inoltre nell'elenco a discesa devono comparire anche altri valori per identificare la potenza del motore come "Engine power PRP". Una volta selezionato il motore corretto il codice deve copiare tutti i dati relativi a questo presenti sul foglio "Motori" anch'esso presente sul file XLM. Ho fatto un filtro negli alternatori con formule ma non è preciso. inoltre non mi seleziona sempre il prodotto più vicino al mio targhet. Farlo sui motori non sono proprio riuscito data la complessità e il numero delle esterne da interrogare.

    Ps: se potesse essere più semplice potrei modificare il codice affinché copi tutti i dati di tutti i motori in 9 (al momento) fogli aggiuntivi e poi il codice si va a pescare e filtrare per marca e potenza..

    Spero di essere stato chiaro.
    ringrazio moltissimo quanti avranno la pazienza di aiutarmi.



  • di Zer0Kelvin data: 16/11/2017 09:42:54

    Intanto occorre andare per gradi, risolvendo un problema alla volta.
    Per il momento non ho molto tempo quindi mi limito a due cosette.
    In modulo1 vedo la routine Workbook_Open (che è un gestore di eventi).
    Questa andrebbe messa nel modulo di codice di Questa_cartella_di_lavoro.
    Per eseguire automaticamente qualcosa al modificarsi di una cella si usa Worksheet_Change (altro gestore di eventi) che va inserito nel modulo del foglio interessato.
    Nel tuo caso, se ho capito bene, verrebbe qualcosa di simile

     
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Cells.Count = 1 And Target.Address = "$B:$B3" Then 'se si modifica la cella B3
            Application.EnableEvents = False
            '<<== inseriesci qui quello che vorresti eseguire
            Application.EnableEvents = True
        End If
    End Sub
    



  • di danros3 data: 16/11/2017 09:47:25

    Fantastico. Questo mi risolve altre 2 rogne nello stesso file.



  • di danros3 data: 16/11/2017 11:47:18

    Ciao
    Ho aggiunto la definizione
    lCod = Range("a2").Value ad inizio LI_Gen() altrimenti si bloccava.

    Poi, scusate l'ignoranza ma il debug mi si ferma alla riga
    LI_GEN (LIfind.Offset(0, -1)) con errore: Numero errato di argomenti o assegnazione di proprietà non valida. (sotto riporto il codice inserito nel modulo)

    non capisco dato che LIfind è definito così come LI_GEN

    ps: altra domanda: come fate a postare il codice così compatto mentre se lo posto io appare con uno spazio tra ogni riga?

     
    Sub LI_GEN()
    Dim Riepilogo As Workbook, lCod As String
    Sheets("NN touch").Select
    lCod = Range("a2").Value
        Set Riepilogo = Workbooks.Open(Filename:= _
            "\srvdatidati su Serveruff.tecnicoSCHEDE TECNICHE GRUPPI 2017Tabelle motori " & lCod & _
            "Riepilogo " & lCod & ".xlsx", Notify:=False, ReadOnly:=True)
        Rows("1:100").Copy
        Windows("generazione schema automatica.xlsm").Activate
        Sheets("motori_temp").Range("a1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
                SkipBlanks:=False, Transpose:=False
        Cells.EntireColumn.AutoFit
        Cells.EntireRow.AutoFit
        With Application
            .DisplayAlerts = False
            Riepilogo.Close SaveChanges:=False
            .DisplayAlerts = True
        End With
        Set Riepilogo = Nothing
    End Sub
    
    Sub Copia_dati_motori()
    
    Dim MOT As String, LIcod As String, LIfind As Range
        Windows("generazione schema automatica.xlsm").Activate
    'pulisce foglio temporaneo
        Sheets("motori_temp").Cells.Delete
        Application.ScreenUpdating = False
        With Worksheets("NN touch")
            MOT = .Range("b3").Value
            Set LIfind = .Range("B4:B" & .Range("B4").End(xlDown).Row).Find(MOT, LookIn:=xlValues)
        End With
        If LIfind Is Nothing Then
            MsgBox ("Tipo o file motore non trovato")
        Else
            LI_GEN (LIfind.Offset(0, -1))
            Windows("generazione schema automatica.xlsm").Activate
            Sheets("motori_temp").Select
    'Ordinamento dati
            Columns("A:AG").Select
            ActiveWorkbook.Worksheets("motori_temp").Sort.SortFields.Clear
            ActiveWorkbook.Worksheets("motori_temp").Sort.SortFields.Add Key:=Range( _
                "A1:A43"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
                xlSortNormal
            With ActiveWorkbook.Worksheets("motori_temp").Sort
                .SetRange Range("A1:BA200")
                .Header = xlGuess
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
            End With
            Range("A1").Select
            Sheets("Dati input GE").Select
        End If
        Application.ScreenUpdating = True
    End Sub
    



  • di Zer0Kelvin data: 16/11/2017 14:44:28

    Ti da errore perchè hai tolto il parametro dalla definizione della routine LI_GEN.
    Cosa intendi quando dici che ti si bloccava?
    Che errore dava, ed in che punto?
    Sarebbe meglio se tu fornissi almeno il file Riepilogo LII.xlsx per poter testare il codice.

    Altro suggerimento: tutti quei select ed activate sono quasi sempre inutili. E' il tipo di codice che viene generato dal registratore di macro, ma quando si programma in genere si procede diversamente (vedi esempio)
     
    'Esempio
        Rows("1:100").Select
        Selection.Copy
    'Equivale a
        Rows("1:100").Copy



  • di Luca73 data: 16/11/2017 14:46:17

    Noto che
    Sub LI_GEN()
    è una sub senza argomenti ma poi la richiami come
    LI_GEN (LIfind.Offset(0, -1))
    con un parametro e questo ti dà errore.
    Ciao
    Luca





  • di danros3 data: 16/11/2017 16:00:21


    Allego i vari file, in cui ho anche inserito la possibilità che mi copi le prime 21 righe dal foglio "motori temp" sul foglio "motori" trasponendo i dati.
    senza il codice sottostante mi copiava sempre la riga 21 e la metteva nella prima colonna
    X Zer0Kelvin : hai ragione. ora ho sistemato.
    X Luca73: a causa del mio errore LI_GEN non veniva definita...

     
    'cancellazione prima riga e colonna
            Rows("1:1").Select
            Application.CutCopyMode = False
            Selection.Delete Shift:=xlUp
            Columns("A:A").Select
            Application.CutCopyMode = False
            Selection.Delete Shift:=xlUp
    'Grazie per le info per semplificare: fammi capire
    ' se inserisco
        Sheets("Dati input GE").Range("F1:M100").Copy
    'al posto del codice seguente funziona??
     Sheets("Dati input GE").Select
     Range("F1:m100").Select
     Selection.Copy
    



  • di danros3 data: 16/11/2017 16:06:42

    Mi serve l'ultimo aiuto, appena potete, per filtrare i motori in base alla potenza in modo da copiare solo i dati del motore selezionato pur mantenendo copia dei dati sul foglio "motori_temp".
    Avevo pensato di eseguire dei filtri con formule ma mi trova sempre il valore inferiore di quanto cercato e mi costringe, come nel foglio alternatori, a scegliere a mano tra 5 (entro questi 5 sicuramente ho quello giusto ma devo sapere io qual'è): L'obiettivo è dare il foglio ai commerciali che poco ne sanno.

    Ancora mille grazie



  • di Zer0Kelvin data: 16/11/2017 20:35:54

    Riguardo questa domanda, sì, è esattamente la stessa cosa, ed il codice è più efficiente.
    Sono rari i casi in cui è veramente necessario selezionare o attivare un oggetto di Excel.
     
    'Grazie per le info per semplificare: fammi capire
    ' se inserisco
        Sheets("Dati input GE").Range("F1:M100").Copy
    'al posto del codice seguente funziona??
     Sheets("Dati input GE").Select
     Range("F1:m100").Select
     Selection.Copy



  • di danros3@gmail.c data: 16/11/2017 22:03:48

    Grazie 1000 per la risposta. Mi aiuterà semplificare tutto il codice negli altri fogli che ho al lavoro.
    I lo filtro sui motori l'ho fatto con formule. Ma non mi piace e lo vorrei semplificare. Quando avete la possibilità e quando potete aiutarmi sono qua grazie.



  • di Zer0Kelvin data: 16/11/2017 23:23:26

    Io purtroppo non ho dimestichezza coi filtri, magari qualche altra anima pia...



  • di danros3 data: 17/11/2017 14:32:11

    Giusto per capire:
    Sheets("NN touch").Select
    lCod = Range("d1").Value

    non è la stessa cosa di
    lCod = Sheets("NN touch").Range("a2").Value

    Perdonami ma la mia conoscenza è veramente scarsa.



  • di Zer0Kelvin data: 17/11/2017 14:48:58

    Sheets("NN touch").Select
    lCod = Range("a2").Value

    è la stessa cosa di

    lCod = Sheets("NN touch").Range("a2").Value