Solved

Visual Studio search word table and return Cell index

Posted on 2016-11-04
8
37 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 48

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 48

Expert Comment

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

Range.Information(wdWithInTable)

Open in new window

0
 
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
Top 6 Sources for Identifying Threat Actor TTPs

Understanding your enemy is essential. These six sources will help you identify the most popular threat actor tactics, techniques, and procedures (TTPs).

 

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

Why You Should Analyze Threat Actor TTPs

After years of analyzing threat actor behavior, it’s become clear that at any given time there are specific tactics, techniques, and procedures (TTPs) that are particularly prevalent. By analyzing and understanding these TTPs, you can dramatically enhance your security program.

Join & Write a Comment

Suggested Solutions

Background What I'm presenting in this article is the result of 2 conditions in my work area: We have a SQL Server production environment but no development or test environment; andWe have an MS Access front end using tables in SQL Server but we a…
Since upgrading to Office 2013 or higher installing the Smart Indenter addin will fail. This article will explain how to install it so it will work regardless of the Office version installed.
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…

744 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

Need Help in Real-Time?

Connect with top rated Experts

13 Experts available now in Live!

Get 1:1 Help Now