用VBA操作时可以用characters(start,length),但是用VC自动化时,Rang.GetCharacters()应该如何用,多谢。
解决方案 »
- 怎样设置CTabCtrl表头的位置在下面呢?
- list control 保存编辑Item的内容
- 紧急求救:xxxx.obj : error LNK2005
- 使用m_pSet指针时出现“试图越过数据的有效存储区间”提示,望达人赐教
- 急:在不打开本地链接的网络文件和打印机的服务的计算机上也能共享文件
- 如何调用Windows的Search(搜索)窗口,或使用此功能搜索?
- 麻烦看一下,你们的File-New中的Platforms是不是只有Win32
- 求大虾解决OnDrow()问题
- 高分求助:多线程中的回调函数使用全局变量时出错,似乎变量被释放了
- 关于FTP的GETFILE
- 共建系统dll文件导出函数大全
- 最近我的金山词霸老崩溃,是什么问题?有人有相同问题吗?
int CExcelEx::GetMergeRange(LPCTSTR lpszCellBeg, LPCTSTR lpszCellEnd, Range& range)
{
if (!lpszCellBeg || !lpszCellEnd)
{
return -1;
} if (!IsOpen() || m_pWorksheet->m_lpDispatch == NULL)
{
return -1;
} Range rangeCell;
rangeCell = m_pWorksheet->GetRange(_variant_t(lpszCellBeg), _variant_t(lpszCellEnd));
if (rangeCell.m_lpDispatch == NULL)
{
return -1;
}
_variant_t vTmp = rangeCell.GetMergeCells();
if (vTmp.boolVal == -1)
{
rangeCell = rangeCell.GetItem(_variant_t(1L), _variant_t(1L)).pdispVal;
rangeCell = rangeCell.GetMergeArea();
range = rangeCell.DetachDispatch();
return 0;
}
else if (vTmp.boolVal == 0)
{
return 1;
}
else
{
return 2;
}
}BOOL CExcelEx::SetRangeValue(LPCTSTR lpszCellBeg, LPCTSTR lpszCellEnd, const CString& strValue)
{
Range range;
int nRet = GetMergeRange(lpszCellBeg, lpszCellEnd, range);
if (nRet < 0)
{
return FALSE;
}
else if (nRet == 0)
{ }
else
{
//would you merge them?
range = m_pWorksheet->GetRange(_variant_t(lpszCellBeg), _variant_t(lpszCellBeg));
}
//range.SetHorizontalAlignment(_variant_t(3L));
//range.SetVerticalAlignment(_variant_t(2L));
range.SetValue(_variant_t(strValue));
return TRUE;
}
OOL CExcelEx::GetRangeValue(LPCTSTR lpszCellBeg, LPCTSTR lpszCellEnd, CString& strValue)
{
Range range;
_variant_t vResult;
int nRet = GetMergeRange(lpszCellBeg, lpszCellEnd, range);
if (nRet < 0)
{
}
else if (nRet == 0)
{
vResult = range.GetValue();
try
{
strValue = (LPCTSTR)(_bstr_t)vResult;
return TRUE;
}
catch (_com_error& )
{
COleSafeArray sa(vResult);
long index[2] = {1L, 1L};
sa.GetElement(index, &vResult);
}
}
else
{
if (_tcscmp(lpszCellBeg, lpszCellEnd) != 0)
{
return FALSE;
}
range = m_pWorksheet->GetRange(_variant_t(lpszCellBeg), _variant_t(lpszCellEnd));
}
/*
//Determine the array's dimensions.
long lNumRows;
long lNumCols;
sa.GetUBound(1, &lNumRows);
sa.GetUBound(2, &lNumCols);
*/
//Display the elements in the SAFEARRAY.
/*
long index[2];
VARIANT val;
int r, c;
TRACE("Contents of SafeArray\n");
TRACE("=====================\n\t");
for(c=1;c<=lNumCols;c++)
{
TRACE("\t\tCol %d", c);
}
TRACE("\n");
for(r=1;r<=lNumRows;r++)
{
TRACE("Row %d", r);
for(c=1;c<=lNumCols;c++)
{
index[0]=r;
index[1]=c;
sa.GetElement(index, &val);
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");
}
*/
try
{
strValue = (LPCTSTR)(_bstr_t)vResult;
return TRUE;
}
catch (_com_error& err)
{
::AfxMessageBox((LPCTSTR)(err.Description()));
return FALSE;
}
}
“测试内容”,
“测试内容”,
“测试内容”,
我仔细看了上面的代码,理解其实现功能是对Rang包含的单元格操作,不知道对不对?