Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

[Excel] Macro che funziona su tutti i fogli

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

[Excel] Macro che funziona su tutti i fogli

Postdi viskio » 03/02/06 10:26

Ciao a tutti.
Devo creare un file in excel in cui vi sono un certo numero di fogli (circa 30)
In ogni foglio è presente un rettangolo creato con la barra strumenti Disegno.
In questo rettangolo devono comparire diverse immagini (Formato forme/ Colore/ si sceglie l'immagine di riempimento...) Questa scelta dell'immagine è associato a diverse macro che a loro volta sono associate a dei pulsanti creati con la modalità di progettazione.
All'atto pratico si clicca sul pulsante relativo e l'immagine cambia.
Ed è qui che sorge il problema.
Questa cosa mi funzione solo con il Foglio dove è stata creata la macro mentre in tutti gli altri fogli mi dà l'errore di debug.
L'errore praticamente sta nel fatto che il disegno ove compare l'immagine ha un nome specifico nel primo foglio, mentre per gli altri fogli hanno nomi diversi (il VBA li chiama Rectangle ). Premetto che i "rectangle" sono stati copiati e incollati negli altri fogli avendo come fonte il "rectangle" dove è stata creata la macro.
Come devo fare per far funzionare le mie macro su tutti i fogli?
viskio
Utente Junior
 
Post: 36
Iscritto il: 03/02/06 10:13

Sponsor
 

Re: Macro in excel

Postdi cassioli » 03/02/06 14:23

viskio ha scritto:Come devo fare per far funzionare le mie macro su tutti i fogli?

E' un po' vago, cosi' senza vedere manco una riga di codice...
Ma probabilmente la macro è strutturata per funzionare "in locale", cioè solo sugli oggetti del SUO foglio.

Prova a registrare una macro mentre copii un disegno da un foglio all'altro, per vedere se cosi' il Sistema da' al disegno un nome assoluto (del tipo "excel\foglio1\disegno3" invece che solo "disegno3").
cassioli
Utente Senior
 
Post: 1014
Iscritto il: 05/03/04 11:02

Postdi viskio » 03/02/06 14:34

Ecco il codice della macro1....sono quasi tutte identiche come funzionamento:
Codice: Seleziona tutto
Sub Macro1()
' Macro1 Macro
' Macro registrata il 03/02/2006 da cad1
    ActiveSheet.Shapes("Rectangle 1").Select
    Selection.ShapeRange.Line.Weight = 0.75
    Selection.ShapeRange.Line.DashStyle = msoLineSolid
    Selection.ShapeRange.Line.Style = msoLineSingle
    Selection.ShapeRange.Line.Transparency = 0#
    Selection.ShapeRange.Line.Visible = msoTrue
    Selection.ShapeRange.Line.ForeColor.SchemeColor = 64
    Selection.ShapeRange.Line.BackColor.RGB = RGB(255, 255, 255)
    Selection.ShapeRange.Fill.Visible = msoTrue
    Selection.ShapeRange.Fill.ForeColor.RGB = RGB(255, 255, 255)
    Selection.ShapeRange.Fill.BackColor.RGB = RGB(255, 255, 255)
    Selection.ShapeRange.Fill.Transparency = 0#
    Selection.ShapeRange.Fill.UserPicture "Z:\Excel foglio elettrodi\1.JPG"
    Range("F21,H29,H36,F44,D44,B36").Select
    Range("B36").Activate
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    Selection.Borders(xlEdgeLeft).LineStyle = xlNone
    Selection.Borders(xlEdgeTop).LineStyle = xlNone
    Selection.Borders(xlEdgeBottom).LineStyle = xlNone
    Selection.Borders(xlEdgeRight).LineStyle = xlNone
    Selection.Borders(xlInsideVertical).LineStyle = xlNone
    Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
    Range("D21,B29").Select
    Range("B29").Activate
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = 3
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = 3
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = 3
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = 3
    End With
    Range("B29").Select
End Sub

il problema è che sul foglio in questione il disegno ove porre l'immagine viene chiamato "Rectangle 1" mentre su di un altro foglio ha un'altro nome. Quindi quando avvio la macro su un'altro foglio che non è quello dove ho creato precedentemente la macro mi dà l'errore.
viskio
Utente Junior
 
Post: 36
Iscritto il: 03/02/06 10:13

Postdi cassioli » 03/02/06 14:37

Sheets("nomefoglio").Select = seleziona un certo foglio
ActiveSheet.Shapes("nome rettangolo").Select = seleziona un certo rettangolo

Se registri una macro mentre cambi l'immagine del rettangolo, scopri il nome del rettangolo da mettere nella macro. ;)
cassioli
Utente Senior
 
Post: 1014
Iscritto il: 05/03/04 11:02

Postdi viskio » 03/02/06 14:44

nel senso che scopro il nome della macro da mettere su 2° foglio, sul 3° foglio e così via???
Si l'ho fatto ma il problema è che i fogli sono 30 e le macro 9. Non posso fare 270 macro!!!!!!
viskio
Utente Junior
 
Post: 36
Iscritto il: 03/02/06 10:13

Postdi viskio » 03/02/06 14:48

volevo dire nome del rattangolo.....non c'è un modo per un'identificazione generale del "rattangolo"?
viskio
Utente Junior
 
Post: 36
Iscritto il: 03/02/06 10:13

Postdi cassioli » 03/02/06 15:00

viskio ha scritto:nel senso che scopro il nome della macro da mettere su 2° foglio, sul 3° foglio e così via???
Si l'ho fatto ma il problema è che i fogli sono 30 e le macro 9. Non posso fare 270 macro!!!!!!

Hai 9 macro che agiscono sui "rectangle" di 30 fogli?
Cioe', hai 9 pulsanti che "comandano" i "rectangle" dei vari fogli?
Ma come fa un pulsante a "sapere" quale rettangolo deve aggiornare, codice a parte? Oppure ogni pulsante agisce su tutti i fogli?
cassioli
Utente Senior
 
Post: 1014
Iscritto il: 05/03/04 11:02

Postdi cassioli » 03/02/06 15:02

Forse puo' essere utile questo comando:

Codice: Seleziona tutto
Sheets("Foglio2").Shapes("Rectangle 2").Fill.UserPicture "C:\documenti\immagini\immagine.bmp"

cassioli
Utente Senior
 
Post: 1014
Iscritto il: 05/03/04 11:02

Postdi viskio » 03/02/06 15:15

cassioli ha scritto:Forse puo' essere utile questo comando:

Codice: Seleziona tutto
Sheets("Foglio2").Shapes("Rectangle 2").Fill.UserPicture "C:\documenti\immagini\immagine.bmp"



...quindi l'unica cosa da fare è creare tutte le macro che mi servono. Tutte 270. Certo facendo il copia e incolla e cambiando solo il necessario si potrebbe fare....solo che poi mi toccherebbe creare 270 pulsanti associati alle macro, 9 x ogni foglio :eeh: :eeh: :eeh: :eeh:
Oppure si potrebbe ragionare in maniera differente!!!!
Piuttosto che creare subito i 30 fogli precompilati, potrei farne solo 1 e di volta in volta creare una macro che mi salvi nei successivi fogli una volta compilato il tutto ;)
Potrebbe essere un'idea?
viskio
Utente Junior
 
Post: 36
Iscritto il: 03/02/06 10:13

Postdi cassioli » 03/02/06 15:25

viskio ha scritto:
cassioli ha scritto:Forse puo' essere utile questo comando:

Codice: Seleziona tutto
Sheets("Foglio2").Shapes("Rectangle 2").Fill.UserPicture "C:\documenti\immagini\immagine.bmp"



...quindi l'unica cosa da fare è creare tutte le macro che mi servono. Tutte 270. Certo facendo il copia e incolla e cambiando solo il necessario si potrebbe fare....solo che poi mi toccherebbe creare 270 pulsanti associati alle macro, 9 x ogni foglio :eeh: :eeh: :eeh: :eeh:
Oppure si potrebbe ragionare in maniera differente!!!!
Piuttosto che creare subito i 30 fogli precompilati, potrei farne solo 1 e di volta in volta creare una macro che mi salvi nei successivi fogli una volta compilato il tutto ;)
Potrebbe essere un'idea?

Boh, non ho ancora capito che cos'hai in mente, sinceramente...

Il comando che ti ho detto permette di accedere a qualunque rettangolo di qualunque foglio da una singola macro!

Quando tu clicchi sul pulsante 5 del foglio 2, cosa deve succedere? Deve cambiare solo il rettangolo Pippo del foglio 5, o tutti i rettangoli Pippo di tutti i fogli?

Nel primo caso userai ActiveSheet.Shapes("Pippo").Fill.UserPicture "C:\documenti\immagini\immagine.bmp" ;
nel secondo, userai Sheets("Foglio2").Shapes("Pippo").Fill.UserPicture "C:\documenti\immagini\immagine.bmp" 30 volte, cambiando ogni volta il nome del foglio.

Credo che con questi due comandi sia possibile coprire tutte le varianti possibili, devi solo... meditarci un po' su! ;)
... e poi farci sapere!
cassioli
Utente Senior
 
Post: 1014
Iscritto il: 05/03/04 11:02

Postdi viskio » 03/02/06 15:36

Ogni foglio dev'essere indipendente dall'altro. Posso esserci quindi immagini differenti o uguali da un foglio all'altro.
Ogni foglio può avere al massimo 9 immagini (9 possibilità). Quindi 9 macro. Giusto?
I "rettangoli" hanno nomi diversi da un foglio all'altro ne consegue che dovrò necessariamente avere 270 macro ( fogli 30 )
Giusto?

Il comando che dici tu:
Sheets("Foglio2").Shapes("Pippo").Fill.UserPicture "C:\documenti\immagini\immagine.bmp

è per una macro per un determinato foglio ("Foglio 2") su "pippo" che è solo sul "Foglio2". Il "Foglio 3" avrà "pippo2".......
viskio
Utente Junior
 
Post: 36
Iscritto il: 03/02/06 10:13

Postdi viskio » 03/02/06 15:47

Il mio scopo è quello di creare una specie di database con moduli che servono per lo spostamento degli elettrodi in una officina.
Ci sarà un file di questo per ogni commessa.
Tale file in Excel avrà il primo foglio contenenti le generalità della commessa con i nomi degli elettrodi (componenti) che verrà compilato di volta in volta.
Accanto ad ogni nome ci sarà un collegamento ipertestuale che mi farà andare al relativo foglio per lo spostamento degli elettrodi. Questo per avere un accesso diretto al foglio che mi serve.
Ogni foglio avrà una parte contentente delle generalità che però vengono copiate dal primo foglio e una seconda parte contente il fatidico disegno.
Tale disegno non sarà altro che un disegno di un piano cartesiano con tutte le varie possibilità di spostamento di x e y. Tali spostamenti risultano essere 9.
Ogni componente avrà in suo foglio contentente le informazioni generali (commessa, cliente, ec..) e tecniche (spostamento).
Questo è quello che vorrei fare.
Spero di essere stato chiaro. :P :P :P
viskio
Utente Junior
 
Post: 36
Iscritto il: 03/02/06 10:13

Postdi cassioli » 03/02/06 15:51

viskio ha scritto:Ogni foglio dev'essere indipendente dall'altro. Posso esserci quindi immagini differenti o uguali da un foglio all'altro.
Ogni foglio può avere al massimo 9 immagini (9 possibilità). Quindi 9 macro. Giusto?
I "rettangoli" hanno nomi diversi da un foglio all'altro ne consegue che dovrò necessariamente avere 270 macro ( fogli 30 )
Giusto?

Non credo. Immagino che se usi ActiveSheet.eccetera, la tua macro agirà sul rettangolo che si trova nel foglio in cui è stato premuto il pulsante. Devi quindi solo scoprire il nome di ogni rettangolo di ogni foglio, e usare cosi' 9 macro; le dovrai collegare a 270 pulsanti diversi sparsi su 30 foglil, ma le macro saranno solo 9.

Per essere sicuro che in ogni foglio tutti i rettangoli abbiano gli stessi nomi degli altri fogli, cancella tutti i rettangoli in tutti i fogli tranne il primo, poi dal primo copia i rettangoli in tutti i fogli.
Se i nomi non coincidono, non puoi usare 9 macro soltanto...
cassioli
Utente Senior
 
Post: 1014
Iscritto il: 05/03/04 11:02

Postdi Alexsandra » 10/02/06 09:04

.......Macro registrata il 03/02/2006 da cad1 .....

Il mio scopo è quello di creare una specie di database con moduli che servono per lo spostamento degli elettrodi in una officina.


Dal caso vuoi creare un nesting per taglio Laser? In ogni caso io non creerei 30 fogli con tutte quelle macro. Per essere sicura di quello che stò scrivendo dovresti postare un link con una foto oppure il file che hai fatto.

Io farei un foglio(database) in cui archivierei i dati che mi servono,lo puoi divedere in righe(se hai tanti clienti o dati) e in base ai dati assegnare le righe che servono,oppure in colonne. Inoltre un foglio principale con il tuo rettangolo in cui importi i dati.tramite un pulsante apri un listbox che carichi all'avvio con i dati(titoli) che hai archiviato esempio
Codice: Seleziona tutto
Private Sub UserForm_Activate()
 i = 2 ' 2 righe per i titoli sulle colonne
Do Until Sheets("database").Cells(i, 1).Value = ""
With Sheets("database")
 elemento = .Cells(i, 1).Value ' carichi una matrice
 End With
 ListBox1.AddItem elemento ' aggiungi un elemento al list ad ogni loop
 i = i + 26 ' salti di 26 righe al prossimo cliente
 Loop
 ListBox1.ListIndex = 0
 End Sub

Così ogni 26 righe leggi un cliente o i tuoi dati,selezionato quello che ti serve nel listbox cliccando su un command button carichi i dati nel foglio principale.(al clik sul listbox assegni una variabile pubblica (public p as integer) e calcoli il n° di riga es.
Codice: Seleziona tutto
Private Sub ListBox1_Click()
p = ListBox1.ListIndex + 1 ' scopri l'indice della matrice(1°- 3° etcc) voce del list
p = (26 * p) - 24 ' calcoli
End Sub

Ripeto che si dovrebbe avere più informazioni su quello che vorresti fare,questo è solo un esempio che mi è venuto in mente leggendo i tuoi post.
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31


Torna a Applicazioni Office Windows


Topic correlati a "[Excel] Macro che funziona su tutti i fogli":


Chi c’è in linea

Visitano il forum: alfrimpa e 7 ospiti