2014-02-10 46 views
2

用戶向我提供了一個Excel文檔,該文檔在幾個單元格中具有文本框。我有通常的設置代碼來加載Excel應用程序,獲取工作表,然後開始迭代使用的範圍。當我嘗試獲取包含文本框的單元格的值時,該值爲null。從Excel中獲取文本框單元格

foreach (Range row in usedRange.Rows) { 
    object[,] valueArray = (object[,])row.get_Value(XlRangeValueDataType.xlRangeValueDefault); 
    var value = valueArray[1,10]; // This is null for textbox cells 
} 

是否有一個特殊的方法,我應該使用它來獲取Excel工作表中出現的文本框的值?

編輯與修復和解釋

迭代形狀的Stewbob的建議讓我在正確的方向。但是,使用下面的代碼,我得到空例外:

for (int i=1; i<shapes.Count;i++){ 
    var item = shapes.Range[i].Item(1); 
    string myString = item.TextFrame2.TextRange.Characters.Text.ToString(); 
} 

看着快速監視對象後,我發現了一些古怪的形狀。它是msoOLEControlObject類型的。事實證明,這個Excel文檔中的值從網頁中剪切並粘貼到Excel中。 Excel不會創建文本框,而是OLE框。在OLE盒也有一個「值」屬性,所以我可以訪問文本框的值,例如:

var shapes = ws.Shapes; 
    for (int i=1; i<shapes.Count;i++){ 
     var item = shapes.Range[i].Item(1); 
     var myText = item.OLEFormat.Object; 
     if (myText.Object != null) { 
      if (myText.Object.Value != null) { 
       Console.WriteLine(myText.Object.Value.ToString()); 
      } 
     } 
    } 

所以一定要確保,如果你正在處理您檢查值屬性,而不是財產的TextRange粘貼的對象。

回答

3

如果你知道的文本框的名稱,你可以參考這樣說:

ActiveSheet.Shapes.Range(Array("TextBox 1")).Select 

如果你不知道這個名字,你可以使用ActiveSheet.Shapes通過在工作表上的所有形狀迭代。

獲取文本框中的實際文本在VBA中並不是非常簡單。通過活動工作表上的所有Shape對象下面的代碼循環:

Dim shp As Shape 
Dim myText As String 

For Each shp In ActiveSheet.Shapes 
    myText = shp.TextFrame2.TextRange.Characters.Text 
Next 

雖然我看到你工作在C#,所以上面的代碼會有點不同,但它至少給你的對象模型去TextBox裏面的文字。

1

那麼,TextBox實際上不在任何單元格內(雖然它可能看起來像)。

相反,您必須從WorkSheet中的Shapes集合中獲取它。

相關問題