Automation Excel avec c++ : "Offset" [Résolu]

Messages postés
2
Date d'inscription
vendredi 27 mai 2011
Dernière intervention
8 juin 2011
- 6 juin 2011 à 21:28 - Dernière réponse :
Messages postés
2
Date d'inscription
vendredi 27 mai 2011
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
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
Messages postés
2
Date d'inscription
vendredi 27 mai 2011
Dernière intervention
8 juin 2011
- 8 juin 2011 à 21:03
3
Merci
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

Merci aymericpont 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de aymericpont
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Dernière intervention
14 février 2014
- 8 juin 2011 à 19:51
0
Merci
salut,

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


@++
Commenter la réponse de cs_patatalo

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.