用VBA操作时可以用characters(start,length),但是用VC自动化时,Rang.GetCharacters()应该如何用,多谢。

解决方案 »

  1.   


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

  2.   


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

  3.   

    我没写清楚我的意思,我的意思现在有一个单元格:“测试内容”,我现在想设置其某一部分的格式,如变为:
    “测试内容”,
    “测内容”,
    “测试内容”,
    我仔细看了上面的代码,理解其实现功能是对Rang包含的单元格操作,不知道对不对?