Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

Visual Studio search word table and return Cell index

Posted on 2016-11-04
8
Medium Priority
?
148 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 53

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 53

Expert Comment

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

Range.Information(wdWithInTable)

Open in new window

0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
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 2000 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

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

In real business world data are crucial and sometimes data are shared among different information systems. Hence, an agreeable file transfer protocol need to be established.
This article describes how you can use Custom Document Properties to store settings and other information in your workbook so that they will be available the next time you open the workbook.
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…
Get people started with the utilization of class modules. Class modules can be a powerful tool in Microsoft Access. They allow you to create self-contained objects that encapsulate functionality. They can easily hide the complexity of a process from…
Suggested Courses

772 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