thunderpat59199
Messages postés32Date d'inscriptionmardi 10 avril 2007StatutMembreDernière intervention28 décembre 2007
-
5 juin 2007 à 19:19
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDerniè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
cs_lermite222
Messages postés492Date d'inscriptionjeudi 5 avril 2007StatutMembreDernière intervention 2 juillet 20124 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
thunderpat59199
Messages postés32Date d'inscriptionmardi 10 avril 2007StatutMembreDernière intervention28 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
thunderpat59199
Messages postés32Date d'inscriptionmardi 10 avril 2007StatutMembreDernière intervention28 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
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 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.
jers19
Messages postés9Date d'inscriptionmardi 5 juin 2007StatutMembreDernière intervention18 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
thunderpat59199
Messages postés32Date d'inscriptionmardi 10 avril 2007StatutMembreDernière intervention28 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?
jers19
Messages postés9Date d'inscriptionmardi 5 juin 2007StatutMembreDernière intervention18 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")
'**************************
'*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.
cs_lermite222
Messages postés492Date d'inscriptionjeudi 5 avril 2007StatutMembreDernière intervention 2 juillet 20124 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")
cs_lermite222
Messages postés492Date d'inscriptionjeudi 5 avril 2007StatutMembreDernière intervention 2 juillet 20124 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
jers19
Messages postés9Date d'inscriptionmardi 5 juin 2007StatutMembreDernière intervention18 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+
jers19
Messages postés9Date d'inscriptionmardi 5 juin 2007StatutMembreDernière intervention18 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
jers19
Messages postés9Date d'inscriptionmardi 5 juin 2007StatutMembreDernière intervention18 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).