Belirli bir başlığa göre bir kelime belgesindeki başlıklara göre ağaç benzeri bir hiyerarşi oluşturmak


0

Bazen bir projenin özellikleri, çoğu zaman bir web sitesi hakkında önerilerde bulunmak zorunda kalıyorum. Temelde web sitesinin tüm bölümlerinin ağaç benzeri bir hiyerarşisi olan bir 'anahat' bölümü eklemeyi seviyorum. Bunlar bir başlığa neredeyse bire bir karşılık gelir. Aşağıdaki başlık yapısını bir belgedeki hayal edin.

Project
Revision History
Table of Contents
Project Outline
Project Information
    Homepage
        Interactive Banner
        Various Panels
        Search
        Login
    Common Components
        Current Weather
        Social Networking Icons
        Contact Details
        Live Chat
    Content Pages
        Gallery
        Comments
    Contact Us

In Proje Anahat bölümünde, Ardından, kablosuz sinyal SmartArt> Yatay Hiyerarşi denetimi ve altında temelde hemen hemen aynı içerikle doldurmak Proje Bilgileri başlığı. Nasıl göründüğü hakkında bir fikir edinmek için, görüntülenen ekte verilenlere bakınız.

Yukarıdaki belge yapısıyla ilgili olarak proje taslağının hiyerarşisini gösteren resim.

Dediğim neredeyse görüntüde altında yapmak var gibi ben, buna bazen eklemek çünkü, aynı içeriği Çeşitli Panelleri orada onlar için hiçbir gerçek başlıklar vardır ama anahat gösterilmektedir.

Sorun şu ki, teklif çeşitli yinelemelerden geçerse, esasen başlıklara dayanması koşuluyla bu hiyerarşiyi kendim güncellemek zorunda kalmak bir baş ağrısıdır. Benzer bir şeyin, belgenin kendisinden otomatik olarak üretilebilmesi, Proje Düğümünü ilgili düğüm olarak seçeceğinizi ve çocukları ağaç olarak oluşturulduğunu ve yine de istediğiniz yere özel düğümler eklemenizi sağlayan bir yöntem var mı?


Bir makro muhtemelen bunu başarmanın tek yoludur. Bir Google’a sahip olun ve API ile oynayın.
Adam,

Demek hala buradasın ama pes ettin? Yazık.

Yanıtlar:


0

Aşağıdaki makroyu deneyebilirsiniz. Başlıklarınızın standart Başlık Stilleri'ni kullanan paragraflar olduğunu varsayar (aksi takdirde, AFAICS'e ulaşmak çok daha zor hale gelir). Başlık seviyeleriniz katı bir hiyerarşi değilse, mantıklı bir şey yapmaya çalışacaktır, ancak makroyu gerektiği gibi düzeltmek size kalmıştır.

Belgenizi yedekleyin.

Kullanmak istediğiniz başlık alt ağacını gösteren Başlık metnini aramak için alt "testMakeHierarchy" öğesini değiştirin. Ardından belgede, diyagramı istediğiniz yere tıklayın, ardından makroyu çalıştırın.

Zaten bir şemanız varsa, mevcut şemanın yanına tıklayın, makroyu çalıştırın, daha sonra ihtiyacınız yoksa eski şemayı silin.

Sub testMakeHierarchy()
' change the text "Project Information" as appropriate
' Click where you want the diagram
' then run this sub.
Call makeHierarchy(Selection.Range, _
  "urn:microsoft.com/office/officeart/2005/8/layout/hierarchy2", _
  "Project Information")
End Sub

Sub makeHierarchy(rngLocation As Word.Range, strLayout As String, strTopLevelText As String)
' Inserts a Hierarchy SmartArt diagram
' - at the location specified by rngLocation,
' - using the SmartArtLayout defined by strLayout
' - taking text from all the Heading n paragraph styles
'    from the Heading paragraph with text strTopLevelText
'    to the next Heading paragraph with the same level
'    or the end of document
'    strMatchHeadingStyle is a string used to match styles - see testMakeHierarchy for an example.

' Currently makes a number of kludgy assumptions, the main one being that
' if (say) the starting point is a Heading 2 paragraph, the next para will be Heading 3
Const theFontName As String = "Arial"
Const thePlaceholderText As String = "[Placeholder]"
Dim bContinue As Boolean
Dim bDiagramCreated As Boolean
Dim intLevel As Integer
Dim intBoxCount As Integer
Dim intCurrentLevel As Integer
Dim intPreviousLevel As Integer
Dim intStartingLevel As Integer
Dim intHWMLevel As Integer
Dim lngPreviousStart As Long
Dim objDocument As Word.Document
Dim rng As Word.Range
Dim san As Office.SmartArtNode
Dim sanl(9) As Office.SmartArtNode
Dim shp As Word.InlineShape

bContinue = True
' set the range to the first paragraph in the containing Document
Set objDocument = rngLocation.Parent
Set rng = objDocument.Content.GoTo(wdGoToHeading, wdGoToFirst)
If headingLevel(rng) = 10 Then
  bContinue = False
Else
  bContinue = True
  lngPreviousStart = rng.Start
  While bContinue And (rng.Paragraphs(1).Range.Text <> (strTopLevelText & vbCr))
    Set rng = rng.GoToNext(wdGoToHeading)
    bContinue = (rng.Start <> lngPreviousStart)
    lngPreviousStart = rng.Start
  Wend
End If

If Not bContinue Then
  MsgBox "Could not find a Heading paragraph containing just the text """ & strTopLevelText & """", vbOKOnly
Else
  intStartingLevel = headingLevel(rng)
  intPreviousLevel = intStartingLevel
  bDiagramCreated = False
  Set rng = rng.GoToNext(wdGoToHeading)
  intCurrentLevel = headingLevel(rng)
  While (rng.Start > lngPreviousStart) And (intCurrentLevel > intStartingLevel)
    ' we have got one Heading with a lower level
    ' so start creating our hierarchy diagram
    If Not bDiagramCreated Then
      ' Create and empty the shape
      Set shp = rngLocation.InlineShapes.AddSmartArt(Application.SmartArtLayouts(strLayout), rngLocation)
      With shp.SmartArt
        For i = .AllNodes.Count To 1 Step -1
          .AllNodes(i).Delete
        Next
      End With
      Set sanl(intCurrentLevel) = shp.SmartArt.Nodes.Add
      intHWMLevel = intCurrentLevel
      bDiagramCreated = True
    Else
      If intCurrentLevel = intPreviousLevel Then
        Set sanl(intCurrentLevel) = sanl(intCurrentLevel).AddNode(msoSmartArtNodeAfter)
      Else
        If intCurrentLevel > intPreviousLevel Then
          For intLevel = intPreviousLevel + 1 To intCurrentLevel
            If Not (sanl(intLevel) Is Nothing) Then
              Set sanl(intLevel) = Nothing
            End If
            Set sanl(intLevel) = sanl(intLevel - 1).AddNode(msoSmartArtNodeBelow)
            If intLevel < intCurrentLevel Then
              With sanl(intLevel).TextFrame2.TextRange
                .Text = thePlaceholderText
                .Font.Name = theFontName
              End With
            End If
          Next
        Else ' higher level than previous
          If sanl(intCurrentLevel) Is Nothing Then
            Set sanl(intCurrentLevel) = sanl(intHWMLevel).AddNode(msoSmartArtNodeAfter)
          Else
            Set sanl(intCurrentLevel) = sanl(intCurrentLevel).AddNode(msoSmartArtNodeAfter)
          End If
        End If
      End If
    End If
    With sanl(intCurrentLevel).TextFrame2
      With .TextRange
         .Text = Left(rng.Paragraphs(1).Range.Text, Len(rng.Paragraphs(1).Range.Text) - 1)
         .Font.Name = "Arial"
      End With
    End With
    lngPreviousStart = rng.Start
    intPreviousLevel = intCurrentLevel
    Set rng = rng.GoToNext(wdGoToHeading)
    intCurrentLevel = headingLevel(rng)
  Wend
  If bDiagramCreated Then
    For intLevel = 1 To 9
      Set sanl(intLevel) = Nothing
    Next
    Set shp = Nothing
  Else
    MsgBox "No suitable headings found.", vbOKOnly
  End If
End If
skip:
Set rng = Nothing
Set objDocument = Nothing
End Sub


Function headingLevel(rng As Word.Range) As Integer
' looks at the first paragraph in Range rng
' returns 1 - 9 for heading styles 1 to 9, 10 for any other style
Dim d As Word.Document
Dim s As Word.Style
' AFAIK we have to assign a Style object, otherwise we
' just get a variant
With rng
  Set d = rng.Parent
  Set s = .Paragraphs(1).Style
  Select Case s.NameLocal
    Case d.Styles(Word.WdBuiltinStyle.wdStyleHeading1).NameLocal, _
            d.Styles(Word.WdBuiltinStyle.wdStyleHeading2).NameLocal, _
            d.Styles(Word.WdBuiltinStyle.wdStyleHeading3).NameLocal, _
            d.Styles(Word.WdBuiltinStyle.wdStyleHeading4).NameLocal, _
            d.Styles(Word.WdBuiltinStyle.wdStyleHeading5).NameLocal, _
            d.Styles(Word.WdBuiltinStyle.wdStyleHeading6).NameLocal, _
            d.Styles(Word.WdBuiltinStyle.wdStyleHeading7).NameLocal, _
            d.Styles(Word.WdBuiltinStyle.wdStyleHeading8).NameLocal, _
            d.Styles(Word.WdBuiltinStyle.wdStyleHeading9).NameLocal
        headingLevel = s.ListLevelNumber
      Case Else
        headingLevel = 10
  End Select
  Set s = Nothing
  Set d = Nothing
End With
End Function

Word’de hiç makro kullanmadım. Nasıl yaratılacağını açıklayabilir misin? Word 2010 kullanıyorum.
Karl Cassar

Alışmanız gerekir ancak kabaca: (1) Geliştirici Sekmesi etkinleştirilmemişse, ikinci sütundaki ilgili girişi Dosya-> Seçenekler-> Şeridi Özelleştir'de kontrol ederek etkinleştirin. (2) Şeritte, Geliştirici sekmesini ve ardından Visual Basic düğmesini tıklayın. (3) Proje penceresinde Normal'i seçin ve Ekle> Modül'ü tıklayın. (4) kodu mesajımdan kopyalayın ve yeni oluşturulan Modül penceresine yapıştırın. (5) Verdiğim talimatları uyguladıktan sonra testMakeHierarchy alt kısmında bir yere tıklayın ve F5 tuşuna basın (veya VB Düzenleyicideki standart araç çubuğunda "Alt Çalıştır" ok simgesini tıklayın).

Tamam, çalıştırmayı başardı ancak "Başlık paragrafı bulunamadı ..." iletisini gösteriyor. "Başlıklarınızın standart Başlık Stillerini kullanan paragraflar olduğunu varsayar" derken ne demek istiyorsunuz? Stiller> 1-9. Başlıkları kullanarak başlıklar oluşturdum. Bu tamam mı?
Karl Cassar

İyi olmalı. Örnek olarak verdiğiniz taslaktan yola çıkarak, "Proje Bilgileri" metniyle bir Başlık 1 stiline sahip olacağınız, ardından "Ana Sayfa", "Ortak Bileşenler" başlık 2, "Etkileşimli Başlık" başlık 3 olacaktı. , vb. Standart yerleşik Stilleri kullanmanız gerekir ve her şey olduğu gibi, makro tam metni arar, bu nedenle ek boşluklar, tam olarak aynı büyük harf kullanımı vb. hiyerarşiyi tespit ederken, kodda muhtemelen bir hata var ve daha ileri bir göz atacağım.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.