Inclure un formule dans VB6 pour Excel

cs_petchy Messages postés 710 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 19 mai 2015 - 8 avril 2006 à 18:50
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 - 11 avril 2006 à 22:48
bonjour
dans mon projet [VB6] j'ai mis cette formule pour l'ouverture d'une feuille Excel,la pas de probleme ça fonctione
Private Sub open_Click()
Dim fichier1 As String
Dim DevisExcel As Object
Dim MAVALEUR As String
Dim Plage As Range, Col, Lgn&
'test d'existence si un fichier excel a été sélectionner
If fichier.ListIndex = -1 Then
MsgBox "vous n'avez selectionnié aucun fichier", vbCritical, "Erreur"
Else
fichier1 = fichier.Path & "" & fichier.FileName
'ouvrir le fichier excel selectionner


Set DevisExcel = CreateObject("excel.Application")
Workbooks.open FileName:=fichier1, Editable:=True
Application.ScreenUpdating = False
Range("a2:E8500").Sort Key1:=Columns(3) 'tri des colonnes
Range("H2:H8500").FormulaR1C1 = "=""<""&30/24/60/60"
Range("F3:F8500").Formula = "=(C3=C2)*(B3-B2)"
Range("I2").Select 'nbrs de défauts
ActiveCell.FormulaR1C1 = _
"=COUNTIF(RC[-3]:R[8500]C[-3],RC[-1])-COUNTIF(RC[-3]:R[8500]C[-3],0)" '=NB.SI(F2:F50;H2)-NB.SI(F2:F50;0)
Range("F3:F8500").NumberFormat = "[s]"
Columns("F:K").ColumnWidth = 0 'colonnes cachées
Range("A1").Select
moteur_de_recherche.Hide
MAVALEUR = Range("I2").Value
MsgBox " Défauts < 30s est de " & vbCrLf & MAVALEUR, vbExclamation, "Nbrs de défauts inférieur à 30s"
Range("c1").FormulaR1C1 = "NOMBRES DE DEFAUTS :" & MAVALEUR
Range("c1").Font.Bold = True
FontStyle = "Gras"
Size = 12
Range("c1").Font.ColorIndex = 3
Application.ScreenUpdating = True
DevisExcel.Visible = True
DevisExcel.Application.DisplayAlerts = True
End If
End Sub
Mais je voudrais inclure cette formule,et c'est la que ça pose probleme ,ça me met plein d'erreur,quelqu'un aurait il une idée pour inclure cette formule avec l'autre du dessus.
Dim Plage As Range, Col, Lgn&
Application.ScreenUpdating = False
With Feuil1
Set Plage = .Range("A2", .Range("A65536").End(xlUp)).Resize(, 11)
End With
Col = Plage.Value
For Lgn = UBound(Col, 1) To LBound(Col, 1) Step -1
With Plage.Rows(Lgn)
If Col(Lgn, 6) < TimeSerial(0, 0, 30) And Col(Lgn, 6) > 0 Then
.Font.ColorIndex = 3
Else
.Delete
End If
End With
Next Lgn
Application.ScreenUpdating = True
merci
@plus
petchy

9 réponses

cs_Stephane33 Messages postés 630 Date d'inscription samedi 15 février 2003 Statut Modérateur Dernière intervention 9 octobre 2011 1
8 avril 2006 à 21:47
Dim Plage As Range
Dim Col, Lgn as Integer
D'ailleurs ces deux variables sont déclarée dans la fonction précendente et à priori non utilisées

......
With Feuil1
Set Plage = .Range("A2", .Range("A65536").End(xlUp)).Resize(, 11)
End With
C'est un peu lourd et pas trop compréhensible
reprend par étapes quitte à écrire deux ligne de plus

(.......
Je vois pas trop ou tu veux en venir revoit ta syntaxe et vu le nom tu peux te permettre
Set Plage = Feuil1.Range......
Je sais pas à quoi correspond .Range("A65536").End(xlUp) A savoir si End(xlUp) est une proriété de .range("A65536") ou si c'est .range("A65536",Feuil1.End(xlUp)
CE ne serait pas plutôt
Set Plage =Feuil1.range("A2",Feuil1.End(xlUp)) ............)

Juste faites-le
0
cs_petchy Messages postés 710 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 19 mai 2015 4
8 avril 2006 à 22:02
Re Stéphane
en fait cette formule sélectionne toutes les lignes et celles qui sont inférieur à 30 secondes les met en rouges et supprime les autres lignes qui sont supérieur à 30 secondes.
mais bon si tu as plus simple et que j'arrive à intégré à VB6 je prends,


merci
petchy
0
galopin01 Messages postés 133 Date d'inscription lundi 4 octobre 2004 Statut Membre Dernière intervention 14 octobre 2011 1
10 avril 2006 à 05:59
0
galopin01 Messages postés 133 Date d'inscription lundi 4 octobre 2004 Statut Membre Dernière intervention 14 octobre 2011 1
10 avril 2006 à 06:00
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
galopin01 Messages postés 133 Date d'inscription lundi 4 octobre 2004 Statut Membre Dernière intervention 14 octobre 2011 1
10 avril 2006 à 06:03
bonjour,
Sorry, vraiment zarbi ce forum ! pourquoi les messages ne passent-ils pas dans le textbox évolué ?
...

Je suis bien d'accord que cette expression est un peu obscure, mais elle est (probablement )exacte.
par contre cette expression est (probablement) fautive :
Col = Plage.Value

Plage étant un tableau (de plusieurs cellules) : Col est un tableau (Array à 2 dimensions)
En fait tu fait en VBA (a peu près) la même erreur de formulation que dans ton explication :
"sélectionne toutes les lignes et celles qui sont inférieur à 30 secondes"
( les lignes ne sont jamais inférieures inférieures à 30 secondes, seule une cellule de cette ligne peut avoir une valeur...)

De ce fait si tu essaies d'évaluer Col aussitot après
Col = Plage.Value 'avec un msgbox
MsgBox Col 'tu produits une erreur, il faudrait écrire
MsgBox Col(1,1) '(par exemple)

Dans ces conditions il est très difficile d'évaluer la suite de ton code, dans tous les cas cette expression :
UBound(Col, 1) 'n'a pas de sens
A+
0
cs_petchy Messages postés 710 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 19 mai 2015 4
10 avril 2006 à 13:48
salut
en fait cette formule marche trés bien avec excel,ça me sélectionne bien les lignes qui sont inférieurs à 30s et le met en rouge,et les autre lignes sont supprimer.


la ligne qui me fait une erreur c'est :
Set Plage = .Range("A2", .Range("A65536").End(xlUp)).Resize(, 11)
bon aprés c'est "col ",donc c'est pour ça que je ne peut pas l'intéger dans VB6.je vais encore chercher
merci d'avoir répondu
petchy
0
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
11 avril 2006 à 00:50
Salut 55913 petchy, salut aux autres aussi,

je m'incruste juste un peu pour dire à =353504 galopin01 qu'il se trompe quand il dit "UBound(Col, 1) 'n'a pas de sens".

Ubound(Col,1) renvoie le plus grand indice de la 1ère dimension, en l'occurence ici 2
Ubound(Col,2) renvoie le plus grand indice de la 2ème dimension, en l'occurence ici 11.

Ensuite, 52847 Stephane33 a raison en ce qui concerne les "re-déclarations", ne les mets pas, ça va mieux sans (mais je crois que tu le sais) :)

Enfin, = 55913 petchy (eh, il s'intéresse à moi? c'est pas trop tôt), le message d'erreur que tu as sur cette ligne doit être :

Erreur d'exécution 424, un objet est requis

(Mince un télépathe! qui voit à distance! un visiopathe?)

Et pour cause, si tu prends directement ton 2ème bloc d'instructions (ah oui, on ne dit pas formule, mais bloc d'instructions, je te bloque là un peu pour te faire ton instruction :) ), qui est sûrement directement issu d'Excel (bon reflexe pour apprendre vite et bien), et que tu l'implémentes dans ton code VB,
VB n'arrivera pas à résoudre la référence présente dans ton rationnaliseur de code (un bloc With ...End With est un rationnaliseur de code)!
Feuil1 est une de classe qui existe de façon implicite cad pas besoin d'écrire Set Feuil1 = ActiveWorkbook.Sheets("Feuil1") ), mais qui n'existe pas de façon implicite dans VB!

Comment faire pour qu'elle existe dans VB? Ben, la réponse est soulignée entre les parenthèses de la phrase ci-dessus!

PS : ré-examine bien ton code, il y a d'autres instructions dans (à peu près) le même cas, qui ne déclenchent pas encore d'erreur, mais ça viendra un jour ou l'autre ! (et peut-être pas dans ce bloc d'instructions, cf effet de bord)

PS2 : plus simple, c'est pas forcément possible, plus modulaire, ça l'est sûrement :
Pourquoi ne pas faire une fonction FichierExiste() ?
Pourquoi ne pas faire une fonction TrierColonne() ?
Etc,
comme ça, tu isoles les problèmes dans des blocs précis, et quand tu poses une question, elle ne fait pas peur, au demeurant, et on trouve des solutions à chaque problème,
et toi, tu comprendras mieux la globalité de ton code, car tu jongleras avec des petites boites au lieu d'une palette SNCF de petites boites.


allez, gardes la pêche,
à+
rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais
</SUP>
0
cs_petchy Messages postés 710 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 19 mai 2015 4
11 avril 2006 à 15:33
salut
merci rvblog d'avoir répondu à l'appel de la détresse :(
mais pourrais tu m'expliquer un peu plus :
Pourquoi ne pas faire une fonction FichierExiste() ?
Pourquoi ne pas faire une fonction TrierColonne() ?
et me donner un exemple
merci
petchy
0
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
11 avril 2006 à 22:48
Salut petchy,

ce n'était qu'une approche méthologique pour t'inciter à découper un peu ton code, afin d'éviter d'avoir une si grande procédure à nous présenter (alors qu'il n'y a qu'une ligne en erreur!).

Cette approche s'appelle la modularité, et elle consiste à créer des modules, atomiques (le plus petit possible) et génériques (rendant le plus de services possibles aux plus grand nombre possible).

Une fois que tu as créé des petits outils, on ne trouve dans ta procédure que les appels à tes outils (donc, moins de lignes de code).

voilà, c'est tout!

au fait, ça marche maintenant?

à+


rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais
</SUP>
0
Rejoignez-nous