Ricerca dati partendo da numero
Hai un problema con Excel? 
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.tecnico SCHEDE 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.tecnico SCHEDE 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
Vuoi Approfondire?