VBA difficulté pour soustraire deux valeurs

Résolu/Fermé
florent5528 Messages postés 104 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 24 juin 2022 - Modifié par florent5528 le 31/01/2012 à 20:59
florent5528 Messages postés 104 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 24 juin 2022 - 1 févr. 2012 à 19:09
Bonjour,

Je travaille sous exel 2007.

j'ai une première feuille sur laquelle je remplis différents items.

Lorsque j'active la macro, cela récupère les items remplis et les rentre dans un tableau.

J'ai une petite sous macro qui indique qu'à chaque activation de la macro je dois remplir la ligne suivante.

La récupération et l'écriture des données ne pose pas de soucis.

Dans les items à remplir il y a l'heure de début et l'heure de fin à remplir.
Je récupère ces items toujours dans les mêmes colonnes.
Je souhaiterai que automatiquement une sous macro calcule le temps passé et l'indique dans une troisième colonne sur la ligne correspondante.

les données à utiliser sont sous la forme hh:mm
et le résultat devrait s'afficher sous la même forme

J'ai un peu cherché et trouvé ceci et qui d'après la personne fonctionne normalement

Sheets("Données").Cells(Ligne, 5).Select
ActiveCell.FormulaR1C1 = "=RC[-1]-RC[-2]"

dans mon cas j'ai une erreur a la première ligne du code précédent.

Auriez vous une idée ou des suggestion?

Pour vous aidez voici le code de ma macro dans son ensemble.

Private Sub CommandButton1_Click()

Dim Numéro_intervention As String
'Macro permettant l'affichage d'un message d'erreur et d'empécher le transfert de donnés si le numéro d'intervention est vierge
'je l'informe que la variable numéro_intervention sera du texte
Numéro_intervention = Range("B1").Value
If Numéro_intervention = "" Then Sheets("Remplissage").Range("B1").Select
If Numéro_intervention = "" Then MsgBox "NUMERO D'INTERVENTION MANQUANT !", vbCritical, "Erreur"
'si la variable est vierge => affichage d'une boite de dialogue d'erreur, avec juste bouton, ok "message",type de boite, "titre"
If Numéro_intervention = "" Then Exit Sub
'Si variable vierge stopper la macro

Dim Ligne As Long

Ligne = ThisWorkbook.Worksheets("Remplissage").Range("A16").Value
'cette ligne permet de savoir a partir de quelle ligne écrire les données rentrées pour éviter la surécriture

Sheets("Données").Cells(Ligne, 1).Value = Sheets("Remplissage").Range("B1").Value 'n°d'inter
Sheets("Données").Cells(Ligne, 2).Value = Sheets("Remplissage").Range("B3").Value 'mois de l'année
Sheets("Données").Cells(Ligne, 3).Value = Sheets("Remplissage").Range("B5").Value 'Heure de début
Sheets("Données").Cells(Ligne, 4).Value = Sheets("Remplissage").Range("B7").Value 'Heure de fin
Sheets("Données").Cells(Ligne, 7).Value = Sheets("Remplissage").Range("B9").Value 'ISP
Sheets("Données").Cells(Ligne, 8).Value = Sheets("Remplissage").Range("B11").Value 'vecteur
Sheets("Données").Cells(Ligne, 9).Value = Sheets("Remplissage").Range("B13").Value 'commune

Sheets("Données").Cells(Ligne, 10).Value = Sheets("Remplissage").Range("E1").Value 'Niveau de soins
Sheets("Données").Cells(Ligne, 11).Value = Sheets("Remplissage").Range("E3").Value 'PISU
Sheets("Données").Cells(Ligne, 12).Value = Sheets("Remplissage").Range("E13").Value 'SAI
Sheets("Données").Cells(Ligne, 13).Value = Sheets("Remplissage").Range("E5").Value 'SMUR présent
Sheets("Données").Cells(Ligne, 14).Value = Sheets("Remplissage").Range("E7").Value 'Avant SMUR
Sheets("Données").Cells(Ligne, 15).Value = Sheets("Remplissage").Range("E9").Value 'Avant VSAV
Sheets("Données").Cells(Ligne, 16).Value = Sheets("Remplissage").Range("E11").Value 'Transport

Sheets("Données").Cells(Ligne, 5).Select
ActiveCell.FormulaR1C1 = "=RC[-1]-RC[-2]"


ThisWorkbook.Worksheets("Remplissage").Range("A16").Value = Ligne + 1
'cette ligne indique que la valeur de la ligne A16 doit être augmenté de plus un. C'est la fin de la procédure lancé à la 1ère ligne

ActiveWindow.ScrollRow = 1
'j'ai gardé volontairement cette ligne pour ramener à la bonne place une feuille éventuellement déplacer cela équivaut à remonter la page avec la molette de la souris

Range("B1").ClearContents
Range("B3").ClearContents
Range("B5").ClearContents
Range("B7").ClearContents
Range("B9").ClearContents
Range("B11").ClearContents
Range("B13").ClearContents
Range("E1").ClearContents
Range("E3").ClearContents
Range("E13").ClearContents
Range("E5").ClearContents
Range("E7").ClearContents
Range("E9").ClearContents
Range("E11").ClearContents
' en cas de dysfonctionnement la macro de base est:
' Range("I7").Select
' Selection.ClearContents
' au lieu de: Range("I7").ClearContents
Range("B1").Select

End Sub


Je précise que je suis débutant en VBA et que je suis preneur de tout autre conseil en plus de mon problème si vous voyez des aberrations

Merci
A voir également:

4 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
1 févr. 2012 à 11:51
Bonjour à tous,

Sans avoir le classeur sous les yeux, on va tourner en rond ....

pour joindre une pièce
mettre le classeur sans données confidentielles en pièce jointe sur
https://www.cjoint.com/
et faire un clic droit sur le lien proposé puis "copier l'adresse du lien" et coller dans le message de réponse
1
florent5528 Messages postés 104 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 24 juin 2022
1 févr. 2012 à 17:15
Bonjour

Voici l'adresse du document

https://www.cjoint.com/?0BbrpF7iRtT
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 1/02/2012 à 18:02
avec le classeur en main, on peut tester ce qu'on fait; sinon, on reste souvent dans le verbiage
partie de la macro corrigée (il te reste à compléter la ligne de nettoyage de la feuille "remplissage)

Dim Ligne As Integer   
With Sheets("Données")   
     'cette ligne permet de savoir a partir de quelle ligne écrire les données rentrées pour éviter la surécriture   
     Ligne = .Columns("E").Find("*", , , , , xlPrevious).Row + 1   
     .Cells(Ligne, 1).Value = Sheets("Remplissage").Range("B1").Value 'n°d'inter   
     .Cells(Ligne, 2).Value = Sheets("Remplissage").Range("B3").Value 'mois de l'année   
     .Cells(Ligne, 3).Value = Sheets("Remplissage").Range("B5").Value 'Heure de début   
     .Cells(Ligne, 4).Value = Sheets("Remplissage").Range("B7").Value 'Heure de fin   
     .Cells(Ligne, 7).Value = Sheets("Remplissage").Range("B9").Value 'ISP   
     .Cells(Ligne, 8).Value = Sheets("Remplissage").Range("B11").Value 'vecteur   
     .Cells(Ligne, 9).Value = Sheets("Remplissage").Range("B13").Value 'commune   
     .Cells(Ligne, 10).Value = Sheets("Remplissage").Range("E1").Value 'Niveau de soins   
     .Cells(Ligne, 11).Value = Sheets("Remplissage").Range("E3").Value 'PISU   
     .Cells(Ligne, 12).Value = Sheets("Remplissage").Range("E13").Value 'SAI   
     .Cells(Ligne, 13).Value = Sheets("Remplissage").Range("E5").Value 'SMUR présent   
     .Cells(Ligne, 14).Value = Sheets("Remplissage").Range("E7").Value 'Avant SMUR   
     .Cells(Ligne, 15).Value = Sheets("Remplissage").Range("E9").Value 'Avant VSAV   
     .Cells(Ligne, 16).Value = Sheets("Remplissage").Range("E11").Value 'Transport   
     .Cells(Ligne, 5) = .Cells(Ligne, 4) - .Cells(Ligne, 3) 'calcul du temps de travail   
 End With   
ActiveWindow.ScrollRow = 1   
'j'ai gardé volontairement cette ligne pour ramener à la bonne place une feuille éventuellement déplacer cela équivaut à remonter la page avec la molette de la souris   

'---nettoyage saisies   
With Sheets("remplissage")   
Range("B1,B3,B5,B7").ClearContents 'A COMPLETER   
End With
0
florent5528 Messages postés 104 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 24 juin 2022
1 févr. 2012 à 19:09
ça fonctionne

un grand merci pour le coup de main et pour toutes les infos que j'ai pu glaner dans ta macro

cela me resservira pour bien d'autre chose
0
Bonsoir
quel type d'erreur?


A+
0
florent5528 Messages postés 104 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 24 juin 2022
1 févr. 2012 à 16:58
Bonjour

Le message d'erreur indique ceci

Erreur d'excécution '1004'
La méthode de Selection de la classe Range à échoué
0
Bonjour,

Sheets("Données").Cells(Ligne, 5).Select

1) Verifier le nom de la feuille "Données".
2) Verifier que la variable Ligne prend une valeur strictement positive.

;)
0
florent5528 Messages postés 104 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 24 juin 2022
1 févr. 2012 à 17:06
Bonjour

J'ai vérifier le nom de la feuille données, a priori aucun souci

pour le petit 2 j'ai changé la variable ligne en lui donner le type Byte et non long comme avant
j'ai eu un nouveau message d'erreur de type '6'
dépassement de capacité
0
florent5528 Messages postés 104 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 24 juin 2022
Modifié par florent5528 le 1/02/2012 à 17:12
j'ai essayé de nouveau,
en mettant integer au lieu de byte qui donnait erreur 6
et au lieu de Long comme au départ qui donne erreur 1004.

Integer me donne comme aussi une erreur 1004 et ça déconne au même niveau que si la variable est de type Long

du coup j'ai envie de dire que cela ne provient pas du type de variable.

Et merci pour le coup de main
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
1 févr. 2012 à 17:14
C'est pour cela que je te t'avais demandé de voir le classeur mais je ne voudrais pas te déranger...
0
florent5528 Messages postés 104 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 24 juin 2022
1 févr. 2012 à 17:27
tu ne me déranges pas du tout
En plus c'est moi qui demande de l'aide
et toi qui a la gentillesse de m'aider à avancer
0
re

Je n'arrive pas à reproduire l'erreur!

dans Sheets("Données"), n'y a t il pas un espace en trop ou un caractère qui diffère par rapport au nom de la feuille?
C'est curieux puisque cette feuille est utilisée plusieurs fois.

Pour la valeur de Ligne essaie ceci
Ligne = Val(Worksheets("Remplissage").Range("A16").Value)
On force en numérique la valeur lue en texte.

Peut-être que les deux erreurs sont liées, commence par rajouter val .... et vois...

A+
0
florent5528 Messages postés 104 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 24 juin 2022
Modifié par florent5528 le 1/02/2012 à 17:18
Après vérification pas d'erreur dans le terme

Et après essaie de ta nouvelle ligne de code cela dysfonctionne au même endroit et avec le même code erreur qu'avant
0