![]() |
|
|
|
#1
|
|||
|
|||
|
Hello,
I'm looking for a way to insert multiple pictures into a two column table that sets each photos width to a specified size and locks the aspect ratio for the height allowing one picture per row and adding rows as needed. I then need to insert the information about the gps location of the picture into the second column for each picture. I have this information in the file detail area of each photo when I go into properties. I have found an amazing macro on here that works well for inserting the photos into a table below. I'm completely new to macros and not sure how to change captioning the picture so that it includes the gps data instead and how to put this information in the column next to the picture instead of the row below. Any help or suggestions would be immensely appreciated. Code:
Sub AddPicsWithCaption() 'Sourced from: https://www.msofficeforums.com/drawi...-document.html Application.ScreenUpdating = False Dim Stl As Style, i As Long, j As Long, c As Long, r As Long, NumCols As Long, iShp As InlineShape Dim oTbl As Table, TblWdth As Single, StrTxt As String, RwHght As Single, ColWdth As Single With ActiveDocument.PageSetup TblWdth = .PageWidth - .LeftMargin - .RightMargin - .Gutter End With On Error GoTo ErrExit NumCols = CLng(InputBox("How Many Columns per Row?")) ColWdth = PointsToCentimeters(TblWdth / NumCols) ColWdth = CentimetersToPoints(CSng(InputBox("What max width for the pictures, in Centimeters (e.g. " & Format(ColWdth, "0.00") & ")?"))) RwHght = CentimetersToPoints(CSng(InputBox("What max height for the pictures, in Centimeters (e.g. 5)?"))) On Error GoTo 0 'Select and insert the Pics With Application.FileDialog(msoFileDialogFilePicker) .Title = "Select image files and click OK" .Filters.Add "Images", "*.gif; *.jpg; *.jpeg; *.bmp; *.tif; *.png" .FilterIndex = 2 If .Show = -1 Then 'Create a paragraph Style with 0 space before/after & centre-aligned With ActiveDocument On Error Resume Next Set Stl = .Styles("TblPic") If Stl Is Nothing Then Set Stl = .Styles.Add(Name:="TblPic", Type:=wdStyleTypeParagraph) On Error GoTo 0 With .Styles("TblPic").ParagraphFormat .Alignment = wdAlignParagraphCenter .KeepWithNext = True .SpaceAfter = 0 .SpaceBefore = 0 End With End With 'Add a 2-row by NumCols-column table to take the images Set oTbl = Selection.Tables.Add(Range:=Selection.Range, NumRows:=2, NumColumns:=NumCols) With oTbl .AutoFitBehavior (wdAutoFitFixed) .TopPadding = 0 .BottomPadding = 0 .LeftPadding = 0 .RightPadding = 0 .Spacing = 0 .Columns.Width = ColWdth .Borders.Enable = True End With CaptionLabels.Add Name:="Picture" For i = 1 To .SelectedItems.Count Step NumCols r = oTbl.Rows.Count - 1 'Format the rows Call FormatRows(oTbl, r, RwHght) For c = 1 To NumCols j = j + 1 'Insert the Picture Set iShp = ActiveDocument.InlineShapes.AddPicture( _ FileName:=.SelectedItems(j), LinkToFile:=False, _ SaveWithDocument:=True, Range:=oTbl.Cell(r, c).Range) With iShp .LockAspectRatio = True If (.Width < ColWdth) And (.Height < RwHght) Then .Width = ColWdth If .Height > RwHght Then .Height = RwHght End If End With 'Get the Image name for the Caption StrTxt = Split(.SelectedItems(j), "")(UBound(Split(.SelectedItems(j), ""))) StrTxt = ": " & Split(StrTxt, ".")(0) 'Insert the Caption on the row below the picture With oTbl.Cell(r + 1, c).Range .InsertBefore vbCr .Characters.First.InsertCaption _ Label:="Picture", Title:=StrTxt, _ Position:=wdCaptionPositionBelow, ExcludeLabel:=False .Characters.First = vbNullString .Characters.Last.Previous = vbNullString End With 'Exit when we're done If j = .SelectedItems.Count Then Exit For Next 'Add extra rows as needed If j < .SelectedItems.Count Then oTbl.Rows.Add oTbl.Rows.Add End If Next Else End If End With ErrExit: Application.ScreenUpdating = True End Sub Sub FormatRows(oTbl As Table, x As Long, Hght As Single) With oTbl With .Rows(x) .Height = Hght .HeightRule = wdRowHeightExactly .Range.Style = "TblPic" .Cells.VerticalAlignment = wdCellAlignVerticalCenter End With With .Rows(x + 1) .Height = CentimetersToPoints(0.5) .HeightRule = wdRowHeightExactly .Range.Style = "Caption" End With End With End Sub Last edited by macropod; 11-10-2024 at 12:52 PM. Reason: Added code tags |
|
#2
|
|||
|
|||
|
You will need to add the reference indicated:
Code:
Option Explicit
Sub AddPicsWithGPSCoordinates()
Dim oStyle As Style, lngIndex As Long, oShp As InlineShape
Dim oTbl As Table, sngTblWidth As Single, strGPS As String, sngRowHght As Single, sngColWdth As Single
Application.ScreenUpdating = False
With ActiveDocument.PageSetup
sngTblWidth = .PageWidth - .LeftMargin - .RightMargin - .Gutter
End With
sngColWdth = 340
sngRowHght = 140
With Application.FileDialog(msoFileDialogFilePicker)
.Title = "Select image files and click OK"
.Filters.Add "Images", "*.gif; *.jpg; *.jpeg; *.bmp; *.tif; *.png"
.FilterIndex = 2
If .Show = -1 Then
With ActiveDocument
On Error Resume Next
Set oStyle = .Styles("TblPic")
If oStyle Is Nothing Then Set oStyle = .Styles.Add(Name:="TblPic", Type:=wdStyleTypeParagraph)
On Error GoTo 0
With oStyle.ParagraphFormat
.Alignment = wdAlignParagraphCenter
.KeepWithNext = True
.SpaceAfter = 0
.SpaceBefore = 0
End With
End With
Set oTbl = Selection.Tables.Add(Range:=Selection.Range, NumRows:=1, NumColumns:=2)
With oTbl
.AutoFitBehavior (wdAutoFitFixed)
.TopPadding = 0
.BottomPadding = 0
.LeftPadding = 0
.RightPadding = 0
.Spacing = 0
.Columns(1).Width = sngColWdth
.Columns(2).Width = sngTblWidth - sngColWdth
.Borders.Enable = True
With .Rows(1)
.Height = sngRowHght
.HeightRule = wdRowHeightExactly
.Range.Style = "TblPic"
.Cells.VerticalAlignment = wdCellAlignVerticalCenter
End With
End With
For lngIndex = 1 To .SelectedItems.Count
'Insert the Picture
Set oShp = ActiveDocument.InlineShapes.AddPicture( _
FileName:=.SelectedItems(lngIndex), LinkToFile:=False, _
SaveWithDocument:=True, Range:=oTbl.Cell(lngIndex, 1).Range)
With oShp
.LockAspectRatio = True
If (.Width < sngColWdth) And (.Height < sngRowHght) Then
.Width = sngColWdth
If .Height > sngRowHght Then .Height = sngRowHght
End If
End With
'Get the Image name for the Caption
strGPS = fcnGetGPSInfo(.SelectedItems(lngIndex))
oTbl.Cell(lngIndex, 2).Range.Text = "Location" & vbCr & strGPS
oTbl.Rows.Add
Next lngIndex
oTbl.Rows.Last.Delete
End If
End With
ErrExit:
Application.ScreenUpdating = True
End Sub
Function fcnGetGPSInfo(strPath) As String
'You will need to stet a reeference to Microsoft Shell Controls and Automation
Dim objShell As New Shell
Dim oFSO As Object, oFile As Object, oFolder As Object
Dim varLat, varLng, strLat, strLong
Dim strFolder As String, strFile As String
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFile = oFSO.GetFile(strPath)
strFile = oFile.Name
strFolder = oFile.ParentFolder.Path
Select Case oFile.Type
Case "JPEG File", "PNG File", "GIF File", "JPG File", "BMP File"
Set oFolder = objShell.Namespace(strFolder)
Set oFile = oFolder.ParseName(strFile)
varLat = oFile.ExtendedProperty("{8727CFFF-4868-4EC6-AD5B-81B98521D1AB}100")
varLng = oFile.ExtendedProperty("{C4C4DBB2-B593-466B-BBDA-D03D27D5E43A}100")
If Not IsEmpty(varLat) Then
strLat = varLat(0) & Chr(176) & varLat(1) & "'" & Format(varLat(2), "0.00") & """"
Else
strLat = 0
End If
If Not IsEmpty(varLng) Then
strLong = varLng(0) & Chr(176) & varLng(1) & "'" & Format(varLng(2), "0.00") & """"
Else
strLong = 0
End If
fcnGetGPSInfo = "Lat: " & strLat & vbCr & "Long: " & strLong
Set oFile = Nothing
Set oFolder = Nothing
End Select
lbl_Exit:
Exit Function
End Function
|
|
#3
|
|||
|
|||
|
Note: In the function fcnGetGPSInfo,
varLat and varLng return arrays with 1) Degrees, 2) Minutes and 3) Seconds and fractional seconds. You may need or want to change the format returned. |
|
#4
|
||||
|
||||
|
See: https://www.msofficeforums.com/word-...ordinates.html
The code there assumes that the file list is in an Excel workbook, but the code in red can easily be added to the generic code in: https://www.msofficeforums.com/drawi...-document.html
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
|
#5
|
|||
|
|||
|
Belinda,
Paul has provided a less complicated method of extracting the GPS data. I have tried to tailor his code more to your specific requirements: Code:
Option Explicit
Sub AddPicsWithGPSCoordinates()
Dim lngIndex As Long, oShp As InlineShape
Dim oTbl As Table, sngTblWidth As Single, strGPS As String, sngRowHght As Single, sngColWdth As Single
Application.ScreenUpdating = False
With ActiveDocument.PageSetup
sngTblWidth = .PageWidth - .LeftMargin - .RightMargin - .Gutter
End With
'These are fixed values in points. Suited for landscape oriented photos. Modify here or use the original input box method.
sngColWdth = 320
sngRowHght = 200
With Application.FileDialog(msoFileDialogFilePicker)
.Title = "Select image files and click OK"
.Filters.Add "Images", "*.gif; *.jpg; *.jpeg; *.bmp; *.tif; *.png"
.FilterIndex = 2
If .Show = -1 Then
Set oTbl = Selection.Tables.Add(Range:=Selection.Range, NumRows:=1, NumColumns:=2)
With oTbl
.AutoFitBehavior wdAutoFitFixed
.TopPadding = 2
.BottomPadding = 2
.LeftPadding = 0
.RightPadding = 0
.Spacing = 0
.Columns(2).Width = sngTblWidth - sngColWdth
.Columns(1).Width = sngColWdth
.Borders.Enable = True
With .Rows(1)
.Cells(2).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter
.Height = sngRowHght
.HeightRule = wdRowHeightExactly
.Cells.VerticalAlignment = wdCellAlignVerticalCenter
End With
End With
For lngIndex = 1 To .SelectedItems.Count
'Insert the Picture
Set oShp = ActiveDocument.InlineShapes.AddPicture( _
FileName:=.SelectedItems(lngIndex), LinkToFile:=False, _
SaveWithDocument:=True, Range:=oTbl.Cell(lngIndex, 1).Range)
With oShp
.LockAspectRatio = True
If (.Width < sngColWdth) And (.Height < sngRowHght) Then
.Width = sngColWdth
If .Height > sngRowHght Then .Height = sngRowHght
End If
End With
'Get the GPS data
strGPS = fcnGetGPSInfo(.SelectedItems(lngIndex))
oTbl.Cell(lngIndex, 2).Range.Text = "Location" & vbCr & strGPS
oTbl.Rows.Add
Next lngIndex
oTbl.Rows.Last.Delete
End If
End With
ErrExit:
Application.ScreenUpdating = True
End Sub
Function fcnGetGPSInfo(strPath) As String
'You will need to set a reeference to Microsoft Windows Image Acquisition library
Dim WIAFile As Object, WIAProp As Object
Dim strLat As String, NS As String, strLong As String, EW As String
fcnGetGPSInfo = "Not" & vbCr & "Defined"
strLat = "": NS = "": strLong = "": EW = ""
Set WIAFile = CreateObject("WIA.ImageFile")
WIAFile.LoadFile strPath
With WIAFile
If .Properties.Exists("GpsLongitudeRef") Then NS = .Properties("GpsLongitudeRef").Value
If .Properties.Exists("GpsLongitude") Then
With .Properties("GpsLongitude")
'Seconds rounded to four decimal places
strLong = NS & .Value(1) & Chr(186) & .Value(2) & Chr(39) & Format(.Value(3), "0.0000") & Chr(34)
'strLong = NS & .Value(1) + .Value(2) / 60 + .Value(3) / 3600
End With
End If
If .Properties.Exists("GpsLatitudeRef") Then EW = .Properties("GpsLatitudeRef").Value
If .Properties.Exists("GpsLatitude") Then
With .Properties("GpsLatitude")
'Seconds rounded to four decimal places
strLat = EW & .Value(1) & Chr(186) & .Value(2) & Chr(39) & Format(.Value(3), "0.0000") & Chr(34)
'StrLat = EW & .Value(1) + .Value(2) / 60 + .Value(3) / 3600
End With
End If
End With
If strLat <> vbNullString Then fcnGetGPSInfo = strLat & vbCr & strLong
Set WIAFile = Nothing
lbl_Exit:
Exit Function
End Function
|
|
| Thread Tools | |
| Display Modes | |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
Photo and Caption insert macro adjustments
|
mathemagician44 | Word VBA | 2 | 10-13-2024 08:58 AM |
| Insert photo reference inside callout | brownees | Word VBA | 1 | 05-12-2024 04:36 PM |
How to make a transparent calendar outline, and insert it on top of a photo.
|
TheSkiBoy | PowerPoint | 3 | 12-08-2014 12:33 PM |
insert photo on top of movie
|
wabash12 | PowerPoint | 2 | 06-14-2013 06:32 AM |
power point 2011 is there anyway to create a photo albumn(s) and insert the album bet
|
Jrmatm26538 | PowerPoint | 6 | 02-14-2012 09:00 AM |