2014-03-26 50 views
2

我想從Word表格中選取單元格。我需要收集選定的表格單元格以創建自定義書籤對象,其中包含用戶選擇單元格範圍的信息。當用戶選擇單元格的矩形區域時,一切正常。這是我應得選擇表格單元格在我的Word加載項:Word Interop:當選擇區域不是矩形時,如何從Word表格中獲取有效的選定單元格集合?

Globals.ThisAddIn.Application.Selection.Range.Application.ActiveWindow.Selection.Cells 

如果用戶選擇未矩形或選擇一個以上的區域(按住CTRL向下),則該屬性返回細胞無效集合區。我創建了一個簡單的VBA代碼使用兩個屬性測試表中選擇什麼樣細胞:

Globals.ThisAddIn.Application.Selection.Range.Application.ActiveWindow.Selection.Cells 
Globals.ThisAddIn.Application.Selection.Range.Cells 

這兩項性能在用戶選擇非矩形的表格單元格區域返回不同的和無效的選定單元格集合。這是我使用的是測試用的VBA代碼,細胞在Word表格範圍內進行選擇時,有:

Sub test() 

Dim listaKomorek1 As New Collection 
Dim listaKomorek2 As New Collection 
Dim indekser1 As Integer 
Dim indekser2 As Integer 
Dim tekst1 As String 
Dim tekst2 As String 
Dim tabela As Table 

Set tabela = Selection.Range.Tables(1) 

indekser1 = 1 
indekser2 = 1 
liczbaKomorek1 = Selection.Range.Cells.count() 
liczbaKomorek2 = Selection.Range.Application.ActiveWindow.Selection.Cells.count() 
tekst1 = "Lista komorek 1 (Selection.Range.Cells): " & vbCrLf & vbCrLf & vbCrLf 
tekst2 = "Lista komorek 2 (ActiveWindow.Selection.Cells): " & vbCrLf & vbCrLf & vbCrLf 

For Each komorka In Selection.Range.Cells 
    tekst1 = tekst1 & "#Cell: " & CStr(indekser1) & " Value: " & CStr(komorka.Range.Text) & " Column: " & CStr(komorka.ColumnIndex) & " Row: " & CStr(komorka.RowIndex) & vbCrLf 
    indekser1 = indekser1 + 1 
Next komorka 

For Each komorka In Selection.Range.Application.ActiveWindow.Selection.Cells 
    tekst2 = tekst2 & "#Cell: " & CStr(indekser2) & " Value: " & CStr(komorka.Range.Text) & " Column: " & CStr(komorka.ColumnIndex) & " Row: " & CStr(komorka.RowIndex) & vbCrLf 
    indekser2 = indekser2 + 1 
Next komorka 

tekst1 = tekst1 & vbCrLf & "Cells count: " & CStr(liczbaKomorek1) 
tekst2 = tekst2 & vbCrLf & "Cells count: " & CStr(liczbaKomorek2) 
MsgBox tekst1 
MsgBox tekst2 
End Sub 

我的問題的,當用戶在Word表格中選擇區域我如何才能夠獲得有效的選擇細胞採集未矩形?

+0

據我所知,一個選擇是VBA「看到」的多個不連續的部分只有一部分是最後一個選擇。較早的選擇無法通過對象模型獲得。並且沒有有用的「選定」屬性。 AFAIK如果你做了一個連續的選擇,你可以成功迭代Selection.Cells,但我不確定這是否是你發現的。還有其他一些潛在的困難:一個選擇包含兩個表格中的單元格以及兩者之間的空格(Selection.Cells.Count在這種情況下爲零)以及涉及嵌套表格的選擇。 – 2014-03-26 18:04:48

+0

相關:http://support.microsoft.com/kb/288424 –

+0

有趣的閱讀,謝謝。關於此:當用戶選擇多個不連續範圍時,Selection對象的以下方法和屬性將應用於用戶選擇中的所有子範圍:Selection.Font.Size。這是不是意味着我可以改變,例如,字體大小爲多個不連續範圍內的所有單元格,然後迭代通過表來找到這些單元格?這會工作嗎? – shadovraven

回答

0

感謝Tim Williams發佈的文章,我設法找到了解決方案。這個解決方案並不完美,但它提供了,我沒有設法想到更好的東西。爲了獲得選定單元格的有效集合,在表格中連續選擇時。我們可以更改支持連續選擇的屬性之一。之後,我們可以輕鬆地找到具有更改屬性的單元格,這些單元格將成爲表格中的所有選定單元格這裏是我創建的方法,我使用Font.Size來查找選定的單元格:

public static List<System.Drawing.Point> GetSelectedCells() 
    { 
     //We will use this to hold column and row coordinates for cells 
     List<System.Drawing.Point> value = new List<System.Drawing.Point>(); 
     try 
     { 
      Microsoft.Office.Interop.Word.Range range = Globals.ThisAddIn.Application.Selection.Range; 
      if (range.Tables.Count > 0) 
      { 
       Table tempTable = range.Tables[1]; 
       float[,] backupTable = new float[range.Tables[1].Rows.Count + 1, range.Tables[1].Columns.Count + 1]; 

       for (int i = 1; i <= tempTable.Rows.Count; i++) 
       { 
        for (int j = 1; j <= tempTable.Rows[i].Cells.Count; j++) 
         backupTable[i, j] = tempTable.Rows[i].Cells[j].Range.Font.Size; 
       } 

       Globals.ThisAddIn.Application.Selection.Font.Size = 1; 

       foreach (Row row in range.Tables[1].Rows) 
       { 
        foreach (Cell cell in row.Cells) 
        { 
         if (cell.Range.Font.Size == 1) 
         { 
          System.Drawing.Point point = new System.Drawing.Point(); 
          point.X = cell.RowIndex; 
          point.Y = cell.ColumnIndex; 
          value.Add(point); 
         } 
        } 
       } 

       for (int i = 1; i <= tempTable.Rows.Count; i++) 
       { 
        for (int j = 1; j <= tempTable.Rows[i].Cells.Count; j++) 
         tempTable.Rows[i].Cells[j].Range.Font.Size = backupTable[i, j]; 
       } 
       Marshal.ReleaseComObject(tempTable); 
      } 
     } 
     catch(Exception) 
     { 
      //This exception can be used to handle Exception that occurs when there are merged cells in the  table. 
     } 
     return value; 
    } 

這不適用於合併的單元格。

0

只需使用所選範圍的的rowIndex和ColumnIndex屬性:

int selectedRowIndex = Globals.ThisAddIn.Application.Selection.Range.Cells[1].RowIndex; 
int selectedColumnIndex = Globals.ThisAddIn.Application.Selection.Range.Cells[1].ColumnIndex; 

//to get the index of the selected Table, you could use thie titel-property, if you set it before 
string selectedTableTitle = Globals.ThisAddIn.Application.Selection.Tables[1].Title; 
相關問題