View Single Post
 
Old 09-28-2025, 08:13 PM
macropod's Avatar
macropod macropod is offline Windows 10 Office 2016
Administrator
 
Join Date: Dec 2010
Location: Canberra, Australia
Posts: 22,467
macropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond repute
Default

Try the code below. I've tidied up your code somewhat, reducing it to just 84 lines instead of close to 200, plus it's now way more efficient.

Some points to note:
1. Your hard-coded LatestSongbook has been replaced by a FilePicker dialog
2. Nothing gets selected or copied & pasted and no window switching is done and you'll see no window flickering, etc.
3. I wasn't sure where you want the musical key to go, so I've output it to an assumed column 4 of the table. You might want to change that.

Code:
Sub Demo()
Application.ScreenUpdating = False
Dim GigNum As String, GigName As String, GigDate As String, GigLoc As String, GigPost As String, GigTime As String, GigFile As String
Dim DocSrc As Document, DocRef As Document, DocTgt As Document, Rng As Range, r As Long, p As Long, Fld As Field, StrKey as String
With Application.FileDialog(FileDialogType:=msoFileDialogFilePicker)
  .Title = "Select the Song Book": .AllowMultiSelect = False
  .Filters.Clear: .Filters.Add "Documents", "*.doc; *.docx; *.docm", 1
  .InitialFileName = "D:\Documents\MJH-20\MJH-Music\LotSU\LotSU Songbooks\"
  If .Show = -1 Then
    Set DocRef = Documents.Open(.SelectedItems(1), ReadOnly:=True, Visible:=False, AddToRecentFiles:=False)
  Else
    MsgBox "No Song Book selected. Exiting", vbExclamation: Exit Sub
  End If
End With
Set DocSrc = Documents.Open(FileName:="C:\Users\" & Environ("Username") & "\Desktop\SetListCreator.docx", ReadOnly:=True, Visible:=False, AddToRecentFiles:=False)
Set DocTgt = Documents.Add
With DocSrc
  With .Tables(1)
    GigNum = Split(.Cell(1, 1).Range.Text, vbCr)(0)
    GigName = Split(.Cell(1, 2).Range.Text, vbCr)(0)
    GigDate = Split(.Cell(1, 3).Range.Text, vbCr)(0)
    GigPost = Split(.Cell(2, 1).Range.Text, vbCr)(0)
    GigLoc = Split(.Cell(2, 2).Range.Text, vbCr)(0)
    GigTime = Split(.Cell(2, 3).Range.Text, vbCr)(0)
    GigFile = Mid(GigDate, 4) & Mid(GigDate, 4, 2) & Left(GigDate, 2) & GigName & " Songs"
  End With
  With DocTgt
    With .PageSetup
      .Orientation = wdOrientPortrait
      .TopMargin = CentimetersToPoints(0.5)
      .BottomMargin = CentimetersToPoints(0.5)
      .LeftMargin = CentimetersToPoints(1)
      .RightMargin = CentimetersToPoints(0.5)
      .Gutter = CentimetersToPoints(0)
      .HeaderDistance = CentimetersToPoints(0.5)
      .FooterDistance = CentimetersToPoints(0.5)
      .PageWidth = CentimetersToPoints(21)
      .PageHeight = CentimetersToPoints(29.7)
      .FirstPageTray = wdPrinterDefaultBin
      .OtherPagesTray = wdPrinterDefaultBin
      .SectionStart = wdSectionNewPage
      .VerticalAlignment = wdAlignVerticalTop
      .BookFoldPrintingSheets = 1
      .GutterPos = wdGutterPosLeft
    End With
    With .Range
      .ParagraphFormat.Alignment = wdAlignParagraphCenter
      .Text = vbCr & vbCr & vbCr & GigNum
      .Paragraphs.Last.Range.Font.Size = 24
      .InsertAfter vbCr & vbCr & GigName & vbCr & vbCr & GigLoc & vbCr & vbCr & GigPost & vbCr & vbCr & GigDate & vbCr & vbCr & GigTime & Chr(12)
      .Paragraphs(7).Range.Font.Size = 36
    End With
  End With
  With .Tables(1)
    For r = 3 To .Rows.Count
      If Len(.Cell(r, 1).Range.Text) = 2 then Exit For
      p = Split(.Cell(r, 1).Range.Text, vbCr)(0) + 6: StrKey = ""
      Set Rng = DocRef.GoTo(What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=p).GoTo(What:=wdGoToBookmark, Name:="\page")
      DocTgt.Range.Characters.Last.FormattedText = Rng.FormattedText
      .Cell(r, 1).Range.Text = r - 2: .Cell(r, 3).Range.Text = Split(Rng.Paragraphs.First.Range.Text, vbCr)(0)
      With Rng
        With .Find
          .ClearFormatting
          .Replacement.ClearFormatting
          .Font.Color = RGB(255, 0, 0)
          .Execute FindText:="\[[A-G]*\]", MatchWildcards:=True, Wrap:=wdFindStop, Forward:=True, Format:=True, ReplaceWith:=""
        End With
        If .Find.Found = True Then StrKey = .Text
      End With
      .Cell(r, 4).Range.Text = StrKey
    Next
  End With
  With DocTgt
    For Each Fld In .Fields
      If Fld.Type = wdFieldTOCEntry Then
        Fld.Code.Paragraphs(1).Range.Text = vbNullString
      End If
    Next
    .SaveAs2 FileName:="D:\Documents\MJH-20\MJH-Music\LotSU\Gig Sheets\" & GigFile & ".docx", FileFormat:=wdFormatXMLDocument, AddToRecentFiles:=False
    .SaveAs2 FileName:="D:\Documents\MJH-20\MJH-Music\LotSU\Gig Sheets\" & GigFile & ".pdf", FileFormat:=wdFormatPDF, AddToRecentFiles:=False
    .Close False
  End With
  .SaveAs2 FileName:="D:\Documents\MJH-20\MJH-Music\LotSU\Gig Sheets\" & GigFile & "Set.pdf", FileFormat:=wdFormatPDF, AddToRecentFiles:=False
  .Close False
End With
DocRef.Close False: Set Rng = Nothing: Set DocSrc = Nothing: Set DocRef = Nothing: Set DocTgt = Nothing
Application.ScreenUpdating = True
End Sub
PS: I really don't support the brute-force approach to formatting you've taken. It would be far better to design a suitable template for your GigFiles, with Styles that generate the appropriate fonts & paragraph spacing.
__________________
Cheers,
Paul Edstein
[Fmr MS MVP - Word]
Reply With Quote