Aiutamici Forum
Benvenuto Ospite Cerca | Topic Attivi | Utenti | | Log In | Registra

[EXCEL] Bordare righe particolari. Opzioni
aetio
Inviato: Friday, June 25, 2010 4:43:33 PM

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
Sponsor
Inviato: Friday, June 25, 2010 4:43:33 PM

 
simo95
Inviato: Friday, June 25, 2010 6:06:24 PM

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
aetio
Inviato: Friday, June 25, 2010 9:49:26 PM

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... ;)
a10n11
Inviato: Friday, June 25, 2010 10:28:08 PM

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

aetio
Inviato: Friday, June 25, 2010 10:53:15 PM

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
a10n11
Inviato: Saturday, June 26, 2010 11:30:46 AM

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


aetio
Inviato: Saturday, June 26, 2010 11:54:41 AM

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
a10n11
Inviato: Saturday, June 26, 2010 12:16:21 PM

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

a10n11
Inviato: Saturday, June 26, 2010 12:25:34 PM

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

aetio
Inviato: Saturday, June 26, 2010 12:34:45 PM

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!! ;)
a10n11
Inviato: Saturday, June 26, 2010 12:41:02 PM

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

a10n11
Inviato: Saturday, June 26, 2010 12:45:58 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
QUI trovi il file sul quale ho testato
la macro
saluti
Giap


aetio
Inviato: Saturday, June 26, 2010 1:55:31 PM

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
a10n11
Inviato: Saturday, June 26, 2010 6:48:02 PM

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

aetio
Inviato: Saturday, June 26, 2010 7:56:12 PM

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.
a10n11
Inviato: Monday, June 28, 2010 10:10:45 AM

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

aetio
Inviato: Monday, June 28, 2010 11:18:57 AM

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
a10n11
Inviato: Monday, June 28, 2010 12:33:46 PM

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

aetio
Inviato: Monday, June 28, 2010 2:20:53 PM

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 Grazie
Commenta:
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)
Utenti presenti in questo topic
Guest


Salta al Forum
Aggiunta nuovi Topic disabilitata in questo forum.
Risposte disabilitate in questo forum.
Eliminazione tuoi Post disabilitata in questo forum.
Modifica dei tuoi post disabilitata in questo forum.
Creazione Sondaggi disabilitata in questo forum.
Voto ai sondaggi disabilitato in questo forum.

Main Forum RSS : RSS

Aiutamici Theme
Powered by Yet Another Forum.net versione 1.9.1.8 (NET v2.0) - 3/29/2008
Copyright © 2003-2008 Yet Another Forum.net. All rights reserved.