#1
|
|||
|
|||
Word - position document
Hello
Is it possible to save the value of a fixed document position in a variable? I want to store a 4 digit value that always comes out in the same position. Thank you |
#2
|
|||
|
|||
Hi,
Are you asking if you can save a variable in a document? If so, I was looking into that a while ago, and although haven't used it yet, I did record the following notes on how to store a document variable, and retrieve it again. Hopefully this helps get you on the right path if that's what you're looking to do. Code:
Sub varTest() ' Testing how to store and retrieve a variable saved with the doc. ActiveDocument.Variables.Add Name:="Value1", Value:="1" MsgBox ActiveDocument.Variables("Value1") + 3 For Each myVar In ActiveDocument.Variables Debug.Print ("Name = " & myVar.Name & vbCr & "Value = " & myVar.Value) Next myVar End Sub |
#3
|
|||
|
|||
What I want is to take a value in a specific position and store it in a variable.
For example (the attached document) know the position of the number 1151 and save in a variable. |
#4
|
|||
|
|||
There are several ways you could do this.
|
#5
|
|||
|
|||
If you're looking for the character/range position in the document, this might help. If you're looking for the X,Y position on the screen, that's a different problem.
Italophile's solutions may work better, as mine would of course change if you changed the document, moving things around. But this stores the current position of your text as the Range.Start attribute. What exactly are you trying to do with this position once you store it? Just curious as I have never needed to know the position of something in a document. I have needed to know positions when building a UI, or dealing with images, etc. Understanding more of what your bigger goal is may help us help you get there. Code:
Sub position() ' Find characters 1150 and store position in a variable. Dim docRange As Range Set docRange = ActiveDocument.Range Dim str_text As String str_text = "1150" Dim position As Long Dim str_message As String With docRange.Find .ClearFormatting .Text = str_text .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = True .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With docRange.Find.Execute ' Store range position = docRange.Start ' Define message for msgBox str_message = (str_text & " is at position: " & position & ".") Call MsgBox(prompt:=str_message, Buttons:=vbOKOnly) End Sub |
#6
|
|||
|
|||
Sorry for my english, it's poor.
I have a document with inserted bookmarks. The document is created by a VB6 program. I have tried to read the value of the bookmark, but there is no way. I have used a code that was sent to me in this forum. It detects the bookmark but does not read the value. Quote:
|
#7
|
||||
|
||||
A bookmark can enclose a text range or it can be 'collapsed' in that its end is in the same position as its start. This is the equivalent as having a selection or just a cursor position.
So oBM.Range.Text will only show content if the range's end is greater than its start. You can either modify the contents of the bookmark's range or use the earlier suggestions as more bulletproof methods of avoiding this problem.
__________________
Andrew Lockton Chrysalis Design, Melbourne Australia |
#8
|
|||
|
|||
Quote:
can you give me an example? thanks |
#9
|
|||
|
|||
When you next ask a question please include as much detail as possible. It is very hard to help someone when they haven't provided vital details, i.e. "I have a document with inserted bookmarks" and "The document is created by a VB6 program"
The attached screenshot shows the difference between a collapsed and enclosing bookmark, and how to show bookmarks in your document. If you have no control over the document and you know that the code is never more than 4 characters you can edit your code as follows: Code:
Sub TestBookmark() Dim rng As Range Dim code As String If ActiveDocument.Bookmarks.Exists("code") Then Set rng = ActiveDocument.Bookmarks("code").Range If rng.Start = rng.End Then rng.MoveEnd wdCharacter, 4 code = rng.Text Debug.Print code Else code = rng.Text Debug.Print code End If Else MsgBox "This bookmark doesn't exist" & vbCr & "code" End If End Sub |
#10
|
|||
|
|||
Quote:
I have executed the code that you have sent me and it has not given any error. Code:
Sub TestBookmark() Dim rng As Range Dim code As String If ActiveDocument.Bookmarks.Exists("CodiPacient") Then Set rng = ActiveDocument.Bookmarks("CodiPacient").Range If rng.Start = rng.End Then rng.MoveEnd wdCharacter, 4 code = rng.Text Debug.Print code Else code = rng.Text Debug.Print code End If Else MsgBox "This bookmark doesn't exist" & vbCr & "code" End If End Sub thanks |
#11
|
|||
|
|||
That's what the code already does. If that isn't what you want, you'll have to be more specific about what you need.
|
#12
|
|||
|
|||
This example displays the numbers for all bookmarks in your document as a msgBox. Since it appears your numbers vary in size, I'm extending the range as long as their are numbers in it. In the code below, you can see the line where your bookmark value from the document is being stored as the var, bookmarkValue.
It was being stored in the previous example as "code", so as Italophile mentioned, you are already storing it as a variable. Next question for you - What are you going to do with the variable once you have it? Posting a sample Word document (not screen shots) with the actual bookmarks you're trying to work with, and details about your end goal would be helpful. This is like a mystery that we're learning a little more with each iteration Code:
Sub bookmarkValues() Dim rng As Range Dim bm As Bookmark Dim rng_expanded As Range Dim bookmarkValue As String For Each bm In ActiveDocument.Bookmarks Set rng = bm.Range If rng.Start = rng.End Then Set rng_expanded = rng rng_expanded.MoveEndWhile cset:="0123456789" ' Store bookmark document text as a variable bookmarkValue = rng_expanded.Text Call MsgBox(prompt:=("Bookmark value: " & bookmarkValue), buttons:=vbOKOnly) End If Next bm End Sub |
#13
|
|||
|
|||
Quote:
I want to save the variable because I have a program that saves the document in the directory of that code when I close the document. I put the code that I have (I want the value that I enter through the inputbox, variable "oBM" to be taken from the bookmark) Code:
Sub SaveAsBM() Dim oBM As String Dim sPath As String oBM = InputBox("RECEPTE", "ENTRA EL CODI DEL PACIENT", "") sPath = "C:\Server\" & oBM & "\" CreateFolders sPath ActiveDocument.SaveAs sPath & "recepte" & Format(Now, "yyyymmdd hhnnss") & ".pdf" bFound = True End Sub Private Function CreateFolders(strPath As String) Dim strTempPath As String Dim lng_Path As Long Dim VPath As Variant Dim oFSO As Object Dim i As Integer Set oFSO = CreateObject("Scripting.FileSystemObject") VPath = Split(strPath, "\") If Left(strPath, 2) = "\\" Then strPath = "\\" & VPath(2) & "\" For lng_Path = 3 To UBound(VPath) strPath = strPath & VPath(lng_Path) & "\" If Not oFSO.FolderExists(strPath) Then MkDir strPath Next lng_Path Else strPath = VPath(0) & "\" For lng_Path = 1 To UBound(VPath) strPath = strPath & VPath(lng_Path) & "\" If Not oFSO.FolderExists(strPath) Then MkDir strPath Next lng_Path End If lbl_Exit: Set oFSO = Nothing Exit Function End Function |
#14
|
|||
|
|||
Okay, I think we're getting closer. I modified your SaveAsBM script as below, replacing the InputBox with code for getting the value of the bookmark named "CodiClient"
It tested fine for me, creating the folder named 11241, and saving the document as a PDF. But the PDF wouldn't open for me, but I trust it's working for you, or you know how to make that part work. Let me know if this is getting closer to your goal. Code:
Sub SaveAsBM() Dim oBM As String Dim sPath As String Dim bm As Bookmark Dim bmName As String Dim bmValue As String Dim rng_bm As Range Dim rng_expanded As Range Dim bmCheck As Boolean bmName = "CodiClient" sPath = "C:\Server" ' oBM = InputBox("RECEPTE", "ENTRA EL CODI DEL PACIENT", "") ' Store bookmark value for new folder name. For Each bm In ActiveDocument.Bookmarks If bm.Name = bmName Then Set rng_bm = bm.Range If rng_bm.Start = rng_bm.End Then Set rng_expanded = rng_bm rng_expanded.MoveEndWhile cset:="0123456789" bmValue = rng_expanded.Text sPath = (sPath & "\" & bmValue & "\") bmCheck = True End If End If Next bm If bmCheck = True Then Debug.Print ("Creating folder: " & sPath) CreateFolders sPath ActiveDocument.SaveAs sPath & "recepte" & Format(Now, "yyyymmdd hhnnss") & ".pdf" bFound = True Else Call MsgBox(prompt:=("Unable to find bookmark, " & bmName), buttons:=vbCritical) End If End Sub |
#15
|
|||
|
|||
Looping through the bookmarks collection is unnecessary when there is a built-in function to check that a bookmark exists.
So the simplified code should be: Code:
Sub SaveAsBM() Dim sPath As String: sPath = "C:\Server" Dim bmName As String: bmName = "CodiClient" Dim bm As Bookmark Dim bmValue As String Dim rng_bm As Range If ActiveDocument.Bookmarks.Exists(bmName) Then Set rng_bm = bm.Range If rng_bm.Start = rng_bm.End Then rng_bm.MoveEndWhile cset:="0123456789" bmValue = rng_bm.Text End If sPath = (sPath & "\" & bmValue & "\") Debug.Print ("Creating folder: " & sPath) CreateFolders sPath ActiveDocument.SaveAs sPath & "recepte" & Format(Now, "yyyymmdd hhnnss") & ".pdf" Else Call MsgBox(prompt:=("Unable to find bookmark, " & bmName), buttons:=vbCritical) End If End Sub |
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
Can I make Word remember the window size and position for each document? | Jennifer Murphy | Word | 4 | 02-20-2023 06:36 PM |
Changing Caption Position on Whole Document at once | Alexandarale | Word Tables | 1 | 11-15-2020 06:56 PM |
Copy selected text from one document and paste to new document in same position on the page | gasparik | Word VBA | 1 | 05-11-2020 05:41 AM |
Starting a document, returning to last position | glennnall | Word | 0 | 10-08-2017 10:09 AM |
VBA: how can I know the position on a document? | tinfanide | Excel Programming | 3 | 02-27-2012 03:24 PM |