![]() |
|
![]() |
|
Thread Tools | Display Modes |
#1
|
|||
|
|||
![]()
Split from: https://www.msofficeforums.com/word-...-pictures.html
My intention is that if more than one image was selected, one table by image. Also, I have added a line what I like it, but and I would like to remove only the outer edge, is it possible? I would like it to stay like this: Anyway, I would like that if I choose several images, they have space between them. I don't know where I have to put the line of code to create a space between one table and the next. Code: Code:
Sub AddPics() 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 On Error GoTo ErrExit NumCols = 1 'CLng(InputBox("Cuantas columnas por fila?")) RwHght = CentimetersToPoints(8) '(CSng(InputBox("¿Altura maxima de la fila?"))) On Error GoTo 0 'Selecciona e inserta fotos With Application.FileDialog(msoFileDialogFilePicker) .Title = "Seleccion de imagenes y click en Abrir" .Filters.Add "Imagenes", "*.gif; *.jpg; *.jpeg; *.bmp; *.tif; *.png" .FilterIndex = 2 If .Show = -1 Then 'Crea un Estilo de parrafo con 0 espacios antes/despues y alineado al centro. 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 'Agregue una tabla de 2 filas por NumCols-column para colocar las imágenes Set oTbl = Selection.Tables.Add(Range:=Selection.Range, NumRows:=2, NumColumns:=NumCols) With ActiveDocument.PageSetup TblWdth = .PageWidth - .LeftMargin - .RightMargin - .Gutter ColWdth = CentimetersToPoints(15) 'TblWdth / NumCols End With 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:="Fotografía nº" For i = 1 To .SelectedItems.Count Step NumCols r = ((i - 1) / NumCols + 1) * 2 - 1 'Formato de filas Call FormatRows(oTbl, r, RwHght) For c = 1 To NumCols j = j + 1 ActiveDocument.Tables(1).Spacing = 9 'Inserta la foto 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 'Obtener el nombre de la imagen para el pie de foto StrTxt = Split(.SelectedItems(j), "\")(UBound(Split(.SelectedItems(j), "\"))) StrTxt = ": " & Split(StrTxt, ".")(0) 'Inserta el título Caption en la fila debajo de la imagen With oTbl.Cell(r + 1, c).Range .InsertBefore vbCr .Characters.First.InsertCaption _ Label:="Fotografía nº", Title:=StrTxt, _ Position:=wdCaptionPositionBelow, ExcludeLabel:=False .Characters.First = vbNullString .Characters.Last.Previous = vbNullString End With 'Salir cuando hayamos terminado If j = .SelectedItems.Count Then Exit For Next 'Agregue filas adicionales según sea necesario If j < .SelectedItems.Count Then oTbl.Rows.Add oTbl.Rows.Add End If Next ' oTbl.ConvertToText 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 = "Normal" End With End With End Sub Last edited by macropod; 03-05-2022 at 07:06 PM. Reason: Split thread & delete duplicate |
#2
|
||||
|
||||
![]()
The code requires multiple changes for that. Try:
Code:
Sub AddPics() 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 On Error GoTo ErrExit NumCols = 1 'CLng(InputBox("Cuantas columnas por fila?")) RwHght = CentimetersToPoints(8) '(CSng(InputBox("¿Altura maxima de la fila?"))) On Error GoTo 0 'Selecciona e inserta fotos With Application.FileDialog(msoFileDialogFilePicker) .Title = "Seleccion de imagenes y click en Abrir" .Filters.Add "Imagenes", "*.gif; *.jpg; *.jpeg; *.bmp; *.tif; *.png" .FilterIndex = 2 If .Show = -1 Then 'Crea un Estilo de parrafo con 0 espacios antes/despues y alineado al centro. 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 .Styles(wdStyleNormal).ParagraphFormat.SpaceBefore = 0 End With 'Agregue una tabla de 2 filas por NumCols-column para colocar las imágenes Set oTbl = Selection.Tables.Add(Range:=Selection.Range, NumRows:=3, NumColumns:=NumCols) With ActiveDocument.PageSetup TblWdth = .PageWidth - .LeftMargin - .RightMargin - .Gutter ColWdth = CentimetersToPoints(15) 'TblWdth / NumCols End With With oTbl .AutoFitBehavior (wdAutoFitFixed) .TopPadding = 0 .BottomPadding = 0 .LeftPadding = 0 .RightPadding = 0 .Spacing = 0 .Columns.Width = ColWdth .Borders.Enable = True '.Spacing = 9 End With CaptionLabels.Add Name:="Fotografía nº" For i = 1 To .SelectedItems.Count Step NumCols r = ((i - 1) / NumCols + 1) * 3 - 2 'Formato de filas Call FormatRows(oTbl, r, RwHght) For c = 1 To NumCols j = j + 1 'Inserta la foto 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 'Obtener el nombre de la imagen para el pie de foto StrTxt = Split(.SelectedItems(j), "\")(UBound(Split(.SelectedItems(j), "\"))) StrTxt = ": " & Split(StrTxt, ".")(0) 'Inserta el título Caption en la fila debajo de la imagen With oTbl With .Cell(r + 1, c) .Borders(wdBorderLeft).Visible = False .Borders(wdBorderRight).Visible = False End With With .Cell(r + 2, c).Range .InsertBefore vbCr .Characters.First.InsertCaption Label:="Fotografía nº", Title:=StrTxt, _ Position:=wdCaptionPositionBelow, ExcludeLabel:=False .Characters.First = vbNullString .Characters.Last.Previous = vbNullString End With End With 'Salir cuando hayamos terminado If j = .SelectedItems.Count Then Exit For Next 'Agregue filas adicionales según sea necesario If j < .SelectedItems.Count Then oTbl.Rows.Add oTbl.Rows.Add oTbl.Rows.Add End If Next ' oTbl.ConvertToText With oTbl For r = .Rows.Count - 2 To 3 Step -3 .Split .Rows(r) Next End With 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 = wdStyleNormal End With With .Rows(x + 2) .Height = CentimetersToPoints(0.5) .HeightRule = wdRowHeightExactly .Range.Style = wdStyleNormal .Cells.VerticalAlignment = wdCellAlignVerticalCenter End With End With End Sub
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#3
|
|||
|
|||
![]()
WOW, It works perfect. Thanks a lot.
Could you explain to me what these lines of code do? I execute it step by step and still I don't understand it very well: Code:
With oTbl For r = .Rows.Count - 2 To 3 Step -3 .Split .Rows(r) Next End With Code:
For i = 1 To .SelectedItems.Count Step NumCols r = ((i - 1) / NumCols + 1) * 3 - 2 MsgBox r Last edited by gorkac; 03-06-2022 at 12:44 AM. Reason: One more question. |
#4
|
|||
|
|||
![]()
One last question please.
Bold this part of the only: Code:
CaptionLabels.Add Name:="Fotografía nº" For i = 1 To .SelectedItems.Count Step NumCols r = ((i - 1) / NumCols + 1) * 3 - 2 'Formato de filas Call FormatRows(oTbl, r, RwHght) For c = 1 To NumCols j = j + 1 'Inserta la foto 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 'Obtener el nombre de la imagen para el pie de foto StrTxt = Split(.SelectedItems(j), "\")(UBound(Split(.SelectedItems(j), "\"))) StrTxt = ": " & Split(StrTxt, ".")(0) "Fotografía nº 1: xxxxx" "Fotografía nº 2: xxxxx" "Fotografía nº 3: xxxxx" and so |
#5
|
||||
|
||||
![]() Quote:
Code:
.Split .Rows(r) 2. The line: Code:
r = ((i - 1) / NumCols + 1) * 3 - 2 Quote:
Code:
.Characters.Last.Previous = vbNullString Code:
.Collapse wdCollapseStart .MoveEndUntil ":" .End = .End + 1 .Style = wdStyleStrong
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#6
|
|||
|
|||
![]()
It works perfect, THANKS ¡¡¡¡
One last request, how do I make more space where I indicate with the arrow? Screenshot_20220307-120413_Samsung Internet Beta.jpg Last edited by gorkac; 03-07-2022 at 04:41 AM. Reason: One more question. |
#7
|
||||
|
||||
![]()
After:
Code:
.Split .Rows(r) Code:
.Range.Characters.Last.Next.ParagraphFormat.SpaceAfter = 18
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#8
|
|||
|
|||
![]()
Yes, its, certain.
One last thing, since the work is perfect and I don't bother you anymore. Is it possible to change the style of the second row? Captura.PNG |
#9
|
||||
|
||||
![]()
It would have been helpful had you specified all requirements up front.
Replace: Code:
With oTbl For r = .Rows.Count - 2 To 3 Step -3 .Split .Rows(r) .Range.Characters.Last.Next.ParagraphFormat.SpaceAfter = 18 Next End With Code:
With oTbl For r = .Rows.Count To 1 Step -3 With .Rows(.Rows.Count).Borders .OutsideLineStyle = wdLineStyleDouble .OutsideColorIndex = wdGreen End With If .Rows.Count > 3 Then .Split .Rows(r - 2) .Range.Characters.Last.Next.ParagraphFormat.SpaceAfter = 18 Next End With
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#10
|
|||
|
|||
![]()
I don't know how to thank you for your help. Requests are improvements that occur to me.
|
![]() |
Tags |
solved |
|
![]() |
||||
Thread | Thread Starter | Forum | Replies | Last Post |
Stack multiple tables on top of each other in a single table | Remko | Excel | 2 | 04-18-2021 04:18 AM |
![]() |
victorybadges | Word VBA | 4 | 12-25-2020 02:11 PM |
How to compile text from multiple tables into a cell in a nested table | jrooney7 | Word VBA | 2 | 03-11-2019 07:55 AM |
![]() |
JBA479 | Word VBA | 1 | 01-24-2014 08:51 PM |
![]() |
pakistanray | Word Tables | 2 | 10-31-2011 08:07 AM |