Solved

Visual Studio search word table and return Cell index

Posted on 2016-11-04
8
60 Views
Last Modified: 2016-11-07
Hi,

I have an application in Visual Studio I'm using to connect to WORD in order to search a table and return the Row index of where the result was found, it is searching project numbers from a datagridview in a seperate word document and returning some values back in some new columns I added, I found a way to do this but I feel it's slow because it has to scan each row in the WORD table, I feel like this would go faster if instead I told word to FIND the project number and return the row index instead

Is it then possible to ask word to search for text in a table and return back the row index it found the text in?

My current code is as follows:

        Me.Cursor = System.Windows.Forms.Cursors.AppStarting
        Dim col As New DataGridViewTextBoxColumn
        col.DataPropertyName = "PropertyName"
        col.HeaderText = "Terrain"
        col.Name = "Terrain"
        DataGridView1.Columns.Add(col)


        Dim col1 As New DataGridViewTextBoxColumn
        col1.DataPropertyName = "PropertyName"
        col1.HeaderText = "Labo"
        col1.Name = "Labo"
        DataGridView1.Columns.Add(col1)


        Dim col2 As New DataGridViewTextBoxColumn
        col2.DataPropertyName = "PropertyName"
        col2.HeaderText = "Rapport"
        col2.Name = "Rapport"
        DataGridView1.Columns.Add(col2)

        Dim col3 As New DataGridViewTextBoxColumn
        col3.DataPropertyName = "PropertyName"
        col3.HeaderText = "Date fin rédaction"
        col3.Name = "fin"
        DataGridView1.Columns.Add(col3)


        DataGridView1.Columns("Terrain").DisplayIndex = 1
        DataGridView1.Columns("Labo").DisplayIndex = 2
        DataGridView1.Columns("Rapport").DisplayIndex = 3
        DataGridView1.Columns("fin").DisplayIndex = 4
        DataGridView1.Columns("fin").Width = 150

        Dim appWord As New Word.Application
        appWord.Visible = False
        Dim docWord As New Word.Document
        Dim myFile = Directory.GetFiles("S:\mike2\work\projects").OrderByDescending(Function(f) New FileInfo(f).LastWriteTime).First()
        docWord = appWord.Documents.Add(myFile.Split(".")(0) & ".doc")
        Dim tbl As Word.Table = docWord.Tables(1)
        For x = 0 To DataGridView1.Rows.Count - 1

            If docWord.Content.Find.Execute(DataGridView1.Item(11, x).Value) = True Then
                For i = 3 To tbl.Range.Rows.Count
                    If tbl.Cell(i, 1).Range.Text.Substring(0, tbl.Cell(i, 1).Range.Text.Length - 1).Trim = DataGridView1.Item(11, x).Value Then
                        DataGridView1.Item(76, x).Value = tbl.Cell(i, 4).Range.Text.Substring(0, tbl.Cell(i, 4).Range.Text.Length - 1).Trim & "%"
                        DataGridView1.Item(78, x).Value = tbl.Cell(i, 6).Range.Text.Substring(0, tbl.Cell(i, 6).Range.Text.Length - 1).Trim & "%"
                        DataGridView1.Item(77, x).Value = tbl.Cell(i, 5).Range.Text.Substring(0, tbl.Cell(i, 5).Range.Text.Length - 1).Trim & "%"
                        DataGridView1.Item(79, x).Value = tbl.Cell(i, 7).Range.Text.Substring(0, tbl.Cell(i, 7).Range.Text.Length - 1)
                        Exit For
                    End If
                Next
            Else
            End If

        Next
        appWord.Quit()
        Me.Cursor = System.Windows.Forms.Cursors.Arrow

Open in new window

0
Comment
Question by:FCapo
  • 4
  • 2
  • 2
8 Comments
 
LVL 49

Expert Comment

by:Rgonzo1971
ID: 41874307
HI,

you could use

Range.Information(wdEndOfRangeRowNumber)
'or
Range.Information(wdStartOfRangeRowNumber)

Open in new window

Regards
0
 

Author Comment

by:FCapo
ID: 41874314
Hi,

I added this to test :  MsgBox(docWord.Range.Information(Word.WdInformation.wdEndOfRangeRowNumber))

and it just keeps giving me back -1 everytime
0
 
LVL 49

Expert Comment

by:Rgonzo1971
ID: 41874350
can you test if you are really in the table

Range.Information(wdWithInTable)

Open in new window

0
3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

 
LVL 76

Expert Comment

by:GrahamSkan
ID: 41874359
Make the Find range that of the table, not the whole document
This was edited in VBA, so might have to be tweaked for .Net

Dim rng As Word.Range
Dim rw As Word.Row
'...

        rng = tbl.Range
        With rng.Find
            .Text = DataGridView1.Item(11, X).Value
            If .Execute Then
                rw = rng.Rows(1) 'Within the Find With block,rng acts as the found range
                DataGridView1.Item(76, X).Value = GetCellText(rw.Cells(4)) & "%"
                DataGridView1.Item(78, X).Value = GetCellText(rw.Cells(6)) & "%"
                DataGridView1.Item(77, X).Value = GetCellText(rw.Cells(5)) & "%"
                DataGridView1.Item(79, X).Value = GetCellText(rw.Cells(7))
                Exit For
                
            Else
            End If
        End With

Open in new window


Here is the code to return the text of a table cell
Function GetCellText(cl As Word.Cell) As String
    Dim rng As Word.Range
    
    Set rng = cl.Range
    rng.MoveEnd wdCharacter, -1
    GetCellText = rng.Text
End Function

Open in new window

0
 

Author Comment

by:FCapo
ID: 41874390
Rgonzo1971 I tested with  MsgBox(docWord.Content.Information(Word.WdInformation.wdWithInTable)) and the result back is FALSE
0
 

Author Comment

by:FCapo
ID: 41874439
Hi GrahamSkan,

I tried your method and I'm getting the following error :
Additional information: Cannot access individual rows in this collection because the table has vertically merged cells.
0
 
LVL 76

Accepted Solution

by:
GrahamSkan earned 500 total points
ID: 41875307
Oh dear. I hadn't expected that.
Never mind, we can use still use the row number from the RowIndex property. This version assumes that the cells to be addressed haven't been merged away.
Dim rng As Word.Range
Dim r As Integer
'...

        rng = tbl.Range
        With rng.Find
            .Text = DataGridView1.Item(11, X).Value
            If .Execute Then
                r = rng.Cells(1).RowIndex 'within the Find With block,rng acts as the found range
                DataGridView1.Item(76, X).Value = GetCellText(tbl.Cell(r, 4)) & "%"
                DataGridView1.Item(78, X).Value = GetCellText(tbl.Cell(r, 6)) & "%"
                DataGridView1.Item(77, X).Value = GetCellText(tbl.Cell(r, 5)) & "%"
                DataGridView1.Item(79, X).Value = GetCellText(tbl.Cell(r, 7))
                Exit For
                
            Else
            End If
        End With

Open in new window

0
 

Author Closing Comment

by:FCapo
ID: 41877763
Thanks GrahamSkan, great solution to my problem!
0

Featured Post

Live: Real-Time Solutions, Start Here

Receive instant 1:1 support from technology experts, using our real-time conversation and whiteboard interface. Your first 5 minutes are always free.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Real-time is more about the business, not the technology. In day-to-day life, to make real-time decisions like buying or investing, business needs the latest information(e.g. Gold Rate/Stock Rate). Unlike traditional days, you need not wait for a fe…
If you need to start windows update installation remotely or as a scheduled task you will find this very helpful.
Get people started with the process of using Access VBA to control Outlook using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Microsoft Outlook. Using automation, an Access applic…
Show developers how to use a criteria form to limit the data that appears on an Access report. It is a common requirement that users can specify the criteria for a report at runtime. The easiest way to accomplish this is using a criteria form that a…

776 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question