Discussione:
VBA: caricare immagini jpg in un foglio Excel
(troppo vecchio per rispondere)
draleo
2017-01-28 09:38:29 UTC
Permalink
E’ possibile , tramite VBA, caricare in un foglio Excel, immagini prelevate da una cartella “Immagini” contenente più file Jpg, senza aprire i files stessi e senza fare il copia-incolla manuale ?
Per es. Se in una cartella , chiamata “immagini”, avessi i seguenti 4 files formato jpg; 1,2,3,4
E volessi incollarli rispettivamente nelle celle A7, E7,K7, P7 (quindi con passo 5 in orizzontale)
Cioè
1.jpg in A7, 4 celle vuote, 2.jpg in E7, 4 celle vuote, 3.jpg in K7, 4 celle vuote, 4 .jpg in P7)
Per il momento dovrei sapere solo se si può fare. In caso affermativo , preparerò una schema per il posizionamento delle immagini e chiederò ulteriori suggerimenti.
grazie
draleo
casanmaner
2017-01-28 15:46:27 UTC
Permalink
Post by draleo
E’ possibile , tramite VBA, caricare in un foglio Excel, immagini prelevate da una cartella “Immagini” contenente più file Jpg, senza aprire i files stessi e senza fare il copia-incolla manuale ?
Per es. Se in una cartella , chiamata “immagini”, avessi i seguenti 4 files formato jpg; 1,2,3,4
E volessi incollarli rispettivamente nelle celle A7, E7,K7, P7 (quindi con passo 5 in orizzontale)
Cioè
1.jpg in A7, 4 celle vuote, 2.jpg in E7, 4 celle vuote, 3.jpg in K7, 4 celle vuote, 4 .jpg in P7)
Per il momento dovrei sapere solo se si può fare. In caso affermativo , preparerò una schema per il posizionamento delle immagini e chiederò ulteriori suggerimenti.
grazie
draleo
Premesso che mi pare che la seconda, in base al passo 5, dovrebbe finire in F7, prova questa macro dove viene inserita, nel foglio attivo (activesheet) l'immagine, ridimensionata in altezza (ho usato 140 che poi con le mie foto ne portava la larghezza pari alle cinque colonne di larghezza 8,5), e le posiziona in corrispondenza dell'angolo superiore della cella di riferimento.
Prova se può esserti utile.
'---
Sub InserisciImmagini()
Const PercorsoImmagini As String = "C:\tmpImmagini\"
Dim Immagine As Object
Dim i As Long, NumCol As Long
Const PassoCol As Long = 5
Const NumRiga As Long = 7
NumCol = 1
For i = 1 To 4
Set Immagine = ActiveSheet.Pictures.Insert(PercorsoImmagini & "1.JPG")
With Immagine
.Height = "140"
.Top = ActiveSheet.Cells(NumRiga, NumCol).Top
.Left = ActiveSheet.Cells(NumRiga, NumCol).Left
End With
NumCol = NumCol + PassoCol
Next i
End Sub
'---
casanmaner
2017-01-28 15:47:57 UTC
Permalink
Post by casanmaner
Post by draleo
E’ possibile , tramite VBA, caricare in un foglio Excel, immagini prelevate da una cartella “Immagini” contenente più file Jpg, senza aprire i files stessi e senza fare il copia-incolla manuale ?
Per es. Se in una cartella , chiamata “immagini”, avessi i seguenti 4 files formato jpg; 1,2,3,4
E volessi incollarli rispettivamente nelle celle A7, E7,K7, P7 (quindi con passo 5 in orizzontale)
Cioè
1.jpg in A7, 4 celle vuote, 2.jpg in E7, 4 celle vuote, 3.jpg in K7, 4 celle vuote, 4 .jpg in P7)
Per il momento dovrei sapere solo se si può fare. In caso affermativo , preparerò una schema per il posizionamento delle immagini e chiederò ulteriori suggerimenti.
grazie
draleo
Premesso che mi pare che la seconda, in base al passo 5, dovrebbe finire in F7, prova questa macro dove viene inserita, nel foglio attivo (activesheet) l'immagine, ridimensionata in altezza (ho usato 140 che poi con le mie foto ne portava la larghezza pari alle cinque colonne di larghezza 8,5), e le posiziona in corrispondenza dell'angolo superiore della cella di riferimento.
Prova se può esserti utile.
'---
Sub InserisciImmagini()
Const PercorsoImmagini As String = "C:\tmpImmagini\"
Dim Immagine As Object
Dim i As Long, NumCol As Long
Const PassoCol As Long = 5
Const NumRiga As Long = 7
NumCol = 1
For i = 1 To 4
Set Immagine = ActiveSheet.Pictures.Insert(PercorsoImmagini & "1.JPG")
With Immagine
.Height = "140"
.Top = ActiveSheet.Cells(NumRiga, NumCol).Top
.Left = ActiveSheet.Cells(NumRiga, NumCol).Left
End With
NumCol = NumCol + PassoCol
Next i
End Sub
'---
Ops mi sono accorto che non ho modificato questa riga:
Set Immagine = ActiveSheet.Pictures.Insert(PercorsoImmagini & "1.JPG")

Per caricare le immagini in base al numero dato dal ciclo.
Modifica così:

Set Immagine = ActiveSheet.Pictures.Insert(PercorsoImmagini & i & ".JPG")
draleo
2017-01-28 16:26:20 UTC
Permalink
Post by casanmaner
Post by casanmaner
Post by draleo
E’ possibile , tramite VBA, caricare in un foglio Excel, immagini prelevate da una cartella “Immagini” contenente più file Jpg, senza aprire i files stessi e senza fare il copia-incolla manuale ?
Per es. Se in una cartella , chiamata “immagini”, avessi i seguenti 4 files formato jpg; 1,2,3,4
E volessi incollarli rispettivamente nelle celle A7, E7,K7, P7 (quindi con passo 5 in orizzontale)
Cioè
1.jpg in A7, 4 celle vuote, 2.jpg in E7, 4 celle vuote, 3.jpg in K7, 4 celle vuote, 4 .jpg in P7)
Per il momento dovrei sapere solo se si può fare. In caso affermativo , preparerò una schema per il posizionamento delle immagini e chiederò ulteriori suggerimenti.
grazie
draleo
Premesso che mi pare che la seconda, in base al passo 5, dovrebbe finire in F7, prova questa macro dove viene inserita, nel foglio attivo (activesheet) l'immagine, ridimensionata in altezza (ho usato 140 che poi con le mie foto ne portava la larghezza pari alle cinque colonne di larghezza 8,5), e le posiziona in corrispondenza dell'angolo superiore della cella di riferimento.
Prova se può esserti utile.
'---
Sub InserisciImmagini()
Const PercorsoImmagini As String = "C:\tmpImmagini\"
Dim Immagine As Object
Dim i As Long, NumCol As Long
Const PassoCol As Long = 5
Const NumRiga As Long = 7
NumCol = 1
For i = 1 To 4
Set Immagine = ActiveSheet.Pictures.Insert(PercorsoImmagini & "1.JPG")
With Immagine
.Height = "140"
.Top = ActiveSheet.Cells(NumRiga, NumCol).Top
.Left = ActiveSheet.Cells(NumRiga, NumCol).Left
End With
NumCol = NumCol + PassoCol
Next i
End Sub
'---
Set Immagine = ActiveSheet.Pictures.Insert(PercorsoImmagini & "1.JPG")
Per caricare le immagini in base al numero dato dal ciclo.
Set Immagine = ActiveSheet.Pictures.Insert(PercorsoImmagini & i & ".JPG")
Funziona bene (e non ne dubitavo).a questo punto dovrei perfezionare la cosa
1) non posso cambiare le dimensioni delle immagini (e ho risolto eliminando la riga .Height = "140").
2)così però le immagini mi vengono visualizzate sulla cella prescelta andando verso il basso; avendo immagini di diverse altezze , quindi queste mi vengono allineate sul loro bordo superiore. Io invece avrei necessita di allinearle sul loro bordo inferiore (cioè l'immagine dovrebbe svilupparsi verso l'alto). E' possibile ?
draleo
casanmaner
2017-01-28 16:48:25 UTC
Permalink
Post by draleo
Post by casanmaner
Post by casanmaner
Post by draleo
E’ possibile , tramite VBA, caricare in un foglio Excel, immagini prelevate da una cartella “Immagini” contenente più file Jpg, senza aprire i files stessi e senza fare il copia-incolla manuale ?
Per es. Se in una cartella , chiamata “immagini”, avessi i seguenti 4 files formato jpg; 1,2,3,4
E volessi incollarli rispettivamente nelle celle A7, E7,K7, P7 (quindi con passo 5 in orizzontale)
Cioè
1.jpg in A7, 4 celle vuote, 2.jpg in E7, 4 celle vuote, 3.jpg in K7, 4 celle vuote, 4 .jpg in P7)
Per il momento dovrei sapere solo se si può fare. In caso affermativo , preparerò una schema per il posizionamento delle immagini e chiederò ulteriori suggerimenti.
grazie
draleo
Premesso che mi pare che la seconda, in base al passo 5, dovrebbe finire in F7, prova questa macro dove viene inserita, nel foglio attivo (activesheet) l'immagine, ridimensionata in altezza (ho usato 140 che poi con le mie foto ne portava la larghezza pari alle cinque colonne di larghezza 8,5), e le posiziona in corrispondenza dell'angolo superiore della cella di riferimento.
Prova se può esserti utile.
'---
Sub InserisciImmagini()
Const PercorsoImmagini As String = "C:\tmpImmagini\"
Dim Immagine As Object
Dim i As Long, NumCol As Long
Const PassoCol As Long = 5
Const NumRiga As Long = 7
NumCol = 1
For i = 1 To 4
Set Immagine = ActiveSheet.Pictures.Insert(PercorsoImmagini & "1.JPG")
With Immagine
.Height = "140"
.Top = ActiveSheet.Cells(NumRiga, NumCol).Top
.Left = ActiveSheet.Cells(NumRiga, NumCol).Left
End With
NumCol = NumCol + PassoCol
Next i
End Sub
'---
Set Immagine = ActiveSheet.Pictures.Insert(PercorsoImmagini & "1.JPG")
Per caricare le immagini in base al numero dato dal ciclo.
Set Immagine = ActiveSheet.Pictures.Insert(PercorsoImmagini & i & ".JPG")
Funziona bene (e non ne dubitavo).a questo punto dovrei perfezionare la cosa
1) non posso cambiare le dimensioni delle immagini (e ho risolto eliminando la riga .Height = "140").
2)così però le immagini mi vengono visualizzate sulla cella prescelta andando verso il basso; avendo immagini di diverse altezze , quindi queste mi vengono allineate sul loro bordo superiore. Io invece avrei necessita di allinearle sul loro bordo inferiore (cioè l'immagine dovrebbe svilupparsi verso l'alto). E' possibile ?
A condizione che l'altezza delle immagini abbia un valore minore rispetto alla misura del "Top" della riga di riferimento prova qualcosa del genere:

'---
Sub InserisciImmagini()
Const PercorsoImmagini As String = "C:\tmpImmagini\"
Dim Immagine As Object
Dim i As Long, NumCol As Long
Const PassoCol As Long = 5
Const NumRiga As Long = 7
NumCol = 1
For i = 1 To 4
Set Immagine = ActiveSheet.Pictures.Insert(PercorsoImmagini & "1.JPG")
With Immagine
.Top = ActiveSheet.Cells(NumRiga, NumCol).Top - .Height
.Left = ActiveSheet.Cells(NumRiga, NumCol).Left
End With
NumCol = NumCol + PassoCol
Next i
End Sub
'---
casanmaner
2017-01-28 16:51:56 UTC
Permalink
Post by draleo
2)così però le immagini mi vengono visualizzate sulla cella prescelta andando verso il basso; avendo immagini di diverse altezze , quindi queste mi vengono allineate sul loro bordo superiore. Io invece avrei necessita di allinearle sul loro bordo inferiore (cioè l'immagine dovrebbe svilupparsi verso l'alto). E' possibile ?
Rileggendo vedo che vuoi che l'immagini si sviluppi dal bordo inferiore (e non superiore).

Sostituisci:

.Top = ActiveSheet.Cells(NumRiga, NumCol).Top - .Height

con:

.Top = ActiveSheet.Cells(NumRiga, NumCol).Top - .Height + ActiveSheet.Cells(NumRiga, NumCol).RowHeight
draleo
2017-01-28 17:04:03 UTC
Permalink
Post by casanmaner
Post by draleo
2)così però le immagini mi vengono visualizzate sulla cella prescelta andando verso il basso; avendo immagini di diverse altezze , quindi queste mi vengono allineate sul loro bordo superiore. Io invece avrei necessita di allinearle sul loro bordo inferiore (cioè l'immagine dovrebbe svilupparsi verso l'alto). E' possibile ?
Rileggendo vedo che vuoi che l'immagini si sviluppi dal bordo inferiore (e non superiore).
.Top = ActiveSheet.Cells(NumRiga, NumCol).Top - .Height
.Top = ActiveSheet.Cells(NumRiga, NumCol).Top - .Height + ActiveSheet.Cells(NumRiga, NumCol).RowHeight
Perfetto ! Adesso, visto che le prove hanno dato esiti positivi al di là di ogni mia più rosea previsione, devo fare mente locale per organizzare, con questa metodica, una specie di catalogo (che poi dovrei stampare)
Grazie mille. tornerò a farmi vivo, non appena mi sarò chiarito le idee
draleo
draleo
2017-01-29 13:58:02 UTC
Permalink
Continuando il discorso.
Non potendo lavorare con le dimensioni normali delle celle, ho ridimensionato sia l’altezza di tutte le righe (6), sia la larghezza di tutte le colonne (0,67). Ho ottenuto così un foglio , tipo carta millimetrata; ogni cella misura approssimativamente 2*2 mm; così, in anteprima di stampa, posso vedere i risultati con migliore precisione . Con questa metodica, la macro di partenza , modificando alcuni parametri
Const PassoCol As Long = 20
Const NumRiga As Long = 25
NumCol = 7
funziona bene e mette correttamente le prime 4 immagini nella stessa riga all’interno dei margini di stampa.
A questo punto, per inserire altre immagini, bisogna andare a capo.
Cioè la 5° immagine dovrebbe scendere di 25 righe (cioè passo verticale 25 righe), mantenendo sempre il passo orizzontale a 20 colonne.
E così via (dopo ogni gruppo di 4 immagini in orizzontale) occorre scendere di 25 righe, fino a riempire tutto il 1° foglio , che alla fine dell’operazione conterrà 20 immagini: distribuite in 5 righe, con 4 immagini ciascuna (Const NumRiga As Long = 25; Const PassoCol As Long = 20).
Esaurito il primo foglio di stampa, bisogna passare al 2° foglio, che conterrà altre 20 immagini, distribuite allo stesso modo. Ma al cambio di foglio (cioè dalla 21° immagine) nasce il problema: la prima riga del nuovo foglio di stampa , dove inserire la 21° immagine, non potrà essere 150 (125+25),ma dovrà essere 125+25+8. Queste 8 righe in più servono a contenere il piede di stampa e un po' di spazio vuoto , per separare la 1° pagina di stampa dalla 2°.
In definitiva ogni volta che si cambia il foglio di stampa (e quindi solo ogni 20 immagini) la prima riga dovrà essere posizionata così (ultima riga+25+8). E così via fino al termine
Speriamo di essere stato comprensibile. Si può fare ?
draleo
casanmaner
2017-01-29 15:12:04 UTC
Permalink
Post by draleo
Continuando il discorso.
Non potendo lavorare con le dimensioni normali delle celle, ho ridimensionato sia l’altezza di tutte le righe (6), sia la larghezza di tutte le colonne (0,67). Ho ottenuto così un foglio , tipo carta millimetrata; ogni cella misura approssimativamente 2*2 mm; così, in anteprima di stampa, posso vedere i risultati con migliore precisione . Con questa metodica, la macro di partenza , modificando alcuni parametri
Const PassoCol As Long = 20
Const NumRiga As Long = 25
NumCol = 7
funziona bene e mette correttamente le prime 4 immagini nella stessa riga all’interno dei margini di stampa.
A questo punto, per inserire altre immagini, bisogna andare a capo.
Cioè la 5° immagine dovrebbe scendere di 25 righe (cioè passo verticale 25 righe), mantenendo sempre il passo orizzontale a 20 colonne.
E così via (dopo ogni gruppo di 4 immagini in orizzontale) occorre scendere di 25 righe, fino a riempire tutto il 1° foglio , che alla fine dell’operazione conterrà 20 immagini: distribuite in 5 righe, con 4 immagini ciascuna (Const NumRiga As Long = 25; Const PassoCol As Long = 20).
Esaurito il primo foglio di stampa, bisogna passare al 2° foglio, che conterrà altre 20 immagini, distribuite allo stesso modo. Ma al cambio di foglio (cioè dalla 21° immagine) nasce il problema: la prima riga del nuovo foglio di stampa , dove inserire la 21° immagine, non potrà essere 150 (125+25),ma dovrà essere 125+25+8. Queste 8 righe in più servono a contenere il piede di stampa e un po' di spazio vuoto , per separare la 1° pagina di stampa dalla 2°.
In definitiva ogni volta che si cambia il foglio di stampa (e quindi solo ogni 20 immagini) la prima riga dovrà essere posizionata così (ultima riga+25+8). E così via fino al termine
Speriamo di essere stato comprensibile. Si può fare ?
draleo
Prova qualcosa del genere (nota che ho modificato la dichiarazione di alcune variabili/costanti e ne ho aggiunte altre per poter indicare il numero di immagini per riga e per pagina):
'----
Sub InserisciImmagini()
'Call CancellaImmagini

Const PercorsoImmagini As String = "C:\tmpImmagini\"
Const NumImmaginiPerRiga As Long = 4
Const NumImmaginiPerPagina As Long = 20
Const PassoCol As Long = 20
Const DeltaPassoRighe As Long = 25
Const DeltaRigheCambioPagina As Long = 8
Const NumColIniziale As Long = 7
Const NumeroImmaginiDaCaricare As Long = 50

Dim Immagine As Object
Dim i As Long, NumCol As Long, PassoRighe As Long

NumCol = NumColIniziale
PassoRighe = 0
For i = 1 To NumeroImmaginiDaCaricare
Set Immagine = ActiveSheet.Pictures.Insert(PercorsoImmagini & i & ".JPG")
With Immagine
'.Height = 42
.Top = ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Top + _
ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).RowHeight - .Height
.Left = ActiveSheet.Cells(DeltaPassoRighe, NumCol).Left
End With
If i Mod NumImmaginiPerRiga = 0 Then
NumCol = NumColIniziale
If i Mod NumImmaginiPerPagina = 0 Then
PassoRighe = PassoRighe + DeltaPassoRighe + DeltaRigheCambioPagina
Else
PassoRighe = PassoRighe + DeltaPassoRighe
End If
Else
NumCol = NumCol + PassoCol
End If
Next i
End Sub
'----
draleo
2017-01-29 19:52:05 UTC
Permalink
Post by casanmaner
Post by draleo
Continuando il discorso.
Non potendo lavorare con le dimensioni normali delle celle, ho ridimensionato sia l’altezza di tutte le righe (6), sia la larghezza di tutte le colonne (0,67). Ho ottenuto così un foglio , tipo carta millimetrata; ogni cella misura approssimativamente 2*2 mm; così, in anteprima di stampa, posso vedere i risultati con migliore precisione . Con questa metodica, la macro di partenza , modificando alcuni parametri
Const PassoCol As Long = 20
Const NumRiga As Long = 25
NumCol = 7
funziona bene e mette correttamente le prime 4 immagini nella stessa riga all’interno dei margini di stampa.
A questo punto, per inserire altre immagini, bisogna andare a capo.
Cioè la 5° immagine dovrebbe scendere di 25 righe (cioè passo verticale 25 righe), mantenendo sempre il passo orizzontale a 20 colonne.
E così via (dopo ogni gruppo di 4 immagini in orizzontale) occorre scendere di 25 righe, fino a riempire tutto il 1° foglio , che alla fine dell’operazione conterrà 20 immagini: distribuite in 5 righe, con 4 immagini ciascuna (Const NumRiga As Long = 25; Const PassoCol As Long = 20).
Esaurito il primo foglio di stampa, bisogna passare al 2° foglio, che conterrà altre 20 immagini, distribuite allo stesso modo. Ma al cambio di foglio (cioè dalla 21° immagine) nasce il problema: la prima riga del nuovo foglio di stampa , dove inserire la 21° immagine, non potrà essere 150 (125+25),ma dovrà essere 125+25+8. Queste 8 righe in più servono a contenere il piede di stampa e un po' di spazio vuoto , per separare la 1° pagina di stampa dalla 2°.
In definitiva ogni volta che si cambia il foglio di stampa (e quindi solo ogni 20 immagini) la prima riga dovrà essere posizionata così (ultima riga+25+8). E così via fino al termine
Speriamo di essere stato comprensibile. Si può fare ?
draleo
'----
Sub InserisciImmagini()
'Call CancellaImmagini
Const PercorsoImmagini As String = "C:\tmpImmagini\"
Const NumImmaginiPerRiga As Long = 4
Const NumImmaginiPerPagina As Long = 20
Const PassoCol As Long = 20
Const DeltaPassoRighe As Long = 25
Const DeltaRigheCambioPagina As Long = 8
Const NumColIniziale As Long = 7
Const NumeroImmaginiDaCaricare As Long = 50
Dim Immagine As Object
Dim i As Long, NumCol As Long, PassoRighe As Long
NumCol = NumColIniziale
PassoRighe = 0
For i = 1 To NumeroImmaginiDaCaricare
Set Immagine = ActiveSheet.Pictures.Insert(PercorsoImmagini & i & ".JPG")
With Immagine
'.Height = 42
.Top = ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Top + _
ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).RowHeight - .Height
.Left = ActiveSheet.Cells(DeltaPassoRighe, NumCol).Left
End With
If i Mod NumImmaginiPerRiga = 0 Then
NumCol = NumColIniziale
If i Mod NumImmaginiPerPagina = 0 Then
PassoRighe = PassoRighe + DeltaPassoRighe + DeltaRigheCambioPagina
Else
PassoRighe = PassoRighe + DeltaPassoRighe
End If
Else
NumCol = NumCol + PassoCol
End If
Next i
End Sub
'----
Perfetto (quasi). Il quasi è dovuto al fatto che, SOLO nella prima fila e SOLO nel 1° Foglio, la 3° e 4° foto, vengono caricate sulla riga successiva (lasciando vuoto il 3° e 4° spazio). ma la sequenza poi riprende correttamente dalla 2° fila. Inoltre vedo che avevi previsto la macro Cancellaimmagini (poi disattivata). Mi sarebbe invece UTILISSIMA, perché in questa fase di prove, cancellare a mano 100-150 immagini, è un po'macchinoso. Poi dovrò inserire una breve didascalia (una riga sotto la relativa immagine). Sto preparando l'elenco delle didascalie da inserire, ordinate correttamente come le relative foto, in una colonna di un altro foglio Excel, sullo stesso file : ma non dovrebbero esserci difficoltà (la procedura è la stessa, con la differenza che si tratta di una stringa di testo, posizionata in un altro foglio Excel
Appena pronta, torno a chiederti l'ennesimo aiuto per inserirle
draleo
casanmaner
2017-01-29 20:25:18 UTC
Permalink
Post by draleo
Post by casanmaner
Post by draleo
Continuando il discorso.
Non potendo lavorare con le dimensioni normali delle celle, ho ridimensionato sia l’altezza di tutte le righe (6), sia la larghezza di tutte le colonne (0,67). Ho ottenuto così un foglio , tipo carta millimetrata; ogni cella misura approssimativamente 2*2 mm; così, in anteprima di stampa, posso vedere i risultati con migliore precisione . Con questa metodica, la macro di partenza , modificando alcuni parametri
Const PassoCol As Long = 20
Const NumRiga As Long = 25
NumCol = 7
funziona bene e mette correttamente le prime 4 immagini nella stessa riga all’interno dei margini di stampa.
A questo punto, per inserire altre immagini, bisogna andare a capo.
Cioè la 5° immagine dovrebbe scendere di 25 righe (cioè passo verticale 25 righe), mantenendo sempre il passo orizzontale a 20 colonne.
E così via (dopo ogni gruppo di 4 immagini in orizzontale) occorre scendere di 25 righe, fino a riempire tutto il 1° foglio , che alla fine dell’operazione conterrà 20 immagini: distribuite in 5 righe, con 4 immagini ciascuna (Const NumRiga As Long = 25; Const PassoCol As Long = 20).
Esaurito il primo foglio di stampa, bisogna passare al 2° foglio, che conterrà altre 20 immagini, distribuite allo stesso modo. Ma al cambio di foglio (cioè dalla 21° immagine) nasce il problema: la prima riga del nuovo foglio di stampa , dove inserire la 21° immagine, non potrà essere 150 (125+25),ma dovrà essere 125+25+8. Queste 8 righe in più servono a contenere il piede di stampa e un po' di spazio vuoto , per separare la 1° pagina di stampa dalla 2°.
In definitiva ogni volta che si cambia il foglio di stampa (e quindi solo ogni 20 immagini) la prima riga dovrà essere posizionata così (ultima riga+25+8). E così via fino al termine
Speriamo di essere stato comprensibile. Si può fare ?
draleo
'----
Sub InserisciImmagini()
'Call CancellaImmagini
Const PercorsoImmagini As String = "C:\tmpImmagini\"
Const NumImmaginiPerRiga As Long = 4
Const NumImmaginiPerPagina As Long = 20
Const PassoCol As Long = 20
Const DeltaPassoRighe As Long = 25
Const DeltaRigheCambioPagina As Long = 8
Const NumColIniziale As Long = 7
Const NumeroImmaginiDaCaricare As Long = 50
Dim Immagine As Object
Dim i As Long, NumCol As Long, PassoRighe As Long
NumCol = NumColIniziale
PassoRighe = 0
For i = 1 To NumeroImmaginiDaCaricare
Set Immagine = ActiveSheet.Pictures.Insert(PercorsoImmagini & i & ".JPG")
With Immagine
'.Height = 42
.Top = ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Top + _
ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).RowHeight - .Height
.Left = ActiveSheet.Cells(DeltaPassoRighe, NumCol).Left
End With
If i Mod NumImmaginiPerRiga = 0 Then
NumCol = NumColIniziale
If i Mod NumImmaginiPerPagina = 0 Then
PassoRighe = PassoRighe + DeltaPassoRighe + DeltaRigheCambioPagina
Else
PassoRighe = PassoRighe + DeltaPassoRighe
End If
Else
NumCol = NumCol + PassoCol
End If
Next i
End Sub
'----
Perfetto (quasi). Il quasi è dovuto al fatto che, SOLO nella prima fila e SOLO nel 1° Foglio, la 3° e 4° foto, vengono caricate sulla riga successiva (lasciando vuoto il 3° e 4° spazio). ma la sequenza poi riprende correttamente dalla 2° fila. Inoltre vedo che avevi previsto la macro Cancellaimmagini (poi disattivata). Mi sarebbe invece UTILISSIMA, perché in questa fase di prove, cancellare a mano 100-150 immagini, è un po'macchinoso. Poi dovrò inserire una breve didascalia (una riga sotto la relativa immagine). Sto preparando l'elenco delle didascalie da inserire, ordinate correttamente come le relative foto, in una colonna di un altro foglio Excel, sullo stesso file : ma non dovrebbero esserci difficoltà (la procedura è la stessa, con la differenza che si tratta di una stringa di testo, posizionata in un altro foglio Excel
Appena pronta, torno a chiederti l'ennesimo aiuto per inserirle
draleo
Mi sa che il problema è in questa riga:
.Left = ActiveSheet.Cells(DeltaPassoRighe, NumCol).Left

dove ho dimenticato di inserire, a seguito delle modifiche fatte, il "PassoRighe".

Prova con la procedura così modificata dove, oltre a correggere quella riga, ho inserito delle righe per "unire" delle celle al di sotto delle immagini e inserire una "didascalia" (basta sull'indice che dovrebbe corrispondere al numero dell'immagine caricata).

'---
Sub InserisciImmagini()

Call CancellaImmagini

Const PercorsoImmagini As String = "C:\tmpImmagini\"
Const NumImmaginiPerRiga As Long = 4
Const NumImmaginiPerPagina As Long = 20
Const PassoCol As Long = 20
Const DeltaPassoRighe As Long = 25
Const DeltaRigheCambioPagina As Long = 8
Const NumColIniziale As Long = 7
Const NumeroImmaginiDaCaricare As Long = 50

Dim Immagine As Object
Dim i As Long, NumCol As Long, PassoRighe As Long

NumCol = NumColIniziale
PassoRighe = 0
For i = 1 To NumeroImmaginiDaCaricare
Set Immagine = ActiveSheet.Pictures.Insert(PercorsoImmagini & i & ".JPG")
With Immagine
.Height = 42
.Top = ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Top + _
ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).RowHeight - .Height
.Left = ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Left
'<--- con questi comandi unisco le celle al di sotto dell'immagine (2 righe e 12 colonne) _
e inserisco una "didascalia"
With ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Offset(1, 0).Resize(2, 12)
Debug.Print .Address
.Merge
.Value = "Immagine " & i & ".JPG"
End With
'--->
End With
If i Mod NumImmaginiPerRiga = 0 Then
NumCol = NumColIniziale
If i Mod NumImmaginiPerPagina = 0 Then
PassoRighe = PassoRighe + DeltaPassoRighe + DeltaRigheCambioPagina
Else
PassoRighe = PassoRighe + DeltaPassoRighe
End If
Else
NumCol = NumCol + PassoCol
End If
Next i
End Sub


Sub CancellaImmagini()
Dim shp As Shape
'<--- n.b. per mia semplicità cancello tutte le celle per ripristinare per ogni nuovo inserimento.
' da valutare nel caso specifico come modificare
ActiveSheet.Cells.Clear

'n.b. nel foglio ho un "pulsante modulo" nominato "Pulsante" e ho impostato la condizione di _
cancellare tutte le immagini tranne quella nominata "Pulsante"
For Each shp In ActiveSheet.Shapes
With shp
If .Name <> "Pulsante" Then .Delete
End With
Next shp
End Sub
'---
casanmaner
2017-01-29 20:34:39 UTC
Permalink
Ah... Il "Debug.Print" é da eliminare :)
draleo
2017-01-29 21:35:36 UTC
Permalink
Post by casanmaner
Ah... Il "Debug.Print" é da eliminare :)
No, non è cambiato niente. Continua a mettere La 3°e 4°Foto, sulla seconda riga. Non so perché. Se si trattasse solo di una riga, non sarebbe molto importante. Solo che ho provato solo una centinaio di foto (ma alla fine del lavoro dovrebbero essere circa 2mila). speriamo non si ripeta con le altre. La didascalia funziona molto bene ed è ottima l'idea di unire più celle. Il Pulsante per cancellare non l'ho usato, perché cancellerebbe tutte le celle e quindi cancellerebbe anche gli altri dati ,che in parte sono già presenti e che alla fine del lavoro aumenteranno (Titolo della pagina,num pagina, piè di pagina, ecc). Ma questo è un problema secondario, sul quale ora si può soprassedere
draleo
draleo
2017-01-29 21:52:07 UTC
Permalink
Post by draleo
Post by casanmaner
Ah... Il "Debug.Print" é da eliminare :)
No, non è cambiato niente. Continua a mettere La 3°e 4°Foto, sulla seconda riga. Non so perché. Se si trattasse solo di una riga, non sarebbe molto importante. Solo che ho provato solo una centinaio di foto (ma alla fine del lavoro dovrebbero essere circa 2mila). speriamo non si ripeta con le altre. La didascalia funziona molto bene ed è ottima l'idea di unire più celle. Il Pulsante per cancellare non l'ho usato, perché cancellerebbe tutte le celle e quindi cancellerebbe anche gli altri dati ,che in parte sono già presenti e che alla fine del lavoro aumenteranno (Titolo della pagina,num pagina, piè di pagina, ecc). Ma questo è un problema secondario, sul quale ora si può soprassedere
draleo
Stranissimo: Ho cambiato i numeri delle immagini e il problema è sparito. Se parto dalla immagine 1 alla immagine 50, il problema non c'è più. Ma se parto dal num 540 per es fino al 590, allora il problema si ripresenta. Boh...
draleo
casanmaner
2017-01-29 21:56:18 UTC
Permalink
Post by draleo
Post by draleo
Post by casanmaner
Ah... Il "Debug.Print" é da eliminare :)
No, non è cambiato niente. Continua a mettere La 3°e 4°Foto, sulla seconda riga. Non so perché. Se si trattasse solo di una riga, non sarebbe molto importante. Solo che ho provato solo una centinaio di foto (ma alla fine del lavoro dovrebbero essere circa 2mila). speriamo non si ripeta con le altre. La didascalia funziona molto bene ed è ottima l'idea di unire più celle. Il Pulsante per cancellare non l'ho usato, perché cancellerebbe tutte le celle e quindi cancellerebbe anche gli altri dati ,che in parte sono già presenti e che alla fine del lavoro aumenteranno (Titolo della pagina,num pagina, piè di pagina, ecc). Ma questo è un problema secondario, sul quale ora si può soprassedere
draleo
Stranissimo: Ho cambiato i numeri delle immagini e il problema è sparito. Se parto dalla immagine 1 alla immagine 50, il problema non c'è più. Ma se parto dal num 540 per es fino al 590, allora il problema si ripresenta. Boh...
draleo
Questo è quello che vedo nel mio file

Loading Image...

Il problema è che parti da un numero "pari" 540.
casanmaner
2017-01-29 22:52:52 UTC
Permalink
Proviamo a cambiare approccio.
Invece di "contare" i cambi tramite la funzione mod utilizziamo un contatore sia per le immagini inserite per riga che quelle inserite per pagina.
In questa versione ho aggiunto una costante dove indicare il numero della prima immagine, dichiarato una variabile pari al numero finale dell'ultima immagine da caricare e valorizzato la stessa e utilizzata ai fini del ciclo (assieme al numero della prima immagine).

Prova a vedere se così riesci a caricare le immagini a "piacere" in base al numero iniziale e al numero di immagini che vuoi vengano caricate.
A me sembra così ma avendo diverse immagini che sono copie di altre può comunque sfuggirmi a colpo d'occhio se c'è qualcosa che non torna.


'---
Sub InserisciImmaginiII()

Call CancellaImmagini

Const PercorsoImmagini As String = "C:\tmpImmagini\"

Const NumeroPrimaImmagine As Long = 4
Const NumeroImmaginiDaCaricare As Long = 58

Const NumImmaginiPerRiga As Long = 4
Const NumImmaginiPerPagina As Long = 20
Const PassoCol As Long = 20
Const DeltaPassoRighe As Long = 25
Const DeltaRigheCambioPagina As Long = 8
Const NumColIniziale As Long = 7

Dim Immagine As Object
Dim i As Long, NumCol As Long, PassoRighe As Long
Dim NumeroUltimaImmagine
Dim ContatoreImmaginiPerRiga As Long, ContatoreImmaginiPerColonna As Long

NumeroUltimaImmagine = NumeroPrimaImmagine + NumeroImmaginiDaCaricare - 1
NumCol = NumColIniziale
PassoRighe = 0
ContatoreImmaginiPerRiga = 0
ContatoreImmaginiPerColonna = 0

For i = NumeroPrimaImmagine To NumeroUltimaImmagine
Set Immagine = ActiveSheet.Pictures.Insert(PercorsoImmagini & i & ".JPG")
With Immagine
.Height = 42
.Top = ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Top + _
ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).RowHeight - .Height
.Left = ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Left
'<--- con questi comandi unisco le celle al di sotto dell'immagine (2 righe e 12 colonne) _
e inserisco una "didascalia"
With ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Offset(1, 0).Resize(2, 12)
Debug.Print .Address
.Merge
.Value = "Immagine " & i & ".JPG"
End With
'--->
ContatoreImmaginiPerRiga = ContatoreImmaginiPerRiga + 1
ContatoreImmaginiPerColonna = ContatoreImmaginiPerColonna + 1
End With

If ContatoreImmaginiPerRiga >= NumImmaginiPerRiga Then
ContatoreImmaginiPerRiga = 0
NumCol = NumColIniziale
If ContatoreImmaginiPerColonna >= NumImmaginiPerPagina Then
ContatoreImmaginiPerColonna = 0
PassoRighe = PassoRighe + DeltaPassoRighe + DeltaRigheCambioPagina
Else
PassoRighe = PassoRighe + DeltaPassoRighe
End If
Else
NumCol = NumCol + PassoCol
End If
Next i
End Sub
'---
casanmaner
2017-01-29 23:00:10 UTC
Permalink
Anche in questa, ovviamente, il Debug.Print è da eliminare (me ne sono scordato :-) ).
Inoltre le due condizioni:
If ContatoreImmaginiPerRiga >= NumImmaginiPerRiga Then
e
If ContatoreImmaginiPerRiga >= NumImmaginiPerRiga Then

in verità possono essere poste senza il > ma solo con = in quanto i contatori non potranno mai superare i valori di NumImmaginiPerRiga e NumImmaginiPerRiga perché ragginto tale valore vengono nuovamente azzerati.

ciao
draleo
2017-01-30 14:27:54 UTC
Permalink
Post by casanmaner
Anche in questa, ovviamente, il Debug.Print è da eliminare (me ne sono scordato :-) ).
If ContatoreImmaginiPerRiga >= NumImmaginiPerRiga Then
e
If ContatoreImmaginiPerRiga >= NumImmaginiPerRiga Then
in verità possono essere poste senza il > ma solo con = in quanto i contatori non potranno mai superare i valori di NumImmaginiPerRiga e NumImmaginiPerRiga perché ragginto tale valore vengono nuovamente azzerati.
ciao
Si.ora va bene;ho fatto alcune prove e con le nuove modifiche e il problema è scomparso. Posso iniziare a caricare le foto dal num che preferisco. Ho però notato un'altra situazione, in cui si verifica un errore. Se la sequenza delle foto(1,2,3,4,5 ecc) fosse 1,2,3,3A,4,5 ecc, si verifica un errore in quanto l'immagine 3A non viene riconosciuta come numero. E' un evento raro, perché in circa 2000 foto, ce ne saranno solo 15-20 di questo tipo, e posso aggirare l'ostacolo: arrestare la sequenza prima del num incriminato, inserire la foto a mano e poi riprendere la sequenza. ma se si potesse fare in maniera automatica sarebbe ancora meglio. E' fattibile ?
grazie
draleo
casanmaner
2017-01-30 17:29:49 UTC
Permalink
Post by draleo
Post by casanmaner
Anche in questa, ovviamente, il Debug.Print è da eliminare (me ne sono scordato :-) ).
If ContatoreImmaginiPerRiga >= NumImmaginiPerRiga Then
e
If ContatoreImmaginiPerRiga >= NumImmaginiPerRiga Then
in verità possono essere poste senza il > ma solo con = in quanto i contatori non potranno mai superare i valori di NumImmaginiPerRiga e NumImmaginiPerRiga perché ragginto tale valore vengono nuovamente azzerati.
ciao
Si.ora va bene;ho fatto alcune prove e con le nuove modifiche e il problema è scomparso. Posso iniziare a caricare le foto dal num che preferisco. Ho però notato un'altra situazione, in cui si verifica un errore. Se la sequenza delle foto(1,2,3,4,5 ecc) fosse 1,2,3,3A,4,5 ecc, si verifica un errore in quanto l'immagine 3A non viene riconosciuta come numero. E' un evento raro, perché in circa 2000 foto, ce ne saranno solo 15-20 di questo tipo, e posso aggirare l'ostacolo: arrestare la sequenza prima del num incriminato, inserire la foto a mano e poi riprendere la sequenza. ma se si potesse fare in maniera automatica sarebbe ancora meglio. E' fattibile ?
grazie
draleo
Queste eccezioni sarebbe bene evitarle perché comportano parecchi problemi (soprattutto se poi l'eccezione non si riferisse alla sola lettera A) e visto che si sta impostando il lavoro forse sarebbe più opportuno adattare il formato che si sta elaborando in modo che il numero XA diventi X+1 e via a scalare i numeri di riferimento successivi.

Comunque ti propongo questa ultima versione.
Hai puristi della programmazione non piacerà perché è un po' "spagetti code" in quanto il codice, in presenza di un numero per cui è presente una eccezione, rimanda in "su" per "riprendere il ciclo" (vedi EccezioneNumerica: e GoTo EccezioneNumerica).
Ma è la soluzione più immediata che mi è venuta e quindi dovrai accontentarti :-)

Quindi prova qualcosa del genere:
'---

Sub InserisciImmaginiIII()

Call CancellaImmagini

Const PercorsoImmagini As String = "C:\tmpImmagini\"

Const NumeroPrimaImmagineIniziale As Long = 1
Const NumeroImmaginiDaCaricare As Long = 60

Const NumImmaginiPerRiga As Long = 4
Const NumImmaginiPerPagina As Long = 20
Const PassoCol As Long = 20
Const DeltaPassoRighe As Long = 25
Const DeltaRigheCambioPagina As Long = 8
Const NumColIniziale As Long = 7

Dim Immagine As Object
Dim i As Long, NumCol As Long, PassoRighe As Long
Dim NumeroPrimaImmagine As Long, NumeroUltimaImmagine As Long
Dim ContatoreImmaginiPerRiga As Long, ContatoreImmaginiPerColonna As Long
Dim stringaEccezioneNumerica As String

NumeroPrimaImmagine = NumeroPrimaImmagineIniziale
NumeroUltimaImmagine = NumeroPrimaImmagine + NumeroImmaginiDaCaricare - 1
NumCol = NumColIniziale
PassoRighe = 0
ContatoreImmaginiPerRiga = 0
ContatoreImmaginiPerColonna = 0
stringaEccezioneNumerica = vbNullString

EccezioneNumerica:
For i = NumeroPrimaImmagine To NumeroUltimaImmagine
'<--- inserimento immagini senza eccezione numerica - start
Set Immagine = ActiveSheet.Pictures.Insert(PercorsoImmagini & i & stringaEccezioneNumerica & ".JPG")
With Immagine
.Height = 42
.Top = ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Top + _
ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).RowHeight - .Height
.Left = ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Left
'<--- con questi comandi unisco le celle al di sotto dell'immagine (2 righe e 12 colonne) _
e inserisco una "didascalia"
With ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Offset(1, 0).Resize(2, 12)
.Merge
.Value = "Immagine " & i & stringaEccezioneNumerica & ".JPG"
End With
'--->
ContatoreImmaginiPerRiga = ContatoreImmaginiPerRiga + 1
ContatoreImmaginiPerColonna = ContatoreImmaginiPerColonna + 1
End With
If ContatoreImmaginiPerRiga = NumImmaginiPerRiga Then
ContatoreImmaginiPerRiga = 0
NumCol = NumColIniziale
If ContatoreImmaginiPerColonna = NumImmaginiPerPagina Then
ContatoreImmaginiPerColonna = 0
PassoRighe = PassoRighe + DeltaPassoRighe + DeltaRigheCambioPagina
Else
PassoRighe = PassoRighe + DeltaPassoRighe
End If
Else
NumCol = NumCol + PassoCol
End If
'inserimento immagini senza eccezione numerica - end --->
'<--- inserimento immagini con eccezione numerica - start
If stringaEccezioneNumerica = vbNullString Then
Select Case i
Case 3, 7, 10 '<=== inserire i numeri per cui è presente una eccezione numerica
stringaEccezioneNumerica = "A"
NumeroPrimaImmagine = i
NumeroUltimaImmagine = NumeroUltimaImmagine - 1
GoTo EccezioneNumerica '<= rimando "spaghetti code"
End Select
End If
stringaEccezioneNumerica = vbNullString
'inserimento immagini con eccezione numerica - end --->
Next i
End Sub
'---

Nota che se parti da un dato numero, es. 1, e indichi che vuoi caricare un certo numero di immagini, es. 60, con questo codice il numero di immagini caricate sarà sempre 60. Il numero dell'ultima immagine caricata sarà influenzato dal numero di eccezioni indicate.
Io ho inserito tre immagini nominate 3A, 7A e 10A.
Sono partito dalla 1 e ho indicato di caricarne 60.
Poiché in corrispondenza dei n. 3, 7 e 10 carico anche le immagini 3A, 7A e 10A e poiché comunque carico sempre 60 immagini l'ultima immagine caricata sarà la n. 57.
draleo
2017-01-30 18:29:18 UTC
Permalink
Io eviterei volentieri tutte le eccezioni, ma purtroppo non posso farlo.I num delle immagini corrispondo ai num di catalogo degli articoli, e non posso cambiarli, altrimenti falserei tutta la sua numerazione. Comunque, quel che conta è il risultato. E il risultato è che la correzione funziona benissimo. Anche troppo bene; io mi sarei accontentato di soluzioni più semplici, del tipo : se c'è un qualsiasi errore nella sequenza numerica delle foto (lettere dell'alfabeto, oppure mancasse un numero nella sequenza,) allora passa alla foto successiva e lascia uno spazio vuoto. Poi provvederei io manualmente ad inserire quello che manca. Saranno 15-20 eccezioni al massimo e non sarebbe un problema inserire manualmente 20 foto. Se tu non avessi realizzato questa OTTIMA procedura, avrei dovuto inserirne manualmente 2mila!(avrei rinunciato a questa idea). Farò ulteriori prove; forse ci sarà da migliorare qualcosa di secondario; ma il grosso del lavoro è a posto. Complimenti
draleo
casanmaner
2017-01-30 19:03:11 UTC
Permalink
Post by draleo
Io eviterei volentieri tutte le eccezioni, ma purtroppo non posso farlo.I num delle immagini corrispondo ai num di catalogo degli articoli, e non posso cambiarli, altrimenti falserei tutta la sua numerazione. Comunque, quel che conta è il risultato. E il risultato è che la correzione funziona benissimo. Anche troppo bene; io mi sarei accontentato di soluzioni più semplici, del tipo : se c'è un qualsiasi errore nella sequenza numerica delle foto (lettere dell'alfabeto, oppure mancasse un numero nella sequenza,) allora passa alla foto successiva e lascia uno spazio vuoto.
Non è detto che sia più semplice :-)
Come avrai notato la procedura non fa alcuna verifica sulla presenza di file ma parte dal "presupposto" che i file ci siano.
Certo volendo si potrebbe anche impostare dei massaggi di errore o anche un semplice "On Error Resume Next" nel qual caso se mancasse un'immagine la procedura salterebbe la parte dell'inserimento della stessa eseguendo però gli altri comandi (compreso il conteggio progressivo).
Invece per eventuali numeri con lettere, come avrai notato, viene richiesto di indicare per quali numeri esistono delle immagini tipo iA.JPG.
draleo
2017-02-01 09:28:17 UTC
Permalink
La procedura VBA funziona molto bene (ogni tanto si verifica qualche errore per eccezioni che non avevo previsto, ma questo è un problema minimo e al quale si può sopperire anche manualmente). Il vero problema è grafico: viene fuori un lungo elenco di foto (che sono circa 4mila e non 2mila, come pensavo inizialmente) che si susseguono ininterrottamente con soluzioni di continuità. Come se in una libreria i volumi siano disposti su un unico scaffale, senza alcun separatore tra le varie categorie: diventa arduo cercare il volume che interessa. Occorrerebbe fare in modo che ogni volta che si cambia categoria ( in posizioni prefissate , che io conosco o che posso ricavare facilmente) si possa andare a pagina nuova
Inoltre servirebbe inserire degli spazi vuoti (in posizioni prefissate e che io conosco) che servono o ad inserire annotazioni o a dividere le categorie in sottocategorie. Non so se sia possibile farlo con il VBA: cioè aggiungere una nuova macro , che intervenendo dopo quella esistente e che funziona bene e quindi non sarebbe opportuno toccare, possa risistemare le immagini, secondo questi concetti. Se la soluzione con il VBA non fosse possibile, l'alternativa sarebbe di inserire nella cartella sorgente , in posizioni prefissata ,delle nuove immagini fittizie, facilmente riconoscibili, che poi eliminerò manualmente, ottenendo gli spazi vuoti che mi servono. In questo modo si eliminerebbe anche il problema delle eccezioni, ma…certo non è uno scherzo rinominare 4000 foto. Qualche idea ?
draleo
casanmaner
2017-02-01 12:48:29 UTC
Permalink
Post by draleo
La procedura VBA funziona molto bene (ogni tanto si verifica qualche errore per eccezioni che non avevo previsto, ma questo è un problema minimo e al quale si può sopperire anche manualmente). Il vero problema è grafico: viene fuori un lungo elenco di foto (che sono circa 4mila e non 2mila, come pensavo inizialmente) che si susseguono ininterrottamente con soluzioni di continuità. Come se in una libreria i volumi siano disposti su un unico scaffale, senza alcun separatore tra le varie categorie: diventa arduo cercare il volume che interessa. Occorrerebbe fare in modo che ogni volta che si cambia categoria ( in posizioni prefissate , che io conosco o che posso ricavare facilmente) si possa andare a pagina nuova
Inoltre servirebbe inserire degli spazi vuoti (in posizioni prefissate e che io conosco) che servono o ad inserire annotazioni o a dividere le categorie in sottocategorie. Non so se sia possibile farlo con il VBA: cioè aggiungere una nuova macro , che intervenendo dopo quella esistente e che funziona bene e quindi non sarebbe opportuno toccare, possa risistemare le immagini, secondo questi concetti. Se la soluzione con il VBA non fosse possibile, l'alternativa sarebbe di inserire nella cartella sorgente , in posizioni prefissata ,delle nuove immagini fittizie, facilmente riconoscibili, che poi eliminerò manualmente, ottenendo gli spazi vuoti che mi servono. In questo modo si eliminerebbe anche il problema delle eccezioni, ma…certo non è uno scherzo rinominare 4000 foto. Qualche idea ?
draleo
Tutto o quasi è possibile ma il problema principale è che la cosa si fa sempre più complessa e non avendo tutto il quadro completo diventa difficile, se dall'altra parte non c'è qualcuno in grado di "personalizzare", arrivare alla fine :-)

Nel frattempo ti consiglio una modifica alla procedura in modo che i nomi delle immagini nel foglio corrispondano, per le immagini caricate automaticamente, alla numerazione caricata (con l'indicazione della eventuale eccezione).
Dopo
With Immagine

inserisci

.Name = "Immagine " & i & stringaEccezioneNumerica

In questo modo nel foglio avrai comunque delle immagini nominate in base al numero del catalogo.


Per inserire spazi in posizioni che tu conosci dovresti individuare le posizioni (ad es. con il Select Case come ho fatto per individuare le eccezioni o con delle condizioni IF) e in quei casi andare a modificare il "PassoRighe" eventualmente valorizzando una ulteriore variabile a cui dare un certo valore e poi azzerare dopo averlo assegnato alla variabile "PassoRighe". Volendo inserendo anche una interruzione di pagina.
Nella procedura ho fatto in modo che un dato testo venga inserito al di sotto delle immagini.

Qualcosa del genere potresti creare, in altra posizione, per inserire un testo, basato su uno più numeri di indice, per inserire un testo che indichi la categoria e volendo per inserire una interruzione di pagina.
draleo
2017-02-01 20:45:41 UTC
Permalink
Per quanto riguarda il cambio di pagina, credo che mi orienterò verso la realizzazione di più Fogli (e/o più file). In ognuno lavorerò con una sola categoria di immagini per volta; poi alla fine, riunirò tutti i fogli in un solo foglio, in modo che il cambio di pagina avvenga senza codice.
Invece per quanto riguarda l’inserimento di spazi vuoti per inserire annotazioni o quanto altro, ci penserò.
Adesso ho invece un paio di problemi “ estetici ”:
1)Come modificare perché la didascalia abbia sempre lo stesso carattere (per es: Calibri 9, corsivo e con il testo a capo)?
With ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Offset(1, 0).Resize(2, 12)
.Merge
.Value = "Immagine " & i & stringaEccezioneNumerica
End With
2)Vorrei inserire in tutte le pagine dei riquadri (come appare nel file che ho postato su DropBox https://www.dropbox.com/s/ng617k5po72z1b3/catalogo_prova.xlsm?dl=0 Quelli presenti le ho fatti a mano; ma farli a mano in 150 pagine circa è un po' lungo; anche perché quando lancio la procedura cancella immagini, mi viene cancellato tutto. Si possono realizzare quei riquadri in tutte le pagine delle immagini col VBA ? (mantenendo sempre le stesse posizioni e dimensioni del riquadro riportato nel file postato)
draleo
casanmaner
2017-02-01 22:15:56 UTC
Permalink
Post by draleo
Per quanto riguarda il cambio di pagina, credo che mi orienterò verso la realizzazione di più Fogli (e/o più file). In ognuno lavorerò con una sola categoria di immagini per volta; poi alla fine, riunirò tutti i fogli in un solo foglio, in modo che il cambio di pagina avvenga senza codice.
Invece per quanto riguarda l’inserimento di spazi vuoti per inserire annotazioni o quanto altro, ci penserò.
1)Come modificare perché la didascalia abbia sempre lo stesso carattere (per es: Calibri 9, corsivo e con il testo a capo)?
With ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Offset(1, 0).Resize(2, 12)
.Merge
.Value = "Immagine " & i & stringaEccezioneNumerica
End With
2)Vorrei inserire in tutte le pagine dei riquadri (come appare nel file che ho postato su DropBox https://www.dropbox.com/s/ng617k5po72z1b3/catalogo_prova.xlsm?dl=0 Quelli presenti le ho fatti a mano; ma farli a mano in 150 pagine circa è un po' lungo; anche perché quando lancio la procedura cancella immagini, mi viene cancellato tutto. Si possono realizzare quei riquadri in tutte le pagine delle immagini col VBA ? (mantenendo sempre le stesse posizioni e dimensioni del riquadro riportato nel file postato)
draleo
Per evitare che vengano cancellati i formati nella procedura che elimina le immagini basta che venga impostato in luogo del "Clear" il comando "ClearContents":

ActiveSheet.Cells.ClearContents


Per impostare i carattere, l'allineamento, e altre cose delle "didascalie" puoi utilizzare le varie proprietà tipiche delle celle:
Ad es.

With ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Offset(1, 0).Resize(2, 12)
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = True
With .Font
.Name = "Calibri"
.Size = 9
.Italic = True
End With
.Merge
.Value = "Immagine " & i & stringaEccezioneNumerica '& ".JPG"
End With
Ettore
2017-02-01 22:30:24 UTC
Permalink
2)Vorrei inserire in tutte le pagine dei riquadri

intendi il bordo nero che fa da cornice in ogni pagina?
Come lo hai inserito manualmente?
draleo
2017-02-02 08:25:25 UTC
Permalink
Post by draleo
2)Vorrei inserire in tutte le pagine dei riquadri
intendi il bordo nero che fa da cornice in ogni pagina?
Come lo hai inserito manualmente?
Si. Intendo il bordo nero che fa da cornice ad ogni pagina. Ho semplicemente selezionato l'area che mi interessa e ho applicato il bordo casella spesso. Per tutto quanto riguarda la nuova procedura di Casanmaner, devo studiarla e provarla. Ma occorrerà del tempo; c'è anche il lavoro quotidiano da portare avanti, altrimenti mi licenziano....Tra 3-4 anni vado in pensione e allora avrò tutto il tempo necessario per divertirmi
casanmaner
2017-02-02 15:15:41 UTC
Permalink
Visto che devi ancora guardarci allora riporto il codice con ulteriori modifiche in quanto riguardando il tuo file vedo che c'è un "Titolo" e a "fine pagina" una serie di celle unite con l'indicazione "anno 1945" (immagino che l'anno possa essere variabile in base a degli intervalli di numero di immagini e quindi potresti pensare di assegnare un valore ad una variabile in base agli intervalli di immagine "lavorati" e inserire il valore automaticamente. Attualmente inserisco il testo "anno XXXX" per far vedere dove viene riempito quel "campo".
Comunque attualmente viene creata l'unione delle celle in quella posizione (in realtà ho centrato quegli spazi e uniformato il numero di celle unite per avere una certa simmetria).
Inoltre ho modificato anche le celle unite per le didascalie. Non so se ho presunto correttamente ma ho l'impressione che la larghezza delle tue immagini sia pari al "passo colonne" (attualmente 20) e allora ho impostato il codice in modo che il numero di celle da unire venga impostato da una ulteriore costante dichiarata nelle intestazioni del modulo (in questo momento ho posto pari a PassoCol).
Ho anche dichiarato altre nuove costanti, sempre nella intestazione del modulo, che impostano il numero di righe e di colonne, nonché gli offset, dei campi dedicati alla numerazione delle pagine e all'indicazione della descrizione dell'anno.
L'idea è quella di poter modificare i parametri modificando le costanti utilizzate nel successivo codice senza dover avere la necessità di scorrerlo tutto.
Questo approccio in realtà potrebbe essere utlizzato anche per altre parti come il nome del carattere, la dimensione, se impostare i campo allineati al centro in orizzontale o in verticale.

Incollo il link al file che ho utilzzato così puoi renderti conto dell'aspetto grafico sul mio file di testo (ho impostato anche le mie immagini con una altezza tale che per quelle che si sviluppano in orizzontale la larghezza corrisponda al passo delle colonne supponendo che lo stesso possa accadere alle tue immagini). Ovviamente tu annullerai il comando che imposta l'altezza.

https://www.dropbox.com/s/zk7jt8idgl7qtgj/VBA%20caricare%20immagini%20jpg%20in%20un%20foglio%20Excel.xlsm?dl=0

Questo invece il nuovo codice:
'---
Option Explicit

'<--- dichiarazioni constanti per inserimento immagini e didascalie - start
Const PercorsoImmagini As String = "C:\tmpImmagini\"
Const NumeroPrimaImmagineIniziale As Long = 1
Const NumeroImmaginiDaCaricare As Long = 64
Const NumImmaginiPerRiga As Long = 4
Const NumImmaginiPerPagina As Long = 20
Const PassoCol As Long = 20
Const DeltaPassoRighe As Long = 25
Const DeltaRigheCambioPagina As Long = 8
Const NumColIniziale As Long = 7
Const NumRigheDidascalie As Long = 2
Const NumColDidascalie As Long = PassoCol

'dichirazioni costanti per inserimento immagini e didascalie - end --->

'<--- dichiarazioni variabili per inserimento immagini e didascalie - start
Dim Immagine As Object
Dim i As Long, NumCol As Long, PassoRighe As Long
Dim NumeroPrimaImmagine As Long, NumeroUltimaImmagine As Long
Dim ContatoreImmaginiPerRiga As Long, ContatoreImmaginiPerPagina As Long
Dim stringaEccezioneNumerica As String
'dichiarazioni variabili per inserimento immagini e didascalie - start --->

'<--- dichiarazioni costanti e variabili per bordi e inserimento descrizioni numeri pagina

Const sRngTitolo As String = "AH1:BG4"
Const PrimaRigaBordo As Long = 5
Const PrimaColonnaBordo As Long = NumColIniziale - 1
Const UltimaColonnaBordo As Long = NumColIniziale + (NumImmaginiPerRiga * PassoCol)
Const PassoRigheBordo As Long = (DeltaPassoRighe * (NumImmaginiPerPagina / NumImmaginiPerRiga)) + 1
Const NumRigheNumPag As Long = 2
Const NumColNumPag As Long = 14
Const offsetColonneNumPag As Long = 4
Const offsetColonneDescrAnno As Long = 64
Dim NumeroPagine As Long
Dim iPrimaRigaBordo As Long, iUltimaRigaBordo As Long, iPassoRigheBordo As Long
Dim iSottrattore As Long

Sub InserimentoImmaginiMain()
Application.ScreenUpdating = False
Call CancellaImmagini
Call InserisciImmaginiIV
Call ImpostaBordiENumerazionePagine
Application.ScreenUpdating = True
End Sub

Sub InserisciImmaginiIV()
Call CancellaImmagini
NumeroPrimaImmagine = NumeroPrimaImmagineIniziale
NumeroUltimaImmagine = NumeroPrimaImmagine + NumeroImmaginiDaCaricare - 1
NumCol = NumColIniziale
PassoRighe = 0
ContatoreImmaginiPerRiga = 0
ContatoreImmaginiPerPagina = 0
stringaEccezioneNumerica = vbNullString
EccezioneNumerica:
For i = NumeroPrimaImmagine To NumeroUltimaImmagine
'<--- inserimento immagini senza eccezione numerica - start
Set Immagine = ActiveSheet.Pictures.Insert(PercorsoImmagini & i & stringaEccezioneNumerica & ".JPG")
With Immagine
.Name = "Immagine " & i & stringaEccezioneNumerica
.Height = 80
.Top = ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Top + _
ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).RowHeight - .Height
.Left = ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Left
'<--- con questi comandi unisco le celle al di sotto dell'immagine (2 righe e 12 colonne) _
e inserisco una "didascalia" _
N.B. ora ho impostato il numero di colonne pari alla costante NumColDidascalie attualmente _
Posta pari al passo colonne. _
Anche il numero righe viene impostato tramite una constante NumRigheDidascalie.
With ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Offset(1, 0).Resize(NumRigheDidascalie, NumColDidascalie)
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = True
With .Font
.Name = "Calibri"
.Size = 9
.Italic = True
End With
.Merge
.Value = "Immagine " & i & stringaEccezioneNumerica '& ".JPG"
End With
'--->
ContatoreImmaginiPerRiga = ContatoreImmaginiPerRiga + 1
ContatoreImmaginiPerPagina = ContatoreImmaginiPerPagina + 1
End With
If ContatoreImmaginiPerRiga = NumImmaginiPerRiga Then
ContatoreImmaginiPerRiga = 0
NumCol = NumColIniziale
If ContatoreImmaginiPerPagina = NumImmaginiPerPagina Then
ContatoreImmaginiPerPagina = 0
PassoRighe = PassoRighe + DeltaPassoRighe + DeltaRigheCambioPagina
Else
PassoRighe = PassoRighe + DeltaPassoRighe
End If
Else
NumCol = NumCol + PassoCol
End If
'inserimento immagini senza eccezione numerica - end --->
'<--- inserimento immagini con eccezione numerica - start
If stringaEccezioneNumerica = vbNullString Then
Select Case i
Case 3, 7, 10 '<=== inserire i numeri per cui è presente una eccezione numerica
stringaEccezioneNumerica = "A"
NumeroPrimaImmagine = i
NumeroUltimaImmagine = NumeroUltimaImmagine - 1
GoTo EccezioneNumerica '<= rimando "spaghetti code"
End Select
End If
stringaEccezioneNumerica = vbNullString
'inserimento immagini con eccezione numerica - end --->
Next i
End Sub

Sub ImpostaBordiENumerazionePagine()
NumeroPagine = Application.RoundUp(NumeroImmaginiDaCaricare / NumImmaginiPerPagina, 0)
iPassoRigheBordo = 0
With ActiveSheet
For i = 1 To NumeroPagine
If i = 1 Then
iSottrattore = 1
Else
iSottrattore = 0
End If
If i > 1 Then iPassoRigheBordo = iUltimaRigaBordo + 1
iPrimaRigaBordo = PrimaRigaBordo + iPassoRigheBordo
iUltimaRigaBordo = iPrimaRigaBordo + PassoRigheBordo - iSottrattore
'Debug.Print .Range(.Cells(iPrimaRigaBordo, PrimaColonnaBordo), .Cells(iUltimaRigaBordo, UltimaColonnaBordo)).Address
With .Range(.Cells(iPrimaRigaBordo, PrimaColonnaBordo), .Cells(iUltimaRigaBordo, UltimaColonnaBordo))
'<--- inserimento bordi
With .Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
With .Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
With .Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
With .Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
End With
'formattazione celle per inserimento numerazione pagina, inserimento numero pagina e _
inserimento interruzione di pagina
With .Cells(iUltimaRigaBordo, PrimaColonnaBordo)
With .Offset(1, offsetColonneNumPag).Resize(NumRigheNumPag, NumColNumPag)
.Merge
.Value = "Pagina " & i & "/" & NumeroPagine
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
With .Font
.Name = "Calibri"
.Size = 8
End With
End With
With .Offset(1, offsetColonneDescrAnno).Resize(NumRigheNumPag, NumColNumPag)
.Merge
.Value = "anno XXXX" 'anno da individuare in base ad una data condizione come ad es. un intervallo di immagini
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
With .Font
.Name = "Calibri"
.Size = 8
End With
End With
End With
.HPageBreaks.Add Before:=.Cells(iUltimaRigaBordo, PrimaColonnaBordo).Offset(3, 0) 'interruzioni di pagina
Next i
With .Range(sRngTitolo)
.Merge
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
With .Font
.Name = "Algerian"
.Size = 20
End With
.Value = "Titolo"
End With
End With
End Sub


Sub CancellaImmagini()
Dim shp As Shape
'<--- n.b. per mia semplicità cancello tutte le celle per ripristinare per ogni nuovo inserimento.
' da valutare nel caso specifico come modificare
With ActiveSheet
.Cells.Clear 'Contents
.ResetAllPageBreaks
End With

'n.b. nel foglio ho un "pulsante modulo" nominato "Pulsante" e ho impostato la condizione di _
cancellare tutte le immagini tranne quella nominata "Pulsante"
For Each shp In ActiveSheet.Shapes
With shp
If .Name <> "Pulsante" Then .Delete
End With
Next shp
End Sub
'---


Un consiglio spassionato.
Non portare tutto il codice alla "prima colonna" nel modulo, eliminando l'effetto a "scalare".
Ti assicuro che in caso di lettura del codice per eventuali future modifiche ti risulterà più facilmente comprensibile piuttosto che avere tutto il testo "appiattito" :-)
Ma ovviamente è solo un consiglio :-)
draleo
2017-02-02 22:14:43 UTC
Permalink
Perfetto !non ho avuto il tempo di studiare il codice (lo farò sabato e/o domenica), ma ho provato il file e ha funzionato tutto alla grande sin dalla prima botta.
Magari occorre cambiare il cambio pagina da 8 a 7
Const DeltaRigheCambioPagina As Long = 7
altrimenti dopo 6-7 pagine tutto scorre verso il basso e si esce dall'area di stampa.
Per quanto riguarda l'anno da mettere in fondo alla pagina hai immaginato bene. Non ho ancora deciso bene come ricavarlo, ma sarà comunque una variabile. Anche sulla larghezza della didascalia, hai intuito bene; la larghezza max del 95% delle mie immagini non supera il passo 20(circa 4,5 cm); nei rari casi in cui si supererà questa misura le 2 immagini saranno in parte sovrapposte, ma comunque ben distinguibili e non costituisce un problema rilevante (anche perché, al limite, nelle pagine interessate, potrei sempre cambiare il passo e ridurre il num di foto per riga)
Post by casanmaner
Un consiglio spassionato.
Non portare tutto il codice alla "prima colonna" nel modulo, eliminando l'effetto a "scalare".
Ti assicuro che in caso di lettura del codice per eventuali future modifiche ti risulterà più facilmente comprensibile piuttosto che avere tutto il testo "appiattito" :-)
Ma ovviamente è solo un consiglio :-)
Me n'ero accorto sin dall'inizio; ma purtroppo quando eseguo il copia-incolla del codice, da questa pagina al modulo VBA, mi da una valanga d'errori. e sono costretto ad allineare tutte le righe a sin, perdendo la "scalarità" . non sono riuscito a trovare una soluzione migliore. Tant'è che sin dall'inizio volevo chiederti di mettere i vari file su dropbox; ma poi ho desistito, per non "rompere" troppo con le mie richieste
grazie infinite
draleo
casanmaner
2017-02-02 23:10:32 UTC
Permalink
In effetti io mi fermavo a massimo 4 pagine.
Provando con più immagini e fino a 7/8 pagine ad un certo punto una pagina risultava eccessivamente abbassata.
Impostando Const DeltaRigheCambioPagina As Long = 7 '8 invece mi pare che anche con più pagine, sono arrivato fino a 16, il fenomeno non si verifichi.
draleo
2017-02-05 10:41:47 UTC
Permalink
Cortesemente, se possibili, alcuni ritocchi:
1)Per motivi pratici , ho deciso di suddividere il lavoro in 5-6 files. In alcuni di questi la sequenza numerica delle foto , NON presenta quelle che abbiamo chiamato “eccezioninumeriche”. Allora come modificare queste righe ? cioè quali numeri mettere al posto di 3,7,10,60, quando le eccezioni numeriche NON ci sono?
Select Case i
Case 3, 7, 10, 60
stringaEccezioneNumerica = "A"
NumeroPrimaImmagine = i
NumeroUltimaImmagine = NumeroUltimaImmagine - 1
GoTo EccezioneNumerica '<= rimando "spaghetti code"
End Select
E comunque se tutte le eccezioni numeriche fossero un problema, che complica di molto il codice VBA, avrei trovato anche il modo di eliminarle tutte ( Ridenominando facilmente tutte le immagini della cartella sorgente esclusivamente con num progressivi)
2)Mi sono accorto che le didascalie sono poco esplicative; quindi sarebbe meglio che la didascalia contenesse del testo preso da un altro foglio ; ho realizzato sul foglio2 una tabella, in cui :
nella col A ci sono tutti i num delle immagini, che corrispondono al loro indice
nella col B ci sono tutti i num di catalogo corrispondenti
nella col C ci sono tutte le didascalie corrispondenti . Per es
A47 conterrà 47 (che è il num dell’immagine; B47 avrà il num di catalogo della foto 47; C47 avrà la didascalia della foto 47
Quindi vorrei che la didascalia della foto 47 contenesse Workshett (“ Foglio2”). Range(“C47”)
Come modificare il codice?
3)Tornando al fine di una miglior comprensione delle foto che si susseguono, si potrebbe aggiungere sotto le 2 righe della didascalia, la categoria a cui appartengono? per es
Se le foto che vanno dalla 154 alla 161, appartenessero alla categoria “Storia Moderna”, nella 3° riga (cioè la riga sotto la didascalia) ,che va dalla Foto 154 alla 161, si potrebbe aggiungere una linea così fatta ?
____________________Storia Moderna________________
E’ implicito che io conosco (e quindi posso inserire da qualche parte del codice) gli intervalli di riferimento.
4)Per avere un po' di spazio libero per inserire annotazioni, ho inserito nella cartella sorgente delle immagini fittizie (raffiguranti un punto interrogativo), numerate come se fossero immagini normali, ed inserite nelle posizione desiderate. Alla fine del caricamento , vorrei eliminarle, per avere quello spazio vuoto che mi serve. Se queste immagini fittizie fossero i num 456,788,1022, come eliminarle tramite VBA, alla fine di tutto il lavoro?
5)E' possibile ricavare l’altezza e la larghezza delle immagini inserite? E, se fosse possibile , si potrebbero inserire queste misure nella tabella del foglio2, per es rispettivamente nella colonna D ed E, in modo che questa tabella (preesistente fino alla col C) diventi
A47 conterrà 47 (che è il num dell’immagine; B47 avrà il num di catalogo della foto 47; C47 avrà la didascalia della foto 47, D47 la larghezza della foto 47,e 47 l'altezza della foto 47
Comunque sia è veramente un gran bel lavoro (da far invidia anche ai professionisti del settore). Complimenti
draleo
casanmaner
2017-02-05 13:43:43 UTC
Permalink
Ciao Draleo per il momento, poiché sono impegnato anche in un mio progetto (capita che io scriva codice anche per me :-), ti rispondo nei punti per cui mi è velocemente possibile rispondere.

Punto 1)
Il comando "Select Case" (chiuso con End Select) in pratica può essere tradotto in "Seleziona il caso" dove indicando "i" gli si dice di selezionare i casi in base al valore assunto dalla variabile "i".
"Case" indentifica i valori assunti dalla variabile per cui vuoi che venga adempiuta una determinata azione.
Se per alcune serie numeriche non hai eccezioni nella procedura relativa a quel file imposta un solo numero pari a 0 (zero) (Case 0).
Poiché "i" non assumerà mai il valore 0 in pratica le righe al di sotto di "Case 0" non verranno eseguite.

Se come dici, fosse possibile eliminare le eccezioni sicuramente le cose si semplicherebbero molto, in quanto tutto risulterbbe più facimente gestibile con il singolo ciclo. Anche le parti dove dici di voler inserire una didascalia in base all'indice dell'immagine andando a prendere il dato da una cella. Pensa al caso dell'immagine 47 per la quale fosse presente anche l'eccezione A. O inserisci la didascalia nella riga 47 e in caso di eccezione fai in modo che il riferimento aumenti di 1, sia per il ciclo ripetuto ma anche per i cicli successivi, o in alternativa dovresti pensare di inserire la didascalia in una colonna differente della stessa riga (cosa che probabilmente sarebbe da preferire).

Per il punto 4 prova a modificare così la routine InserisciImmaginiIV (se scarichi il file al precedente link comunque trovi la routine modificata).

'---
Sub InserisciImmaginiIV()
Call CancellaImmagini
NumeroPrimaImmagine = NumeroPrimaImmagineIniziale
NumeroUltimaImmagine = NumeroPrimaImmagine + NumeroImmaginiDaCaricare - 1
NumCol = NumColIniziale
PassoRighe = 0
ContatoreImmaginiPerRiga = 0
ContatoreImmaginiPerPagina = 0
stringaEccezioneNumerica = vbNullString
EccezioneNumerica:
For i = NumeroPrimaImmagine To NumeroUltimaImmagine
'<--- inserimento immagini senza eccezione numerica - start
Select Case CStr(i & stringaEccezioneNumerica) '<=== indicare qui i numeri delle immagini "fittizie"
Case "3A", 5, 10, 29, 38
'Non viene fatto nulla!!!!
Case Else
Set Immagine = ActiveSheet.Pictures.Insert(PercorsoImmagini & i & stringaEccezioneNumerica & ".JPG")
With Immagine
.Name = "Immagine " & i & stringaEccezioneNumerica
'.Height = 80
.Width = 121
.Top = ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Top + _
ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).RowHeight - .Height
.Left = ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Left
'<--- con questi comandi unisco le celle al di sotto dell'immagine (2 righe e 12 colonne) _
e inserisco una "didascalia" _
N.B. ora ho impostato il numero di colonne pari alla costante NumColDidascalie attualmente _
Posta pari al passo colonne. _
Anche il numero righe viene impostato tramite una constante NumRigheDidascalie.
With ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Offset(1, 0).Resize(NumRigheDidascalie, NumColDidascalie)
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = True
With .Font
.Name = "Calibri"
.Size = 9
.Italic = True
End With
.Merge
.Value = "Immagine " & i & stringaEccezioneNumerica '& ".JPG"
End With
'--->
End With
End Select
ContatoreImmaginiPerRiga = ContatoreImmaginiPerRiga + 1
ContatoreImmaginiPerPagina = ContatoreImmaginiPerPagina + 1
If ContatoreImmaginiPerRiga = NumImmaginiPerRiga Then
ContatoreImmaginiPerRiga = 0
NumCol = NumColIniziale
If ContatoreImmaginiPerPagina = NumImmaginiPerPagina Then
ContatoreImmaginiPerPagina = 0
PassoRighe = PassoRighe + DeltaPassoRighe + DeltaRigheCambioPagina
Else
PassoRighe = PassoRighe + DeltaPassoRighe
End If
Else
NumCol = NumCol + PassoCol
End If
'inserimento immagini senza eccezione numerica - end --->
'<--- inserimento immagini con eccezione numerica - start
If stringaEccezioneNumerica = vbNullString Then
Select Case i
Case 3, 7, 10, 60 '<=== inserire i numeri per cui è presente una eccezione numerica
stringaEccezioneNumerica = "A"
NumeroPrimaImmagine = i
NumeroUltimaImmagine = NumeroUltimaImmagine - 1
GoTo EccezioneNumerica '<= rimando "spaghetti code"
End Select
End If
stringaEccezioneNumerica = vbNullString
'inserimento immagini con eccezione numerica - end --->
Next i
End Sub
'---
casanmaner
2017-02-05 13:50:15 UTC
Permalink
Ah... Aggiungo che ai miei impegni va sommata Italia Vs Galles al 6 nazioni rugby :)
draleo
2017-02-05 22:28:36 UTC
Permalink
ti capisco benissimo. A me il rugby non piace e quindi, visto anche che è piovuto tutto il giorno, ho passato l'intero pomeriggio a reimpostare i num delle immagini. E' stata una faticaccia, ma ora non c'è più alcuna eccezione numerica. Sul foglio2 ho un elenco costituito da 3 col: num foto,codice del catalogo,e didascalia (in realtà le didascalie ancora non ci sono,ma penso di riuscire a ricavarle da un altro file i prossimi giorni). Se, compatibilmente con i tuoi impegni e senza alcuna fretta, puoi verificare la fattibilità degli altri punti del post precedente, mi faresti un gran favore
draleo
casanmaner
2017-02-07 00:13:22 UTC
Permalink
Ciao draleo,
prova a guardare il file modificato in questo modo.
Ho inserito un "Foglio2" dove in colonna C ho inserito il testo che dovrebbe rappresentare la didascalia.
In colonna D ho inserito il testo che dovrebbe rappresentare la categoria.
A mio parere, visto che devi fare il lavoro di "categoriazzazione" a questo punto conviene "raccogliere" anche questo dato nel file.
In corrispodenza dello spazio della didascalia viene inserito il testo presente in colonna C.
La procedura inoltre crea, sotto il precedente spazio dedicato alle didascalie, un analogo spazio dove viene inserito il contenuto presente nel corrispondente rigo dellla colonna D (a cui ho anteposto una stringa di testo, dichiarata come una constante, composta da cinque "trattinibassi" (o underscore).
Le lettere delle colonne anch'esse le ho dichiarate tramite una costante così nel caso basterà modificare la lettera della colonna nel caso venisse spostata.
Queste sono le nuove dichiarazioni di costanti e variabili relative a queste modifiche:
'---
Const sNomeWsDidascalie As String = "Foglio2"
Const sColDidascalie As String = "C"
Const sColCategorie As String = "D"
Const sUnderScoreCategoria As String = "_____"
Dim wsDidascalie As Worksheet
'---


Questo è il solito file di esempio.
https://www.dropbox.com/s/zk7jt8idgl7qtgj/VBA%20caricare%20immagini%20jpg%20in%20un%20foglio%20Excel.xlsm?dl=0

Riporto comunque anche tutto il codice (anche se ti verrà più comodo copiarlo direttamente dal VBA del file).

'---
Option Explicit

'<--- dichiarazioni constanti per inserimento immagini e didascalie - start
Const PercorsoImmagini As String = "C:\tmpImmagini\"
Const NumeroPrimaImmagineIniziale As Long = 1
Const NumeroImmaginiDaCaricare As Long = 60
Const NumImmaginiPerRiga As Long = 4
Const NumImmaginiPerPagina As Long = 20
Const PassoCol As Long = 20
Const DeltaPassoRighe As Long = 25
Const DeltaRigheCambioPagina As Long = 7 '8
Const NumColIniziale As Long = 7
Const NumRigheDidascalie As Long = 2
Const NumColDidascalie As Long = PassoCol

'dichirazioni costanti per inserimento immagini e didascalie - end --->

'<--- dichiarazioni variabili per inserimento immagini e didascalie - start
Dim Immagine As Object
Dim i As Long, NumCol As Long, PassoRighe As Long
Dim NumeroPrimaImmagine As Long, NumeroUltimaImmagine As Long
Dim ContatoreImmaginiPerRiga As Long, ContatoreImmaginiPerPagina As Long
Dim stringaEccezioneNumerica As String
'dichiarazioni variabili per inserimento immagini e didascalie - start --->

'<--- dichiarazioni costanti e variabili per bordi e inserimento descrizioni numeri pagina
Const sRngTitolo As String = "AH1:BG4"
Const PrimaRigaBordo As Long = 5
Const PrimaColonnaBordo As Long = NumColIniziale - 1
Const UltimaColonnaBordo As Long = NumColIniziale + (NumImmaginiPerRiga * PassoCol)
Const PassoRigheBordo As Long = (DeltaPassoRighe * (NumImmaginiPerPagina / NumImmaginiPerRiga)) + 1
Const NumRigheNumPag As Long = 2
Const NumColNumPag As Long = 14
Const offsetColonneNumPag As Long = 4
Const offsetColonneDescrAnno As Long = 64
Dim NumeroPagine As Long
Dim iPrimaRigaBordo As Long, iUltimaRigaBordo As Long, iPassoRigheBordo As Long
Dim iSottrattore As Long

'<--- dichiarazioni costanti e variabili relative al foglio dove sono presente le descrizioni delle didascalie e categorie
Const sNomeWsDidascalie As String = "Foglio2"
Const sColDidascalie As String = "C"
Const sColCategorie As String = "D"
Const sUnderScoreCategoria As String = "_____"
Dim wsDidascalie As Worksheet

Sub InserimentoImmaginiMain()
Application.ScreenUpdating = False
Call CancellaImmagini
Call InserisciImmaginiIV
Call ImpostaBordiENumerazionePagine
Application.ScreenUpdating = True
End Sub

Sub InserisciImmaginiIV()
Set wsDidascalie = ThisWorkbook.Worksheets(sNomeWsDidascalie)
Call CancellaImmagini
NumeroPrimaImmagine = NumeroPrimaImmagineIniziale
NumeroUltimaImmagine = NumeroPrimaImmagine + NumeroImmaginiDaCaricare - 1
NumCol = NumColIniziale
PassoRighe = 0
ContatoreImmaginiPerRiga = 0
ContatoreImmaginiPerPagina = 0
stringaEccezioneNumerica = vbNullString
EccezioneNumerica:
For i = NumeroPrimaImmagine To NumeroUltimaImmagine
'<--- inserimento immagini senza eccezione numerica - start
Select Case CStr(i & stringaEccezioneNumerica) '<=== indicare qui i numeri delle immagini "fittizie"
Case 5, 10, 29, 38
'Non viene fatto nulla!!!!
Case Else
Set Immagine = ActiveSheet.Pictures.Insert(PercorsoImmagini & i & stringaEccezioneNumerica & ".JPG")
With Immagine
.Name = "Immagine " & i & stringaEccezioneNumerica
'.Height = 80
.Width = 121
.Top = ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Top + _
ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).RowHeight - .Height
.Left = ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Left
'<--- con questi comandi unisco le celle al di sotto dell'immagine (2 righe e 12 colonne) _
e inserisco una "didascalia" _
N.B. ora ho impostato il numero di colonne pari alla costante NumColDidascalie attualmente _
Posta pari al passo colonne. _
Anche il numero righe viene impostato tramite una constante NumRigheDidascalie.
With ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol)
With .Offset(1, 0).Resize(NumRigheDidascalie, NumColDidascalie)
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = True
With .Font
.Name = "Calibri"
.Size = 9
.Italic = True
End With
.Merge
.Value = wsDidascalie.Range(sColDidascalie & i) '"Immagine " & i & stringaEccezioneNumerica '& ".JPG"
End With
With .Offset(3, 0).Resize(NumRigheDidascalie, NumColDidascalie)
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = True
With .Font
.Name = "Calibri"
.Size = 9
.Italic = True
End With
.Merge
.Value = sUnderScoreCategoria & wsDidascalie.Range(sColCategorie & i) & sUnderScoreCategoria
'"Immagine " & i & stringaEccezioneNumerica '& ".JPG"
End With
End With
'--->
End With
End Select
ContatoreImmaginiPerRiga = ContatoreImmaginiPerRiga + 1
ContatoreImmaginiPerPagina = ContatoreImmaginiPerPagina + 1
If ContatoreImmaginiPerRiga = NumImmaginiPerRiga Then
ContatoreImmaginiPerRiga = 0
NumCol = NumColIniziale
If ContatoreImmaginiPerPagina = NumImmaginiPerPagina Then
ContatoreImmaginiPerPagina = 0
PassoRighe = PassoRighe + DeltaPassoRighe + DeltaRigheCambioPagina
Else
PassoRighe = PassoRighe + DeltaPassoRighe
End If
Else
NumCol = NumCol + PassoCol
End If
'inserimento immagini senza eccezione numerica - end --->
'<--- inserimento immagini con eccezione numerica - start
If stringaEccezioneNumerica = vbNullString Then
Select Case i
Case 0 '<=== inserire i numeri per cui è presente una eccezione numerica
stringaEccezioneNumerica = "A"
NumeroPrimaImmagine = i
NumeroUltimaImmagine = NumeroUltimaImmagine - 1
GoTo EccezioneNumerica '<= rimando "spaghetti code"
End Select
End If
stringaEccezioneNumerica = vbNullString
'inserimento immagini con eccezione numerica - end --->
Next i
End Sub

Sub ImpostaBordiENumerazionePagine()
NumeroPagine = Application.RoundUp(NumeroImmaginiDaCaricare / NumImmaginiPerPagina, 0)
iPassoRigheBordo = 0
With ActiveSheet
For i = 1 To NumeroPagine
If i = 1 Then
iSottrattore = 1
Else
iSottrattore = 0
End If
If i > 1 Then iPassoRigheBordo = iUltimaRigaBordo + 1
iPrimaRigaBordo = PrimaRigaBordo + iPassoRigheBordo
iUltimaRigaBordo = iPrimaRigaBordo + PassoRigheBordo - iSottrattore
'Debug.Print .Range(.Cells(iPrimaRigaBordo, PrimaColonnaBordo), .Cells(iUltimaRigaBordo, UltimaColonnaBordo)).Address
With .Range(.Cells(iPrimaRigaBordo, PrimaColonnaBordo), .Cells(iUltimaRigaBordo, UltimaColonnaBordo))
'<--- inserimento bordi
With .Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
With .Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
With .Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
With .Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
End With
'formattazione celle per inserimento numerazione pagina, inserimento numero pagina e _
inserimento interruzione di pagina
With .Cells(iUltimaRigaBordo, PrimaColonnaBordo)
With .Offset(1, offsetColonneNumPag).Resize(NumRigheNumPag, NumColNumPag)
.Merge
.Value = "Pagina " & i & "/" & NumeroPagine
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
With .Font
.Name = "Calibri"
.Size = 8
End With
End With
With .Offset(1, offsetColonneDescrAnno).Resize(NumRigheNumPag, NumColNumPag)
.Merge
.Value = "anno XXXX" 'anno da individuare in base ad una data condizione come ad es. un intervallo di immagini
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
With .Font
.Name = "Calibri"
.Size = 8
End With
End With
End With
.HPageBreaks.Add Before:=.Cells(iUltimaRigaBordo, PrimaColonnaBordo).Offset(3, 0) 'interruzioni di pagina
Next i
With .Range(sRngTitolo)
.Merge
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
With .Font
.Name = "Algerian"
.Size = 20
End With
.Value = "Titolo"
End With
End With
End Sub


Sub CancellaImmagini()
Dim shp As Shape
'<--- n.b. per mia semplicità cancello tutte le celle per ripristinare per ogni nuovo inserimento.
' da valutare nel caso specifico come modificare
With ActiveSheet
.Cells.Clear 'Contents
.ResetAllPageBreaks
End With

'n.b. nel foglio ho un "pulsante modulo" nominato "Pulsante" e ho impostato la condizione di _
cancellare tutte le immagini tranne quella nominata "Pulsante"
For Each shp In ActiveSheet.Shapes
With shp
If .Name <> "Pulsante" Then .Delete
End With
Next shp
End Sub

Sub RinominaImmagini()
Dim fso As Object
Dim file As Object
Dim fsofiles As Object
Dim i As Long
Set fso = CreateObject("scripting.filesystemobject")
Set fsofiles = fso.getfolder(PercorsoImmagini).Files
i = 0
On Error Resume Next
For Each file In fsofiles
i = i + 1
Name file As PercorsoImmagini & i & ".jpg"
Next file
End Sub
'---
draleo
2017-02-07 14:09:48 UTC
Permalink
Post by casanmaner
Ciao draleo,
prova a guardare il file modificato in questo modo.
Ho inserito un "Foglio2" dove in colonna C ho inserito il testo che dovrebbe rappresentare la didascalia.
In colonna D ho inserito il testo che dovrebbe rappresentare la categoria.
A mio parere, visto che devi fare il lavoro di "categoriazzazione" a questo punto conviene "raccogliere" anche questo dato nel file.
In corrispodenza dello spazio della didascalia viene inserito il testo presente in colonna C.
La procedura inoltre crea, sotto il precedente spazio dedicato alle didascalie, un analogo spazio dove viene inserito il contenuto presente nel corrispondente rigo dellla colonna D (a cui ho anteposto una stringa di testo, dichiarata come una constante, composta da cinque "trattinibassi" (o underscore).
Le lettere delle colonne anch'esse le ho dichiarate tramite una costante così nel caso basterà modificare la lettera della colonna nel caso venisse spostata.
'---
Const sNomeWsDidascalie As String = "Foglio2"
Const sColDidascalie As String = "C"
Const sColCategorie As String = "D"
Const sUnderScoreCategoria As String = "_____"
Dim wsDidascalie As Worksheet
'---
Questo è il solito file di esempio.
https://www.dropbox.com/s/zk7jt8idgl7qtgj/VBA%20caricare%20immagini%20jpg%20in%20un%20foglio%20Excel.xlsm?dl=0
Riporto comunque anche tutto il codice (anche se ti verrà più comodo copiarlo direttamente dal VBA del file).
'---
Option Explicit
'<--- dichiarazioni constanti per inserimento immagini e didascalie - start
Const PercorsoImmagini As String = "C:\tmpImmagini\"
Const NumeroPrimaImmagineIniziale As Long = 1
Const NumeroImmaginiDaCaricare As Long = 60
Const NumImmaginiPerRiga As Long = 4
Const NumImmaginiPerPagina As Long = 20
Const PassoCol As Long = 20
Const DeltaPassoRighe As Long = 25
Const DeltaRigheCambioPagina As Long = 7 '8
Const NumColIniziale As Long = 7
Const NumRigheDidascalie As Long = 2
Const NumColDidascalie As Long = PassoCol
'dichirazioni costanti per inserimento immagini e didascalie - end --->
'<--- dichiarazioni variabili per inserimento immagini e didascalie - start
Dim Immagine As Object
Dim i As Long, NumCol As Long, PassoRighe As Long
Dim NumeroPrimaImmagine As Long, NumeroUltimaImmagine As Long
Dim ContatoreImmaginiPerRiga As Long, ContatoreImmaginiPerPagina As Long
Dim stringaEccezioneNumerica As String
'dichiarazioni variabili per inserimento immagini e didascalie - start --->
'<--- dichiarazioni costanti e variabili per bordi e inserimento descrizioni numeri pagina
Const sRngTitolo As String = "AH1:BG4"
Const PrimaRigaBordo As Long = 5
Const PrimaColonnaBordo As Long = NumColIniziale - 1
Const UltimaColonnaBordo As Long = NumColIniziale + (NumImmaginiPerRiga * PassoCol)
Const PassoRigheBordo As Long = (DeltaPassoRighe * (NumImmaginiPerPagina / NumImmaginiPerRiga)) + 1
Const NumRigheNumPag As Long = 2
Const NumColNumPag As Long = 14
Const offsetColonneNumPag As Long = 4
Const offsetColonneDescrAnno As Long = 64
Dim NumeroPagine As Long
Dim iPrimaRigaBordo As Long, iUltimaRigaBordo As Long, iPassoRigheBordo As Long
Dim iSottrattore As Long
'<--- dichiarazioni costanti e variabili relative al foglio dove sono presente le descrizioni delle didascalie e categorie
Const sNomeWsDidascalie As String = "Foglio2"
Const sColDidascalie As String = "C"
Const sColCategorie As String = "D"
Const sUnderScoreCategoria As String = "_____"
Dim wsDidascalie As Worksheet
Sub InserimentoImmaginiMain()
Application.ScreenUpdating = False
Call CancellaImmagini
Call InserisciImmaginiIV
Call ImpostaBordiENumerazionePagine
Application.ScreenUpdating = True
End Sub
Sub InserisciImmaginiIV()
Set wsDidascalie = ThisWorkbook.Worksheets(sNomeWsDidascalie)
Call CancellaImmagini
NumeroPrimaImmagine = NumeroPrimaImmagineIniziale
NumeroUltimaImmagine = NumeroPrimaImmagine + NumeroImmaginiDaCaricare - 1
NumCol = NumColIniziale
PassoRighe = 0
ContatoreImmaginiPerRiga = 0
ContatoreImmaginiPerPagina = 0
stringaEccezioneNumerica = vbNullString
For i = NumeroPrimaImmagine To NumeroUltimaImmagine
'<--- inserimento immagini senza eccezione numerica - start
Select Case CStr(i & stringaEccezioneNumerica) '<=== indicare qui i numeri delle immagini "fittizie"
Case 5, 10, 29, 38
'Non viene fatto nulla!!!!
Case Else
Set Immagine = ActiveSheet.Pictures.Insert(PercorsoImmagini & i & stringaEccezioneNumerica & ".JPG")
With Immagine
.Name = "Immagine " & i & stringaEccezioneNumerica
'.Height = 80
.Width = 121
.Top = ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Top + _
ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).RowHeight - .Height
.Left = ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Left
'<--- con questi comandi unisco le celle al di sotto dell'immagine (2 righe e 12 colonne) _
e inserisco una "didascalia" _
N.B. ora ho impostato il numero di colonne pari alla costante NumColDidascalie attualmente _
Posta pari al passo colonne. _
Anche il numero righe viene impostato tramite una constante NumRigheDidascalie.
With ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol)
With .Offset(1, 0).Resize(NumRigheDidascalie, NumColDidascalie)
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = True
With .Font
.Name = "Calibri"
.Size = 9
.Italic = True
End With
.Merge
.Value = wsDidascalie.Range(sColDidascalie & i) '"Immagine " & i & stringaEccezioneNumerica '& ".JPG"
End With
With .Offset(3, 0).Resize(NumRigheDidascalie, NumColDidascalie)
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = True
With .Font
.Name = "Calibri"
.Size = 9
.Italic = True
End With
.Merge
.Value = sUnderScoreCategoria & wsDidascalie.Range(sColCategorie & i) & sUnderScoreCategoria
'"Immagine " & i & stringaEccezioneNumerica '& ".JPG"
End With
End With
'--->
End With
End Select
ContatoreImmaginiPerRiga = ContatoreImmaginiPerRiga + 1
ContatoreImmaginiPerPagina = ContatoreImmaginiPerPagina + 1
If ContatoreImmaginiPerRiga = NumImmaginiPerRiga Then
ContatoreImmaginiPerRiga = 0
NumCol = NumColIniziale
If ContatoreImmaginiPerPagina = NumImmaginiPerPagina Then
ContatoreImmaginiPerPagina = 0
PassoRighe = PassoRighe + DeltaPassoRighe + DeltaRigheCambioPagina
Else
PassoRighe = PassoRighe + DeltaPassoRighe
End If
Else
NumCol = NumCol + PassoCol
End If
'inserimento immagini senza eccezione numerica - end --->
'<--- inserimento immagini con eccezione numerica - start
If stringaEccezioneNumerica = vbNullString Then
Select Case i
Case 0 '<=== inserire i numeri per cui è presente una eccezione numerica
stringaEccezioneNumerica = "A"
NumeroPrimaImmagine = i
NumeroUltimaImmagine = NumeroUltimaImmagine - 1
GoTo EccezioneNumerica '<= rimando "spaghetti code"
End Select
End If
stringaEccezioneNumerica = vbNullString
'inserimento immagini con eccezione numerica - end --->
Next i
End Sub
Sub ImpostaBordiENumerazionePagine()
NumeroPagine = Application.RoundUp(NumeroImmaginiDaCaricare / NumImmaginiPerPagina, 0)
iPassoRigheBordo = 0
With ActiveSheet
For i = 1 To NumeroPagine
If i = 1 Then
iSottrattore = 1
Else
iSottrattore = 0
End If
If i > 1 Then iPassoRigheBordo = iUltimaRigaBordo + 1
iPrimaRigaBordo = PrimaRigaBordo + iPassoRigheBordo
iUltimaRigaBordo = iPrimaRigaBordo + PassoRigheBordo - iSottrattore
'Debug.Print .Range(.Cells(iPrimaRigaBordo, PrimaColonnaBordo), .Cells(iUltimaRigaBordo, UltimaColonnaBordo)).Address
With .Range(.Cells(iPrimaRigaBordo, PrimaColonnaBordo), .Cells(iUltimaRigaBordo, UltimaColonnaBordo))
'<--- inserimento bordi
With .Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
With .Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
With .Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
With .Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
End With
'formattazione celle per inserimento numerazione pagina, inserimento numero pagina e _
inserimento interruzione di pagina
With .Cells(iUltimaRigaBordo, PrimaColonnaBordo)
With .Offset(1, offsetColonneNumPag).Resize(NumRigheNumPag, NumColNumPag)
.Merge
.Value = "Pagina " & i & "/" & NumeroPagine
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
With .Font
.Name = "Calibri"
.Size = 8
End With
End With
With .Offset(1, offsetColonneDescrAnno).Resize(NumRigheNumPag, NumColNumPag)
.Merge
.Value = "anno XXXX" 'anno da individuare in base ad una data condizione come ad es. un intervallo di immagini
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
With .Font
.Name = "Calibri"
.Size = 8
End With
End With
End With
.HPageBreaks.Add Before:=.Cells(iUltimaRigaBordo, PrimaColonnaBordo).Offset(3, 0) 'interruzioni di pagina
Next i
With .Range(sRngTitolo)
.Merge
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
With .Font
.Name = "Algerian"
.Size = 20
End With
.Value = "Titolo"
End With
End With
End Sub
Sub CancellaImmagini()
Dim shp As Shape
'<--- n.b. per mia semplicità cancello tutte le celle per ripristinare per ogni nuovo inserimento.
' da valutare nel caso specifico come modificare
With ActiveSheet
.Cells.Clear 'Contents
.ResetAllPageBreaks
End With
'n.b. nel foglio ho un "pulsante modulo" nominato "Pulsante" e ho impostato la condizione di _
cancellare tutte le immagini tranne quella nominata "Pulsante"
For Each shp In ActiveSheet.Shapes
With shp
If .Name <> "Pulsante" Then .Delete
End With
Next shp
End Sub
Sub RinominaImmagini()
Dim fso As Object
Dim file As Object
Dim fsofiles As Object
Dim i As Long
Set fso = CreateObject("scripting.filesystemobject")
Set fsofiles = fso.getfolder(PercorsoImmagini).Files
i = 0
On Error Resume Next
For Each file In fsofiles
i = i + 1
Name file As PercorsoImmagini & i & ".jpg"
Next file
End Sub
'---
Ok. Già prima funzionava benissimo. Ora queste modifiche rappresentano la classica ciliegina sulla torta. Credo che meglio di così non si poteva fare. Ora il lavoro grosso, per il quale occorrevano competenze che io non ho, è terminato. Rimane da fare il lavoro manuale: classificazione, aggiunte e rinomine delle immagini ecc; ma questo è un lavoro noioso che spetta a me e che riesco a fare da solo. Ancora grazie
draleo
draleo
2017-02-11 09:15:07 UTC
Permalink
Chiedo cortesemente un altro (spero piccolo) aiuto. Quando puoi, naturalmente. La tua macro ,riportata sotto, dovrebbe rinominare i files Jpg di quella determinata cartella: chiamati 1,2,3,4,5 ecc ; cioè la sequenza è costituita da numeri che devono essere necessariamente consecutivi. Ma se io inserisco (oppure cancello) una nuova foto, le consecutività della sequenza viene a mancare (e il programma da errore). Quindi Io avrei la necessita di rinominare (aumentando di una unità) SOLO quei files, che vengono dopo un determinato numero; per es: se volessi inserire, una nuova foto dopo il num 80, tutti file successivi al num 80(81,82,83 ecc) dovrebbero essere rinominati aumentando di 1 unità :cioè dovressero essere rinominati: 82,83,84 ecc. In tal modo tra 80 e 82 si libererebbe un numero , dove inserire la nuova foto (che sarà chiamata 81). Stesso discorso se volessi eliminare un num (per es il 205); una volta eliminata la foto 205,la sequenza diventerebbe: 204,206 ecc.(e il programma darebbe ugualmente errore) Quindi Per mantenere la consecutività della numerazione, tutte le foto successivi al 205 (206,207,208 ecc, dovrebbero essere rinominati, riducendo di una unità (205,206,207 ecc)
Come modificare questa macro ?
Perdona la mia ignoranza. Ancora grazie
---------------------------------------
Sub RinominaImmagini()
Dim fso As Object
Dim file As Object
Dim fsofiles As Object
Dim i As Long
Set fso = CreateObject("scripting.filesystemobject")
Set fsofiles = fso.getfolder(PercorsoImmagini).Files
i = 0
On Error Resume Next
For Each file In fsofiles
i = i + 1
Name file As PercorsoImmagini & i & ".jpg"
Next file
End Sub
casanmaner
2017-02-11 16:41:58 UTC
Permalink
Post by draleo
Chiedo cortesemente un altro (spero piccolo) aiuto. Quando puoi, naturalmente. La tua macro ,riportata sotto, dovrebbe rinominare i files Jpg di quella determinata cartella: chiamati 1,2,3,4,5 ecc ; cioè la sequenza è costituita da numeri che devono essere necessariamente consecutivi. Ma se io inserisco (oppure cancello) una nuova foto, le consecutività della sequenza viene a mancare (e il programma da errore). Quindi Io avrei la necessita di rinominare (aumentando di una unità) SOLO quei files, che vengono dopo un determinato numero; per es: se volessi inserire, una nuova foto dopo il num 80, tutti file successivi al num 80(81,82,83 ecc) dovrebbero essere rinominati aumentando di 1 unità :cioè dovressero essere rinominati: 82,83,84 ecc. In tal modo tra 80 e 82 si libererebbe un numero , dove inserire la nuova foto (che sarà chiamata 81). Stesso discorso se volessi eliminare un num (per es il 205); una volta eliminata la foto 205,la sequenza diventerebbe: 204,206 ecc.(e il programma darebbe ugualmente errore) Quindi Per mantenere la consecutività della numerazione, tutte le foto successivi al 205 (206,207,208 ecc, dovrebbero essere rinominati, riducendo di una unità (205,206,207 ecc)
Come modificare questa macro ?
Perdona la mia ignoranza. Ancora grazie
---------------------------------------
Sub RinominaImmagini()
Dim fso As Object
Dim file As Object
Dim fsofiles As Object
Dim i As Long
Set fso = CreateObject("scripting.filesystemobject")
Set fsofiles = fso.getfolder(PercorsoImmagini).Files
i = 0
On Error Resume Next
For Each file In fsofiles
i = i + 1
Name file As PercorsoImmagini & i & ".jpg"
Next file
End Sub
Ciao Draleo,
quella routine l'avevo inserita solo perché non avendo io immagini numerate e dovendo fare la copia di mie foto avevo fatto in modo che una volta inserite nella cartella la prima volta ne venisse cambiato il nome (senza doverlo fare io manualmente).
Quindi ovviamente non è adatta a queste due tue particolari necessità.
Ritengo per per fare quanto chiedi occorrano due differenti procedure.
Anche perché ritengo che soprattutto la prima debba rinominare le immaggini successive alla "nuova" ma con un numero già presente debba partire dall'ultima immagine con un ciclo a ritroso.
Questo perché se si partisse dalla "prima" avresti che la 80 diventa la 81, ma tu la 81 è già presente e verrebbe sovrascritta (o forse la procedura potrebbe andare in errore in quanto già presente).
Quindi bisognerebbe partire dal numero dell'ultima immagine e darle un numero successivo, poi prendere la penultima e assegnargli un indice successivo.
Però le incognite possono essere diverse.
Ad es. le immagini presenti hanno "salti di numero".
Oppure semplicemente vanno dalla n. 1 alla numero 100 (giusto per esempio) in maniera consecutiva?
Perché nel caso ci sarebbe da decidere cosa deve fare la procedura nel caso in cui ciclando un numero a questo numero non trovi corrispondenza una immagine esistente.
Insomma, lo scenario è importante conoscerlo :-)
draleo
2017-02-11 18:18:11 UTC
Permalink
Post by casanmaner
Oppure semplicemente vanno dalla n. 1 alla numero 100 (giusto per esempio) in maniera consecutiva?
Si. ho fatto in modo che tutte le immagini abbiano un num consecutivo (anche perché, altrimenti, la procedura darebbe errore). Quindi non ci sono salti di numero. E il problema è appunto sorto per mantenere questa consecutività.
1)immissione di una nuova immagine, credo sia giusta la tua soluzione: partire dall'ultima(darle il num successivo) e poi risalire. es: immagini da 1 a 100;se tra la num 80 e la num 81 volessi immetterne una nuova, occorrerebbe partire dalla 100; darle il num 101; proseguire così a ritroso fino alla num 81(che diventerebbe 82).a questo punto tra la 80 e la 82, non ci sarebbero immagini, ed io potrei inserire quella nuova dandole il num 81, mantenendo così la consecutività
2) eliminazione di una immagine esistente: se io per es eliminassi la num 85, occorrerebbe partire dal num 86 in avanti fino a 100 , togliendo a tutte un numero(la 86 diverrebbe 85 e si può fare perché la 85 era stata eliminata; la 87 diverrebbe la 86 e così via fino alla 100 (che diventerebbe 99, come è giusto che sia). anche in questo caso la consecutività viene mantenuta.
Ma come si fa a tradurre il tutto in VBA? io non ne sono capace
draleo
draleo
2017-02-11 18:28:03 UTC
Permalink
Post by draleo
Post by casanmaner
Oppure semplicemente vanno dalla n. 1 alla numero 100 (giusto per esempio) in maniera consecutiva?
Si. ho fatto in modo che tutte le immagini abbiano un num consecutivo (anche perché, altrimenti, la procedura darebbe errore). Quindi non ci sono salti di numero. E il problema è appunto sorto per mantenere questa consecutività.
1)immissione di una nuova immagine, credo sia giusta la tua soluzione: partire dall'ultima(darle il num successivo) e poi risalire. es: immagini da 1 a 100;se tra la num 80 e la num 81 volessi immetterne una nuova, occorrerebbe partire dalla 100; darle il num 101; proseguire così a ritroso fino alla num 81(che diventerebbe 82).a questo punto tra la 80 e la 82, non ci sarebbero immagini, ed io potrei inserire quella nuova dandole il num 81, mantenendo così la consecutività
2) eliminazione di una immagine esistente: se io per es eliminassi la num 85, occorrerebbe partire dal num 86 in avanti fino a 100 , togliendo a tutte un numero(la 86 diverrebbe 85 e si può fare perché la 85 era stata eliminata; la 87 diverrebbe la 86 e così via fino alla 100 (che diventerebbe 99, come è giusto che sia). anche in questo caso la consecutività viene mantenuta.
Ma come si fa a tradurre il tutto in VBA? io non ne sono capace
draleo
Naturalmente anche la numerazioni delle didascalie vanno cambiate; ma questo posso farlo io a mano; nel Foglio 2 , c'è l'elenco delle didascalie (ognuna accoppiata al num dell'immagine). Inserire (o eliminare una riga) e cambiare a mano la numerazione con autofit, non è un gran problema
casanmaner
2017-02-11 19:24:23 UTC
Permalink
Per il momento ho predisposto due procedure per lavorare le sole immagini presenti nel percorso (parto dal presupposto che nella directory siano presenti solo i file delle immagini).
Sicuramente sarebbe possibile gestire in automatico anche la modifica nel foglio 2.
In che colonna hai inserito il numero dell'immagine di riferimento?

Comunque per quanto riguarda le immagini per prima cosa nel Modulo1 ho dichiarato pubblica la costante:
Public Const PercorsoImmagini As String = "C:\tmpImmagini\" '<--- dichiarata constante pubblica per renderla comune a tutti i moduli

In questo modo è disponibile per tutti i moduli della cartella di lavoro.

Ho inserito un Modulo2 dove ho scritto il seguente codice:
'---

Sub RinominaImmaginiPerNuovaImmagine()
NumeroImmagine = Application.InputBox(Prompt:="Inserire il numero della nuova immagine", _
Title:="Rinomina Immagini per Inserimento Nuova Immagine", _
Type:=1)
If NumeroImmagine = 0 Then Exit Sub

Dim Fso As Object
Dim NumeroImmagini As Long, i As Long
Set Fso = CreateObject("scripting.filesystemobject")
If Fso.FileExists(PercorsoImmagini & NumeroImmagine & ".jpg") Then
NumeroImmagini = Fso.GetFolder(PercorsoImmagini).Files.Count
For i = NumeroImmagini To NumeroImmagine Step -1
Name PercorsoImmagini & i & ".jpg" As PercorsoImmagini & i + 1 & ".jpg"
Next i
Else
MsgBox "L'immagine " & Chr(34) & NumeroImmagine & ".jpg" & Chr(34) & _
" non è presente nel percorso " & Chr(34) & PercorsoImmagini & Chr(34), _
vbCritical, "Rinomina Immagini per Inserimento Nuova Immagine"
End If
End Sub

Sub EliminaImmagineERinominaImmagini()
NumeroImmagine = Application.InputBox(Prompt:="Inserire il numero dell'immagine da eliminare", _
Title:="Elimina Immagine e Rinomina Immagini", _
Type:=1)
If NumeroImmagine = 0 Then Exit Sub
Dim Fso As Object
Dim NumeroImmagini As Long, i As Long
Set Fso = CreateObject("scripting.filesystemobject")
If Fso.FileExists(PercorsoImmagini & NumeroImmagine & ".jpg") Then
NumeroImmagini = Fso.GetFolder(PercorsoImmagini).Files.Count
Fso.DeleteFile (PercorsoImmagini & NumeroImmagine & ".jpg")
For i = NumeroImmagine + 1 To NumeroImmagini
Name PercorsoImmagini & i & ".jpg" As PercorsoImmagini & i - 1 & ".jpg"
Next i

Else
MsgBox "L'immagine " & Chr(34) & NumeroImmagine & ".jpg" & Chr(34) & _
" non è presente nel percorso " & Chr(34) & PercorsoImmagini & Chr(34), _
vbCritical, "Elimina Immagine e Rinomina Immagini Successive"
End If
End Sub
'---

Quando viene lanciata una delle due procedure viene visualizzato un InputBox dove va inserito il numero di immagine, rispettivamente del numero dell'immagine che andrà aggiunta (e in questo caso le altre immagini vengono rinominate incrementando di 1 il numero del loro nome) o dell'immagine che andrà cancellata (e in questo caso l'immagine verrà cancellata e quelle con numero di nome successivo rinumerate decrementando di 1 il numero del loro nome).
Se per caso il numero dell'immagine inserito non fosse presente viene lanciato un messaggio di avviso e non viene fatto niente.
In realtà nel caso di eliminazione e in mancaza dell'immagine da eliminare si potrebbe pensare comunque di rinumerare le immagini decrementandone il numero.
Io ho pensato al momento di non fare nulla.

Il codice lo trovi nel solito file di cui incollo nuovamente il link:
https://www.dropbox.com/s/zk7jt8idgl7qtgj/VBA%20caricare%20immagini%20jpg%20in%20un%20foglio%20Excel.xlsm?dl=0

Mi raccomando, fai sempre prima delle delle prove su di una copia della cartella delle immagini originarie in modo che io avessi sbagliato qualcosa almeno non di "sputtani" i file originali ;-)
draleo
2017-02-11 22:03:06 UTC
Permalink
Post by casanmaner
Per il momento ho predisposto due procedure per lavorare le sole immagini presenti nel percorso (parto dal presupposto che nella directory siano presenti solo i file delle immagini).
Sicuramente sarebbe possibile gestire in automatico anche la modifica nel foglio 2.
In che colonna hai inserito il numero dell'immagine di riferimento?
Public Const PercorsoImmagini As String = "C:\tmpImmagini\" '<--- dichiarata constante pubblica per renderla comune a tutti i moduli
In questo modo è disponibile per tutti i moduli della cartella di lavoro.
'---
Sub RinominaImmaginiPerNuovaImmagine()
NumeroImmagine = Application.InputBox(Prompt:="Inserire il numero della nuova immagine", _
Title:="Rinomina Immagini per Inserimento Nuova Immagine", _
Type:=1)
If NumeroImmagine = 0 Then Exit Sub
Dim Fso As Object
Dim NumeroImmagini As Long, i As Long
Set Fso = CreateObject("scripting.filesystemobject")
If Fso.FileExists(PercorsoImmagini & NumeroImmagine & ".jpg") Then
NumeroImmagini = Fso.GetFolder(PercorsoImmagini).Files.Count
For i = NumeroImmagini To NumeroImmagine Step -1
Name PercorsoImmagini & i & ".jpg" As PercorsoImmagini & i + 1 & ".jpg"
Next i
Else
MsgBox "L'immagine " & Chr(34) & NumeroImmagine & ".jpg" & Chr(34) & _
" non è presente nel percorso " & Chr(34) & PercorsoImmagini & Chr(34), _
vbCritical, "Rinomina Immagini per Inserimento Nuova Immagine"
End If
End Sub
Sub EliminaImmagineERinominaImmagini()
NumeroImmagine = Application.InputBox(Prompt:="Inserire il numero dell'immagine da eliminare", _
Title:="Elimina Immagine e Rinomina Immagini", _
Type:=1)
If NumeroImmagine = 0 Then Exit Sub
Dim Fso As Object
Dim NumeroImmagini As Long, i As Long
Set Fso = CreateObject("scripting.filesystemobject")
If Fso.FileExists(PercorsoImmagini & NumeroImmagine & ".jpg") Then
NumeroImmagini = Fso.GetFolder(PercorsoImmagini).Files.Count
Fso.DeleteFile (PercorsoImmagini & NumeroImmagine & ".jpg")
For i = NumeroImmagine + 1 To NumeroImmagini
Name PercorsoImmagini & i & ".jpg" As PercorsoImmagini & i - 1 & ".jpg"
Next i
Else
MsgBox "L'immagine " & Chr(34) & NumeroImmagine & ".jpg" & Chr(34) & _
" non è presente nel percorso " & Chr(34) & PercorsoImmagini & Chr(34), _
vbCritical, "Elimina Immagine e Rinomina Immagini Successive"
End If
End Sub
'---
Quando viene lanciata una delle due procedure viene visualizzato un InputBox dove va inserito il numero di immagine, rispettivamente del numero dell'immagine che andrà aggiunta (e in questo caso le altre immagini vengono rinominate incrementando di 1 il numero del loro nome) o dell'immagine che andrà cancellata (e in questo caso l'immagine verrà cancellata e quelle con numero di nome successivo rinumerate decrementando di 1 il numero del loro nome).
Se per caso il numero dell'immagine inserito non fosse presente viene lanciato un messaggio di avviso e non viene fatto niente.
In realtà nel caso di eliminazione e in mancaza dell'immagine da eliminare si potrebbe pensare comunque di rinumerare le immagini decrementandone il numero.
Io ho pensato al momento di non fare nulla.
https://www.dropbox.com/s/zk7jt8idgl7qtgj/VBA%20caricare%20immagini%20jpg%20in%20un%20foglio%20Excel.xlsm?dl=0
Mi raccomando, fai sempre prima delle delle prove su di una copia della cartella delle immagini originarie in modo che io avessi sbagliato qualcosa almeno non di "sputtani" i file originali ;-)
Funziona, funziona. Senza alcun problema( e non ne dubitavo). La colonna del Foglio 2 dove sono riportatati i num delle immagini è la col A. Es in A70 c'è il num 70; in A 162 c'è il num 162 (che sono i num delle rispettive immagini); nella col B ci sono le rispettive didascalie.
Non posso dirti a buon rendere (ti porterei iella).
draleo
casanmaner
2017-02-12 16:00:28 UTC
Permalink
Ho modificato le due precedenti procedure per poter elaborare in automatico anche i dati nel "Foglio2" dove hai inserito i riferimenti alle immagini, didascalie e categorie.
Ho prima di tutto fatte delle modifiche alle dichiarazioni aggiungendone una per avere il riferimento alla colonna dove hai inserito i numeri. Ho modificato i riferimenti che da quello che ho capito ora sono B per le didascalie e C per le categorie. E ho dichiarato pubbliche quelle costanti e variabili utilizzate nelle due procedure copiate nel secondo modulo.
Queste le dichiarazioni presenti nel Modulo1:
'----
'<--- dichiarazioni costanti e variabili relative al foglio dove sono presente le descrizioni delle didascalie e categorie
Public Const sNomeWsDidascalie As String = "Foglio2"
Public Const sColNumeroImmagine As String = "A"
Const sColDidascalie As String = "B"
Const sColCategorie As String = "C"
Const sUnderScoreCategoria As String = "_____"
Public wsDidascalie As Worksheet
'-----

Queste le due procedure presenti nel Modulo2:
'----
Option Explicit

Dim NumeroImmagine As Long

Sub RinominaImmaginiPerNuovaImmagine()
NumeroImmagine = Application.InputBox(Prompt:="Inserire il numero della nuova immagine", _
Title:="Rinomina Immagini per Inserimento Nuova Immagine", _
Type:=1)
If NumeroImmagine = 0 Then Exit Sub

Dim Fso As Object
Dim NumeroImmagini As Long, i As Long
Set wsDidascalie = ThisWorkbook.Worksheets(sNomeWsDidascalie)
Set Fso = CreateObject("scripting.filesystemobject")
If Fso.FileExists(PercorsoImmagini & NumeroImmagine & ".jpg") Then
NumeroImmagini = Fso.GetFolder(PercorsoImmagini).Files.Count
Application.ScreenUpdating = False
With wsDidascalie
For i = NumeroImmagini To NumeroImmagine Step -1
Name PercorsoImmagini & i & ".jpg" As PercorsoImmagini & i + 1 & ".jpg"
.Range(sColNumeroImmagine & i) = i + 1
Next i
With .Range(sColNumeroImmagine & NumeroImmagine)
.EntireRow.Insert
.Offset(-1, 0).Value = NumeroImmagine
End With
End With
Application.ScreenUpdating = True
Else
MsgBox "L'immagine " & Chr(34) & NumeroImmagine & ".jpg" & Chr(34) & _
" non è presente nel percorso " & Chr(34) & PercorsoImmagini & Chr(34), _
vbCritical, "Rinomina Immagini per Inserimento Nuova Immagine"
End If
End Sub

Sub EliminaImmagineERinominaImmagini()
NumeroImmagine = Application.InputBox(Prompt:="Inserire il numero dell'immagine da eliminare", _
Title:="Elimina Immagine e Rinomina Immagini", _
Type:=1)
If NumeroImmagine = 0 Then Exit Sub
Dim Fso As Object
Dim NumeroImmagini As Long, i As Long
Set wsDidascalie = ThisWorkbook.Worksheets(sNomeWsDidascalie)
Set Fso = CreateObject("scripting.filesystemobject")
If Fso.FileExists(PercorsoImmagini & NumeroImmagine & ".jpg") Then
NumeroImmagini = Fso.GetFolder(PercorsoImmagini).Files.Count
Fso.DeleteFile (PercorsoImmagini & NumeroImmagine & ".jpg")
Application.ScreenUpdating = False
With wsDidascalie
For i = NumeroImmagine + 1 To NumeroImmagini
Name PercorsoImmagini & i & ".jpg" As PercorsoImmagini & i - 1 & ".jpg"
.Range(sColNumeroImmagine & i) = i - 1
Next i
.Range(sColNumeroImmagine & NumeroImmagine).EntireRow.Delete
End With
Application.ScreenUpdating = True
Else
MsgBox "L'immagine " & Chr(34) & NumeroImmagine & ".jpg" & Chr(34) & _
" non è presente nel percorso " & Chr(34) & PercorsoImmagini & Chr(34), _
vbCritical, "Elimina Immagine e Rinomina Immagini Successive"
End If
End Sub
'----

Il link al file di esempio è sempre lo stesso ma lo incollo per comodità tua:
https://www.dropbox.com/s/zk7jt8idgl7qtgj/VBA%20caricare%20immagini%20jpg%20in%20un%20foglio%20Excel.xlsm?dl=0


Fai sempre prove prima su una copia del file e della cartella immagini :-)
Fidarsi è bene ... non fidarsi è meglio ;-)
draleo
2017-02-12 19:32:45 UTC
Permalink
Post by casanmaner
Ho modificato le due precedenti procedure per poter elaborare in automatico anche i dati nel "Foglio2" dove hai inserito i riferimenti alle immagini, didascalie e categorie.
Ho prima di tutto fatte delle modifiche alle dichiarazioni aggiungendone una per avere il riferimento alla colonna dove hai inserito i numeri. Ho modificato i riferimenti che da quello che ho capito ora sono B per le didascalie e C per le categorie. E ho dichiarato pubbliche quelle costanti e variabili utilizzate nelle due procedure copiate nel secondo modulo.
'----
'<--- dichiarazioni costanti e variabili relative al foglio dove sono presente le descrizioni delle didascalie e categorie
Public Const sNomeWsDidascalie As String = "Foglio2"
Public Const sColNumeroImmagine As String = "A"
Const sColDidascalie As String = "B"
Const sColCategorie As String = "C"
Const sUnderScoreCategoria As String = "_____"
Public wsDidascalie As Worksheet
'-----
'----
Option Explicit
Dim NumeroImmagine As Long
Sub RinominaImmaginiPerNuovaImmagine()
NumeroImmagine = Application.InputBox(Prompt:="Inserire il numero della nuova immagine", _
Title:="Rinomina Immagini per Inserimento Nuova Immagine", _
Type:=1)
If NumeroImmagine = 0 Then Exit Sub
Dim Fso As Object
Dim NumeroImmagini As Long, i As Long
Set wsDidascalie = ThisWorkbook.Worksheets(sNomeWsDidascalie)
Set Fso = CreateObject("scripting.filesystemobject")
If Fso.FileExists(PercorsoImmagini & NumeroImmagine & ".jpg") Then
NumeroImmagini = Fso.GetFolder(PercorsoImmagini).Files.Count
Application.ScreenUpdating = False
With wsDidascalie
For i = NumeroImmagini To NumeroImmagine Step -1
Name PercorsoImmagini & i & ".jpg" As PercorsoImmagini & i + 1 & ".jpg"
.Range(sColNumeroImmagine & i) = i + 1
Next i
With .Range(sColNumeroImmagine & NumeroImmagine)
.EntireRow.Insert
.Offset(-1, 0).Value = NumeroImmagine
End With
End With
Application.ScreenUpdating = True
Else
MsgBox "L'immagine " & Chr(34) & NumeroImmagine & ".jpg" & Chr(34) & _
" non è presente nel percorso " & Chr(34) & PercorsoImmagini & Chr(34), _
vbCritical, "Rinomina Immagini per Inserimento Nuova Immagine"
End If
End Sub
Sub EliminaImmagineERinominaImmagini()
NumeroImmagine = Application.InputBox(Prompt:="Inserire il numero dell'immagine da eliminare", _
Title:="Elimina Immagine e Rinomina Immagini", _
Type:=1)
If NumeroImmagine = 0 Then Exit Sub
Dim Fso As Object
Dim NumeroImmagini As Long, i As Long
Set wsDidascalie = ThisWorkbook.Worksheets(sNomeWsDidascalie)
Set Fso = CreateObject("scripting.filesystemobject")
If Fso.FileExists(PercorsoImmagini & NumeroImmagine & ".jpg") Then
NumeroImmagini = Fso.GetFolder(PercorsoImmagini).Files.Count
Fso.DeleteFile (PercorsoImmagini & NumeroImmagine & ".jpg")
Application.ScreenUpdating = False
With wsDidascalie
For i = NumeroImmagine + 1 To NumeroImmagini
Name PercorsoImmagini & i & ".jpg" As PercorsoImmagini & i - 1 & ".jpg"
.Range(sColNumeroImmagine & i) = i - 1
Next i
.Range(sColNumeroImmagine & NumeroImmagine).EntireRow.Delete
End With
Application.ScreenUpdating = True
Else
MsgBox "L'immagine " & Chr(34) & NumeroImmagine & ".jpg" & Chr(34) & _
" non è presente nel percorso " & Chr(34) & PercorsoImmagini & Chr(34), _
vbCritical, "Elimina Immagine e Rinomina Immagini Successive"
End If
End Sub
'----
https://www.dropbox.com/s/zk7jt8idgl7qtgj/VBA%20caricare%20immagini%20jpg%20in%20un%20foglio%20Excel.xlsm?dl=0
Fai sempre prove prima su una copia del file e della cartella immagini :-)
Fidarsi è bene ... non fidarsi è meglio ;-)
Bene, Benissimo. Adesso credo cha la fase ideativa sia finita (grazie a te);invece per me inizia un duro e noiosissimo lavoro manuale di catalogazione, numerazione , ecc di una valanga di foto e dati, da suddividere in 15-20 files più snelli, che mi porterò via 1-2 mesi (e forse più). Per cui non rompo più per un bel po’.
Grazie ancora
Draleo
draleo
2017-02-21 14:37:00 UTC
Permalink
Proseguendo nel fattivo lavoro sono emerse 2 cose alle quali inizialmente non avevo pensato:
1) la numerazione delle pagine: avendo suddiviso il tutto in numerosi files, avrei necessità che la suddetta numerazione non inizi in tutti i files sempre dal num 1; così come esiste una costante che permette l’inserimento del num della prima immagine
Const NumeroPrimaImmagineIniziale As Long = ……..
Sarebbe importante avere una analoga costante anche per la prima pagina, da impostare in ciascun file; cioè se la prima pag del 3° file, iniziasse dal num di pagina 48, la prima pagina di questo file dovrebbe avere il num 48 ( e non il num 1), la 2° pagina il num 49 ecc ecc
2) La variabile ANNO, ( al quale si riferiscono le immagini) , e che attualmente è stata lasciata incognita: XXXX. In una riga del listato appare
With .Offset(1, offsetColonneDescrAnno).Resize(NumRigheNumPag, NumColNumPag)
.Merge
.Value = "anno XXXX" 'anno da individuare in base ad una data condizione come ad es. un ‘intervallo di immagini.

Cioè non mi è chiaro cosa devo predisporre per identificare l’ANNO in questione: una tabella ?es
Da immag a immag ANNO
1 32 ANNO 1973
33 71 ANNO 1974
72 98 ANNO 1975
99 120 ANNO 1976
Oppure basta avere un elenco in cui accanto ad ogni immagine appare il relatvo anno
Num Immag ANNO
1 ANNO 1973
2 ANNO 1973
3 ANNO 1973
…. ANNO 1973
33 ANNO 1974
34 ANNO 1974

draleo
casanmaner
2017-02-21 16:35:15 UTC
Permalink
Andiamo pre gradi (e in base al tempo che ho :-D).
Per il punto 1 la modifica, a patto che poi sia l'operatore ad inviduare qual è la pagina iniziale in base a quella che risulta essere la pagina finale di un precedente file, dovrebbe essere abbastanza semplice.
Nel modulo 1 ho inserito una nuova costante così denominata:

Const NumeroPrimaImmagineIniziale As Long = 1 '<--- nuova dichiarazione per gestione numeri pagine

Nella procedura "ImpostaBordiENumerazionePagine" ho sostituito questa riga di comando:

'.Value = "Pagina " & i & "/" & NumeroPagine

con la seguente riga di comando:

.Value = "Pagina " & i + NumeroPrimaPagina - 1 & "/" & NumeroPagine + NumeroPrimaPagina - 1 '<--- nuova riga per inserimento numeri pagina

In base al valore assegnato alla precedente constante viene modificato il numero di pagina e anche il "totale" del numero di pagine.
Se ad es. asseggnassi il valore di 1 e il numero di pagine fosse 3 verrebbe restituito "Pagina 1/3".
Se, invece, asseggnassi il valore di 11 e il numero di pagine fosse sempre 3 verrebbe restituito "Pagina 11/13".

Qui trovi il link al file come modificato:
https://www.dropbox.com/s/zk7jt8idgl7qtgj/VBA%20caricare%20immagini%20jpg%20in%20un%20foglio%20Excel.xlsm?dl=0

Per il punto 2 la questione principale è se in un file tu farai in modo che vi rientrino solo foto di uno stesso anno o meno.
Il problema è dato dal fatto che quel comando è inserito in una procedura distinta da quella di inserimento delle immagini e al più per ogni pagina penso che si potrebbe individuare l'ultimo numero dell'immagine presente in quella pagina.
Diciamco che nel tuo "db" (dove hai anche le didascalie e la categoria potresti pensare di affinacare una colonna dove inserire l'anno di riferimento della foto per ogni foto). Poi in base al numero o della prima foto o dell'ultima foto andare a "pescare" l'anno.
Non so se mi sono spiegato bene.
Quindi prima di tutto occorre capire come vuoi operare e se per te è fattibile, così come per ogni foto inserisci didascalia e categoria, inserire l'anno di riferimento.
Poi dovrei un attimo "studiare" la procedura per fare mente locale di come opera :-)
Perché ti sembrerà strano ma da una settimana all'altra dimentico quanto fatto :-)
casanmaner
2017-02-21 16:43:17 UTC
Permalink
Perdonami Drale ma ho fatto confusione con il nome della nuova costante è in realtà ti ho indicato una costante che era già presente.
Il nome della nuova costante è:

Const NumeroPrimaPagina As Long = 11 '<--- nuova dichiarazione per gestione numeri pagine
draleo
2017-02-21 18:58:24 UTC
Permalink
Post by casanmaner
Andiamo pre gradi (e in base al tempo che ho :-D).
Per il punto 1 la modifica, a patto che poi sia l'operatore ad inviduare qual è la pagina iniziale in base a quella che risulta essere la pagina finale di un precedente file, dovrebbe essere abbastanza semplice.
Per il punto 1 è tutto OK: la nuova modifica funziona bene
Post by casanmaner
Per il punto 2 la questione principale è se in un file tu farai in modo che vi rientrino solo foto di uno stesso anno o meno.
Purtroppo no; nello stesso file possono essere presenti molte annate
Post by casanmaner
Quindi prima di tutto occorre capire come vuoi operare e se per te è fattibile, così come per ogni foto inserisci didascalia e categoria, inserire l'anno di riferimento.
Si; già lo avevo previsto e in colonna D del foglio 2 ho già inserito tutti gli anni corrispondenti al num di immagine della col A
Post by casanmaner
per ogni pagina penso che si potrebbe individuare l'ultimo numero dell'immagine presente in quella pagina.
Si. credo vada bene così: il relativo anno dell'ultima immagine di quella pagina, restituisce l'anno di quella pagina.Purtroppo In qualche raro caso, potrebbe verificarsi che nella stessa pagina ci siano 2 annate; ma ,a parte che potrei sempre inserire delle immagini fittizie per far scorrere la seconda annata alla pagina successiva ,ma se anche in un paio di pagine vi fossero 2 annate, correggerò a mano l'anno. Il problema (raro) è comunque risolvibile in un modo o nell'altro

Se pensi che la cosa sia fattibile, non sono importanti i tempi: ho tante di quelle immagini e didascalie da sistemare che anche tra 1-2 mesi, andrebbe comunque bene
Grazie ancora
draleo
draleo
casanmaner
2017-02-21 19:07:08 UTC
Permalink
Post by draleo
Post by casanmaner
Andiamo pre gradi (e in base al tempo che ho :-D).
Per il punto 1 la modifica, a patto che poi sia l'operatore ad inviduare qual è la pagina iniziale in base a quella che risulta essere la pagina finale di un precedente file, dovrebbe essere abbastanza semplice.
Per il punto 1 è tutto OK: la nuova modifica funziona bene
Post by casanmaner
Per il punto 2 la questione principale è se in un file tu farai in modo che vi rientrino solo foto di uno stesso anno o meno.
Purtroppo no; nello stesso file possono essere presenti molte annate
Post by casanmaner
Quindi prima di tutto occorre capire come vuoi operare e se per te è fattibile, così come per ogni foto inserisci didascalia e categoria, inserire l'anno di riferimento.
Si; già lo avevo previsto e in colonna D del foglio 2 ho già inserito tutti gli anni corrispondenti al num di immagine della col A
Post by casanmaner
per ogni pagina penso che si potrebbe individuare l'ultimo numero dell'immagine presente in quella pagina.
Si. credo vada bene così: il relativo anno dell'ultima immagine di quella pagina, restituisce l'anno di quella pagina.Purtroppo In qualche raro caso, potrebbe verificarsi che nella stessa pagina ci siano 2 annate; ma ,a parte che potrei sempre inserire delle immagini fittizie per far scorrere la seconda annata alla pagina successiva ,ma se anche in un paio di pagine vi fossero 2 annate, correggerò a mano l'anno. Il problema (raro) è comunque risolvibile in un modo o nell'altro
Se pensi che la cosa sia fattibile, non sono importanti i tempi: ho tante di quelle immagini e didascalie da sistemare che anche tra 1-2 mesi, andrebbe comunque bene
Grazie ancora
draleo
draleo
Ma se assieme alla categoria si inserisse l'anno?
Non ci starebbe?
Troppa confusione?
draleo
2017-02-21 19:19:20 UTC
Permalink
Post by casanmaner
Post by draleo
Post by casanmaner
Andiamo pre gradi (e in base al tempo che ho :-D).
Per il punto 1 la modifica, a patto che poi sia l'operatore ad inviduare qual è la pagina iniziale in base a quella che risulta essere la pagina finale di un precedente file, dovrebbe essere abbastanza semplice.
Per il punto 1 è tutto OK: la nuova modifica funziona bene
Post by casanmaner
Per il punto 2 la questione principale è se in un file tu farai in modo che vi rientrino solo foto di uno stesso anno o meno.
Purtroppo no; nello stesso file possono essere presenti molte annate
Post by casanmaner
Quindi prima di tutto occorre capire come vuoi operare e se per te è fattibile, così come per ogni foto inserisci didascalia e categoria, inserire l'anno di riferimento.
Si; già lo avevo previsto e in colonna D del foglio 2 ho già inserito tutti gli anni corrispondenti al num di immagine della col A
Post by casanmaner
per ogni pagina penso che si potrebbe individuare l'ultimo numero dell'immagine presente in quella pagina.
Si. credo vada bene così: il relativo anno dell'ultima immagine di quella pagina, restituisce l'anno di quella pagina.Purtroppo In qualche raro caso, potrebbe verificarsi che nella stessa pagina ci siano 2 annate; ma ,a parte che potrei sempre inserire delle immagini fittizie per far scorrere la seconda annata alla pagina successiva ,ma se anche in un paio di pagine vi fossero 2 annate, correggerò a mano l'anno. Il problema (raro) è comunque risolvibile in un modo o nell'altro
Se pensi che la cosa sia fattibile, non sono importanti i tempi: ho tante di quelle immagini e didascalie da sistemare che anche tra 1-2 mesi, andrebbe comunque bene
Grazie ancora
draleo
draleo
Ma se assieme alla categoria si inserisse l'anno?
Non ci starebbe?
Troppa confusione?
Già fatto; ho fatto leggere modifiche in modo che nella didascalia appaia anche l'anno dell'immagine. Il punto è però che mi serve anche l'annata della pagina posta in fondo ad essa, come indice. Se per es volessi trovare le immagini dell' anno 1979, basterebbe sfogliare le pagine (che saranno stampate e che saranno circa 200 in tutto)e trovare facilmente l'anno 1979. Se invece dovessi esaminare tutte le immagini per trovare l'anno che mi interessa, sarebbe tutto molto più laborioso
casanmaner
2017-02-21 20:08:40 UTC
Permalink
Ok, prova allora queste modifiche che ho apportato al codice del solito file:
https://www.dropbox.com/s/zk7jt8idgl7qtgj/VBA%20caricare%20immagini%20jpg%20in%20un%20foglio%20Excel.xlsm?dl=0

Per prima cosa ho dichiarato una nuova variabile nelle dichiarazioni '<--- dichiarazioni costanti e variabili per bordi e inserimento descrizioni numeri pagina

Dim NumeroUltimaImmagineDellaPagina As Long '<--- variabile dichiarata per calcolare il numero dell'ultima immagina di ogni pagina

Per seconda cosa ho impostato una nuova costante per indicare la lettera della colonna in cui saranno inseriti gli anni (dove per ogni immagine dovrebbe essere riportato l'anno di appartenenza) nel foglio delle didascalie/categorie.
La nuova costante riportata tra le dichiarazioni '<--- dichiarazioni costanti e variabili relative al foglio dove sono presente le descrizioni delle didascalie e categorie è la seguente:

Const sColAnni As String = "D" '<--- nuova costante per individuare la colonna degli anni

Poi nella procedura "ImpostaBordiENumerazionePagine" subito sopra quella che era la riga "Value = "anno XXXX" ho inserito queste righe di comando:

'<---- nuove righe per inserire l'anno in base al numero dell'ultima immagine caricata nella pagina --->
NumeroUltimaImmagineDellaPagina = NumeroPrimaImmagineIniziale + (NumImmaginiPerPagina * i) - 1
NumeroUltimaImmagine = NumeroPrimaImmagine + NumeroImmaginiDaCaricare - 1
If NumeroUltimaImmagineDellaPagina > NumeroUltimaImmagine Then
NumeroUltimaImmagineDellaPagina = NumeroUltimaImmagine
End If
'nuove righe per inserire l'anno in base al numero dell'ultima immagine caricata nella pagina --->

e immediatamente sotto trovi la riga di comando che assegna l'anno al gruppo di celle in fondo alla pagina:

.Value = "Anno " & wsDidascalie.Range(sColAnni & NumeroUltimaImmagineDellaPagina).Value '<--- inserimento dell'anno

Mi sembra che giri correttamente ma lascio a te il lavoro di test più approfondito :-)
Rimane la cosa che se ad es. la penultima foto della pagina fosse dell'anno 1900 e l'ultima del 1901 la procedura leggendo il numero dell'ultima immagine ripoterebbe 1901.
draleo
2017-02-22 10:34:15 UTC
Permalink
Post by casanmaner
Mi sembra che giri correttamente ma lascio a te il lavoro di test più approfondito :-)
Gira molto bene; l'ho testato in un paio di files che uso per le prove e non ho riscontrato alcun problema. E non c'è motivo per pensare che con i files veri (più massicci e variegati)le cose cambino
Post by casanmaner
Rimane la cosa che se ad es. la penultima foto della pagina fosse dell'anno 1900 e l'ultima del 1901 la procedura leggendo il numero dell'ultima immagine ripoterebbe 1901.
non credo ci siano situazioni del genere, perché se un annata terminasse alla penultima (o terz'ultima immagine) della pagina ho già provveduto - o comunque provvederò- ad inserire 1-2 immagini fittizie per far scorrere l'annata successiva alla pagina seguente. questo meccanismo di indicizzare le pagine con l'annata è molto utile. In alcuni files particolari avrò la necessità di indicizzare la pagina con una descrizione+anno.
Ma Non credo cambi niente : basterà riportare in colonna D della riga corrispondente la descrizione+ anno voluta. Sbaglio ?
Ancora grazie per lo splendido lavoro (e la pazienza). Appena terminato il lavoro (tra 2-3 mesi ...spero),come piccolo segno di gratitudine, ti invierò il prodotto finale cartaceo, che utilizzerai come vuoi
draleo
casanmaner
2017-02-22 11:17:34 UTC
Permalink
Post by draleo
Post by casanmaner
Mi sembra che giri correttamente ma lascio a te il lavoro di test più approfondito :-)
Gira molto bene; l'ho testato in un paio di files che uso per le prove e non ho riscontrato alcun problema. E non c'è motivo per pensare che con i files veri (più massicci e variegati)le cose cambino
Post by casanmaner
Rimane la cosa che se ad es. la penultima foto della pagina fosse dell'anno 1900 e l'ultima del 1901 la procedura leggendo il numero dell'ultima immagine ripoterebbe 1901.
non credo ci siano situazioni del genere, perché se un annata terminasse alla penultima (o terz'ultima immagine) della pagina ho già provveduto - o comunque provvederò- ad inserire 1-2 immagini fittizie per far scorrere l'annata successiva alla pagina seguente. questo meccanismo di indicizzare le pagine con l'annata è molto utile. In alcuni files particolari avrò la necessità di indicizzare la pagina con una descrizione+anno.
Ma Non credo cambi niente : basterà riportare in colonna D della riga corrispondente la descrizione+ anno voluta. Sbaglio ?
Certo.
Al massimo potresti pensare di considerare una modifica che in caso di valore solo numerico riporti "Anno " & ... "valore della cella" altrimenti solo "testo della cella".
Ad es.
If IsNumeric(wsDidascalie.Range(sColAnni & NumeroUltimaImmagineDellaPagina).Value) then
.Value = "Anno " & wsDidascalie.Range(sColAnni & NumeroUltimaImmagineDellaPagina).Value
else
.Value = wsDidascalie.Range(sColAnni & NumeroUltimaImmagineDellaPagina).Value
end if
Post by draleo
Ancora grazie per lo splendido lavoro (e la pazienza). Appena terminato il lavoro (tra 2-3 mesi ...spero),come piccolo segno di gratitudine, ti invierò il prodotto finale cartaceo, che utilizzerai come vuoi
draleo
Peccato che tu, a differenza di Ale, non commercializzi vino :D :D :D :D :D
draleo
2019-02-16 15:16:44 UTC
Permalink
Dopo circa 2 anni di un molto soddisfacente utilizzo, torno sull’argomento per una sopraggiunta necessità.
Per ricordarlo più facilmente, riporto quanto fa il file di casanmaner di questo post : carica su un foglio Excel una serie di immagini Jpg, disposte regolarmente in tante righe e tante colonne ,quante sono riportate nelle costanti dichiarate. Sotto ogni immagine c’è la relativa didascalia (caricata dal foglio2). In ogni pagina , per motivi estetici, c’è un riquadro che funge da bordo. A piè di pagina c’è la numerazione delle pagine. Tutto funziona benissimo. Solo che ora mi si presenta un'altra necessità: inserire una Frase descrittiva della pagina (didascalia pagina , che nell’esempio è Queen Victoria ) sotto il bordo superiore; per ottenere questo ho fatto delle modifiche al codice nel modulo1 alla macro :Sub ImpostaBordiENumerazionePagine()
Questa modifica funziona bene ,ma ha il problema che riporta tale frase in tutte le pagine, mentre io avrei la necessità che apparisse solo in alcune pagine dichiarate (es pag 7-8-15 ecc )
E’ possibile raggiungere lo scopo prefissato ?
Riporto il file all’indirizzo
https://www.dropbox.com/s/zp1unz02pmkzdau/USA%201847-1900.pdf?dl=0

Il codice sotto riportato è quello introdotto da me per cercare di ottenere tale frase; che però mi appare in tutte le pagine e mi costringe a cancellarlo manualmente là dove non serve
…………..
'formattazione per inserimento didascalia pagina
With .Cells(iPrimaRigaBordo, PrimaColonnaBordo)
With .Offset(1, 25).Resize(NumRigheNumPag + 2, NumColNumPag + 20)
.Merge
.Value = "Queen Victoria"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
With .Font
.Name = "Algerian"
.Size = 16
End With
End With
End With
…………………….
grazie
draleo
Bruno Campanini
2019-02-16 18:22:12 UTC
Permalink
Post by draleo
Dopo circa 2 anni di un molto soddisfacente utilizzo, torno sull’argomento
per una sopraggiunta necessità. Per ricordarlo più facilmente, riporto
quanto fa il file di casanmaner di questo post : carica su un foglio Excel
una serie di immagini Jpg, disposte regolarmente in tante righe e tante
colonne ,quante sono riportate nelle costanti dichiarate. Sotto ogni
immagine c’è la relativa didascalia (caricata dal foglio2). In ogni pagina ,
per motivi estetici, c’è un riquadro che funge da bordo. A piè di pagina c’è
la numerazione delle pagine. Tutto funziona benissimo. Solo che ora mi si
presenta un'altra necessità: inserire una Frase descrittiva della pagina
(didascalia pagina , che nell’esempio è Queen Victoria ) sotto il bordo
superiore; per ottenere questo ho fatto delle modifiche al codice nel modulo1
alla macro :Sub ImpostaBordiENumerazionePagine() Questa modifica funziona
bene ,ma ha il problema che riporta tale frase in tutte le pagine, mentre io
avrei la necessità che apparisse solo in alcune pagine dichiarate (es pag
7-8-15 ecc ) E’ possibile raggiungere lo scopo prefissato ? Riporto il file
all’indirizzo
https://www.dropbox.com/s/zp1unz02pmkzdau/USA%201847-1900.pdf?dl=0
Il codice sotto riportato è quello introdotto da me per cercare di ottenere
tale frase; che però mi appare in tutte le pagine e mi costringe a
cancellarlo manualmente là dove non serve ………….. 'formattazione per
inserimento didascalia pagina With .Cells(iPrimaRigaBordo,
PrimaColonnaBordo) With .Offset(1, 25).Resize(NumRigheNumPag + 2,
NumColNumPag + 20) .Merge
.Value = "Queen Victoria"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
With .Font
.Name = "Algerian"
.Size = 16
End With
End With
End With
…………………….
grazie
draleo
Io non so dove metter la mani, quindi al tuo problema provvederà
sicuramente casanmaner.

Richiesto da un amico di predisporre una cosa del genere con
riferimento alle monete, mi piacerebbe molto aver sottomano il
tuo file Excel.
Pagherei con l'invio di una bottiglia di Cardenal Mendoza
o di Gran Duca d'Alba... o con entrambe.

Bruno
draleo
2019-02-16 19:25:52 UTC
Permalink
Post by Bruno Campanini
Post by draleo
Dopo circa 2 anni di un molto soddisfacente utilizzo, torno sull’argomento
per una sopraggiunta necessità. Per ricordarlo più facilmente, riporto
quanto fa il file di casanmaner di questo post : carica su un foglio Excel
una serie di immagini Jpg, disposte regolarmente in tante righe e tante
colonne ,quante sono riportate nelle costanti dichiarate. Sotto ogni
immagine c’è la relativa didascalia (caricata dal foglio2). In ogni pagina ,
per motivi estetici, c’è un riquadro che funge da bordo. A piè di pagina c’è
la numerazione delle pagine. Tutto funziona benissimo. Solo che ora mi si
presenta un'altra necessità: inserire una Frase descrittiva della pagina
(didascalia pagina , che nell’esempio è Queen Victoria ) sotto il bordo
superiore; per ottenere questo ho fatto delle modifiche al codice nel modulo1
alla macro :Sub ImpostaBordiENumerazionePagine() Questa modifica funziona
bene ,ma ha il problema che riporta tale frase in tutte le pagine, mentre io
avrei la necessità che apparisse solo in alcune pagine dichiarate (es pag
7-8-15 ecc ) E’ possibile raggiungere lo scopo prefissato ? Riporto il file
all’indirizzo
https://www.dropbox.com/s/zp1unz02pmkzdau/USA%201847-1900.pdf?dl=0
Il codice sotto riportato è quello introdotto da me per cercare di ottenere
tale frase; che però mi appare in tutte le pagine e mi costringe a
cancellarlo manualmente là dove non serve ………….. 'formattazione per
inserimento didascalia pagina With .Cells(iPrimaRigaBordo,
PrimaColonnaBordo) With .Offset(1, 25).Resize(NumRigheNumPag + 2,
NumColNumPag + 20) .Merge
.Value = "Queen Victoria"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
With .Font
.Name = "Algerian"
.Size = 16
End With
End With
End With
…………………….
grazie
draleo
Io non so dove metter la mani, quindi al tuo problema provvederà
sicuramente casanmaner.
Richiesto da un amico di predisporre una cosa del genere con
riferimento alle monete, mi piacerebbe molto aver sottomano il
tuo file Excel.
Pagherei con l'invio di una bottiglia di Cardenal Mendoza
o di Gran Duca d'Alba... o con entrambe.
Bruno
E' un dovere (e un piacere) se potessi esserti utile. Il file (l'autore è casanmaner) è quello scaricabile dal link postato sopra. Io l'utilizzo per farmi degli album di francobolli. ma sostituendo le foto dei francobolli , con quelle delle monete, non cambia niente. Il problema casomai sono le foto. Io le scarico da un sito Web (sempre grazie ad un altra ottima procedura di casanmaner e Elio Buonocore). Ma no so se ci siano anche le foto delle monete. controllerò

draleo
casanmaner
2019-02-16 19:41:47 UTC
Permalink
Post by draleo
Dopo circa 2 anni di un molto soddisfacente utilizzo, torno sull’argomento per una sopraggiunta necessità.
Per ricordarlo più facilmente, riporto quanto fa il file di casanmaner di questo post : carica su un foglio Excel una serie di immagini Jpg, disposte regolarmente in tante righe e tante colonne ,quante sono riportate nelle costanti dichiarate. Sotto ogni immagine c’è la relativa didascalia (caricata dal foglio2). In ogni pagina , per motivi estetici, c’è un riquadro che funge da bordo. A piè di pagina c’è la numerazione delle pagine. Tutto funziona benissimo. Solo che ora mi si presenta un'altra necessità: inserire una Frase descrittiva della pagina (didascalia pagina , che nell’esempio è Queen Victoria ) sotto il bordo superiore; per ottenere questo ho fatto delle modifiche al codice nel modulo1 alla macro :Sub ImpostaBordiENumerazionePagine()
Questa modifica funziona bene ,ma ha il problema che riporta tale frase in tutte le pagine, mentre io avrei la necessità che apparisse solo in alcune pagine dichiarate (es pag 7-8-15 ecc )
E’ possibile raggiungere lo scopo prefissato ?
Riporto il file all’indirizzo
https://www.dropbox.com/s/zp1unz02pmkzdau/USA%201847-1900.pdf?dl=0
Il codice sotto riportato è quello introdotto da me per cercare di ottenere tale frase; che però mi appare in tutte le pagine e mi costringe a cancellarlo manualmente là dove non serve
…………..
'formattazione per inserimento didascalia pagina
With .Cells(iPrimaRigaBordo, PrimaColonnaBordo)
With .Offset(1, 25).Resize(NumRigheNumPag + 2, NumColNumPag + 20)
.Merge
.Value = "Queen Victoria"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
With .Font
.Name = "Algerian"
.Size = 16
End With
End With
End With
…………………….
grazie
draleo
ciao draleo,
il link porta ad un pdf.
Ora non ricordo perfettamente ma mi pare venisse effettuato un ciclo.
Se così fosse potresti valorizzare un "contatore" per ciascuna pagina e quando il corrisponde ad una dei numeri di pagina per cui desideri inserire quella ulteriore descrizione far eseguire il codice da te implementato.

Ad es. dichiari una variabile
Dim Contantore as long

Ad ogni ciclo di pagina

Contatore = Contatore + 1

Poi puoi aggiungere qualcosa del genere

Select Case Contatore
Case 7, 8, 15
With .Cells(iPrimaRigaBordo, PrimaColonnaBordo)
With .Offset(1, 25).Resize(NumRigheNumPag + 2, NumColNumPag + 20)
.Merge
.Value = "Queen Victoria"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
With .Font
.Name = "Algerian"
.Size = 16
End With
End With
End With
End Select


prova a verificare se potrebbe andare bene.
casanmaner
2019-02-16 19:43:40 UTC
Permalink
Aggiungo che guardando il pdf vedo che ci sono delle pagine numerate "Pagina 1", ecc.
Quindi un contatore sembra già esserci.
Potresti collegarti a quello per condizionare l'inserimento delle descrizioni ulteriori.
draleo
2019-02-16 19:54:36 UTC
Permalink
Post by casanmaner
Aggiungo che guardando il pdf vedo che ci sono delle pagine numerate "Pagina 1", ecc.
Quindi un contatore sembra già esserci.
Potresti collegarti a quello per condizionare l'inserimento delle descrizioni ulteriori.
Evidentemente ho sbagliato ad inserire il link. Questo è il link esatto del file di casanmaner

https://www.dropbox.com/s/6egwhsdro1cgmsa/Caricare%20immagini%20Jpg%20in%20un%20foglio%20Excel.xlsm?dl=0
draleo
draleo
2019-02-16 20:47:13 UTC
Permalink
Post by draleo
Post by casanmaner
Aggiungo che guardando il pdf vedo che ci sono delle pagine numerate "Pagina 1", ecc.
Quindi un contatore sembra già esserci.
Potresti collegarti a quello per condizionare l'inserimento delle descrizioni ulteriori.
Evidentemente ho sbagliato ad inserire il link. Questo è il link esatto del file di casanmaner
https://www.dropbox.com/s/6egwhsdro1cgmsa/Caricare%20immagini%20Jpg%20in%20un%20foglio%20Excel.xlsm?dl=0
draleo
o mi sono rincoglionito io, oppure hanno cambiato qualcosa su Dropbox; infatti non mi permette più di scaricare il file, che avevo regolarmente condiviso. Per tagliare la testa al toro, Posso inviarlo a Bruno in allegato ad una normale mail (ma devo sapere il suo indirizzo). Per Casanmaner credo già di averlo
draleo
casanmaner
2019-02-16 21:19:53 UTC
Permalink
Post by draleo
Post by draleo
Post by casanmaner
Aggiungo che guardando il pdf vedo che ci sono delle pagine numerate "Pagina 1", ecc.
Quindi un contatore sembra già esserci.
Potresti collegarti a quello per condizionare l'inserimento delle descrizioni ulteriori.
Evidentemente ho sbagliato ad inserire il link. Questo è il link esatto del file di casanmaner
https://www.dropbox.com/s/6egwhsdro1cgmsa/Caricare%20immagini%20Jpg%20in%20un%20foglio%20Excel.xlsm?dl=0
draleo
o mi sono rincoglionito io, oppure hanno cambiato qualcosa su Dropbox; infatti non mi permette più di scaricare il file, che avevo regolarmente condiviso. Per tagliare la testa al toro, Posso inviarlo a Bruno in allegato ad una normale mail (ma devo sapere il suo indirizzo). Per Casanmaner credo già di averlo
draleo
Ciao Draleo il tuo file io sono riuscito a scaricarlo.
Come ti dicevo nella routine ImpostaBordiENumerazionePagine c'è un ciclo (dove il contatore è "i").

Prova a modificare così la tua parte relativa alla didascalia:

'formattazione per inserimento didascalia pagina
Select Case i
Case 7, 8, 15
With .Cells(iPrimaRigaBordo, PrimaColonnaBordo)
With .Offset(1, 25).Resize(NumRigheNumPag + 2, NumColNumPag + 20)
.Merge
.Value = "Queen Victoria"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
With .Font
.Name = "Algerian"
.Size = 16
End With
End With
End With
End Select


Non ho avuto modo di provare perché non ho immagini da utilizzare.

ciao
draleo
2019-02-16 21:57:35 UTC
Permalink
Post by casanmaner
Post by draleo
Post by draleo
Post by casanmaner
Aggiungo che guardando il pdf vedo che ci sono delle pagine numerate "Pagina 1", ecc.
Quindi un contatore sembra già esserci.
Potresti collegarti a quello per condizionare l'inserimento delle descrizioni ulteriori.
Evidentemente ho sbagliato ad inserire il link. Questo è il link esatto del file di casanmaner
https://www.dropbox.com/s/6egwhsdro1cgmsa/Caricare%20immagini%20Jpg%20in%20un%20foglio%20Excel.xlsm?dl=0
draleo
o mi sono rincoglionito io, oppure hanno cambiato qualcosa su Dropbox; infatti non mi permette più di scaricare il file, che avevo regolarmente condiviso. Per tagliare la testa al toro, Posso inviarlo a Bruno in allegato ad una normale mail (ma devo sapere il suo indirizzo). Per Casanmaner credo già di averlo
draleo
Ciao Draleo il tuo file io sono riuscito a scaricarlo.
Come ti dicevo nella routine ImpostaBordiENumerazionePagine c'è un ciclo (dove il contatore è "i").
'formattazione per inserimento didascalia pagina
Select Case i
Case 7, 8, 15
With .Cells(iPrimaRigaBordo, PrimaColonnaBordo)
With .Offset(1, 25).Resize(NumRigheNumPag + 2, NumColNumPag + 20)
.Merge
.Value = "Queen Victoria"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
With .Font
.Name = "Algerian"
.Size = 16
End With
End With
End With
End Select
Non ho avuto modo di provare perché non ho immagini da utilizzare.
ciao
Si. Grazie. Funziona benissimo
Per Bruno: Tutto quello che serve per realizzare un album delle monete (didascalie ed immagini)si può scaricare dal sito
https://colnect.com/it/coins
bisogna registrarsi, ma la registrazione è gratuita
La prima cosa da fare è scaricare le schede delle monete (dalle quali si otterranno poi didascalie da associare alle immagini). Per farlo
Menu Nazioni
Scegliere per es -Italia- Vittorio Emanuele II-appaiono tutte le schede di ogni moneta (2 immagini ,fronte-retro per moneta). I vari campi delle schede si possono scaricare tramite il comando esporta. Si ottiene un file csv, contente tutte le informazioni che servono, che trasformerai in un file excel.
Ogni riga è una scheda di una singola moneta. Non tutti i campi serviranno (sarà l’esperto in numismatica a scegliere quali informazioni servono). Uno dei campi (mi sembra l’ultimo) contiene gli indirizzi da utilizzare successivamente per scaricare le immagini, con l’altro procedura di Casanmaner (Web scraping)
Le immagini Jpg andranno in una cartella e da li richiamate. Le didascalie vanno invece messe nel Foglio2 del programma “caricare immagini Jpg in un file Excel
Il tutto è più facile a farlo che a dirlo
Comunque per qualsiasi chiarimento (non sul VBA, perché tu ne sai molto più di me) puoi contattarmi
draleo
Ammammata
2019-02-18 09:25:18 UTC
Permalink
Il giorno Sat 16 Feb 2019 10:57:35p, *draleo* ha inviato su
Post by draleo
appaiono tutte le schede di ogni moneta (2 immagini ,fronte-retro per
moneta)
vedo che in alcuni casi c'è anche la scansione del bordo... tipo la moneta
da due euro
--
/-\ /\/\ /\/\ /-\ /\/\ /\/\ /-\ T /-\
-=- -=- -=- -=- -=- -=- -=- -=- - -=-
Post by draleo
http://www.bb2002.it :) <<<<<
........... [ al lavoro ] ...........
draleo
2019-02-28 10:18:04 UTC
Permalink
Post by casanmaner
Post by draleo
Post by draleo
Post by casanmaner
Aggiungo che guardando il pdf vedo che ci sono delle pagine numerate "Pagina 1", ecc.
Quindi un contatore sembra già esserci.
Potresti collegarti a quello per condizionare l'inserimento delle descrizioni ulteriori.
Evidentemente ho sbagliato ad inserire il link. Questo è il link esatto del file di casanmaner
https://www.dropbox.com/s/6egwhsdro1cgmsa/Caricare%20immagini%20Jpg%20in%20un%20foglio%20Excel.xlsm?dl=0
draleo
o mi sono rincoglionito io, oppure hanno cambiato qualcosa su Dropbox; infatti non mi permette più di scaricare il file, che avevo regolarmente condiviso. Per tagliare la testa al toro, Posso inviarlo a Bruno in allegato ad una normale mail (ma devo sapere il suo indirizzo). Per Casanmaner credo già di averlo
draleo
Ciao Draleo il tuo file io sono riuscito a scaricarlo.
Come ti dicevo nella routine ImpostaBordiENumerazionePagine c'è un ciclo (dove il contatore è "i").
'formattazione per inserimento didascalia pagina
Select Case i
Case 7, 8, 15
With .Cells(iPrimaRigaBordo, PrimaColonnaBordo)
With .Offset(1, 25).Resize(NumRigheNumPag + 2, NumColNumPag + 20)
.Merge
.Value = "Queen Victoria"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
With .Font
.Name = "Algerian"
.Size = 16
End With
End With
End With
End Select
Non ho avuto modo di provare perché non ho immagini da utilizzare.
ciao
Può essere fattibile inserire anche un contatore di righe ? Cioè :già esiste un contatore di pagine; già esistono 2 costanti
Const NumImmaginiPerRiga As Long = 5
Const NumImmaginiPerPagina As Long = 25
da questi elementi si può estrapolare un contatore di righe ? La domanda è finalizzata ad inserire delle didascalie in corrispondenza di alcune righe (non in tutte); in pratica una frase funga da didascalia di riga

draleo
draleo
2019-02-28 17:49:28 UTC
Permalink
Post by draleo
Post by casanmaner
Post by draleo
Post by draleo
Post by casanmaner
Aggiungo che guardando il pdf vedo che ci sono delle pagine numerate "Pagina 1", ecc.
Quindi un contatore sembra già esserci.
Potresti collegarti a quello per condizionare l'inserimento delle descrizioni ulteriori.
Evidentemente ho sbagliato ad inserire il link. Questo è il link esatto del file di casanmaner
https://www.dropbox.com/s/6egwhsdro1cgmsa/Caricare%20immagini%20Jpg%20in%20un%20foglio%20Excel.xlsm?dl=0
draleo
o mi sono rincoglionito io, oppure hanno cambiato qualcosa su Dropbox; infatti non mi permette più di scaricare il file, che avevo regolarmente condiviso. Per tagliare la testa al toro, Posso inviarlo a Bruno in allegato ad una normale mail (ma devo sapere il suo indirizzo). Per Casanmaner credo già di averlo
draleo
Ciao Draleo il tuo file io sono riuscito a scaricarlo.
Come ti dicevo nella routine ImpostaBordiENumerazionePagine c'è un ciclo (dove il contatore è "i").
'formattazione per inserimento didascalia pagina
Select Case i
Case 7, 8, 15
With .Cells(iPrimaRigaBordo, PrimaColonnaBordo)
With .Offset(1, 25).Resize(NumRigheNumPag + 2, NumColNumPag + 20)
.Merge
.Value = "Queen Victoria"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
With .Font
.Name = "Algerian"
.Size = 16
End With
End With
End With
End Select
Non ho avuto modo di provare perché non ho immagini da utilizzare.
ciao
Può essere fattibile inserire anche un contatore di righe ? Cioè :già esiste un contatore di pagine; già esistono 2 costanti
Const NumImmaginiPerRiga As Long = 5
Const NumImmaginiPerPagina As Long = 25
da questi elementi si può estrapolare un contatore di righe ? La domanda è finalizzata ad inserire delle didascalie in corrispondenza di alcune righe (non in tutte); in pratica una frase funga da didascalia di riga
draleo
Ripensandoci bene … potrebbe non essere necessario questo nuovo contatore. Avendo già il contatore di immagini. Basta dirgli :in corrispondenza dell immagine n. X ,spostati di n righe in alto e scrivi "abcdef.." spero di non aver fatto sprecare del tempo nella ricerca di una soluzione che, ORA, dopo averci rimurginato sopra, può essere ridondante. Grazie

draleo

Bruno Campanini
2019-02-17 10:27:00 UTC
Permalink
Post by draleo
Post by draleo
https://www.dropbox.com/s/6egwhsdro1cgmsa/Caricare%20immagini%20Jpg%20in%20un%20foglio%20Excel.xlsm?dl=0
draleo
o mi sono rincoglionito io, oppure hanno cambiato qualcosa su Dropbox;
infatti non mi permette più di scaricare il file, che avevo regolarmente
condiviso. Per tagliare la testa al toro, Posso inviarlo a Bruno in allegato
ad una normale mail (ma devo sapere il suo indirizzo). Per Casanmaner credo
già di averlo draleo
Il tuo file l'ho scaricato e appena l'ho attivato mi ha subito detto
che il mio office 2019 non è attivato.
Poco male, ho invocato la maga che me l'attiva ed ora è tutto a posto.

Pensavo che le immagini fossero embedded invece il file fa riferimento
a una directory, etc.

Che non ci sia proprio la possibilità di tenere le immagini
integrate al file xslm?
Ho cercato in Internet ma non ho trovato nulla al riguardo... io
però son cieco come una talpa in tali ricerche.

Bruno
casanmaner
2019-02-17 12:17:37 UTC
Permalink
Bruno una volta caricate le immagini rimangono nel file Excel.
Il file è vuoto per eseguire l'inserimento ex novo.
Bruno Campanini
2019-02-17 15:18:29 UTC
Permalink
Post by casanmaner
Bruno una volta caricate le immagini rimangono nel file Excel.
Il file è vuoto per eseguire l'inserimento ex novo.
Sì, intendevo riferirmi ai file... quelli rimangono dov'erano.
Ho un amico che ha diverse centinaia di foto di monete, che
vorrebbe iserire come elenco di file in Excel, quivi ordinare
e filtrare detti file e con un click tirar fuori una bella
immagine full screen dell'oggetto rappresentato.

Per far ciò dovrebbe avere disponibili in Excel (embedded)
i vari file ovvero aver riprodotto in tante celle le "figurine"
che poi verrebbero ingrandite, etc.
In tale secondo caso le operazioni di inserimento, ordinamento
e filtro mi pare sarebbero alquanto complicate.
O magari è normale amministrazione... solo per me straordinaria.

Bruno
casanmaner
2019-02-17 18:04:22 UTC
Permalink
Post by Bruno Campanini
Post by casanmaner
Bruno una volta caricate le immagini rimangono nel file Excel.
Il file è vuoto per eseguire l'inserimento ex novo.
Sì, intendevo riferirmi ai file... quelli rimangono dov'erano.
Ho un amico che ha diverse centinaia di foto di monete, che
vorrebbe iserire come elenco di file in Excel, quivi ordinare
e filtrare detti file e con un click tirar fuori una bella
immagine full screen dell'oggetto rappresentato.
Per far ciò dovrebbe avere disponibili in Excel (embedded)
i vari file ovvero aver riprodotto in tante celle le "figurine"
che poi verrebbero ingrandite, etc.
In tale secondo caso le operazioni di inserimento, ordinamento
e filtro mi pare sarebbero alquanto complicate.
O magari è normale amministrazione... solo per me straordinaria.
Probabilmente Draleo potrebbe darti instruzioni più dettagliate utilizzando lui il file.
Da quello che ricordo le immagini risultavano numerate, cioé il nome del file era un numero (es. 1.jpg, 2.jpg, ecc.) e il ciclo caricava le immagini in base agli indici iniziali e finali del ciclo.
Poi, se non ricordo male, tramite una tabella di raccordo ad ogni numero era associato un dettaglio e la procedura associava questo dettagli all'immagine carcata.

Il risultato finale era il pdf che draleo aveva linkato per errore in un suo precedente post.

ciao
draleo
2019-02-17 19:17:49 UTC
Permalink
Post by casanmaner
Post by Bruno Campanini
Post by casanmaner
Bruno una volta caricate le immagini rimangono nel file Excel.
Il file è vuoto per eseguire l'inserimento ex novo.
Sì, intendevo riferirmi ai file... quelli rimangono dov'erano.
Ho un amico che ha diverse centinaia di foto di monete, che
vorrebbe iserire come elenco di file in Excel, quivi ordinare
e filtrare detti file e con un click tirar fuori una bella
immagine full screen dell'oggetto rappresentato.
Per far ciò dovrebbe avere disponibili in Excel (embedded)
i vari file ovvero aver riprodotto in tante celle le "figurine"
che poi verrebbero ingrandite, etc.
In tale secondo caso le operazioni di inserimento, ordinamento
e filtro mi pare sarebbero alquanto complicate.
O magari è normale amministrazione... solo per me straordinaria.
Probabilmente Draleo potrebbe darti instruzioni più dettagliate utilizzando lui il file.
Da quello che ricordo le immagini risultavano numerate, cioé il nome del file era un numero (es. 1.jpg, 2.jpg, ecc.) e il ciclo caricava le immagini in base agli indici iniziali e finali del ciclo.
Poi, se non ricordo male, tramite una tabella di raccordo ad ogni numero era associato un dettaglio e la procedura associava questo dettagli all'immagine carcata.
Il risultato finale era il pdf che draleo aveva linkato per errore in un suo precedente post.
ciao
Si. è così. L'album è costituito da una sequenza di immagini e ad ognuna è accoppiata la sua spiegazione (didascalia)più o meno dettagliata. Le immagini jpg vengono poste in una cartella e devono essere numerate in maniera progressiva (1-2-3 ecc senza salti). I testi che costituiscono la didascalia, sono posti nel foglio 2 (ogni riga 1 didascalia). anche queste didascalie devono essere numerate in maniera progressiva (1-2-3 ecc) e il numero attribuito deve corrispondere a quello della relativa immagine. La procedura non fa altro che accoppiare questi elementi e disporli sui fogli Excel (secondo dei parametri variabili (num di elementi per riga e colonna, fattori di riduzioni delle immagini, num righe didascalie, piè di pagina, titolo ecc).Le foto ognuno sceglie quali metterci, così le didascalie. Certo se sono 100ia o migliaia , meglio scaricarle già pronte da qualche parte. Le didascalie si possono ordinare come si vuole, ma se si cambia il loro ordine va cambiata anche quello delle immagini (altrimenti non corrispondono più). Quando io cambio tale ordinamento , anziché mettermi a riordinare le immagini (c'è da diventare matti), preferisco riscaricare tutte le immagini in base al nuovo ordinamento (in 10 minuti si caricano circa un 1000io di immagini)

draleo
draleo
2019-02-17 12:32:24 UTC
Permalink
Post by Bruno Campanini
Il tuo file l'ho scaricato e appena l'ho attivato mi ha subito detto
che il mio office 2019 non è attivato.
Poco male, ho invocato la maga che me l'attiva ed ora è tutto a posto.
strano. il file che ho condiviso è stato fatto con una vecchia versione di Excel (2010 ?non ricordo, comunque non ho mai avuto versioni seguenti la 2017)
Post by Bruno Campanini
Pensavo che le immagini fossero embedded invece il file fa riferimento
a una directory, etc.
Che non ci sia proprio la possibilità di tenere le immagini
integrate al file xslm?
questo francamente non lo so. Io le metto in una cartella e da li le carico sul file Excel. Poi una volta che il lavoro è terminato, salvo il file excel in PDF (e allora la cartella delle immagini non serve più)
draleo
casanmaner
2017-02-02 00:20:29 UTC
Permalink
Ti propongo la procedura riscritta.
Non sono sicuro che modificando i parametri del numero di immagini per riga e per pagina i bordi e le numerazioni pagina e relative interruzioni risultino corrette ed eventualmente saranno da aggiustare i parametri delle costanti che ho utilizzato per inserire i bordi, unire le celle e inserire le numerazioni pagine, in maniera "slegata" tra di loro.
Come noterai ho portato all'esterno delle macro le costanti e variabili per poterle eventualmente utilizzare in "comune".
Nota che ho previsto una macro "Main" da dove richiamo le altre macro in sequenza.

'----
Option Explicit

'<--- dichiarazioni constanti per inserimento immagini e didascalie - start
Const PercorsoImmagini As String = "C:\tmpImmagini\"
Const NumeroPrimaImmagineIniziale As Long = 1
Const NumeroImmaginiDaCaricare As Long = 50
Const NumImmaginiPerRiga As Long = 4
Const NumImmaginiPerPagina As Long = 20
Const PassoCol As Long = 20
Const DeltaPassoRighe As Long = 25
Const DeltaRigheCambioPagina As Long = 8
Const NumColIniziale As Long = 7
'dichirazioni costanti per inserimento immagini e didascalie - end --->

'<--- dichiarazioni variabili per inserimento immagini e didascalie - start
Dim Immagine As Object
Dim i As Long, NumCol As Long, PassoRighe As Long
Dim NumeroPrimaImmagine As Long, NumeroUltimaImmagine As Long
Dim ContatoreImmaginiPerRiga As Long, ContatoreImmaginiPerPagina As Long
Dim stringaEccezioneNumerica As String
'dichiarazioni variabili per inserimento immagini e didascalie - start --->

'<--- dichiarazioni costanti e variabili per bordi e inserimento descrizioni numeri pagina
Dim NumeroPagine As Long
Const PrimaRigaBordo As Long = 5
Const PrimaColonnaBordo As Long = NumColIniziale - 1
Const UltimaColonnaBordo As Long = NumColIniziale + (NumImmaginiPerRiga * PassoCol)
Const PassoRigheBordo As Long = (DeltaPassoRighe * (NumImmaginiPerPagina / NumImmaginiPerRiga)) + 1
Dim iPrimaRigaBordo As Long, iUltimaRigaBordo As Long, iPassoRigheBordo As Long
Dim iSottrattore As Long

Sub InserimentoImmaginiMain()
Application.ScreenUpdating = False
Call CancellaImmagini
Call InserisciImmaginiIV
Call ImpostaBordiENumerazionePagine
Application.ScreenUpdating = True
End Sub

Sub InserisciImmaginiIV()
Call CancellaImmagini
NumeroPrimaImmagine = NumeroPrimaImmagineIniziale
NumeroUltimaImmagine = NumeroPrimaImmagine + NumeroImmaginiDaCaricare - 1
NumCol = NumColIniziale
PassoRighe = 0
ContatoreImmaginiPerRiga = 0
ContatoreImmaginiPerPagina = 0
stringaEccezioneNumerica = vbNullString
EccezioneNumerica:
For i = NumeroPrimaImmagine To NumeroUltimaImmagine
'<--- inserimento immagini senza eccezione numerica - start
Set Immagine = ActiveSheet.Pictures.Insert(PercorsoImmagini & i & stringaEccezioneNumerica & ".JPG")
With Immagine
.Name = "Immagine " & i & stringaEccezioneNumerica
.Height = 42
.Top = ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Top + _
ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).RowHeight - .Height
.Left = ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Left
'<--- con questi comandi unisco le celle al di sotto dell'immagine (2 righe e 12 colonne) _
e inserisco una "didascalia"
With ActiveSheet.Cells(DeltaPassoRighe + PassoRighe, NumCol).Offset(1, 0).Resize(2, 12)
With .Cells(1, 1)
'.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = True
With .Font
.Name = "Calibri"
.Size = 9
.Italic = True
End With
End With
.Merge
.Value = "Immagine " & i & stringaEccezioneNumerica '& ".JPG"
End With
'--->
ContatoreImmaginiPerRiga = ContatoreImmaginiPerRiga + 1
ContatoreImmaginiPerPagina = ContatoreImmaginiPerPagina + 1
End With
If ContatoreImmaginiPerRiga = NumImmaginiPerRiga Then
ContatoreImmaginiPerRiga = 0
NumCol = NumColIniziale
If ContatoreImmaginiPerPagina = NumImmaginiPerPagina Then
ContatoreImmaginiPerPagina = 0
PassoRighe = PassoRighe + DeltaPassoRighe + DeltaRigheCambioPagina
Else
PassoRighe = PassoRighe + DeltaPassoRighe
End If
Else
NumCol = NumCol + PassoCol
End If
'inserimento immagini senza eccezione numerica - end --->
'<--- inserimento immagini con eccezione numerica - start
If stringaEccezioneNumerica = vbNullString Then
Select Case i
Case 3, 7, 10 '<=== inserire i numeri per cui è presente una eccezione numerica
stringaEccezioneNumerica = "A"
NumeroPrimaImmagine = i
NumeroUltimaImmagine = NumeroUltimaImmagine - 1
GoTo EccezioneNumerica '<= rimando "spaghetti code"
End Select
End If
stringaEccezioneNumerica = vbNullString
'inserimento immagini con eccezione numerica - end --->
Next i
End Sub

Sub ImpostaBordiENumerazionePagine()
NumeroPagine = Application.RoundUp(NumeroImmaginiDaCaricare / NumImmaginiPerPagina, 0)
iPassoRigheBordo = 0
With ActiveSheet
For i = 1 To NumeroPagine
If i = 1 Then
iSottrattore = 1
Else
iSottrattore = 0
End If
If i > 1 Then iPassoRigheBordo = iUltimaRigaBordo + 1
iPrimaRigaBordo = PrimaRigaBordo + iPassoRigheBordo
iUltimaRigaBordo = iPrimaRigaBordo + PassoRigheBordo - iSottrattore
'Debug.Print .Range(.Cells(iPrimaRigaBordo, PrimaColonnaBordo), .Cells(iUltimaRigaBordo, UltimaColonnaBordo)).Address
With .Range(.Cells(iPrimaRigaBordo, PrimaColonnaBordo), .Cells(iUltimaRigaBordo, UltimaColonnaBordo))
'<--- inserimento bordi
With .Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
With .Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
With .Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
With .Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlMedium
End With
End With
'formattazione celle per inserimento numerazione pagina, inserimento numero pagina e _
inserimento interruzione di pagina
With .Cells(iUltimaRigaBordo, PrimaColonnaBordo).Offset(1, 4).Resize(2, 9)
.Merge
.Value = "Pagina " & i & "/" & NumeroPagine
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
With .Font
.Name = "Calibri"
.Size = 8
End With
End With
.HPageBreaks.Add Before:=.Cells(iUltimaRigaBordo, PrimaColonnaBordo).Offset(3, 0) 'interruzioni di pagina
Next i
End With
End Sub

Sub CancellaImmagini()
Dim shp As Shape
'<--- n.b. per mia semplicità cancello tutte le celle per ripristinare per ogni nuovo inserimento.
' da valutare nel caso specifico come modificare
With ActiveSheet
.Cells.Clear 'Contents
.ResetAllPageBreaks
End With

'n.b. nel foglio ho un "pulsante modulo" nominato "Pulsante" e ho impostato la condizione di _
cancellare tutte le immagini tranne quella nominata "Pulsante"
For Each shp In ActiveSheet.Shapes
With shp
If .Name <> "Pulsante" Then .Delete
End With
Next shp
End Sub

'----
casanmaner
2017-02-02 00:27:18 UTC
Permalink
Aggiungo però una considerazione.
Perché per le numerazioni di pagina non impostare semplicemente la numerazioni nelle impostazioni di pagina del foglio?
Ettore
2017-02-02 10:13:51 UTC
Permalink
"casanmaner" ha scritto nel messaggio news:70bea211-9bb2-421e-8979-***@googlegroups.com...
If i = 1 Then
iSottrattore = 1
Else
iSottrattore = 0


questo sottrattore a cosa serve? ho provato a toglierlo, il risultato finale
è identico ( salvo che le tre pagine terminano alla riga x+1 anzichè alla
riga x , ma che differenza fa?)
casanmaner
2017-02-02 10:22:16 UTC
Permalink
Post by casanmaner
If i = 1 Then
iSottrattore = 1
Else
iSottrattore = 0
questo sottrattore a cosa serve? ho provato a toglierlo, il risultato finale
è identico ( salvo che le tre pagine terminano alla riga x+1 anzichè alla
riga x , ma che differenza fa?)
lancia il debug.print (che è disattivato) con e senza il sottrattore. Dovresti vedere una differenza negli intervalli.
casanmaner
2017-02-02 10:23:58 UTC
Permalink
Post by casanmaner
If i = 1 Then
iSottrattore = 1
Else
iSottrattore = 0
questo sottrattore a cosa serve? ho provato a toglierlo, il risultato finale
è identico ( salvo che le tre pagine terminano alla riga x+1 anzichè alla
riga x , ma che differenza fa?)
Aggiungo che ho seguito la sequenza come impostata da draleo nel file di esempio dopo aver impostato il mio foglio con gli stessi margini da lui impostati e impostando come carattere generale il Calibri 11.
Loading...