Pb Range avec WS as Worksheet de _Thierry

laurent45

XLDnaute Occasionnel
Bonjour le Forum,

Je n'arrive pas à trouver ce que je fais de travers.
J'utilise le principe souvent utilisé par le Ô Grand _Thierry (notre maître) ;) : la variable WS as Worksheet

Dans certains cas, je reçois une erreur
Méthode Range non gérée par l'objet Worksheet

Je joins mon fichier avec plus de détail.
[file name=Caisse_20050918135411.zip size=46572]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Caisse_20050918135411.zip[/file]

Merci

Laurent
 

Pièces jointes

  • Caisse_20050918135411.zip
    45.5 KB · Affichages: 33

_Thierry

XLDnaute Barbatruc
Bonjour Laurent, le Forum

Je te remercie des qualificatifs, mais je ne suis pas votre Maître, juste un Contributeur de longue date sur XLD où j'ai beaucoup appris aussi. Ce que je sais je vous le dois et je repartage à mon tour, c'est tout.

Pour ton histoire de WS c'est tout simplement que tu n'utilises pas With / End With

Regarde :
Public Sub Initialise_CRT()
Dim rep As Byte, don As Range, d As Date
Set WS = ThisWorkbook.Worksheets('C.R.T.')
WS.Columns('C:BB').EntireColumn.Hidden =
False
' initialisation de la Cellule 'CRTTotal', pour déclarer la liste des Montants des C.R.T. : CRTRange
3

With WS
     
Set CRTTotal = WS.Range('CC1').End(xlToLeft).Columns
     
Set CRTFin = CRTTotal.End(xlToLeft).Columns
     
Set CRTRange = Range(Cells(1, 3), Cells(1, CRTFin.Column))
     
     
If .Cells(1, CRTFin.Column).Value = 'DATES' Then Set CRTRange = Nothing: Exit Sub
      d =
Date
     
Set CRTMyRange = .Range('B2:B15')
     
Set CRTLadate = CRTMyRange.Find(what:=d, after:=CRTMyRange(1, 1), LookIn:=xlFormulas, lookat:=xlPart, _
          SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
     
' si CRTLadate <> de Date => demander une mise à jour des dates
&nbsp; &nbsp; &nbsp;
If CRTLadate Is Nothing Then rep = MsgBox('Vous n'avez pas remis les dates à jour ! ' & vbCr & vbCr & _
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'Pour mettre à jour
'OK' ', vbCritical + vbOKCancel, _
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Application.ActiveSheet & '\ Information')
&nbsp; &nbsp; &nbsp;
If rep = vbYes Then
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ModuleGeneral.Changer_la_date&nbsp; &nbsp;
' Mise à jour des dates
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rep = vbCancel:
GoTo 3&nbsp; &nbsp; ' Réinitialisation de la ligne de date
&nbsp; &nbsp; &nbsp;
End If
&nbsp; &nbsp; &nbsp;
For Each don In .Range('B2:B15')
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
If don = Date Then
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
If Time < #6:00:00 PM# Then
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Set CRTDateRange = .Range(.Cells(CRTLadate.Row, 3), _
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Cells(CRTLadate.Row, CRTFin.Column)):
Exit For
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
ElseIf Time >= #6:00:00 PM# Then
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Set CRTDateRange = .Range(.Cells(CRTLadate.Row + 1, 3), _
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Cells(CRTLadate.Row, CRTFin.Column)):
Exit For
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
End If
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
End If
&nbsp; &nbsp; &nbsp;
Next don
&nbsp; &nbsp; &nbsp; Accueil_Form.TotalCRTBox.Value = Format(CDbl(.Cells(CRTDateRange.Row, 54).Value), '0.00')
&nbsp; &nbsp; &nbsp;
End With
End Sub

C'est tout !

NB Supprimes les Selections d'Objets Range car là c'est la cause de ton Message d'Erreur, tu ne pourras pas sélectionner une Range en Provenance de WS tant que tu n'auras pas séléctionner WS elle-même avant (C'est logique, on ne peut pas séléctionner le Lait dans le Frigo de la cuisine, si on ne Selectionne pas la Cuisine d'abord !)

Par contre j'ai planté deux fois mon Excel avec un PIII 800 512 de Ram sous Win ME / Office 2000 en RunTime de ton USF pour des essais successifs pour tenter d'arranger ton histoire de Valeur Text... En plus je ne vois pas où tu renvois dans ton codes les CRTTab et autres CRTTab2 vers la feuille... Essaie d'envoyer avec Cells(L, C) = Val(CRTTab(x, l))

De plus ce code est vraiment 'embrouillé' pour moi avec toutes ces variables publics et ces Goto Label ... Je suis en train de travailler sur la migration VB6 (com) vers le Dot.Net et c'est justement ce que j'apprends en ce moment au niveau des structures de codes à éviter.

Bon Courage et merci du compliment
[ol]@+Thierry[/ol]
 

Sylvie

XLDnaute Accro
Bonjour Laurent45, Coucou Thierry Contributeur de longue Date

juste pour te dire Thierry que je prends très bonne note de ta référence au lait dans le frigo et du frigo dans la cuisine.
Racontée comme cela, l'histoire des Objets me parle vraiment !

Je ne te savais pas conteur en plus !! ;) ;)

A++
 

laurent45

XLDnaute Occasionnel
Bonjour _Thierry, Sylvie,

Merci Thierry pour ces explications. Je ne maîtrise pas du tout le principe With, qui pourtant doit être une base. Je vais réétudier la dessus.

Pour les plantages, ça vient surement du fait que je n'est mis qu'une partie du programme. Ca doit être la même chose pour le renvois des CRTTab et CRTTab2. (Selon moi, ils se trouvent dans Private Sub EnregistrerCRT_bc_Click() ).

Je vais donc retravailler sur tout ça.

A bientôt, et encore un grand merci

P.S. : Pour 'Le Ô Grand Maître', c'était juste pour dire (et je ne pense pas être le seul), que je souhaite devenir un contributeur aussi efficace que Toi.

Laurent
 

laurent45

XLDnaute Occasionnel
Re Thierry, Sylvie,

J'ai maintenant un soucis avec Sub Changer_la_date().
Code:
Public Sub Changer_la_date()
Dim Counter As Double, l As Double, cell As Range, i As Single
    Counter = 0
With WS
    If IsEmpty(.Range('B2')) Then
        .Range('B15').Select: GoTo 1
    End If
    For Each cell In .Range('B2:B15')
        If IsDate(cell) Then
                .Cells(cell.Row, 2).Select: Exit For
        End If
    Next
    For i = cell.Row + 2 To 14 Step 2
        If IsEmpty(.Cells(i, 2).Value) Then
            .Cells(i - 2, 2).Select: Exit For
        Else: Counter = Counter + 1
        End If
    Next
    If Counter = 6 Then
        .Range('B15').Select
    End If
End With
1   Ajout_mois (Selection.Value)
End Sub
Il me cherche les cellules de date sur la Feuille ACCUEIL au lieu de C.R.T., malgré les changement que tu m'a indiqué. :angry:
J'ai essayé d'ajouter With / End With dans Sub Changer_la_date(), mais j'ai le message : :whistle:
'Erreur d'exécution '91'
Variable objet ou variable de bloc With non définie
J'ai mis un espion sur WS dans Sub Changer_la_date(), et il renvoit 'Nothing'. :eek:
Il est vraie que la variable WS est définie dans le Module 'Accueil_Form' alors que Sub Changer_la_date() est dans le 'ModuleGeneral'...
Ca doit venir de ça :eek:

@+

Laurent
 

laurent45

XLDnaute Occasionnel
Re à tous, le Forum,

J'ai réussi plusieurs choses. :woohoo: :p ;)

Déjà pour mon problème avec le changement de date :
J'ai ramené les Sub et Function concernées dans le module 'Accueil_Form', et avec With / End With, j'ai modifié tous les .Select, et ça fonctionne. ;)

Pour le problème de format text :
Code:
EnregistrerCRT_bc_Click()
...
    For z = 0 To CRTBox.ListCount - 1
          CRTDateRange.Cells(, z + 1).Value = CRTTab2(z, 1)
          CRTRange.Cells(, z + 1).Value = Format(CDbl(CRTTab2(z, 0)), '0.00') 'Copie des donées sur la Feuille
          If CRTDateRange.Cells(, z + 1).Value = 0 Then CRTDateRange.Cells(, z + 1).Value = ''
     Next z
J'ai remplacé par :
Code:
    For z = 0 To CRTBox.ListCount - 1
          CRTDateRange.Cells(, z + 1).Value = CRTTab2(z, 1)
          CRTRange.Cells(, z + 1).Value = CDbl(CRTTab2(z, 0)) 'Copie des donées sur la Feuille
          If CRTDateRange.Cells(, z + 1).Value = 0 Then CRTDateRange.Cells(, z + 1).Value = ''
     Next z
Le problème, c'est que mon Code du module 'Accueil_Form' devient de plus en plus long. Et plus difficile pour la navigation.

Encore merci Thierry.

Edit1 : Par contre, si tu as des infos pour mes variable public (précédent post de ta part), je serais heureux de simplifier mon code.
Edit2 : J'ai retravaillé les GOTO. Mes conditions IF THEN étaient montées à l'envers. Une fois remis dans l'ordre, pls de GOTO. Petit à petit, mon prgramme devient plus simple. ;)

@+

Message édité par: Laurent45, à: 19/09/2005 15:54

Message édité par: laurent45, à: 21/09/2005 11:16
 

Statistiques des forums

Discussions
300 761
Messages
1 987 018
Membres
209 681
dernier inscrit
Excelcrable