FCapo
asked on
Visual Studio search word table and return Cell index
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:
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
ASKER
Hi,
I added this to test : MsgBox(docWord.Range.Infor mation(Wor d.WdInform ation.wdEn dOfRangeRo wNumber))
and it just keeps giving me back -1 everytime
I added this to test : MsgBox(docWord.Range.Infor
and it just keeps giving me back -1 everytime
can you test if you are really in the table
Range.Information(wdWithInTable)
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
Here is the code to return the text of a table cell
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
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
ASKER
Rgonzo1971 I tested with MsgBox(docWord.Content.Inf ormation(W ord.WdInfo rmation.wd WithInTabl e)) and the result back is FALSE
ASKER
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.
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.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanks GrahamSkan, great solution to my problem!
you could use
Open in new window
Regards