#1
|
|||
|
|||
How to get respective/relative Line Number of a Paragraph ?
Hi
Anyone who could help in differentatiate between Relative line number and Absolute Linenumber. Seems a mistake at the when running the following code from VBA Express : Word - Get Line and Paragraph Number If one observes the Relative and Absolute line number which displays the same when macro is executed. If absolute line number is the Exact position of the actual line number of the document where the cursor is on current line position then why relative line number is same as absolute. Should not relative line number be like for eg. Line 2 of Paragraph 3. Ideally i would prefer to get Paragraph Number and Respective Line no of that Paragraph ir if iam on Paragrpah 3 then if the cursor is on line2 of Paragraph Then it should Display Paragraph 3 Absolute/Relative Line Number 2. Although Absolute/Relative Line Number 10 is displayed with following result with below code i get the following result Quote:
Quote:
Code:
Option Explicit Sub WhereAmI() MsgBox "Paragraph number: " & GetParNum(Selection.Range) & vbCrLf & _ "Absolute line number: " & GetAbsoluteLineNum(Selection.Range) & vbCrLf & _ "Relative line number: " & GetLineNum(Selection.Range) End Sub Function GetParNum(r As Range) As Integer Dim rParagraphs As Range Dim CurPos As Long r.Select CurPos = ActiveDocument.Bookmarks("\startOfSel").Start Set rParagraphs = ActiveDocument.Range(Start:=0, End:=CurPos) GetParNum = rParagraphs.Paragraphs.Count End Function Function GetLineNum(r As Range) As Integer 'relative to current page GetLineNum = r.Information(wdFirstCharacterLineNumber) End Function Function GetAbsoluteLineNum(r As Range) As Integer Dim i1 As Integer, i2 As Integer, Count As Integer, rTemp As Range r.Select Do i1 = Selection.Information(wdFirstCharacterLineNumber) Selection.GoTo what:=wdGoToLine, which:=wdGoToPrevious, Count:=1, Name:="" Count = Count + 1 i2 = Selection.Information(wdFirstCharacterLineNumber) Loop Until i1 = i2 r.Select GetAbsoluteLineNum = Count End Function |
#2
|
|||
|
|||
I've tinkered a bit with the code you provided. Note: No comprehensive test for accuracy. Still, here are is my result plus an alternate method:
Code:
Option Explicit Sub WhereAmI() MsgBox "The cursor is at Document paragraph number: " & fcnSelectionParagraphNumber() & vbCr _ & "Document line number: " & Selection.Information(wdFirstCharacterLineNumber) & vbCr _ & "Paragraph line number: " & fcnSelectionParaLineNumber() lbl_Exit: Exit Sub End Sub Function fcnSelectionParagraphNumber() As Long Dim oRngSpan As Range Dim lngPos As Long lngPos = ActiveDocument.Bookmarks("\startOfSel").Start Set oRngSpan = ActiveDocument.Range(Start:=0, End:=lngPos) If Selection.Start > 0 Then If Selection.Characters.First.Previous = Chr(13) Then fcnSelectionParagraphNumber = oRngSpan.Paragraphs.Count + 1 Else fcnSelectionParagraphNumber = oRngSpan.Paragraphs.Count End If Else fcnSelectionParagraphNumber = 1 End If lbl_Exit: Exit Function End Function Function fcnSelectionParaLineNumber() As Long Dim oRng As Range Dim lngParaLine As Long, lngLine As Long Set oRng = ActiveDocument.Bookmarks("\Para").Range lngParaLine = oRng.Information(wdFirstCharacterLineNumber) Set oRng = ActiveDocument.Bookmarks("\Sel").Range lngLine = oRng.Information(wdFirstCharacterLineNumber) Select Case True Case lngParaLine = lngLine fcnSelectionParaLineNumber = 1 Case Else fcnSelectionParaLineNumber = (lngLine - lngParaLine) + 1 End Select lbl_Exit: Exit Function End Function Sub GetLocation() 'Note this is just a example and with long complex documents, it could be a disaster. Dim oPage As Page Dim oRect As Rectangle Dim oLine As Line Dim lngPage As Long, lngRect As Long, lngLine As Long Dim lngParCount As Long, lngLineCount As Long, lngPLCount As Long Dim bResolved As Boolean bResolved = False For lngPage = 1 To ActiveDocument.ActiveWindow.Panes(1).Pages.Count Set oPage = ActiveDocument.ActiveWindow.Panes(1).Pages(lngPage) For lngRect = 1 To oPage.Rectangles.Count Set oRect = oPage.Rectangles(lngRect) On Error GoTo Err_Handler If oRect.Range.StoryType = wdMainTextStory Then If oRect.RectangleType = wdTextRectangle Then lngParCount = lngParCount + 1 If Selection.InRange(oRect.Range) Then For lngLine = 1 To oRect.Lines.Count Set oLine = oRect.Lines(lngLine) lngPLCount = lngPLCount + 1 If Selection.InRange(oLine.Range) Then lngLineCount = lngLineCount + lngPLCount bResolved = True Exit For End If Next lngLine Else lngLineCount = lngLineCount + oRect.Lines.Count End If If bResolved Then Exit For End If End If NextRect: Next lngRect If bResolved Then Exit For Next lngPage MsgBox "The cursor is in Dococument paragraph number: " & lngParCount & vbCr _ & "Document line number: " & lngLineCount & vbCr _ & "Paragraph line number: " & lngPLCount lbl_Exit: Exit Sub Err_Handler: Resume NextRect End Sub |
#3
|
|||
|
|||
GMaxey
Wonderful Thanks for the GetLocation Option. Why do you feel that Getlocation would be disaster with Long Complex document ? I've not yet have any long Complex document In all the three cases Even Blank Line/Paragraph between Two Paragraph is considered as Paragraph. Would it be possible to count no(s) of paragraph without Blank Line/Paragraph ? Thanks SamD |
#4
|
||||
|
||||
SamD
Empty paragraphs are still paragraphs. It is generally considered bad practice to use empty paragraphs to increase the space between paragraphs containing text - that is what paragraph space above and below is for. Altering the code to check the length of each paragraph (to identify empty paras) would slow the macro down considerably and be misleading.
__________________
Andrew Lockton Chrysalis Design, Melbourne Australia |
#5
|
|||
|
|||
Quote:
If you want, you could develop a count of empty paragraphs as an extra step and then subtract it from the total that Word sees. My preference would be to use styles with inter-paragraph spacing set the way you want and not have the blank paragraphs. Empty paragraphs add to both the size and the complexity of a document. |
#6
|
|||
|
|||
Thanks Charles
Now i understand Every line in word is a paragraph. Quote:
You , me and other VBA developers will know to set inter-paragraph spacing and styles What about for the users ? Only way for them is to Select Document or Paragraph and check for style and spacing So any type of indication thru VBA or any VBA syntax to know what style has been used for inter-paragraph and what spacing has been incorported. Rather than Selecting document/Paragraph and checking for Space Size after each paragraph SamD |
#7
|
|||
|
|||
Sam,
"Every line in word is a paragraph" That is not true. A paragraph can have one line or hundreds. What is true is every press of the Enter key creates a new paragraph. If you press it twice and then start typing then you created two (one for space and one for your text). As Andrew said, checking every paragraph to see if it is empty would just add to the time is take to process and return the user location. That is one of the drawbacks of the GetLocation method. It is evaluating every page, every rectangle, every line up to the the users selection point. That is a laborious process. Nothing for a short letter or two or three page document but a big drag in a big document. I have a document that is 1510 pages long. I have a very robust PC and it still look close to a minute to report the cursor look on page 1500. However, if you wanted to exclude empty paragraphs, and empty text rectangle in the document structure has a range length of 1. So you could modify to: Note: This code has not be tested with documents containing tables or other graphical elements. Code:
Sub GetLocation() Dim oPage As Page Dim oRect As Rectangle Dim oLine As Line Dim lngPage As Long, lngRect As Long, lngLine As Long Dim lngParCount As Long, lngLineCount As Long, lngPLCount As Long Dim bResolved As Boolean bResolved = False For lngPage = 1 To ActiveDocument.ActiveWindow.Panes(1).Pages.Count Set oPage = ActiveDocument.ActiveWindow.Panes(1).Pages(lngPage) For lngRect = 1 To oPage.Rectangles.Count Set oRect = oPage.Rectangles(lngRect) On Error GoTo Err_Handler If oRect.Range.StoryType = wdMainTextStory Then If oRect.RectangleType = wdTextRectangle Then If Len(oRect.Range) > 1 Then 'An empty TextRectangle as a range lenght = 1 lngParCount = lngParCount + 1 If Selection.InRange(oRect.Range) Then For lngLine = 1 To oRect.Lines.Count Set oLine = oRect.Lines(lngLine) lngPLCount = lngPLCount + 1 If Selection.InRange(oLine.Range) Then lngLineCount = lngLineCount + lngPLCount bResolved = True Exit For End If Next lngLine Else lngLineCount = lngLineCount + oRect.Lines.Count End If End If If bResolved Then Exit For End If End If NextRect: Next lngRect If bResolved Then Exit For Next lngPage MsgBox "The cursor is in Dococument paragraph number: " & lngParCount & vbCr _ & "Document line number: " & lngLineCount & vbCr _ & "Paragraph line number: " & lngPLCount lbl_Exit: Exit Sub Err_Handler: Resume NextRect End Sub "So any type of indication thru VBA or any VBA syntax to know what style has been used for inter-paragraph and what spacing has been incorported. Rather than Selecting document/Paragraph and checking for Space Size after each paragraph" You could do a find and replace looking for ^13^13. Any found would indicate the user has used paragraphs for spacing. |
#8
|
|||
|
|||
Quote:
Every line is not a paragraph. In Word, every press of the Enter key creates a Word paragraph. I suspect that every user, from time to time, uses the Enter key for spacing; I know that I do, in documents. No well-formed template should. Again, empty paragraphs add disproportionately to the size and complexity of documents. A large number of the problems reported on forums like this are the result of empty paragraphs that carry formatting. If text is directly formatted, each paragraph mark will carry up to fifty different formatting commands that Word has to interpret on the fly as it renders the document on the screen or print. Any Word training should include use of styles and inter-paragraph spacing. This is not vba or expert-level material. When I hire staff to do word processing I do test and train. Word is not a typewriter, it is a complex program when used to produce complex documents. Basic Concepts of Microsoft Word - from Shauna Kelly For simple documents, it is simple to use. |
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
syntax for inserting blank line before inserting table and after a line or paragraph | SamDsouza | Word VBA | 8 | 08-04-2019 11:10 PM |
Data validation,force cell to be filed with number if respective cell is not empty | nicholes | Excel Programming | 0 | 08-01-2015 09:08 AM |
Hanging relative to the number | pmahesha | Word | 2 | 04-13-2015 12:16 PM |
How to create a table with a number of line depending a number entered by user | Cellendhyll | Word Tables | 3 | 07-10-2014 05:49 AM |
How set up a 'paragraph number'? | peytontodd | Word | 2 | 12-11-2012 06:55 PM |