Pagina precedente | 1 | Pagina successiva
Vota | Stampa | Notifica email    
Autore

COPIARE SU ALTRO FOGLIO RIGHE IN BASE AD UN DETRMINATO VALORE

Ultimo Aggiornamento: 26/09/2017 11:47
Post: 1
Registrato il: 19/09/2017
Città: LIVORNO
Età: 45
Utente Junior
2016
OFFLINE
19/09/2017 12:27

Buongiorno,
sono nuova ed imbranata...
il mio principale sta mettendo a dura prova i miei nervi...
vuole che da un primo foglio (ORDINE) con un elenco materiale e quantità io riesca in un altro foglio a trovare la formula grazie alla quale "se una cella è maggiore a 0 l'intera riga venga copiata (e fin qui credo di esserci riuscita con =SE(ORDINE!D13>0;ORDINE!B13;"zero")
Gli ho fatto vedere il lavoro tutta orgogliosa ma lui vuole che in caso il valore sia zero non compaia proprio la riga...ovvero estrapolare da questo elenco un ordine materiale da mandare al fornitore...senza spazi vuoti!
Potete aiutarmi? Oppure per aiutare vuoi posso allegarvi il file?
Post: 3.440
Registrato il: 21/06/2013
Città: NAPOLI
Età: 70
Utente Master
Excel 365
OFFLINE
19/09/2017 12:33

Ciao Sara (non imbranata [SM=g27828] )

Puoi allegare un file di esempio con i dati (non sensibili) sul foglio1 e sul foglio2, sulla base di questi) inserisci manualmente il risultato che vuoi ottenere.

È possibile che si debba ricorrere ad una macro; tu ne sai qualcosa?

Oppure con un filtro dati eviti di visualizzare le righe che in una certa cella hanno "zero"; ci hai pensato?

[Modificato da alfrimpa 19/09/2017 12:40]

Alfredo
Post: 3.441
Registrato il: 21/06/2013
Città: NAPOLI
Età: 70
Utente Master
Excel 365
OFFLINE
19/09/2017 15:29

Ciao Sara

In attesa del tuo file propongo questa macro che copia sul foglio2 tutti i record del foglio1 che hanno quantità diversa da 0.

Ovviamente in presenza del tuo file "reale" credo debba essere modificata.

vb
Sub Copia()
Dim ur As Long
Dim lr As Long
Dim rng As Range
Dim cel As Range
ur = Worksheets("Foglio1").Cells(Rows.Count, 1).End(xlUp).Row
Set rng = Worksheets("Foglio1").Range("B2:b" & ur)
For Each cel In rng
lr = Worksheets("Foglio2").Cells(Rows.Count, 1).End(xlUp).Row
    If cel.Value <> 0 Then
        Worksheets("Foglio2").Cells(lr + 1, 1).Value = cel.Offset(0, -1).Value
        Worksheets("Foglio2").Cells(lr + 1, 2).Value = cel.Value
    End If
Next cel
End Sub


Ho supposto che sul foglio1 vi fossero i materiali in colonna A ed in colonna B le quantità.

Se la situazione sul tuo file è diversa la macro si modifica in un attimo.
[Modificato da alfrimpa 19/09/2017 15:40]

Alfredo
Post: 1
Registrato il: 19/09/2017
Città: LIVORNO
Età: 45
Utente Junior
2016
OFFLINE
20/09/2017 09:00

Buongiorno,
grazie per avermi risposto (il mio help è arrivato a te).
allego (o almeno credo) il file Excel.
Il primo foglio è quello dove io dovrò inserire le quantità di un determinato articolo, in un determinato edificio mentre gli altri fogli sono gli edifici suddivisi dove vorrei che apparissero (come per magia) solo le righe e le quantità dove sono presenti dei valori.(nel secondo foglio c'è già quel cazzabuglio di formula che avevo fatto io...ma al capo non vanno bene tutti quegli zero
Alfrimpa...eccoci qua..io e te...e l'ostrogoto che mi hai scritto [SM=x423026]
ricordati che sono IMBRANATA [SM=x423047]
Post: 3.443
Registrato il: 21/06/2013
Città: NAPOLI
Età: 70
Utente Master
Excel 365
OFFLINE
20/09/2017 12:00

Dunque Sara armati di una buona dose di pazienza e di buona volontà [SM=g27828]

Ti riallego il tuo file nel quale ho inserito la macro che vedi qui piuttosto diversa da quella che ti avevo postato in precedenza perché la struttura dei tuoi fogli è decisamente differente da quella che avevo ipotizzato io.

vb
Sub Copia()
Dim i As Integer
Dim ur As Long
Dim lr As Long
Dim rng As Range
Dim cel As Range
Dim fgl As String
Dim scrt As Integer
ur = Worksheets("ORDINE").Cells(Rows.Count, 2).End(xlUp).Row
Set rng = Worksheets("ORDINE").Range("D11:G" & ur)
For i = 4 To Sheets.Count
    Sheets(i).Range("b13:d1000").ClearContents
Next i
For Each cel In rng
    If cel.Value <> "" Then
        fgl = CStr(Cells(10, cel.Column))
        lr = Worksheets(fgl).Cells(Rows.Count, 2).End(xlUp).Row
        Select Case cel.Column
            Case Is = 4
                scrt = -1
            Case Is = 5
                scrt = -2
            Case Is = 6
                scrt = -3
            Case Is = 7
                scrt = -4
        End Select
        Worksheets(fgl).Cells(lr + 1, 2).Value = cel.Offset(0, scrt - 1).Value
        Worksheets(fgl).Cells(lr + 1, 3).Value = cel.Offset(0, scrt).Value
        Worksheets(fgl).Cells(lr + 1, 4).Value = cel.Value
    End If
Next cel
MsgBox "Copia effettuata"
Sheets("ORDINE").Range("A1").Select
End Sub


Sul foglio "ORDINE" ho inserito un pulsante "Effettua copia" che la esegue.

Giusto per tua "scienza" [SM=g27828] una macro è un insieme di istruzioni scritte in un linguaggio di programmazione che si chiama Visual Basic for Application (VBA) che è comune a tutte le applicazioni di Office ossia, oltre ad Excel, Word Access etc. (sia pure con delle differenze dovute alle specificità di ogni singolo programma).

Spero con questo di non averti "spaventata" e ti prego di farmi sapere.

P.S. Probabilmente lo stesso risultato si poteva raggiungere anche utilizzando le formule di Excel ma io con queste non sono bravo per cui preferisco il VBA.

Attendo un tuo riscontro.


Alfredo
Post: 2
Registrato il: 19/09/2017
Città: LIVORNO
Età: 45
Utente Junior
2016
OFFLINE
21/09/2017 12:42

ohhh miooo diooo sei un geniooooo!!!!
Se ottengo l'aumento si divide!!Ahahah mandami l'IBAN... [SM=x423025]
Scherzi a parte, non riuscirò MAI a fare una macro nonostante tu mi abbia scienzializzato [SM=x423039]
Quindi se io volessi applicare questa macro ad altro foglio di lavoro futuro...come diavolo farei? [SM=x423024]
Grazieeeeee


Post: 3.448
Registrato il: 21/06/2013
Città: NAPOLI
Età: 70
Utente Master
Excel 365
OFFLINE
21/09/2017 14:55

Re:
saraimbranata, 21/09/2017 12.42:

ohhh miooo diooo sei un geniooooo!!!!



Innanzi tutto ti ringrazio per le belle parole.

saraimbranata, 21/09/2017 12.42:

Quindi se io volessi applicare questa macro ad altro foglio di lavoro futuro...come diavolo farei?



Questa è una bella domanda ma mi metti in difficoltà perché per risponderti dovrei scrivere un libro [SM=g27828] .

Come hai visto Excel è un programma dalle grandi potenzialità ma se cominci ad usare il VBA lo puoi rivoltare come un calzino.

saraimbranata, 21/09/2017 12.42:

Scherzi a parte, non riuscirò MAI a fare una macro nonostante tu mi abbia scienzializzato [SM=x423039]



Su questo consentimi di dissentire; basta un po' di buona volontà e tanta passione che ogni ostacolo si supera.

Non esistono macro/codici buoni per tutte le stagioni ma questo dipende da cosa si vuole fare e dalla struttura del file che si vuole elaborare.

Se anche ti spiegassi riga per riga il codice che ti ho scritto dubito che riuscirai a comprenderlo pienamente (e non per mancanza di fiducia nei tuoi confronti.

Piuttosto fammi tu le domande che ritieni ed io cercherò di rispondere nella maniera più chiara (comprensibile) possibile.

In attesa di una tua raffica di domande [SM=g27828] ti saluto.

P.S. Quanto all'IBAN direi che se passassi per Livorno (o tu per Napoli) un caffè lo accetterei più che volentieri

[Modificato da alfrimpa 21/09/2017 15:58]

Alfredo
Post: 3
Registrato il: 19/09/2017
Città: LIVORNO
Età: 45
Utente Junior
2016
OFFLINE
22/09/2017 12:21

Wow Napoli, chissà magari ... [SM=x423071] una giratona!!!
Concordo con quanto hai detto, forse non si direbbe...ma mi piacerebbe davvero capire queste cose!
Forse un giorno avrò tempo anche per questo [SM=x423024]
Avevi detto parti con le domande??? ne ho solo una sei stupito vero???
Nel file che mi hai inviato te la colonna A dell'ordine (attualmente priva di numeri) non viene copiata nei vari fogli 113,204 etc
come faccio a farla venire?
Grazie ancora per la tua gentilezza
Ciao ciao
Post: 3.457
Registrato il: 21/06/2013
Città: NAPOLI
Età: 70
Utente Master
Excel 365
OFFLINE
22/09/2017 14:16

Re:
saraimbranata, 22/09/2017 12.21:


Nel file che mi hai inviato te la colonna A dell'ordine (attualmente priva di numeri) non viene copiata nei vari fogli 113,204 etc
come faccio a farla venire?



Aggiungendo l'istruzione nel punto che ti ho indicato

vb
Sub Copia()
Dim i As Integer
Dim ur As Long
Dim lr As Long
Dim rng As Range
Dim cel As Range
Dim fgl As String
Dim scrt As Integer
ur = Worksheets("ORDINE").Cells(Rows.Count, 2).End(xlUp).Row
Set rng = Worksheets("ORDINE").Range("D11:G" & ur)
For i = 4 To Sheets.Count
    Sheets(i).Range("b13:d1000").ClearContents
Next i
For Each cel In rng
    If cel.Value <> "" Then
        fgl = CStr(Cells(10, cel.Column))
        lr = Worksheets(fgl).Cells(Rows.Count, 2).End(xlUp).Row
        Select Case cel.Column
            Case Is = 4
                scrt = -1
            Case Is = 5
                scrt = -2
            Case Is = 6
                scrt = -3
            Case Is = 7
                scrt = -4
        End Select
        Worksheets(fgl).Cells(lr + 1, 1).Value = cel.Offset(0, scrt - 2).Value '<======= Riga aggiunta
        Worksheets(fgl).Cells(lr + 1, 2).Value = cel.Offset(0, scrt - 1).Value
        Worksheets(fgl).Cells(lr + 1, 3).Value = cel.Offset(0, scrt).Value
        Worksheets(fgl).Cells(lr + 1, 4).Value = cel.Value
    End If
Next cel
MsgBox "Copia effettuata"
Sheets("ORDINE").Range("A1").Select
End Sub


Riesci da sola a fare la modifica?

Mi aspettavo molte domande e te ne esci con una sola? [SM=g27828]

Comunque provo a commentarti il codice magari ti può essere utile

Alfredo
Post: 3.458
Registrato il: 21/06/2013
Città: NAPOLI
Età: 70
Utente Master
Excel 365
OFFLINE
22/09/2017 14:40

Dunque Sara ci provo

Con queste istruzioni dichiaro le variabili che mi occorrono durante la procedura

vb
Dim i As Integer
Dim ur As Long
Dim lr As Long
Dim rng As Range
Dim cel As Range
Dim fgl As String
Dim scrt As Integer


Memorizzo nella variabile ur il numero di riga dell'ultima cella piena in colonna B

vb
ur = Worksheets("ORDINE").Cells(Rows.Count, 2).End(xlUp).Row


Imposto nella variabile rng (di tipo Range) l'intervallo che mi occorre analizzare ossia D11:G ed il valore della variabile ur; con questo sistema avremo sempre degli intervalli dinamici e non fissi.

vb
Set rng = Worksheets("ORDINE").Range("D11:G" & ur)


Qui imposto un ciclo For per cancellare tutti i dati eventualmente preesistenti nell'intervallo B13:D1000 di tutti i fogli a partire dal quarto fino all'ultimo della cartella.

vb
For i = 4 To Sheets.Count
    Sheets(i).Range("b13:d1000").ClearContents
Next i


Ora viene la parte un po' più complicata; con le istruzioni che vedi sotto imposto un ciclo For (diverso da quello precedente) in cui faccio una serie di cose.

vb
For Each cel In rng


Se il contenuto di ogni cella dell'intervallo che stiamo esaminando (D11:Gxx) è diverso da vuoto

vb
If cel.Value <> "" Then


memorizza nella variabile fgl il contenuto della cella riga 10 e colonna della cella in esame: in pratica il nome degli edifici

vb
fgl = CStr(Cells(10, cel.Column))


con questo memorizzo nella variabile lr l'ultima riga piena della colonna B del foglio dell'edificio in precedenza individuato

vb
lr = Worksheets(fgl).Cells(Rows.Count, 2).End(xlUp).Row


./. continua.....



[Modificato da alfrimpa 22/09/2017 14:42]

Alfredo
Post: 3.459
Registrato il: 21/06/2013
Città: NAPOLI
Età: 70
Utente Master
Excel 365
OFFLINE
22/09/2017 14:59

Con questo ciclo imposto la variabile scrt un determinato valore (che mi servirà po) in dipendenza del numero della colonna della cella esaminata

vb
Select Case cel.Column
            Case Is = 4
                scrt = -1
            Case Is = 5
                scrt = -2
            Case Is = 6
                scrt = -3
            Case Is = 7
                scrt = -4
End Select


Con queste istruzioni vado a dire che i valori della cella vuota del foglio dell'edificio colonne A,B, C e D sono uguali allo scarto (colonne precedenti in base al valore della variabile scrt della cella in esame)

vb
Worksheets(fgl).Cells(lr + 1, 1).Value = cel.Offset(0, scrt - 2).Value '<======= Riga aggiunta
        Worksheets(fgl).Cells(lr + 1, 2).Value = cel.Offset(0, scrt - 1).Value
        Worksheets(fgl).Cells(lr + 1, 3).Value = cel.Offset(0, scrt).Value
        Worksheets(fgl).Cells(lr + 1, 4).Value = cel.Value


Con questa visualizzo il messaggio "Copia effettuata".

Infine con questa seleziono la cella A1 del foglio "Ordine"

vb
Sheets("ORDINE").Range("A1").Select


Ora tu mi dirai che come "professore" non valgo una cicca ma ho cercato di fare del mio meglio.

Di più penso che si potrebbe fare solo con una chiacchierata al telefono [SM=g27828]

Qualora fossi interessata fammelo sapere [SM=g27828]

Alfredo
Post: 4
Registrato il: 19/09/2017
Città: LIVORNO
Età: 45
Utente Junior
2016
OFFLINE
25/09/2017 10:17

Ecco qua che è comparsa la colonna A...ora è tutto perfetto! Siiii ci sono riuscita ad aggiungere la riga da modificare e sono già felice così...basta poco che ce vò!!!
Grazie ancora...davvero tante grazieee!!! [SM=x423017]
Post: 3.463
Registrato il: 21/06/2013
Città: NAPOLI
Età: 70
Utente Master
Excel 365
OFFLINE
25/09/2017 10:23

Ok Sara mi fa piacere.

Quindi ti è tutto chiaro?
[Modificato da alfrimpa 25/09/2017 10:27]

Alfredo
Post: 3.464
Registrato il: 21/06/2013
Città: NAPOLI
Età: 70
Utente Master
Excel 365
OFFLINE
25/09/2017 10:27

Re:
saraimbranata, 25/09/2017 10.17:

Ecco qua che è comparsa la colonna A...ora è tutto perfetto! Siiii ci sono riuscita ad aggiungere la riga da modificare e sono già felice così...basta poco che ce vò!!!
Grazie ancora...davvero tante grazieee!!! [SM=x423017]



Hai visto che "imbranata" non sei? [SM=g27828]



Alfredo
Post: 5
Registrato il: 19/09/2017
Città: LIVORNO
Età: 45
Utente Junior
2016
OFFLINE
26/09/2017 11:47

[SM=x423038]
Vota:
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Cerca nel forum
Tag discussione
Discussioni Simili   [vedi tutte]
Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 03:51. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com