Originariamente Scritto da
stealth_ema
Ciao a tutti,
La mia richiesta è questa:
Ho un foglio Excel della mia azienda, contenente i dati di vari prodotti: lo dovrei confrontare con quello di un fornitore (confronto il campo "codice prodotto") ed estrapolare il prezzo dal file del fornitore e sostituirlo a quello nel nostro. Dopodichè, se il prezzo è cambiato colorare la cella "prezzo" di rosso, se non lo è lasciarla così, se il prodotto è assente nel nostro database il campo diventa verde.
Secondo voi è fattibile? E con quale operazione? Bastano le formule "base" di Excel o serve scrivere codice in VBA? Aggiungo che saranno almeno 10 anni che non tocco questo linguaggio; quindi se poteste spiegarmi la cosa in maniera molto basica ve ne sarei grato.
Grazie e un saluto.
P.S.: e' davvero questione di vita o morte, buona parte delle mie possibilità di essere assunto passano da qui!
Via formula potrebbe essere fattibile se cambi un po' il tipo di risultato ottenuto (invece che sovrascrivere direttamente le celle, aggiungere in due nuove colonne differenti il prezzo modificato e la casellina colorata).
Vedi ad esempio questo articolo e quelli correlati:
http://www.mbaexcel.com/excel/how-to-use-vlookup/
Non ho esperienza diretta di questo perchè non essendo un esperto di Excel ma sapendo invece programmare, per queste cose passo diretto a VBA anche quando magari ci sarebbero sistemi senza macro
In VBA, per l'appunto, è comunque relativamente semplice; ti butto giù un esempio proprio "alla maledetta", non è particolarmente efficente su grandi quantità di dati ma dovrebbe funzionare:
Codice:
Option Explicit
Sub Confronta()
'Le colonne che contengono i due dati di riferimento (codice/importo)
Const COLONNA_CODICE_FORNITORE As String = "A"
Const COLONNA_IMPORTO_FORNITORE As String = "D"
Dim bookFornitore As Workbook
Dim sheetFornitore As Worksheet
Dim rangeFornitore As Range
Dim codFornitore As String
Dim valoreAzienda As String 'o Double/Currency o quello che e', dipende dal tipo di cella...
Dim row As Long
Set bookFornitore = Workbooks.Open("C:\fornitore.xlsx")
Set sheetFornitore = bookFornitore.Worksheets(1) 'o l'indice corretto del foglio che ti interessa, se non è il primo
'Qui metti codice di controllo su eventuali errori di apertura ecc... ecc..
'ciclo su tutto il foglio fintanto che la colonna col codice non è vuota
'nota bene: se il foglio ha dei "buchi" nelle righe, allora devi trovare un'altro sistema per capire quando interrompere
row = 1
Do
codFornitore = sheetFornitore.Range(COLONNA_CODICE_FORNITORE & row).Value
Set rangeFornitore = sheetFornitore.Range(COLONNA_IMPORTO_FORNITORE & row)
valoreAzienda = Lookup_Codice(codFornitore)
If Len(valoreAzienda) > 0 Then
'trovato
rangeFornitore.Value = valoreAzienda
rangeFornitore.Interior.Color = RGB(255, 0, 0)
Else
'non trovato
rangeFornitore.Interior.Color = RGB(0, 255, 0)
End If
row = row + 1
Loop Until Len(codFornitore) = 0
Set sheetFornitore = Nothing
bookFornitore.Close
Set bookFornitore = Nothing
MsgBox "Confronto completato", vbInformation
End Sub
Function Lookup_Codice(codFornitore As String) As String 'o Double/Currency o quello che e', dipende dal tipo di cella...
'Le colonne che contengono i due dati di riferimento (codice/importo) del TUO foglio
Const COLONNA_CODICE_AZIENDA As String = "D"
Const COLONNA_IMPORTO_AZIENDA As String = "E"
Dim sheetAzienda As Worksheet
Dim codAzienda As String
Dim row As Long
Set sheetAzienda = Workbooks(1).Worksheets(1) ' o l'indice corretto del foglio che ti interessa, se non è il primo
'Vedi commenti all'altro ciclo
row = 1
Do
codAzienda = sheetAzienda.Range(COLONNA_CODICE_AZIENDA & row).Value
'se i due codici corrispondono, restituiamo il contenuto della seconda colonna e usciamo dal ciclo
If StrComp(codAzienda, codFornitore, vbTextCompare) = 0 Then
Lookup_Codice = sheetAzienda.Range(COLONNA_IMPORTO_AZIENDA & row).Value
Exit Do
End If
row = row + 1
Loop Until Len(codAzienda) = 0
'Se arrivi qui, il codice non e' stato trovato, usciamo con valore vuoto
End Function