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
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 :-)