|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ciao, devo risolvere un problema di Archivio di Magazzino, che tengo con Excel: devo evidenziare delle righe che contengono dei dati specifici. In particolare: in col.B ho dei CODICI DI MAGAZZINO (sono questi i miei dati particolari intorno ai quali intendo lavorare...), nelle successive colonne ho i codici dei prodotti e poi a seguire le relative quantità riferite a ciascuno scaffale del magazzino. Per ottimizzare il magazzino ho bisogno di evidenziare nello storico quelle righe che si riferiscono a codici di magazzino vicini tra loro, entro la decina, bordando interamente le righe interessate. Il tutto servendomi di una macro dedicata che lavori in un intervallo di righe da inserire di volta in volta (a seconda dell'esigenza) nel VBA della macro ... allego una FOTO per farmi capire meglio :)) Un GRAZIE anticipato... ;) eZio
|
|
|
|
|
Rank: AiutAmico
Iscritto dal : 12/4/2008 Posts: 2,008
|
Prova a vedere se con Formato > Formattazione condizionale riesci a risolvere.
Puoi impostare un formato in base a delle determinate condizioni che tu imposti.
Il limite massimo è di 3 condizioni.
Ciao
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Grazie del consiglio, simo... ho provato, con la formattazione condizionale... ma come per altre cose (che ho chiesto qui nel forum e che mi avete risolto in modo egregio- un Grazie specialissimo a a10n11/Andrea) preferisco di gran lunga affidare l'arduo lavoro a una macro "dedicata"... E' tutta un'altra musica... ;)
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve a prima vista potrebbe sembrare semplice ma non troppo.. 1) che tipo di formato sono le celle di colonna B ?? 30'49 che arzigogolo di formato hai utilizzato? 2) perchè la riga 17 non è compresa nella decina?? Riga 16 (28'70) Riga 17 (28'61) saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
a10n11 ha scritto:salve a prima vista potrebbe sembrare semplice ma non troppo.. 1) che tipo di formato sono le celle di colonna B ?? 30'49 che arzigogolo di formato hai utilizzato? 2) perchè la riga 17 non è compresa nella decina?? Riga 16 (28'70) Riga 17 (28'61) saluti Giap Salve, hai ragione... sembra facile, ma in realtà bisogna saper smanettare con grande maestria nel linguaggio VBA... ;) quel formato è dovuto ad un'esigenza tecnico-operativa: in pratica quei codici di magazzino sono impostati in quel modo per una estrema comodità interna. Diciamo che nel caso di 30'49 il 30 è un insieme (ad es. un motore, catalogato come 30 nel ns. dBase) e il 49 è riferito al 49^ pezzo (ad es. una biella, catalogata come 49^ paezzo dell'insieme 30 nel ns. dBase) di quell'insieme (il 30, appunto). Si va da XX'01 a (ad esempio) XX'156 e poi di seguito vi sarà il X(X+1)'01 [ma non è detto che sia necessariamente il X(X+1), potrebbe essere il X(X+5) o altro, dipende dalla circostanza specifica dato che per quell'elenco di magazzino ho dovuto operare una selezione mediante un filtro automatico] e via dicendo... Per quanto riguarda la riga 17 hai pienamente ragione, non ti è sfuggito, si tratta di un errore dovuto alla "manualità" dell'operazione che purtroppo per mia somma ignoranza in materia di VBA sono costretto a fare... ecco spiegato il motivo dell'esigenza di una macro che con precisione chirurgica individua ed evidenzia quelle particolari situazioni, peraltro abbastanza frequenti. Come hai sicuramente notato, ho anche colorato con colori diversi le varie "decine", che altrimenti sarebbero difficilmente evidenziabili a vista d'occhio con le semplici bordature... basta vedere le righe da 36 a 42 per rendersene conto... molto probabilmente sarà possibile istruire il prg. affinché esegua nel contempo, quando è necessario, quell'operazione... Detto in parole strapovere, in pratica da un elenco filtrato e "confezionato" in quel modo bisogna evidenziare quei codici (la macro lavora su di loro in pratica, di volta in volta, tutti gli altri dati della riga ne vengono inclusi per ovvietà) appartenenti allo stesso gruppo che distano tra di loro meno di una decina... e nel caso vi siano "ingrovigliamenti" dovuti alla presenza contemporanea di parecchi codici molto ravvicinati bisogna aiutare l'immediata lettura servendosi dei colori, che separano le varie decine tra loro... spero di essere stato sufficientemente chiaro... Grazie infinite, eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve copia la macro che segue su un file di prova. Esegui la macro e vedi se risponde alle tue necessità. NB. Tieni conto che la macro utilizza le colonne CV:CW:CX come appoggio per l'elaborazione dei dati. Pertanto se dette colonne sono utilizzate, cambia i riferimenti nella macro. Code: Sub EVIDENZIA() Application.ScreenUpdating = False With Range("b2:CN1000").Borders .LineStyle = xlNone End With Uriga = Cells(Cells.Rows.Count, 2).End(xlUp).Row For n = 2 To Uriga myvalue = Cells(n, 2).Value Cells(n, 100).Value = CLng(Mid(myvalue, InStr(1, myvalue, "'") + 1, 3)) Next n For A = 2 To Uriga Prn = Cells(A, 100).Value Prs = Cells(A + 1, 100).Value Cells(A, 101).Value = Abs(Prn - Prs) If Cells(A, 101).Value <= 10 Then Cells(A, 102).Value = "x" Cells(A + 1, 102).Value = "x" End If Next A For I = 2 To Uriga If Cells(I, 102).Value = "x" Then Nr = Cells(I, 102).Row Cnt = Cnt + 1 ctrl = True Else If ctrl Then Range(Cells(Nr - Cnt + 1, 2), Cells(Nr, 92)).Select Selection.Borders.Weight = xlMedium Selection.Borders.LineStyle = xlContinuous Selection.Borders(xlInsideVertical).LineStyle = xlNone Selection.Borders(xlInsideHorizontal).LineStyle = xlNone Range(Cells(Nr - Cnt + 1, 102), Cells(Nr, 102)).ClearContents Cnt = 0 Nr = 0 ctrl = False End If End If Next Columns("CV:CW").ClearContents Range("a1").Select Application.ScreenUpdating = True End Sub
saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Innanzi tutto... Grazie!!
ho provato la macro, ma si pianta alla riga Cells(n, 100).Value = CLng(Mid(myvalue, InStr(1, myvalue, "'") + 1, 3)) con messaggio di errore: Errore di run-time'13' - Tipo non corrispondente
Nel frattempo ho rieditato il testo del mio ultimo msg qui sopra, in modo da fornire qualche elemento in più per la comprensione del "teatro" di applicazione della macro... Grazie per il tuo interessamento... ;) eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
aetio ha scritto:Innanzi tutto... Grazie!!
ho provato la macro, ma si pianta alla riga Cells(n, 100).Value = CLng(Mid(myvalue, InStr(1, myvalue, "'") + 1, 3)) con messaggio di errore: Errore di run-time'13' - Tipo non corrispondente
Nel frattempo ho rieditato il testo del mio ultimo msg qui sopra, in modo da fornire qualche elemento in più per la comprensione del "teatro" di applicazione della macro... Grazie per il tuo interessamento... ;) eZio salve l'errore che evidenzi, significa che il carattere che separa i numeri non è un apice (') 30'49 bisogna che mi dici che carattere hai utilizzato come separatore. Al limite rendi disponibile una parte del file utilizzando un servizio di Hosting. saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve per fare prima, nel file di cui hai postato l'immagine, in una cella qualsiasi scrivi questa formula: =CODICE(STRINGA.ESTRAI(B2;3;1)) ti restituirà il codice del carattere utilizzato. saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
a10n11 ha scritto:salve per fare prima, nel file di cui hai postato l'immagine, in una cella qualsiasi scrivi questa formula:
=CODICE(STRINGA.ESTRAI(B2;3;1))
ti restituirà il codice del carattere utilizzato. saluti Giap fatto: restituisce il 39 Grazie!! ;)
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
aetio ha scritto: fatto: restituisce il 39 Grazie!! ;)
salve se è così significa che il file che ho creato per provarlo ha dei riferimenti diversi dal tuo. sarebbe utile vedere uno stralcio del tuo file. saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve QUI trovi il file sul quale ho testato la macro saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Da buon bergamasco ( :D ) ho la testa dura: da quel poco- ma eccellente- che ci conosciamo, ho dato per certo al 100% che la via che mi hai indicato è quella giusta... per cui mi sono chiesto e richiesto il motivo di questa impossibilità di far girare la macro nel mio excel. Per di più il tuo file-test gira benissimo nel mio excel e anche lui mi restituisce il codice 39 per cui c'era qualcosa nei codici- o meglio, in alcuni codici perché fino alla riga 70 la macro gira...- che non era compatibile con i dati immessi nella macro (esecuzione della macro alla mano...verifica dell'avanzamento fino all'errore...). TROVATO L'ARCANO:alcuni codici (per fortuna pochissimi, per cui ho già provveduto a rinominarli per adattarli alla tua macro ehehehe... ignorante in materia SI, ma non stupido :D) avevano la dicitura ad es.20'A4 per via di una sottocatalogazione... COME HO FATTO a dimenticarlo?!? ora funziona alla grande, ma raggruppa bordando anche insiemi di settori che in realtà non sono vicini <10: vedi ad es. le righe 36:44, il top sarebbe 36:37 37:38 38:39 39:41 40:42 e per finire 43:44... la macro borda tutto l'intervallo da 36 a 44. Ecco perché pensavo di inserire anche alcuni colori che aiutassero non poco a rendere immediata la lettura, come da foto in apertura del 3d. Ho notato che l'azione di bordatura termina alla riga 130, nonostante che vi siano ancora righe di codici vicini <10 (131:132, 133:135, 136:137) e in col.CX da riga 131 al termine tabella+1riga restituisce le x Direi proprio che siamo a buon punto... Un immenso Grazie!! (te lo ripeto: quanto t'invidio!! non so cosa darei per conoscere così bene questo gioiello di prg....) eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
aetio ha scritto: ora funziona alla grande, ma raggruppa bordando anche insiemi di settori che in realtà non sono vicini <10: vedi ad es. le righe 36:44, il top sarebbe 36:37 37:38 38:39 39:41 40:42 e per finire 43:44... la macro borda tutto l'intervallo da 36 a 44. Ecco perché pensavo di inserire anche alcuni colori che aiutassero non poco a rendere immediata la lettura, come da foto in apertura del 3d.
salve questo problema pò essere un problema!... infatti la macro legge in sequenza i controllo (x) e se come in questa particolare situazione, i due range si accodano vengo letti come unica matrice. necessita pertanto che riveda la macro. Per quanto riguarda invece l'area di coda che non viene valutata bisognrebbe valutare il perchè creando una tabella come quella che usi per capirne il motivo. Oramai fino a lunedì non posso metterci mano. saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
a10n11 ha scritto: Oramai fino a lunedì non posso metterci mano. saluti Giap
Caro Amico, ci mancherebbe anche che ti metto fretta... !! :D :D :D Ciao e Grazie ancora eZio EDIT: riguardo alle x in col.CX ho accertato che compaiono solo quando in col.B ci sono codici che iniziano con 03, 02, 01 (es. con i codici03'41:03'35 mi restituisce le x, mentre se all'elenco aggiungo altri codici sopra al 03 la macro esegue le operazioni perfettamente...). Forse ti puo' essere utile... ciao.
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve ecco la modifica. Provala e fa sapere se ora va bene. Code: Sub EVIDENZIA() Application.ScreenUpdating = False With Range("b2:CN1000").Borders .LineStyle = xlNone End With Uriga = Cells(Cells.Rows.Count, 2).End(xlUp).Row For n = 2 To Uriga myvalue = Cells(n, 2).Value Cells(n, 100).Value = CLng(Mid(myvalue, InStr(1, myvalue, "'") + 1, 3)) Next n For A = 2 To Uriga Prn = Cells(A, 100).Value Prs = Cells(A + 1, 100).Value Cells(A, 101).Value = Abs(Prn - Prs) If Cells(A, 101).Value <= 10 Then Cells(A, 102).Value = "x" Cells(A + 1, 102).Value = "x" Else If Cells(A, 102) <> "" Then Cells(A, 102).Value = "Z" End If End If Next A For I = 2 To Uriga If Cells(I, 102).Value = "x" Then Nr = Cells(I, 102).Row cnt = cnt + 1 ctrl = True Else If ctrl Then If Cells(I, 102).Value = "Z" Then Nr = Nr + 1 cnt = cnt + 1 End If Range(Cells(Nr - cnt + 1, 2), Cells(Nr, 92)).Select Selection.Borders.Weight = xlMedium Selection.Borders.LineStyle = xlContinuous Selection.Borders(xlInsideVertical).LineStyle = xlNone Selection.Borders(xlInsideHorizontal).LineStyle = xlNone Range(Cells(Nr - cnt + 1, 102), Cells(Nr, 102)).ClearContents cnt = 0 Nr = 0 ctrl = False Ctrl2 = False End If End If Next Columns("CV:CW").ClearContents Range("a1").Select Application.ScreenUpdating = True End Sub
Per quanto riguarda le rige che non vengono calcolate, bisognerebbe vedere il file o almeno far avere un file con solo la colonna B riempita nel caso di dati riservati. saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Innanzi tutto Grazie per l'immensa disponibilità nell'aiutarmi: mi sarebbe davvero di grande aiuto per riuscire a sistemare questo problema! ho preparato un FILE in cui ho colorato i vari codici <10 come andrebbero separati (i colori, posti in col. diverse a seconda della pertinenza dell'intervallo dei codici, aiuterebbero molto a rendere immediata la lettura della tabella) Nelle righe 103 e 124 ci sono errori di appartenenza dei codici che sono stati inseriti nelle bordature, ma che ne sono estranei... per quanto riguarda le x sembra che il problema sia risolto: non ci sono più, e la macro lavora anche nei codici 03-02-01... Grazie ancora per l'immensa pazienza e buona giornata, eZio
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
aetio ha scritto:Innanzi tutto Grazie per l'immensa disponibilità nell'aiutarmi: mi sarebbe davvero di grande aiuto per riuscire a sistemare questo problema! ho preparato un FILE in cui ho colorato i vari codici <10 come andrebbero separati (i colori, posti in col. diverse a seconda della pertinenza dell'intervallo dei codici, aiuterebbero molto a rendere immediata la lettura della tabella) Nelle righe 103 e 124 ci sono errori di appartenenza dei codici che sono stati inseriti nelle bordature, ma che ne sono estranei... per quanto riguarda le x sembra che il problema sia risolto: non ci sono più, e la macro lavora anche nei codici 03-02-01... Grazie ancora per l'immensa pazienza e buona giornata, eZio salve le righe 103 -124 non sono corrette, perchè il controllo veniva fatto per la differenza dei valori che si trovavano dopo l'apice e non teneva conto del valore che si trovava prima. Ti ho corretto la cosa ricontrolla. Code: Sub EVIDENZIA() Application.ScreenUpdating = False With Range("b2:CN1000").Borders .LineStyle = xlNone End With Uriga = Cells(Cells.Rows.Count, 2).End(xlUp).Row For n = 2 To Uriga myvalue = Cells(n, 2).Value aaa = Left(myvalue, InStr(1, myvalue, "'") - 1) bbb = Mid(myvalue, InStr(1, myvalue, "'") + 1, 3) If Len(bbb) = 2 Then bbb = 0 & bbb Cells(n, 100).Value = CLng(aaa & bbb) Next n For A = 2 To Uriga Prn = Cells(A, 100).Value Prs = Cells(A + 1, 100).Value Cells(A, 101).Value = Abs(Prn - Prs) If Cells(A, 101).Value <= 10 Then Cells(A, 102).Value = "x" Cells(A + 1, 102).Value = "x" Else If Cells(A, 102) <> "" Then Cells(A, 102).Value = "Z" End If End If Next A For I = 2 To Uriga If Cells(I, 102).Value = "x" Then Nr = Cells(I, 102).Row cnt = cnt + 1 ctrl = True Else If ctrl Then If Cells(I, 102).Value = "Z" Then Nr = Nr + 1 cnt = cnt + 1 End If Range(Cells(Nr - cnt + 1, 2), Cells(Nr, 92)).Select Selection.Borders.Weight = xlMedium Selection.Borders.LineStyle = xlContinuous Selection.Borders(xlInsideVertical).LineStyle = xlNone Selection.Borders(xlInsideHorizontal).LineStyle = xlNone Range(Cells(Nr - cnt + 1, 102), Cells(Nr, 102)).ClearContents cnt = 0 Nr = 0 ctrl = False Ctrl2 = False End If End If Next Columns("CV:CW").ClearContents Range("a1").Select Application.ScreenUpdating = True End Sub
Per quanto riguarda l'evidenziazione, si deve pensare ad un'altra macro e cercare di vedere come poterla strutturare. Per questa bisogna che mi lasci un po di tempo. saluti Giap
|
|
Rank: AiutAmico
Iscritto dal : 5/10/2010 Posts: 723
|
Ebbene: Perfetta!!Non ho parole... ancor più guardando l'elaborazione del testo della macro... usando un vocabolo dei fumetti GULP!Complimenti per la grande maestria nel muoverti all'interno di questo meraviglioso universo del VBA. E sopra tutto GrazieCommenta:Per quanto riguarda l'evidenziazione, si deve pensare ad un'altra macro e cercare di vedere come poterla strutturare. Per questa bisogna che mi lasci un po di tempo. .... tutto il tempo che vuoi...caro Amico. Se e quando avrai risolto il problema posta pure in questo 3d... lo terrò in evidenza. Ciao, eZio. p.s. -ot-a proposito del tuo avatar, ti presento il mio più caro amico sulla Terra... 8)
|
|
Guest |