Laatste tijd een aantal keren mensen gezien die in Excel werken met een productenlijst met plaatjes. Die plaatjes plakken ze er dan zelf bij. Wat een werk! Met VBA is zoiets simpel te regelen. Plaatjes worden automatisch bij het artikelnummer gezocht en eventueel vernieuwd. Uiteraard moet er wel een map met plaatjes zijn en moeten de namen van de plaatjes gerelateerd zijn aan het artikelnummer.
In het onderstaande voorbeeld heb ik dit uitgewerkt.
Het Excel voorbeeld bestaat uit twee bladen. De eerste heet Plaatjes en bevat de artikelnummers en een knop. Bij een druk op deze knop zoekt het VBA script het juiste plaatje erbij. Wordt dit niet gevonden dan plaatst het een blauwe cirkel met een kruis. De regelhoogte en de grootte van het plaatje worden automatisch ingesteld aan de hand van variabelen uit het tweede blad.
Het tweede blad heet Constanten. Hierin worden een aantal instellingen gedefinieerd:
Het VBA script ziet er als volgt uit:
Sub plaatjestoevoegen()
'definiëren variabelen
Dim shpPlaatje As Shape
Dim intLinks As Integer, intTop As Integer, intBreedte As Integer, intHoogte As Integer
Dim intRows As Integer
Dim rngCel As Range
Dim strPad As String, strExtensie As String
'vullen variabelen
'kunnen ook uit een constantenblad komen
strPad = Worksheets("constanten").Range("b2")
strExtensie = Worksheets("constanten").Range("b3")
intLinks = Worksheets("constanten").Range("b4")
intBreedte = Worksheets("constanten").Range("b5")
intHoogte = Worksheets("constanten").Range("b6")
intTop = Rows("1:1").RowHeight
intRows = ActiveSheet.UsedRange.Rows.Count
'juiste blad activeren
Worksheets("plaatjes").Activate
'rijhoogte instellen voor het gebied met plaatjes
ActiveSheet.Rows("2:" & intRows).RowHeight = 15
ActiveSheet.Rows("2:" & intRows).RowHeight = intHoogte
'wissen aanwezige plaatjes, behalve button; vervangen lukt niet met VBA
For Each shpPlaatje In ActiveSheet.Shapes
If shpPlaatje.Name <> "Button 3" Then
shpPlaatje.Delete
End If
Next
'plaatsen plaatjes
For Each rngCel In ActiveSheet.UsedRange.Columns(1).Cells
If rngCel.Address <> "$A$1" Then
'testen of plaatje bestaat
If Dir(strPad & rngCel.Value & strExtensie) <> "" Then
ActiveSheet.Shapes.AddPicture strPad & rngCel.Value & strExtensie, _
True, True, intLinks, intTop, intBreedte, intHoogte
Else
ActiveSheet.Shapes.AddShape(msoShapeFlowchartSummingJunction, intLinks, _ intTop, intBreedte, intHoogte).Select
End If
intTop = intTop + intHoogte
End If
Next
'A1 selecteren
ActiveSheet.Cells(1, 1).Select
End Sub
In het onderstaande voorbeeld heb ik dit uitgewerkt.
Het Excel voorbeeld bestaat uit twee bladen. De eerste heet Plaatjes en bevat de artikelnummers en een knop. Bij een druk op deze knop zoekt het VBA script het juiste plaatje erbij. Wordt dit niet gevonden dan plaatst het een blauwe cirkel met een kruis. De regelhoogte en de grootte van het plaatje worden automatisch ingesteld aan de hand van variabelen uit het tweede blad.
Het tweede blad heet Constanten. Hierin worden een aantal instellingen gedefinieerd:
Naam | Inhoud |
Pad | D:\walmar domino\images\ |
Extensie | .jpg |
Afstand links | 100 |
Breedte | 70 |
Hoogte | 70 |
Het VBA script ziet er als volgt uit:
Sub plaatjestoevoegen()
'definiëren variabelen
Dim shpPlaatje As Shape
Dim intLinks As Integer, intTop As Integer, intBreedte As Integer, intHoogte As Integer
Dim intRows As Integer
Dim rngCel As Range
Dim strPad As String, strExtensie As String
'vullen variabelen
'kunnen ook uit een constantenblad komen
strPad = Worksheets("constanten").Range("b2")
strExtensie = Worksheets("constanten").Range("b3")
intLinks = Worksheets("constanten").Range("b4")
intBreedte = Worksheets("constanten").Range("b5")
intHoogte = Worksheets("constanten").Range("b6")
intTop = Rows("1:1").RowHeight
intRows = ActiveSheet.UsedRange.Rows.Count
'juiste blad activeren
Worksheets("plaatjes").Activate
'rijhoogte instellen voor het gebied met plaatjes
ActiveSheet.Rows("2:" & intRows).RowHeight = 15
ActiveSheet.Rows("2:" & intRows).RowHeight = intHoogte
'wissen aanwezige plaatjes, behalve button; vervangen lukt niet met VBA
For Each shpPlaatje In ActiveSheet.Shapes
If shpPlaatje.Name <> "Button 3" Then
shpPlaatje.Delete
End If
Next
'plaatsen plaatjes
For Each rngCel In ActiveSheet.UsedRange.Columns(1).Cells
If rngCel.Address <> "$A$1" Then
'testen of plaatje bestaat
If Dir(strPad & rngCel.Value & strExtensie) <> "" Then
ActiveSheet.Shapes.AddPicture strPad & rngCel.Value & strExtensie, _
True, True, intLinks, intTop, intBreedte, intHoogte
Else
ActiveSheet.Shapes.AddShape(msoShapeFlowchartSummingJunction, intLinks, _ intTop, intBreedte, intHoogte).Select
End If
intTop = intTop + intHoogte
End If
Next
'A1 selecteren
ActiveSheet.Cells(1, 1).Select
End Sub
Reacties