2008-11-07 16 views
2

j'ai le code qui me permet de sélectionner un seul élément dans arange:Automatisation Excel. Vous avez besoin de sélectionner plusieurs éléments à partir d'une plage

 COleVariant vItems = cstrAddr; 
     hr = AutoWrap(
          DISPATCH_PROPERTYGET, 
          &vCell, 
          irange, 
          L"Item", 
          2, 
          COleVariant((short)(1)), 
          COleVariant((short)(1))); 
     if (FAILED(hr)) return hr; 


     // Use the dispatch interface to select the cell 
     COleVariant result; 
     hr = AutoWrap(
         DISPATCH_METHOD, 
         &result, 
         vCell.pdispVal, 
         L"Select", 
         0); 
     if (FAILED(hr)) return hr; 

Cela fonctionne très bien. Cependant, j'ai besoin de sélectionner toutes les cellules de la plage, mais je n'ai pas réussi à trouver un moyen de le spécifier dans l'appel "get" de la propriété Item. Essayé en utilisant -1, -1 ... essayé de passer dans une paire de bstr dans les 2 variantes, en spécifiant une plage de colonnes séparées par deux-points et une plage de lignes; également essayé de passer dans un seul paramètre d'une chaîne de spécification de gamme. Aucun n'a travaillé.

Mise à jour: J'ai aussi essayé

hr = iRange->Select(vResult); 

Cela ne retourne S_OK, mais il ne sélectionne pas la plage. Normalement, je ne peux pas appeler directement les fonctions dans la structure iRange; le résultat est une violation gpf ou d'accès - donc je dois utiliser la fonction autowrap (pour conduire un appel Invoke). Je ne suis pas surpris que cet appel ne fonctionne pas. J'espère que ça marchera ... c'est la dernière pièce de ce projet.

Répondre

1

J'ai trouvé la réponse à cette question. Cela semble seulement être un problème lorsqu'il est utilisé dans l'exemple DSOFRAMER (Microsoft KB 311765). DSOFramer est un contrôle ActiveX général pour l'intégration de documents MS Office. Le problème se produit également uniquement dans une version de débogage; versions de sortie sont très bien.

J'ai également trouvé une solution de contournement qui fonctionne sur la version release ou debug: obtenez n'importe quelle cellule de la gamme (using get_Item), puis appelez select sur cet élément, puis sélectionnez de nouveau pour la désélectionner. Une fois cela fait, le select peut être appelé sur la plage. Apparemment, select ne peut pas être appelé sur la plage si une cellule est déjà sélectionnée (ou si l'état de sélection est indéfini).

1

Pas familier avec ce type de code (dans VB c'est beaucoup, beaucoup plus facile à faire Automatisation) Je pense que dans votre exemple vous sélectionnez une cellule dans une plage en utilisant la propriété Item et la méthode Select. Correct?

Ainsi, dans VB

Dim oRange as Range 
Dim oCell as Range 

Set oRange = WorkSheet.Range("A1:A10") '<-- get range 
Set oCell = oRange.Item(1)    '<-- returns first cell in range 
oCell.Select       '<-- selects first cell 

Le problème est propriété Item retourne une seule cellule - vous devez appliquer la méthode Sélectionnez la gamme d'origine.

Dim oRange as Range 

Set oRange = WorkSheet.Range("A1:A10") '<-- get range 
oRange.Select       '<-- Selects the range 
+0

C'est ce que j'essayais à l'origine de faire. Je reçois un échec quand je fais cet appel, cependant. HRESULT 0x800a03ec. J'ai une question distincte affichée ici pour répondre à celle-ci. – Steve

+0

En outre, j'ai vu cette page: http://www.nika-soft.com/nativeexcelnet/doc/NativeExcel.IRange.Select.html qui laisse entendre qu'à partir de C++, vous pouvez spécifier une plage sur les éléments. En raison de restrictions dans mon code, je ne peux pas utiliser les classes listées ici. Je dois utiliser les appels de style autowrap/invoke. – Steve

+0

Eh bien - je suppose que je ne peux pas vous aider ... –