首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VBA >

使用RangePtr读取excel时抛出错误

2013-01-05 
使用RangePtr读取excel时抛出异常ret pRange-GetValue()//Create the SAFEARRAY from the VARIANT ret

使用RangePtr读取excel时抛出异常


      ret = pRange->GetValue();

      //Create the SAFEARRAY from the VARIANT ret.
//if(!(ret.vt & VT_ARRAY))
//return FALSE;
//COleSafeArray sa(ret);

      //Determine the array's dimensions.
long lNumRows;
long lNumCols;
//sa.GetUBound(1, &lNumRows);
//sa.GetUBound(2, &lNumCols);
//lNumRows = pRange->GetRow();
lNumCols = pRange->GetCount()/10;
//lNumRows = pRange->GetColumn();
lNumRows = 10;

      //Display the elements in the SAFEARRAY.
long index[2];
      VARIANT val;
      int r, c;
      TRACE("Contents of SafeArray\n");
      TRACE("=====================\n\t");
      for(c=0;c<lNumCols;c++)
      {
         TRACE("\t\tCol %d", c);
      }
      TRACE("\n");
      for(r=0;r<lNumRows;r++)
      {
         TRACE("Row %d", r);
         for(c=0;c<lNumCols;c++)
         {
//index[0]=r;
//index[1]=c;
//sa.GetElement(index, &val);
int temp = r*150+c;
val = pRange->GetItem(_variant_t(long(0)),_variant_t(long(temp)));
            switch(val.vt)
            {
            case VT_R8:
               {
                  TRACE("\t\t%1.2f", val.dblVal);
                  break;
               }
            case VT_BSTR:
               {
                  TRACE("\t\t%s",(CString)val.bstrVal);
                  break;
               }

            case VT_EMPTY:
               {
                  TRACE("\t\t<empty>");
                  break;
               }
            }
         }


         TRACE("\n");
      }


以上是部分代码,主要的异常就出现在val = pRange->GetItem(_variant_t(long(0)),_variant_t(long(temp)));
我每次只能够打印出
      for(c=0;c<lNumCols;c++)
      {
         TRACE("\t\tCol %d", c);
      }
这部分的内容,然后到pRange->GetItem(0,0)就挂掉了。求解。

另一种方式COleSafeArray sa(ret);会直接异常,因为这里获得的ret值为8204 == VT_ARRAY|VT_VARIANT,用这个初始化sa时直接异常...

求解决方法,希望实现读取excel的功能。

还有个问题
pRange->GetCount();可以获得所有记录的总数,而不是行数目?
pRange->GetRow();pRange->GetColumn();这两个函数根本得不到列数目,而是得到的始终是1,其实我的行列范围设置了A1-->J150的。怎么获取列数目呢
[解决办法]
pRange->GetItem(0,0)

感觉应该是pRange->GetItem(1,1)吧。

热点排行