La consultazione del forum è libera per tutti.
Per poter porre un quesito è invece necessario essere un utente registrato (clicca qui se non lo sei).
Tutti gli utenti che richiedono un supporto, come da REGOLAMENTO, sono caldamente invitati ad allegare un file di esempio con l'indicazione di quello che si desidera ottenere.
Spero che qualche anima pia mi possa aiutare con il vba ho bisogno di creare due bottoni che dovranno compire azioni differenti
il primo bottone dovrà cancellare le immagini o picture perché in base a come si inserisco gli oggetti il comando del vba differisce che si trovano in questo range di celle
Range("B19:O29").Select
Range("P19:AA29").Select
Range("AS8:AW18").Select
Range("AX8:BB18").Select
Range("BM8:BQ18").Select
Range("BR8:BV18").Select
mentre il secondo bottone dovrà copiare il contenuto delle celle che si trovano nel Range("BG7:BH17") ed incollarlo in base al numero che si trova nel range ("V5:W5") nel range di celle che corrisponde allo stesso valore che in questo caso è ("AW53:AX53")
dopo questa operazione dovrà aggiornare il numero progressivamente che si trova nel range di celle Range("V5:W5") infine dovrà cancellare le immagini o picture si trovano in questo range di celle
Range("B19:O29").Select
Range("P19:AA29").Select
Range("AS8:AW18").Select
Range("AX8:BB18").Select
e spostare le immagini o picture che si trovano nel
Range("BM8:BQ18").Select Range("BR8:BV18").Select
nel range
Range("AS8:AW18").Select Range("AX8:BB18").Select
Ultimissima cosa visto che i numeri in Range("V5:W5") saranno aggiornati progressivamente e le caselle libere sono solo 12 dove andranno riportati i valori di ("BG7:BH17") una volta giunti al numero 13 in ("V5:W5") i valori da ricopiare da ("BG7:BH17") nelle celle sottostanti ripartiranno da 1
ho allegato un file con delle macro registrate per far capire meglio quale e il risultato che desidero
http://www.filedropper.com/cartel1
Una cosa non mi è chiara (fra le altre): vuoi cancellare delle immagini dal foglio (OK) e dici che stanno nel Range (...). Ma le immagini non stanno in un Range di celle. Sono oggetti e devono essere identificati e trattati diversamente da (es.) numeri/testo in celle. Per esempio:
ActiveSheet.Shapes.SelectAll
Selection.Delete
Questa routine seleziona tutte le immagini presenti sul foglio attivo e le cancella.
Naturalmente si potrebbe sviluppare con una selezione più raffinata ma il concetto è questo.
Le due istruzioni sopra, per dire, fanno parte di una routine più complessa che (poi) trova le immagini in una cartella, le ridimensiona in base a parametri variabili nella cartella stessa, carica le immagini ridimensionate sul foglio. Il ridimensionamento si rende necessario per evitare un file da parecchie decine di Mb.
Sub RemovePics() Dim pic As Picture On Error Resume Next With Sheets(1) For Each pic In .Pictures If Not Intersect(pic.TopLeftCell, .Range("B19:O29")) Is Nothing Then pic.Delete ElseIf Not Intersect(pic.TopLeftCell, .Range("P19:AA29")) Is Nothing Then pic.Delete ElseIf Not Intersect(pic.TopLeftCell, .Range("AS8:AW18")) Is Nothing Then pic.Delete ElseIf Not Intersect(pic.TopLeftCell, .Range("AX8:BB18")) Is Nothing Then pic.Delete ElseIf Not Intersect(pic.TopLeftCell, .Range("BM8:BQ18")) Is Nothing Then pic.Delete ElseIf Not Intersect(pic.TopLeftCell, .Range("BR8:BV18")) Is Nothing Then pic.Delete Else End If Next pic End With On Error GoTo 0 End Sub
ho risolto cosi grazie dell' interessamento, per caso mi puoi aiutare con le caselle combinate
Bene.
Per caselle combinate intendi moduli a discesa ListBox/ComboBox? E sono Controlli modulo o Controlli Activex?
in pratica si mi serve creare una maschera(userform) da lanciare con un doppio click nella riga dove voglio inserire l' alimento
l userform conterrà due combox
nella prima si seleziona la categoria frutta, latte, uova
nella seconda compariranno i nomi meloni, pere arance ect ect se si seleziona frutta nella prima combox.
per le combox dato che il database e molto grosso circa 1700 alimenti utilizzerei la definizione nomi per le sottocategorie, è l intervallo dinamico per gli alimenti in modo tale che si autoaggiorni da sola la lista del combox 2 una volta che vengono inseriti nuovi alimenti.
ultima cosa anche una casella dove posso digitare l alimento ricercato (xfill)
In linea generale e per esperienza personale, ti consiglio questo:
il progetto Vba (in seguito Vba) meglio separato dalle tabelle. Su un file dov'erano presenti due decine di tabelle piccolissime ma tutte con nome assegnato avevo raggiunto i 22Mb. Ingestibile. Ho spostato tutte le tabelle su un file esterno (0,5Mb) e il Vba è passato a 2,5Mb. Le tabelle di uso frequente vengono lette e caricate in Range dinamici all'apertura del menu principale (se c'è) o all'apertura del progetto Vba.
Per esempio all'avvio del progetto potresti aprire il file Tabelle sul quale avrai definito (in uno - meglio - o più fogli) tutte le tabelle utili: RngCategorie (frutta, latte, uova, ...) e su altre tabelle i prodotti relativi alle categorie:
Vedi DbTabelle.xlsx
Vba:
Definizione dei Range dinamici
Public RngCategorie As Range, RngFrutta As Range, RngLatte As Range, RngUova As Range
All'apertura Vba:
Apre e attiva (!) anche file Tabelle
Ricerca il nome del Range da caricare (es.: RngCategorie) e copia il contenuto dalla seconda all'ultima riga in Range dinamico RngCategorie
e via di seguito per tutti i Range presenti in file Tabelle e definiti in progetto.
Qualcosa del tipo:
scorre la prima riga fino a trovare il nome corrispondente (es.: NameRng = "RngCategorie", NameRng = "RngFrutta", ...)
dopodiché: Set RngCategorie = Range(.Cells(2, FC), .Cells(LR, LC)) (l'ultima riga, che va ricercata, la chiamo sempre LR. Idem per prima colonna FC e ultima colonna LC)
Carica RngCategorie in ComboBox1 (in seconda colonna della Combo puoi metterci i nomi di RngCollegato)
Alla selezione, grazie al nome in colonna B/seconda colonna ComboBox1 potrai alimentare ComboBox2 con il corrispondente Range dinamico relativo ai prodotti specifici della categoria.
Chiude il file Tabelle che non serve più (eccezione per aggiunta categorie/prodotti nuovi, ma si vedrà suo tempo).
Si lavora solo con Vba e i Range caricati (che saranno cancellati solo a chiusura Vba).
Insomma, lo schema secondo me è questo. I 1.700 articoli, anche fossero 10.000, si gestiranno velocemente e più facilmente di quanto sembri. C'è un po' di codice da scrivere ma niente di insormontabile.
P.S.: ho caricato la prima versione del file tabelle. Le colonne definite come Db... sono da intendere come Rng...
ok l idea e proprio quella io ho già fatto un foglio di excel dove tengo tutti i database e l ho collegato all' altro adesso per ovvie raggiungi ho dovuto ripiegare sul vba perche la funzione scarto ed indiretto non funzionano assieme
ho bisogno di una mano nel finire di impostare questa userform si accettano suggerimenti su come procedere, ho bisogno che mi compili le celle di colore giallo, inoltre vorrei se e possibile farlo, inserire una condizione che se si usa la combobox selezione categorie non si può utilizzare la ricerca alimenti e viceversa.Infine vorrei utilizzare il command botton per inserire gli alimenti nelle rispettive righe sia quando si utilizza la ricerca che quando si seleziona l alimento tramite i combobox
Per lanciare la userform basta fare doppio click in una parte del foglio e compare
l'userform è composta da un tetxtbox con ricerca del testo + casella di riepilogo collegato al foglio database alimenti, dove il list box e collegato alla cella f12, sempre in questa userform ci sono altre due combox le quali mi permettono di richiamare le categorie e le sottocategorie e tramite commandbutton vengono inseriti valori nella cella f11
ps penso che per fare cio' ho si usa una ListFillRange in maniera inversa oppure un ciclo for each
http://www.filedropper.com/userform
Mi pare il tuo progetto sia un po' confuso. Non si capisce bene cosa vuoi fare, come intendi procedere e nemmeno perché hai definito - in foglio Piano Alimentare - le colonne C:AU larghezza 1 per poi utilizzare "unisci celle" che, nel caso, è una delle peggiori disgrazie letali in cui possa incappare un programmatore (ognuno ti sconsiglierà l'uso, specialmente se vuoi usare Vba).
Le macro del file le hai sviluppate tu? Te lo chiedo perché certe soluzioni sono notevoli ma altre sono perlomeno strane per un programmatore di quel livello:
Range("AT25:AU25").Select
Selection.ClearContents
oppure
Range( _
"AT25:AU25,AT25:AU25,AT27:AU27,AT29:AU29,AT31:AU31,AT33:AU33,AT35:AU35,AT37:AU37,AW37:AX37,AW35:AX35,AW33:AX33,AW31:AX31,AW29:AX29,AW27:AX27,AW25:AX25,AZ25:BA25,AZ27:BA27,AZ29:BA29,AZ31:BA31,AZ33:BA33,AZ35:BA35,AZ37:BA37" _
).Select
Range("AZ37").Activate
Selection.ClearContents
Range("BS24:BU24").Select
Perché un conto è partire dal nulla ma con un'idea ben chiara e fattibile, un altro conto è prendere un programma già semi sviluppato e pistolarci sopra.
Darò un'occhiata all'insieme e apporterò alcune variazioni che ritengo utili per la funzionalità e leggibilità futura del progetto (a cominciare dalla definizione del "database" e "abbellimenti" vari che non servono/non vanno d'accordo con Vba). Ma non avere troppa fretta.
i range che hai menzionato li ho fatti con il registratore di macro per cancellare il contenuto delle celle la userform mi sto cimentando vedendo video su youtube
si accettano suggerimenti e possibile definire un certo range dove scrive i dati dell userform?
in pratica ho fatto questo ho definito l oggetto userform che compare solo se premi in questi range
Private Sub Worksheet_BeforeDoubleClick(ByVal target As Range, Cancel As Boolean)
If Not Intersect(target, Me.Range("G11:G20, G24:G33, G37:G46, G50:G59, G63:G72, G76:G85, G89:G98")) Is Nothing Then UserForm1.Show End If
e per scrivere i dati dell' userform dato che utilizzo il doppio click andrò a selezionare anche la cella
quindi per l ' inserimento ho usato qst
cella selezionata
valore del combobox lo scrivi nella cella attiva
Private Sub CommandButton1_Click() ActiveCell.Select ActiveCell.Value = ComboBox2.Value End Sub
Guarda, se hai pazienza cerchiamo di venirne a capo. Altrimenti dovrai sbrigartela da solo. Continui a postare richieste incomprensibili e a spizzichi e mozzichi. Per chi non conosce il progetto questo non aiuta, anzi. Viene proprio voglia di lasciar perdere.
Il progetto non sembra complicato ma tu ci metti del tuo per renderlo tale. Se vuoi un aiuto abbi pazienza perché pur volendo darti una mano anche noi abbiamo un mucchio di altre cose da fare. Non puoi pretendere che stiamo tutto il giorno a sviluppare.
Per ora ti posso solo dire che il codice è piuttosto confuso e bisognerà comprendere, pulire, razionalizzare e arrivare alla soluzione con i tempi necessari. Per esempio non capisco perché sia necessario avviare la UserForm tramite DoubleClick su determinate celle mentre sarebbe molto più semplice e comprensibile farlo da una CommandButton.
Ho sistemato qualcosa, domani lo riprendo.
attendo tue cosi spero di riuscire a capirci qualcosa in più
Oggi ho sistemato il caricamento dei dati in UserForm1 per ComboBox1 e 2.
Niente Initialize da doppio click su celle predefinite, ma una Sub collegata a un pulsante sul foglio. Più chiaro e semplice. Dopo la selezione in ComboBox1 visualizza la ComboBox2 con le relative voci. Naturalmente ho modificato il foglio Alimenti (non solo, anche i nomi dei fogli e parecchio altro). Ora mi dovresti spiegare:
1. a che pro caricare TUTTI gli alimenti in ListBox1?
2. Cosa dovrebbe fare dopo aver cliccato su una voce di ListBox1?
3. cosa fare dopo aver caricato gli alimenti in ComboBox2 e averne selezionato uno?
Ho visto che ci sono una ventina di moduli con ognuno qualche routine registrata. Ma non servono tutti quei moduli, ne basterebbe anche solo uno! Comunque, ho girato un po' nel codice, qualcosa ho afferrato (e sistemato: Select + ClearContents = solo ClearContents) e molto no.
Vediamo di sistemare i tre punti sopra, poi eventualmente il resto.
listbox mostra la lista di alimenti che tramite il textbox si effettua la ricerca dell' alimento per poi inserirlo nel foglio piano alimentare a, list box permette di selezionare con il mouse l alimento ed inserirlo, combox due se intendi private sub combox_2 non fa niente perche ho utilizzato selct case per fare l indiretto che poi viene visualizza nella combox due e tramite il tasto inserisci alimento, si inserisce l' alimento