Automation Excel avec c++ : "Offset"

Résolu
aymericpont Messages postés 2 Date d'inscription vendredi 27 mai 2011 Statut Membre Dernière intervention 8 juin 2011 - 6 juin 2011 à 21:28
aymericpont Messages postés 2 Date d'inscription vendredi 27 mai 2011 Statut Membre Dernière intervention 8 juin 2011 - 8 juin 2011 à 21:03
Bonjour,

je cherche à utiliser la fonction "offset" d'excel en OLE Automation.

J'arrive à ouvrir excel, à ouvrir un workbook, à selectionner la feuille que je veux, à lire une cellule mais j'ai eu beau chercher (par moi-même et sur le net) je ne trouve rien pour ces deux fonctions :(

Voila ce que je fais :

//************************************************************
bool MyExcel::SelectRange(char *pPos)
{
if(pPos == NULL) return false;

WCHAR str[100];
MultiByteToWideChar(CP_ACP, 0, pPos, -1, str, 100);

VARIANT parm;
parm.vt = VT_BSTR;
parm.bstrVal = SysAllocString(str);

AutoWrap(DISPATCH_PROPERTYGET, &cellRange, xlSheet.pdispVal, L"Range", 1, parm);

SysFreeString(parm.bstrVal);
VariantClear(&parm);
return true;
}

bool MyExcel::OffsetRange(const int col,const int line)

{
VARIANT parmX;
parmX.vt = VT_I4;
parmX.lVal = line;

VARIANT parmY;
parmY.vt = VT_I4;
parmY.lVal = col;

AutoWrap(DISPATCH_PROPERTYPUT, &cellRange, cellRange.pdispVal, L"Offset", 1, parmX, parmY);

//cellValue.dblVal;

VariantClear(&parmX);
VariantClear(&parmY);

return true;
}
//************************************************************

Ce code compile mais ne fonctionne pas. je récupére cette erreur :
Unhandled exception at 0x001501e9 in "LectureExcel.exe": 0xC0000005: Access violation writing location 0x1501e800.

Je ne comprends pas pourquoi il y a un access violation Writing alors que je ne fais que décaler mon RANGE !

Quelqu'un a t'il une explication ?

Merci beaucoup de votre aide à venir,

Aymeric

2 réponses

aymericpont Messages postés 2 Date d'inscription vendredi 27 mai 2011 Statut Membre Dernière intervention 8 juin 2011
8 juin 2011 à 21:03
Effectivement dans le code que j'ai copié il y avait cette erreur que j'ai pu corriger.

Mais j'ai finalement j'ai compris pourquoi je n'arrivais pas à utiliser cette fonction. c'est parceque je ne SELECTIONNER pas mon RANGE avant. Je ne ne faisais que le définir.

Ma fonction qui fonctionne avec PROPERTYGET :

//*********************************************
bool cExcelApplication::Offset(const int& intOffsetX, const int& intOffsetY, char* pPosSrc)
{
ActivateCell(pPosSrc);

VARIANT offsetX;
offsetX.vt = VT_I4;
offsetX.lVal = intOffsetX;

VARIANT offsetY;
offsetY.vt = VT_I4;
offsetY.lVal = intOffsetY;

AutoWrap(DISPATCH_PROPERTYGET, &cellRange, cellRange.pdispVal, L"Offset", 2, offsetX, offsetY);

//Si une cellule est activée alors on récupére la valeur de la cellule
//Si on a seulement selectionner un champs alors on récupére un tableau qui commence
// à la cellule décaler et qui finit en bas à droite du tableau

VariantClear(&offsetX);
VariantClear(&offsetY);

return true;
}

Merci pour le coup de main,

Salut
3
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
8 juin 2011 à 19:51
salut,

AutoWrap(DISPATCH_PROPERTYPUT, &cellRange, cellRange.pdispVal, L"Offset", 2,parmX, parmY);


@++
0
Rejoignez-nous