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.