Probleme enregistrement de données sur excel

thunderpat59199 Messages postés 32 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 28 décembre 2007 - 5 juin 2007 à 19:19
jrivet Messages postés 7393 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 - 19 juin 2007 à 07:55
j'arrive pas a faire un enregistrement sur plusieurs cellules
je voudrais qu'a chaque donnee envoyé par le port série soit enregistrer à la suite dans excel

Dim exc As New Excel.Application
Workbooks.Add
Sheets("Feuil1").Select
Sheets("Feuil1").Name = "mafeuille"
Range("A2").Select

ActiveCell.FormulaR1C1 = b

ActiveWorkbook.SaveAs FileName:="C:\TxtNumComm.Text.xls", FileFormat:= _
xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
, CreateBackup:=False
ActiveWorkbook.Close
Set exc = Nothing

pour plus d'explication b c'est la donnée de la rs232

26 réponses

cs_lermite222 Messages postés 492 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 2 juillet 2012 4
5 juin 2007 à 22:21
bonjour,
1°) ActiveCell.FormulaR1C1 .. n'est pas une saisie donnée, il faut pour cela mettre
Range("A2).value=b
2°) Tu veux sauver tout un classeur pour mémoriser une donnée ?
si c'est pour ca tu met simplement ..
 ActiveWorkbook.Save .. Si le classeur n'a pas encore de nom il te le demande
a+
louis
0
thunderpat59199 Messages postés 32 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 28 décembre 2007
6 juin 2007 à 06:12
non en fait je recoit les données d'un automate sur le port serie moi je veux que sur la feuille  toute les données .
exemple :
1er donnée dans la cellule a1
2e donnée dans la cellule a2
ect
0
jrivet Messages postés 7393 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
6 juin 2007 à 08:57
Salut,
As tu une erreur? ou bien est ce que cela ne fait pas ce que tu souhaites?

@+: Ju£i?n
Pensez: Réponse acceptée
0
thunderpat59199 Messages postés 32 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 28 décembre 2007
6 juin 2007 à 10:33
j'ai bien remis range(a1).value=b

maintenant je voudrai sur la meme feuille et le meme classeur mettre les données recu sur a1 puis a2 puis a3 ect

voici le code
'Déclaration des variables
Dim appExcel As Excel.Application 'Application Excel
Dim wbExcel As Excel.Workbook 'Classeur Excel
Dim wsExcel As Excel.Worksheet 'Feuille Excel


'Ouverture de l'application
Set appExcel = CreateObject("Excel.Application")
'Ajout d'un classeur car à l'ouverture d'Excel il n'y a aucun classeur d'ouvert
appExcel.Workbooks.Add 'Ceci n'est nécessaire que si vous n'ouvrez pas un fichier existant
'Récupération du classeur par défaut
Set wbExcel = appExcel.ActiveWorkbook
'Récupération de la feuille par défaut
Set wsExcel = wbExcel.ActiveSheet
wsExcel.Range("A1") = b


 ActiveWorkbook.SaveAs FileName:="C:\TxtNumComm.Text.xls", FileFormat:= _
xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
, CreateBackup:=False
ActiveWorkbook.Close
0

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

Posez votre question
jrivet Messages postés 7393 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
6 juin 2007 à 11:25
Salut,
La ligne peu tres bien être une variable
Exemple

Dim Li As Long
Li = 1
Range("A" & CStr(Li)).Value = b1, ----
[code.aspx?ID=41455 By Renfield]
Donc tu peux faire une boucle For sans problème

@+: Ju£i?n
Pensez: Réponse acceptée
0
thunderpat59199 Messages postés 32 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 28 décembre 2007
6 juin 2007 à 11:33
je ne comprend pas ton programe car je suis novice en vb
0
jrivet Messages postés 7393 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
6 juin 2007 à 11:41
JE te dit que

wsExcel.Range("A1") = b

Peu aussi être écrit ainsi

wsExcel.Range("A" & Li ).Value = b
Et que donc tu peux peu faire une boucle qui incremeentera  Li (c'est pas un code c'est du francais)

@+: Ju£i?n
Pensez: Réponse acceptée
0
thunderpat59199 Messages postés 32 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 28 décembre 2007
6 juin 2007 à 11:51
j'ai fait une boucle mais le logiciel se bloque

voici le code

Dim li As Long
li = 1
For li = 1 To 30000
wsExcel.Range("A" & li).Value = b
Next
li = li + 1
0
jrivet Messages postés 7393 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
6 juin 2007 à 11:55
Salut
Normal 30000 lignes c'est long à remplir (avec la meme valeur à chaque fois d'ailleurs normal?)
NOTE: li 1 et li li + 1 sont des lignes inutiles.

@+: Ju£i?n
Pensez: Réponse acceptée
0
thunderpat59199 Messages postés 32 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 28 décembre 2007
6 juin 2007 à 12:15
j'ai enlevé li=1 et li=li+1 et mit li jusque 30

mais ca n'enregistre pas sur les cellule a2 a3 etc
0
jers19 Messages postés 9 Date d'inscription mardi 5 juin 2007 Statut Membre Dernière intervention 18 juin 2007
6 juin 2007 à 19:57
Salut

Mais comment tu fais pour savoir que ta trame rs232 est complète, tu interceptes le caractère de fin de chaine ?

Car si tel est le cas, une fois que tu a ta trame, il te suffit de compter le nombre de trame transmise et de te déplacer dans ton classeur excel pour inscrire tes données avec la commande Range("A2").Offset(nbreTrame,0).value = ValeurDeTaTrame
0
thunderpat59199 Messages postés 32 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 28 décembre 2007
6 juin 2007 à 20:12
oui c'est bien ça
la valeur que je recoit je fais une conversion es ce que ca change quelque chose
comment on fait pour calculer le nombre de trame?
et donc avec le nombre de trame chaque valeur vont etre mis dans plusieurs cellule?
0
jers19 Messages postés 9 Date d'inscription mardi 5 juin 2007 Statut Membre Dernière intervention 18 juin 2007
6 juin 2007 à 21:19
Etant donnée que ton caractère de fin de chaine est tjs le même, tu sais combien de caractères il utilise;
Tu peux donc déterminer le contenu de ta trame en supprimant le nbre de caractères conrrespondant à ta fin de chaine.
par ex si ta fin de chaine est matérialisée par 1 caractère( ici c'est la virgule).

Dim chaineresultats
As
String
Dim Longueur
As
Integer
Dim FinDeChaine
As
String =
","

If Microsoft.VisualBasic.Right(chaineresultats, 1) <> FinDeChaine
Then
      MsgBox(
"Problème de communication, recommencer l'envoi", vbInformation,
"Erreur")
      
GoTo Fin

Else
Longueur = Len(chaineresultats)
NbreTrames += 1

'**************************
'*Traitement des résultats*
'**************************
Dim Matrame
As
String = Microsoft.VisualBasic.Left(chaineresultats, Longueur - 1)
appExcel.Range(
"A1").Offset(NbreTrames, 0).Value = Matrame
End If

Fin:

Par contre il faut que tu déclares ds un module la variable NbreTrames en public et que tu l'initialises à 0.
0
cs_lermite222 Messages postés 492 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 2 juillet 2012 4
6 juin 2007 à 22:05
bonjour jers19, tu va faire perdre la tête au garcon là, ce que tu lui propose est du VB.Net et celà ne fonctionne pas en VBA.


Il faut d'abord déclarer les variables




Dim chaineresultats As String


Dim Longueur As


Integer
Dim FinDeChaine As String
FinDeChaine = ","


NbreTrames =NbreTrames +1
je ne vois pas non plus ce que veux dire avec
IfMicrosoft.VisualBasic.Right(chaineresultats, 1)
<> FinDeChaine Then
      MsgBox(
"Problème de communication, recommencer l'envoi", vbInformation,
"Erreur")

 A+
louis
0
cs_lermite222 Messages postés 492 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 2 juillet 2012 4
6 juin 2007 à 22:18
en VBA je dirais plutôt,
quand tu a ta "trame" complète, je ne sais pas de quel façon tu fais pour celà,
la transposé dans une variable (  MaTrame   ) par exemple
dim e as integer

'Détermine la dernière donnée de la colonne
e = (Range("A65536").End(xlUp).Row) +1<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>Range("A" & e).value =MaTrame
'A chaque fois que tu mettras une nouvelle donnée
elle serra mise en fin de file sur la colonne.
A+
louis
0
jers19 Messages postés 9 Date d'inscription mardi 5 juin 2007 Statut Membre Dernière intervention 18 juin 2007
6 juin 2007 à 23:03
Autant pour moi, excuse moi thunderpat59199,je pensais que tu voulais piloter excel depuis vb.

En ajoutant au déclaration Static NbreTrame et en réécrivant les fonctions left et right, cela devrait marcher.

Dim Matrame AsString
MaTrame = Left(chaineresultats, Longueur - 1)

Pour répondre à lermite22,
if FinChaine <> Right(ChaineResultat,1) permet de vérifier lorsque la rs232 génére un évenement (produit par le composant mscomm) que le caractère de fin de chaine a bien été reçu. Comme ça on est sur d'avoir recu la chaine complète.

Voilà, et merci à toi lermite22 de m(avoir signaler mon erreur, a+
0
thunderpat59199 Messages postés 32 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 28 décembre 2007
7 juin 2007 à 06:03
je veux bien enregistrer les données sur excel.
je ne comprend plus ce qu'il faut mettre maintenant comme code
0
jers19 Messages postés 9 Date d'inscription mardi 5 juin 2007 Statut Membre Dernière intervention 18 juin 2007
7 juin 2007 à 20:19
Salut
Tu peux essayer ca


----------------------------
Sub DonnéesDansExcel()



Dim chaineresultats As String
Dim Longueur As Integer
Dim FinDeChaine As String
Static NbreTrames As Integer   'permet de garder la valeur de la variable tant que l'appli tourne


FinDeChaine = ","   'ici il faut que tu renseignes le caractère de fin de chaine de ton protocole de com rs232



'ici tu vérifies si ton caractère de fin de chaine a été transmis,  le chiffre après la virgule est fonction de ton 'caractère de fin de chaine (dans mon exemple c'est la virgule, donc 1)
 
If Right(chaineresultats, 1) <> FinDeChaine Then
         MsgBox "Problème de communication, recommencer l'envoi", vbOKOnly, "Erreur"
         GoTo Fin
Else
         Longueur = Len(chaineresultats)   'indique la longueur de la chaine (avec le caractère de fin de chaine)
         NbreTrames = NbreTrames + 1   's'incrémente à chaque fois qu'une chaine de caractères est recue

'la fonction left de permet de lire ta chaine en enlevant le caractère de fin de chaine  (comme dans la 
'fonction right, le chiffre après la virgule dépend de ton caractère de fin de chaine      
ActiveSheet.Range("A1").Offset(NbreTrames, 0).Value = Left(chaineresultats, Longueur - 1)
End If
Fin:
End Sub
0
thunderpat59199 Messages postés 32 Date d'inscription mardi 10 avril 2007 Statut Membre Dernière intervention 28 décembre 2007
12 juin 2007 à 12:24
bonjour,

la données que je veux envoyer et dans un label

dans mon prog c'est LblAffichage.caption

comment fait on pour ranger chaque valeurs affichées
sur a1  puis a2 puis a3
0
jers19 Messages postés 9 Date d'inscription mardi 5 juin 2007 Statut Membre Dernière intervention 18 juin 2007
12 juin 2007 à 19:17
Le mieux serait d'enregistrer ta trame dans une variable (par ex chaineresultats) et de déclarer cette variable en public dans ton module (avant toute sous routine).

Si tu veux afficher la trame dans un label, il te suffit d'écrire Userform1.LblAffichage.Caption = chaineresultats
(ds mon ex. le formulaire contenant le label s'appelle Userform1, si ton formulaire se nomme autrement, il faut remplacer userform1 par son nom).
0