Interop.Excel Bordure cellules [Résolu]

Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
- 16 avril 2015 à 13:32 - Dernière réponse :
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 17 avril 2015 à 00:46
Bonjour le Forum,

Dans un tableau Excel, je souhaite mettre une bordure à toutes les cellules.

Le code ci-dessous "encadre" bien la cellule E9.
J'ai essayé en vain d'utiliser UsedRange, CurrentRegion et Borders.
Dim xlApp As Excel.Application = New Microsoft.Office.Interop.Excel.Application()
Dim xlWorkBook As Excel.Workbook
Dim xlWorkSheet As Excel.Worksheet
Dim chartRange As Excel.Range

xlWorkBook = xlApp.Workbooks.Open(MyFilePDP)
xlApp.DisplayAlerts = False
xlWorkSheet = xlWorkBook.Worksheets("Applications")

chartRange = xlWorkSheet.Range("E9")

'chartRange = xlWorkSheet.Range("A1").CurrentRegion.Select()
'chartRange = xlWorkSheet.UsedRange.Select

chartRange.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin)


Merci pour vos suggestions,
jean-marc
Afficher la suite 

Votre réponse

18 réponses

Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- Modifié par ucfoutu le 16/04/2015 à 17:40
0
Merci
Bonjour, Jean-Marc,
ta question relève avant tout de ce que tu sais faire depuis VBA/Excel directement. Tu ne pourras "piloter" valablement Excel qu'à partir de là.
Voici ce que tu écrirais en VBA (sans pilotage) sur la feuille en cours ===>>>
Dim chartrange As Range, c As Range
Set chartrange = UsedRange
chartrange.BorderAround
For Each c In chartrange
c.BorderAround XlLineStyle.xlContinuous, XlBorderWeight.xlThin
Next

Il n'y a plus qu'à "piloter" maintenant sur cette base.

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- Modifié par ucfoutu le 16/04/2015 à 14:37
0
Merci
Je te fais par ailleurs observer que (connaissance Excel et non VB.Net là encore) que la propriété BorderAround ne peut concerner qu'une cellule (d'où le for each).
Pour toutes les cellules d'une plage (ici le UsedRange), il est plus judicieux d'éviter de boucler et d'utiliser la propriété Borders de la plage ! ===>>
Dim chartrange As Range, c As Range
Set chartrange = UsedRange
With chartrange.Borders
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = 0
End With

Conclusion (une fois de plus) : ne pas se lancer dans le pilotage avant de maîtriser directement (sans pilotage).
Ta question aurait préférablement du être posée dans le sous-forum VBA.

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
Commenter la réponse de ucfoutu
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
- 16 avril 2015 à 17:47
0
Merci
Bonjour ucfoutu,

D'abord merci, Jacques, de t'être penché sur mon problème.
J'ai testé le "For Each c In chartrange" avec usedRange.
Le fichier Modèle sur lequel je m'appuie ayant été modifié le usedrange inclût toutes les cellules et par conséquence + de 5 minutes pour traiter 2 feuilles (150 lignes pour 25 colonnes et 1600 lignes pour 30 colonnes).
Donc banni le UsedRange !!!
Je vais continuer mes recherches sur l'utilisation du Select.

jean-marc
Commenter la réponse de cs_JMO
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 16 avril 2015 à 18:28
0
Merci
1) fais donc précéder la détermination du usedrange par sa "remise en état" ===>>
ActiveSheet.UsedRange
Set chartrange = UsedRange

2) ceci étant dit : le principe reste le même, quelle que soit la plage à traiter (issue de l'utilisation du UsedRange ou autre)

3) ceci étant également dit : tu dois bien avoir un moyen de déterminer la plage que tu dois traiter.
Par exemple (si pas de formules présentes sur la feuille) :
Dim laplage_a_traiter As Range
Set laplage_a_traiter = Cells.SpecialCells(xlConstants)
MsgBox laplage_a_traiter.Address

mais ce n'est qu'un exemple et le choix à faire de la méthode est très largement dépendant de ce que tu as sur la feuille.
Commenter la réponse de ucfoutu
Messages postés
12239
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 16 avril 2015 à 18:40
0
Merci
Bonsoir,

        Dim xlApp As Excel.Application = New Microsoft.Office.Interop.Excel.Application()
        Dim xlWorkBook As Excel.Workbook
        Dim xlWorkSheet As Excel.Worksheet
        Dim chartRange As Excel.Range

        xlApp.Visible = True
        xlWorkBook = xlApp.Workbooks.Open(Application.StartupPath & "\exemple.xlsx")
        xlApp.DisplayAlerts = False
        xlWorkSheet = xlWorkBook.Worksheets("exemple")

        chartRange = xlWorkSheet.Range("A1", "V10")
        'chartRange = xlWorkSheet.Range("E9")

        'chartRange = xlWorkSheet.Range("A1").CurrentRegion.Select()  
        'chartRange = xlWorkSheet.UsedRange.Select

        chartRange.Borders.LineStyle = Excel.XlLineStyle.xlContinuous
        chartRange.Borders.Weight = Excel.XlBorderWeight.xlThin


J'ai remplacé le fichier par le mien....


Pour d'autres exemple (en c#) voir ici
Messages postés
12239
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 16 avril 2015 à 18:42
En fait BorderAround, c'est le contour extérieur du range.
Si tu veux faire l'ensemble du range, c'est Borders
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 16 avril 2015 à 19:09
Bonjour, Whismeril: Tout-à-fait (j'en ai parlé plus haut)
Mais plus la discussion avance, et plus on traite d'aspects VBA/Excel, dans une discussion .... VB.Net ... (cela me dérange)
Jean-Marc en est maintenant à déterminer la plage à traiter (totalement du VBA !)
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
- 16 avril 2015 à 19:13
Bonjour Whismeril,

C'est exactement ce que je souhaite.
J'avais testé "chartRange.Borders(Excel.XlLineStyle.xlContinuous, ...)" en vain.

Merci à toi ainsi qu'à ucfoutu.
Bonne soirée.
@+
jean-marc
Commenter la réponse de Whismeril
Messages postés
12239
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 16 avril 2015 à 19:15
0
Merci
Bonsoir Uc, ben oui en fait interop sert à piloter excel de la même façon qu'une macro le ferait mais depuis un exécutable autre qu'excel.
La syntaxique diffère un peu.
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 16 avril 2015 à 22:38
Non. La syntaxe reste celle de VBA. La seule différence est que l'on doit simplement l'appliquer (cette syntaxe VBA) aux objets Excel créés par l'application qui pilote.
Une fois ces objets créés, le code est toujours rigoureusement le même, à l'aide de ces objets, quelle que soit l'application/logiciel qui pilote et quelle qu'en soit la version. C'est le propre de l'automation.
Encore faut-il bien évidemment connaître le code VBA/Excel à appliquer. Et c'est apparemment à CE niveau que le bât blesse dans cette affaire.

Jean-Marc nous dit qu'il a également l'intention de piloter Word. La problématique sera exactement la même. Il ne pourra le faire qu'à condition de maîtriser VBA/Word suffisamment pour réussir à faire, sans pilotage d'abord, ce qu'il veut faire dans l'objet Word.
C'est la raison pour laquelle je l'engagerais, s'il rencontre une difficulté, à d'abord demander de l'aide VBA/Word pour la résoudre (comme, d'ailleurs, il aurait à mon sens dû le faire avec son pilotage de Excel). Le reste (le pilotage) est ensuite un jeu d'enfant.
Voilà.
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
>
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 16 avril 2015 à 23:03
ucfoutu, bonsoir,

Je rappelle que je fais mon apprentissage en VB.NET.
Quant qu'au VBA Excel, je ne l'utilise pas ou très peu dans mes scripts.
L'application que j'avais créé en hta/vbs, il y a quelques années, je la transpose de mon plein gré en VB.Net.
Pour anecdote, il y a deux semaines, j'étais en formation supervision Centréon (ex-Méréthis), et lors de ma présentation au formateur, celui-ci ignorait les mots Gcos7, MainFrame, Jcl, Gcl, Cobol ...etc) et n'en parlons pas du Questar (http://www.histoireinform.com/Histoire/+infos6/chr6inf3.htm) des années 80 !!!

Avant de poser une question sur ce Forum, je recherche sur MSDN et Google.
Et pense respecter la charte de ce Forum en expliquant clairement mon problème.

Salutations,
jean-marc
Messages postés
12239
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2018
>
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 16 avril 2015 à 23:29
Au temps pour moi, je n'avais pas compris dans ce sens.
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
>
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 16 avril 2015 à 23:34
Zappé le message de ucfoutu de 22h38.

Lors de mes prochains posts, j'essaierai de faire le distinguo entre .Net et VBA.

jean-marc
Commenter la réponse de Whismeril
Messages postés
12239
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 16 avril 2015 à 19:16
0
Merci
Quel version de visual studio utilises tu?
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
- 16 avril 2015 à 21:56
J'utilise VB 2010 Express (Windows Seven & Office 2010).
En références de ce projet, j'ai rajouté:
- Microsoft ActiveX Data Objects 2.8 Library;
- Microsoft ADO Ext 2.8 for DDL and Security;
- Microsoft Excel 14.0 Object Library;
- Microsoft OLE DB Service Component 1.0 Type Library.

En import dans le formulaire, j'ai mis :
Imports System.Data.OleDb
Imports System.Text
Imports System.IO
Imports Excel = Microsoft.Office.Interop.Excel

Je serai certainement amené à en rajouter d'autres, puisque maintenant je vais manipuler des fichiers Word.

Je me sers de MSDN et d'un bouquin acheté il y a quelques années (Le Programmeur VB 2008 - Michel Martin - PEARSON) pour mon apprentissage en .Net.

jean-marc
Messages postés
12239
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 16 avril 2015 à 23:49
Il faut faire le distinguo entre les méthodes (sub ou fonction en VB) aux quelles on peut passer des paramètres entre parenthèses et les propriétés.
  • Les méthodes vont exécuter une action, dans le cas de BorderAround entourer d'une bordure précise, et retourner un résultat (fonction) ou pas (sub).
  • Les propriétés retournent ou affectent un état, une donnée de l'objet.


Quand tu écris le code Intellisense te propose les deux en fonction de ce que tu tapes


On voit les méthodes avec un cube rose et les propriétés avec une petite liste qui n'est pas sans rappeler la page de propriété d'un contrôle de VB6.
Attention ce design est complément différent avec VS2013 (d'ou ma question)

Enfin quoi qu'il en soit, pas de parenthèse avec une propriété.

Par contre dans les deux cas, on peut ajouter un . est obtenir la liste des propriétés et méthodes de l'objet retourné (sauf pour une sub)
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
>
Messages postés
12239
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2018
- 17 avril 2015 à 00:00
Merci Whismeril de tes conseils,

Sur ce, j'arrête ce soir la progression de mon script car appel astreinte pour intervention Gcos7 !!!

@+
Commenter la réponse de Whismeril
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- Modifié par ucfoutu le 17/04/2015 à 07:12
0
Merci
Bon. Revenons à la demande de départ (le 1er message).
Je vais illustrer tout ce que j'ai dit plus haut ===>>
Je rappelle que je fais mon apprentissage en VB.NET.
Quant qu'au VBA Excel, je ne l'utilise pas ou très peu dans mes scripts.

C'est bel et bien là le problème et la raison de tout ce que j'ai dit plus haut.
Maintenant : où en es-tu de ton quadrillage à limiter à tes cellules ?
Tout dépend de la feuille en cause (de ce qu'elle contient).
Avec ce que je t'ai dit plus haut, par exemple, et en admettant
- que tu n'aies pas d'autres colonnes (sur toute ta feuille) que la dernière remplie en ligne 1
- que tu n'aies pas de lignes (sur toute ta feuille) au delà de la dernière remplie en colonne A
Disons que pour piloter, tu as créé les objets : (exemples)
apxl pour l'appli Excel
clxl pour le classeur Excel concerné
fxl pour la feuille concernée de ce classeur

que tu as déclaré dercol et derlig en integer ou long (comme l'attend VB.Net)
===>>
With fxl
dercol = .cells(1, apxl.Columns.Count).end(-4159).Column ' ==>> -4159 = valeur de xlToLeft
derlig = .range("A" & apxl.rows.Count).end(-4162).row ' ' ==>> -4162 = valeur de xlUp
With .range(.cells(1, 1), .cells(derlig, dercol)).borders
.LineStyle = 1 ' (valeur de xlContinuous)
.Weight = 2 ' (valeur de xlThin)
.ColorIndex = 0 ' (valeur du noir)
End With
End With

le fait, ton quadrillage.
voilà pourquoi je m'acharne à dire : Excel d'abord, pilotage ensuite.

EDIT : je reviens de bon matin ajouter quelques petites explications ===>>
vous avez probablement observé l'utilisation de valeurs numériques en lieu et place du nom Excel de certaines constantes.
Pourquoi ? ===>>> parce qu'autant une ouverture en "early binding" permet d'utiliser directement les constantes de Excel, autant une ouverture en "late binding"+++ ne le permettrait pas et il faut donc dans ce cas utiliser directement leur valeur et non leur nom.
En choisissant d'utiliser les valeurs et non les noms des constantes de Excel, on "a bon" dans tous les cas de figure (early or late binding). Pourquoi alors s'en priver ?



+++ rappelons qu'une ouverture en liaison tardive (late binding) présente l'avantage, en cas de distribution de l'appli, d'éviter les erreurs pouvant résulter de versions différentes de Microsoft Office.

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
Commenter la réponse de ucfoutu

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.