2014-02-10 9 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의 제안에

편집 올바른 방향으로 저를 얻었다. 그러나 다음 코드를 사용하여, 나는 널 (null) 예외를 얻고 있었다 :

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 상자가 만들어졌습니다. 당신은 값 속성이 아닌 TextRange 속성을 확인 붙이기를 처리하는 경우

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()); 
      } 
     } 
    } 

그래서 확인 : 나는 등의 텍스트 상자 값에 액세스 할 수 있도록 OLE 상자는 '가치'속성을 가지고 있었다.

답변

3

텍스트 상자의 이름을 알고 있다면, 당신은 이런 식으로 참조 할 수 있습니다 : 당신이 이름을 모르는 경우

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

, 당신은 워크 시트의 모든 모양을 반복하는 ActiveSheet.Shapes을 사용할 수 있습니다 .

TextBox에서 실제 텍스트를 가져 오는 것은 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 컬렉션에서 가져와야합니다.

관련 문제