用户向我提供了一个Excel文档,其中包含几个单元格中的文本框。我有通常的设置代码来加载Excel应用程序,获取工作表,然后开始迭代使用的范围。当我尝试获取包含文本框的单元格的值时,该值为null。
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();
}
在Quickwatch中查看对象后,我注意到形状有些奇怪。它的类型为msoOLEControlObject。事实证明,此Excel文档中的值将从网页剪切并粘贴到Excel中。 Excel不是创建文本框而是创建OLE框。 OLE框确实有一个'Value'属性,所以我可以这样访问textboxes值:
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());
}
}
}
因此,请确保您正在处理粘贴的对象,并检查value属性而不是TextRange属性。
答案 0 :(得分:3)
如果您知道文本框的名称,可以这样引用:
ActiveSheet.Shapes.Range(Array("TextBox 1")).Select
如果您不知道名称,可以使用ActiveSheet.Shapes
遍历工作表上的所有形状。
在VBA中获取TextBox中的实际文本并不是非常简单。以下代码遍历活动工作表上的所有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 :(得分:1)
好吧,TextBox实际上并不在任何单元格内(尽管看起来似乎如此)。
相反,您必须从WorkSheet中的Shapes集合中获取它。