Πώς θα βάλω πολλαπλές εικόνες μέσα σε excel με zoom
1. File -> Options -> Advanced -> Do not compress images in file
2. Φτιάχνεις ένα ALT + F11 -> Module
Option Explicit
' Ρυθμίσεις thumbnails
Private Const START_COL As String = "G"
Private Const TH_W As Single = 32
Private Const TH_H As Single = 32
Private Const GAP As Single = 6
' Ρυθμίσεις zoom overlay
Private Const MAX_ZOOM_W As Single = 900 'μέγιστο πλάτος zoom (px)
Private Const MAX_ZOOM_H As Single = 650 'μέγιστο ύψος zoom (px)
Private Const DIM_OPACITY As Single = 0.25 'σκοτείνιασμα φόντου
'================= ΕΙΣΑΓΩΓΗ ΕΙΚΟΝΩΝ ΣΤΗ ΓΡΑΜΜΗ =================
Public Sub InsertThumbsForActiveRow()
Dim ws As Worksheet: Set ws = ActiveSheet
Dim r As Long: r = ActiveCell.Row
Dim c0 As Long: c0 = ws.Range(START_COL & "1").Column
Dim cellStart As Range: Set cellStart = ws.Cells(r, c0)
Dim fd As FileDialog, i As Long
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
.AllowMultiSelect = True
.Title = "Διάλεξε εικόνες για τη γραμμή " & r
.Filters.Clear
.Filters.Add "Εικόνες", "*.png;*.jpg;*.jpeg;*.bmp;*.gif"
If .Show <> -1 Then Exit Sub
End With
Dim leftPos As Double, topPos As Double
leftPos = cellStart.Left
topPos = cellStart.Top + (cellStart.Height - TH_H) / 2
Application.ScreenUpdating = False
For i = 1 To fd.SelectedItems.Count
Dim shp As Shape
Set shp = ws.Shapes.AddPicture( _
Filename:=fd.SelectedItems(i), LinkToFile:=msoFalse, SaveWithDocument:=msoTrue, _
Left:=leftPos, Top:=topPos, Width:=TH_W, Height:=TH_H)
shp.Name = "Thumb_r" & r & "_" & i
shp.Placement = xlMoveAndSize
shp.OnAction = "ThumbZoomOverlay" 'κλικ = zoom overlay
leftPos = leftPos + TH_W + GAP
Next i
Application.ScreenUpdating = True
End Sub
'================= ΔΕΣΙΜΟ ΜΑΚΡΟ ΣΕ ΥΠΑΡΧΟΝΤΑ THUMBNAILS =================
Public Sub WireUpThumbnails()
Dim shp As Shape
For Each shp In ActiveSheet.Shapes
If shp.Type = msoPicture Then shp.OnAction = "ThumbZoomOverlay"
Next shp
MsgBox "Ορίστηκαν όλα τα thumbnails να κάνουν zoom με κλικ.", vbInformation
End Sub
'================= ΖΟΟΜ ΜΕ ΕΠΙΚΑΛΥΨΗ (ΧΩΡΙΣ ΑΡΧΕΙΑ) =================
Public Sub ThumbZoomOverlay()
Dim ws As Worksheet: Set ws = ActiveSheet
If Len(Application.Caller) = 0 Then Exit Sub
Dim thumb As Shape: Set thumb = ws.Shapes(Application.Caller)
'Αν υπάρχει ήδη overlay, κλείστο πρώτα
CloseZoomOverlay ws
Application.ScreenUpdating = False
'1) Σκοτείνιασμα φόντου
Dim dimmer As Shape
Set dimmer = ws.Shapes.AddShape(msoShapeRectangle, _
Left:=ActiveWindow.VisibleRange.Left, _
Top:=ActiveWindow.VisibleRange.Top, _
Width:=ActiveWindow.VisibleRange.Width, _
Height:=ActiveWindow.VisibleRange.Height)
With dimmer
.Name = "ZoomDim"
.Fill.ForeColor.RGB = RGB(0, 0, 0)
.Fill.Transparency = 1 - DIM_OPACITY
.Line.Visible = msoFalse
.OnAction = "CloseZoomOverlay"
End With
'2) Αντίγραφο της εικόνας – στο αρχικό της μέγεθος για καθαρότητα
Dim big As Shape
Set big = thumb.Duplicate
big.Name = "ZoomPic"
big.OnAction = "CloseZoomOverlay"
big.LockAspectRatio = msoTrue
' Επανέφερε το αντίγραφο στο embedded original size
On Error Resume Next
big.ScaleHeight 1, msoTrue
big.ScaleWidth 1, msoTrue
On Error GoTo 0
' Τώρα μεγάλωσε με σωστό aspect ratio μέχρι να φτάσει τα όρια
Dim fW As Double, fH As Double, f As Double
fW = MAX_ZOOM_W / big.Width
fH = MAX_ZOOM_H / big.Height
f = Application.WorksheetFunction.Min(fW, fH)
big.Width = big.Width * f 'το ύψος προσαρμόζεται λόγω LockAspectRatio
'3) Κεντράρισμα στο ορατό παράθυρο
Dim vr As Range: Set vr = ActiveWindow.VisibleRange
big.Left = vr.Left + (vr.Width - big.Width) / 2
big.Top = vr.Top + (vr.Height - big.Height) / 2
big.ZOrder msoBringToFront
Application.ScreenUpdating = True
End Sub
'Κλείσιμο overlay (καλείται με κλικ στο dimmer ή στην εικόνα)
Public Sub CloseZoomOverlay(Optional ByVal dummy As Variant)
Dim ws As Worksheet: Set ws = ActiveSheet
On Error Resume Next
ws.Shapes("ZoomPic").Delete
ws.Shapes("ZoomDim").Delete
On Error GoTo 0
End Sub