Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    selezionare riga da una tabella e incollare su un'altra tabella

    Salve. Cerco un'anima buona che mi possa aiutare su questo problema:
    Ho una cartella con due fogli; uno con il nome Prodotti è una tabella con circa 300 righe, ogni riga parte dalla cella A fino alla cella I, con valori di testo e numerici.
    L'atro foglio con il nome Ordini è una tabella con l'anagrafica del cliente. Le righe sottostanti servono per accogliere i prodotti che il cliente intende acquistare selezionandoli dalla tabella Prodotti. Si tenga presente che il numero di prodotti che verranno copiati nella tabella Ordini saranno da 1 a max 5.
    Problema 1: Selezionare un prodotto dalla tabella Prodotti e incollarlo nella tabella Ordini.
    Problema 2: Se i prodotti sono più di uno devono essere copiati sulle righe susseguenti.
    Nota. Ho cercato di risolvere in questo modo. Alla fine di ogni riga nella tabella Prodotti ho messo un pulsante registrando una macro. Ma mi sembra un obbrobrio, anche perchè devo registrare 300 macro, una per ogni pulsante!
    Spero vivamente che mi possiate aiutare, perchè non ne riesco proprio a venirne fuori. Grazie
    excel 2010

  2. #2
    No, 300 pulsanti non li metterei, ne metterei uno solo che trasferisce da un foglio all'altro le righe cha hai preventivamente selezionato cliccandoci sopra col mouse mentre tieni premuto CTRL.

    Adesso non ti scrivo l'istruzione perché non ricordo esattamente la sintassi, me la guardo domani con calma, tu intanto dimmi una cosa, come vanno individuate le righe in cui incollare?

    Cioè hai un solo cliente, quindi l'anagrafica è in riga 1 e quelle da due a sei sono per gli ordini o i clienti sono più d'uno?

    EDIT: vedo ora che è il tuo primo messaggio: benvenuto allora
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

  3. #3

    selezionare riga da una tabella e incollare su un'altra tabella

    Grazie per essere stato così gentile a rispodere alla mia richiesta di aiuto amico NonCeLaFaccio+(devo dirti in verità che il tuo nickname molto probabilmente lo potrei usare io con molta più ragione ...). Riguardo al mio problema, che in realtà è di mia figlia la quale, con la scusa che è piena di lavoro e io invece, mio malgrado, sono inchiodato in casa davanti al pc mi ha dato la patata bollente.
    Allora caro amico se potessi inviarti un file che ho zippato sarebbe più facile spiegarmi cosa sto cercando di fare. perciò ti chiedo c'è un sistema per inviarti quesrto piccolo file zippato?
    Grazie dell'aiuto.
    excel 2010

  4. #4
    No, lasciamo perdere i file zippati, le comunicazioni private e cose di questo genere, restiamo qui in pubblico così tutti possono trarne beneficio.

    Magari allega uno screenshot, quello sì che può aiutare nella comprensione del problema oppure comincia a descrivermi un po' meglio il foglio Ordini.

    Intanto qui c'è l'istruzione da usare per la copia nel foglio Ordini delle righe che risultano selezionate nel foglio Prodotti:

    codice:
    Sheets("Prodotti").Activate
    Selection.Copy Destination:=Sheets("Ordini").Range("A2")
    Sheets("Ordini").Activate
    Praticamente se inserisci nel foglio Ordini un pulsante e gli associ questo codice, otterrai che, cliccandolo, le righe selezionate nel foglio Prodotti vengano trasferite nel foglio Ordini a partire dalla casella A2.

    E' un primo passo?
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

  5. #5
    Grazie NonCeLaFaccio+. Adesso qualcosa mi è più chiara. Ho realizzato il pulsante e modificato il range di A per farlo copiare nelle righe vuote.
    Quello che vorrei fare, se fosse possibile è di evitare di selezionare a mano le righe prodotti, perchè (mi dice mia figlia), i suoi collaboratori sono un tantino imbranati (più di me ).
    Per cui pensavo di mettere una casella di controllo, mediante la quale selezionare la riga o le righe da copiare sul foglio Ordini. C'è anche il problema di non sovrascrivere le righe che sono già state copiate. In ogni modo, ogni volta che viene fatto un ordine, il massimo numero di prodotti selezionati sono 5.
    Inoltre l'ordine viene salvato con "salva con nome" per cui la cartella originale non viene modificata. Come da tuo suggerimento cerco di allegarti uno screenshot.
    Ti ringrazio e ti auguro una felice serata.
    Immagini allegate Immagini allegate
    excel 2010

  6. #6
    Allora, andiamo con ordine.

    Inserire 300 check-box a mano nel foglio prodotti mi sembra piuttosto scomodo, bisogna cercare di automatizzarlo e la macro che segue dovrebbe riuscirci.

    Prima di eseguirla però devi inserire una colonna A vuota nel foglio prodotti per ospitare i check-box.

    Chiaramente questa macro andrà eseguita una sola volta, all’inizio, mentre nell’uso quotidiano del foglio non servirà più.

    codice:
    Sub Macro1()
    
       i = 0
       
       For Each casella In Range("G5:G500")
          If casella.Value <> "" Then
             i = i + 1
             
             Altezza = 10
             Sommità = casella.Top + ((casella.Offset(1, 0).Top - casella.Top - Altezza) / 2) + 0.75
    
             ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Link:=False, _
                DisplayAsIcon:=False, Left:=10, Top:=Sommità, Width:=10, Height:=Altezza). _
                Select
    
             ActiveSheet.OLEObjects("CheckBox" & i).Object.Caption = ""
             ActiveSheet.OLEObjects("CheckBox" & i).Name = casella.Row
        
          End If
       Next
       
       [A1].Select
    
    End Sub
    Visto che nel foglio dei prodotti ci sono delle celle unite e delle celle vuote, per capire su che righe mettere i check mi serviva qualcosa che me lo indicasse con certezza, e ho pensato che la colonna prezzi andasse bene: se c’è un prezzo c’è un prodotto da poter selezionare e quindi serve un check-box.

    La colonna prezzi nello screenshot che hai mandato occupa (mi sembra) la colonna F ma dopo l’aggiunta della colonna a sinistra occuperà la colonna G, ed è questa che esamino.

    Non sapendo poi a che riga finissero i prodotti ho previsto il ciclo fino alla 500.

    Ovviamente se questi valori non sono corretti puoi adeguare liberamente il range.

    Le caselle che vengono prese in considerazione sono solo quelle che hanno un prezzo, cioè un Value <> 0 e per ciascuna determino la posizione (Altezza e Sommità del check-box) rispetto alla riga in esame (intervieni pure come ti pare su quei valori e quei calcoli), inserisco il check col metodo Add della classe OLEObjects e poi setto un paio di proprietà:
    - La Caption serve per togliere la descrizione automatica del check-box che altrimenti andrebbe a sovrapporsi ai dati seguenti.
    - La Name assegna ad ogni check un nome uguale al numero di riga su cui si trova in modo che poi, esaminando i check, si possa sapere quali righe trasferire.

    La [A1].Select finale serve solo a togliere il focus dall’ultimo check che altrimenti resta selezionato.

    E con questo dovresti riuscire a inserire comodamente i check-box.

    Ora si tratta di assegnare ad un pulsante (da inserire nel foglio Ordini) una serie di istruzioni che trasferiscano da un foglio all’altro le righe checkkate e questo si può fare con questo codice:

    codice:
    Private Sub CommandButton1_Click()
    
    ActiveSheet.Rows(9).Clear
    ActiveSheet.Rows(10).Clear
    ActiveSheet.Rows(11).Clear
    ActiveSheet.Rows(12).Clear
    ActiveSheet.Rows(13).Clear
    
    i = 0
    For Each chk In Sheets("Prodotti").OLEObjects()
          
       If chk.Object.Value Then
          i = i + 1
          If i > 5 Then
             MsgBox "Troppi prodotti selezionati" & vbCrLf & "Copiati solo i primi 5"
             Exit For
          End If
    
          Sheets("Prodotti").Range(Sheets("Prodotti").Cells(chk.Name, 2), Sheets("Prodotti").Cells(chk.Name, 10)).Copy Destination:=Sheets("Ordini").Cells(i + 8, 1)
       End If
    
    Next
    
    End Sub
    Come vedi è molto semplice, inizialmente pulisco le cinque righe in cui copiare i dati per eliminare eventuali dati preesistenti e poi esamino tutti gli oggetti OLE presenti nel foglio Prodotti (cioè i check-box) controllando che quelli selezionati non siano più di cinque e trasferendo uno ad uno quelli selezionati.
    La copia viene effettuata dalla riga chk.Name (ricordi che prima abbiamo impostato il Name col numero di riga?) dalla colonna 2 alla colonna 10 perché quelle sono le colonne dati e l’incolla viene effettuato dopo l’ottava riga perché ho visto che l’anagrafica occupa le prime 8 righe ma anche questi valori puoi modificarli a piacimento ovviamente.

    Fammi sapere come va.
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

  7. #7
    Buonasera e Grazie NonCeLaFaccio+. Grazie al tuo preziosissimo aiuto ho risolto tutto.
    Ho apportato piccole modifiche, giusto come suggerivi tu. Mia figlia aveva precisato "dopo" che il numero dei prodotti potevano essere fino a 16 e io ho fatto la modifica.
    inoltre dato che la tabella dei prodotti non si poteva aggiungere la colonna a sinistra ho creato i checkbox sulla colonna libera a destra (J).
    Insomma un figurone .
    Ti volevo chiedere un'ultima cosa per cortesia. Se alla tabella prodotti devono essere aggiunte altre righe di prodotti come posso procedere.
    Grazie
    excel 2010

  8. #8
    Ciao,
    sono contento per te, è sempre bello fare bella figura con i figli

    Per quello che mi chiedi credo che la soluzione più semplice sia di aggiungere, nella macro, una cancellazione preventiva dei check-box presenti, in modo da poterli poi reinserire su tutti i prodotti trovati, compresi quelli nuovi.

    Oltre questo però occorre anche fare qualche piccola modifica che ho notato riguardando il codice, praticamente la macro che ti ho postato andrebbe modificata così:

    codice:
    Sub Macro1()
      
       Sheets("Prodotti").Activate
       ActiveSheet.OLEObjects.Delete
       i = 0
       Altezza = 10
       
       For Each casella In Range("G5:G500")
          If casella.Value <> "" Then
             i = i + 1
             
             Sommità = casella.Top + ((casella.Offset(1, 0).Top - casella.Top - Altezza) / 2) + 0.75
    
             ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Link:=False, _
                DisplayAsIcon:=False, Left:=10, Top:=Sommità, Width:=10, Height:=Altezza). _
                Select
    
             ActiveSheet.OLEObjects(i).Object.Caption = ""
             ActiveSheet.OLEObjects(i).Name = casella.Row
        
          End If
       Next
       
       [A1].Select
       
    End Sub
    Ti spiego cosa ho fatto.

    Come prima istruzione ho aggiunto la Activate del foglio Prodotti, per evitare che, se eseguita per errore da un altro foglio, inserisca i check su quest'altro.

    Poi ho aggiunto la Delete preventiva che ti dicevo per eliminare i vecchi check-box prima di inserire i nuovi.

    Poi ho spostato l'impostazione dell'altezza dei check-box fuori dal ciclo per evitare che venga inutilmente ripetuta trecento volte visto che ne basta una sola.

    E infine ho semplificato il puntamento ai check per settare la Caption e il Name perché in alcuni casi andava in errore.

    Prendi quindi questa come base per riportare le tue variazioni.

    Un ultima cosa, visto che i prodotti sono diventati 16 e magari cambieranno anche in futuro ti conviene rendere più parametrico il codice del pulsante, così:

    codice:
    Private Sub CommandButton1_Click()
    
    Righe_Anagrafica = 8
    Numero_Prodotti = 16
    
    For i = Righe_Anagrafica + 1 To Righe_Anagrafica + Numero_Prodotti
       Sheets("Ordini").Rows(i).Clear
    Next
    
    i = 0
    For Each chk In Sheets("Prodotti").OLEObjects()
          
       If chk.Object.Value Then
          i = i + 1
          If i > Numero_Prodotti Then
             MsgBox "Troppi prodotti selezionati" & vbCrLf & "Copiati solo i primi " & Numero_Prodotti
             Exit For
          End If
    
          Sheets("Prodotti").Range(Sheets("Prodotti").Cells(chk.Name, 2), Sheets("Prodotti").Cells(chk.Name, 10)).Copy Destination:=Sheets("Ordini").Cells(i + Righe_Anagrafica, 1)
       End If
    
    Next
    
    
    End Sub
    in modo da impostare una volta per tutte, all'inizio, il numero di righe occupate dall'anagrafica (che adesso sono 8) e il numero di prodotti (che adesso sono 16) e non toccare più nulla, infatti la If e la MsgBox ora fanno riferimento a Numero_Prodotti invece che a un valore fisso e anche l'ultima istruzione, la copy, comincia a scrivere dalla riga seguente a quella indicata in Righe_Anagrafica.

    In questo modo sarà più semplice modificarla se un domani cambierà qualcosa.

    Ciao e buon lavoro

    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

  9. #9
    Ciao NonCeLaFaccio+. Ho subito messo in pratica i tuoi ottimi suggerimenti e vanno alla grande. Ti rinnovo i miei più sinceri ringraziamenti. Mi hai aiutato a risolvere il problema con excel in modo impeccabile. Mia figlia è rimasta molto sorpresa della velocità e competenza con cui gli ho modificato il progrmma. Al che le ho fatto leggere i post di questo forum e del ruolo tutto sommato secondario che ho avuto e dell'aiuto che generosamente mi hai fornito.
    Al che mi ha chiesto di ringraziarti cosa che sto facendo con molto piacere.
    Ti auguro una buona serata. Ciao
    excel 2010

  10. #10
    Perché gliel'hai detto? Hai rovinato tutto così

    Sai una cosa? Come al solito aiutando gli altri (te questa volta) ho imparato anch'io qualcosa: questa era la prima volta che facevo inserire dei controlli come i check-box ad una macro e così mi son dovuto studiare l'help e capire come gestire la cosa (infatti avevo anche fatto un errore che poi ho corretto).

    E per questo che mi piace questo forum, perché per aiutare gli altri si è costretti a studiare cose che altrimenti magari si tralascerebbero.

    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.