K8055 + Visual basic et excel

Fermé
charlesprogelec Messages postés 3 Date d'inscription jeudi 10 mai 2012 Statut Membre Dernière intervention 14 mai 2012 - 11 mai 2012 à 14:32
charlesprogelec Messages postés 3 Date d'inscription jeudi 10 mai 2012 Statut Membre Dernière intervention 14 mai 2012 - 14 mai 2012 à 10:25
Bonjour,
Je vais vous expliquez mon idée je veux installe 1 capteur TOR branché sur un relay puis au K8055 relié en USB à mon PC( avec excl et vb 2010).
Ainsi chaque fois que mon capteur detectera quelque chose ma digital input 1 sera à 1. De plus je souhaite recuperer mes données date et heure de chaque detection sur excel pour pouvoir tracer des graphes avec excel. J'ai comme vous l'avez vu ,j'ai mis un while 1 dans l'idée que lorsque je lance mon apllication exe elle tourne en continue de plus je fais un test pour voir si l'on change de jour car si on change de jour je crée un nouveau fichier.J'ai aussi mis une sauvegarde automatique tout les 100 flacons. Le probleme c'est que quand je compile

je vois

Erreur 1004 définie par l'application ou par l'objet

J'espère que vous pourriez me donner quelque piste pour m'aider à faire marcher ce programme.

'Je lance le programme au démarrage
'Lancer un programme au démarrage du PC -> Sans toucher au registre( menu Démarrer )

'Option Explicit


Private Declare Function OpenDevice Lib "K8055d.dll" (ByVal CardAddress As Long) As Long
Private Declare Sub CloseDevice Lib "K8055d.dll" ()
Private Declare Function SetCurrentDevice Lib "K8055d.dll" (ByVal CardAddress As Integer) As Integer
Private Declare Function SetTimer Lib "user32.DLL" ( _
ByVal HWnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc As Long)
Private Declare Function KillTimer Lib "user32.DLL" ( _
ByVal HWnd As Long, ByVal nIDEvent As Long)
Private Declare Function ReadAllDigital Lib "K8055d.dll" () As Long
Private Declare Function ReadDigitalChannel Lib "K8055d.dll" (ByVal Channel As Long) As Boolean
Private Declare Sub SetAllDigital Lib "K8055d.dll" ()
Private Declare Function WriteAllDigital Lib "K8055d.dll" (ByVal Data As Long) As Long
Private Declare Function ReadCounter Lib "K8055d.dll" (ByVal CounterNr As Long) As Long
Private Declare Sub ResetCounter Lib "K8055d.dll" (ByVal CounterNr As Long)
Private Declare Sub SetCounterDebounceTime Lib "K8055d.dll" (ByVal CounterNr As Long, ByVal DebounceTime As Long)




        '////////////////////////////Initialisation des variables/////////////////////////////
        

Dim Channel(8) As String
Dim TimerID As Long
Dim TimerSeconds As Single
Dim Connected As Boolean



 Dim Byt As Boolean
 
 Dim Date_jour As String
 Dim heure_detection As String
 ' Dim Date_jour As Date
 ' Dim heure As Date
 
 
Dim nb_flacon As Integer
Dim N As Long
Dim D As String
 'variable connexion à la carte
Dim CardAddress As Long
Dim h As Long

 

            '////////////////////////////////////LES FONCTIONS////////////////////////////////
            
            
'Fonction derniere ligne
            
Sub Derniereligne(N As Long)
Static Derniere_ligne As Long

Derniere_ligne = ActiveSheet.Columns.End(xlDown).Row


N = Derniere_ligne + 1
End Sub
            
            
      
            
' Function Entier

'Function Entier(Nombre) As Boolean
'Entier = Int(Nombre) = Nombre
'End Function


'Fonction dernier fichier du repertoire

Function DernierFichier(Chemin As String)
Dim fichier As String, DerniereDate As Date
fichier = Dir(Chemin)
Do While fichier <> ""
    If FileDateTime(Chemin & fichier) > DerniereDate Then
        DerniereDate = FileDateTime(Chemin & fichier)
        DernierFichier = fichier
    End If
    fichier = Dir()
Loop
End Function

Sub OuvrirDernierDoc()
Dim Chemin As String

Chemin = "K:\reactif\Charles\FICHIER PROD\"

ChangeFileOpenDirectory = Chemin
Workbooks.Open (Chemin & DernierFichier(Chemin))
End Sub




'////////////////////////////////////PROGRAMME PRINCIPALE//////////////////////////////////





Private Sub Workbook_Open()
 
        

Call OuvrirDernierDoc 'call de la fonction dernier doc  (avant le while 1)
        
        
        
        '//////connexion à la carte//////
CardAddress = 0 'j utilise 1 seul VM110
h = OpenDevice(CardAddress)
Select Case h
  Case 0, 1, 2, 3
   ActiveSheet.Cells(1, 4).Value = "card" + Str(h) + " connected"
  Case -1
  ActiveSheet.Cells(2, 4).Value = "card" + Str(CardAddress) + " no found"
  
End Select


        
        '//Boucle infinie//
        While 1
        
        


        
Date_jour = Format(Now, "yyyy-mm-dd") 'je recupere que jour/moi/année

'je definie date jour avant de fair le test


'///////////////////////////// TEST CHANGEMENT DE JOUR ///////////////////////////////////

If Date_jour = ActiveSheet.Cells(1, 5).Value Then
                          
          


'///////////////////////////// DEFINITON DES COLONNES ///////////////////////////////////
    'On nomme les colonnes
    
    Range("A1").Select
    ActiveCell.FormulaR1C1 = "Nombre de Flacon"
    Range("A2").Select
    Columns("A:A").ColumnWidth = 16.71
    Range("B1").Select
    ActiveCell.FormulaR1C1 = "Heure"
    Range("C1").Select
    ActiveCell.FormulaR1C1 = "Date"
    Range("C2").Select


'///////////////////////////// LES VARIABLES   ///////////////////////////////////



nb_flacon = Cells(3, 4)

Byt = ReadDigitalChannel(1)

'///////////////////////////// Remplissage du tableau ///////////////////////////////////

' Remplir 3 colonnes : une disant le nombre de flacon et une les jours et l'autre les heures



    If (Byt = True) Then
' prévoir un anti rebond avec détection de front descendant

     nb_flacon = nb_flacon + 1 'j'increment maintenant car si nouveau tableau 0+1=1 et si recup d'un ancien excelje dois incrementer l'ancienne avleur avant de la copier
     
    Date_jour = Format(Now, "yyyy-mm-dd") 'je recupere que jour/moi/année
    heure_detection = Format(Now, "HH:m:ss.fff") 'je recupere que heure/min/sec

    Derniereligne (N)  'je prend ma dernier ligne au cas ou je reprend un ancien fichier
     
    ActiveWorkbook.ActiveSheet.Cells(N, 1).Value = nb_flacon
    
    
    ActiveWorkbook.ActiveSheet.Cells(N, 2).Value = heure_detection


    ActiveWorkbook.ActiveSheet.Cells(N, 3).Value = Date_jour


'j'incremente mon nombre de flacon
  
    
ActiveWorkbook.ActiveSheet.Cells(3, 4).Value = nb_flacon 'apres l'incrementation je recopie la valeur de nb_flacon

ActiveWorkbook.ActiveSheet.Cells(1, 5).Value = Date_jour 'j'ecris la date sur la case (1,5)

'///////////////// Function sauvegarder ///////////////////////////////////////
Dim Save As Double


        Save = nb_flacon / 100
        'sauvegarde tout les 100 flacons en testant si la valeur divisé par 100 est un entier
     

        If CInt(Save) = Save Then
        ActiveWorkbook.Save
        End If


    End If

   
Else


'///////////////////////////// CHANGEMENT DE JOUR ///////////////////////////////////
          
                  'creer nouveau classeur si nouvelle journee
                        
                   


D = Day(Now) & "_" & Month(Now) & "_" & Year(Now) & "_" & Hour(Now) & "_" & Minute(Now)
Workbooks.Add


ChDir "N:\Charles\FICHIER PROD"
    ActiveWorkbook.SaveAs Filename:="N:\Charles\FICHIER PROD\Production flacon du_" & D & ".xlsx", _
FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False


    
End If
Wend
End Sub




A voir également:

4 réponses

Bonjour,

Cette erreur se produit quand un objet ne peut pas être atteint, genre feuille qui n'existe pas, controle désactivé ou caché...
C'est quelle ligne qui pose problème?

:)
0
charlesprogelec Messages postés 3 Date d'inscription jeudi 10 mai 2012 Statut Membre Dernière intervention 14 mai 2012
11 mai 2012 à 16:10
[CODE]
Do While fichier <> ""
If FileDateTime(Chemin & fichier) > DerniereDate Then
DerniereDate = FileDateTime(Chemin & fichier)
DernierFichier = fichier
End If
fichier = Dir()
Loop

[/CODE]
ben ça reste dans la boucle loop de la recherche du fichier le plus recent ça fait 9 fois la boucle puis sa lance le chargement et je vois le mesg d'erreur
sachant que j'ai deja testé cette partie du programme dans un autre fichier excel et que ça marche oO
0
Regardes dans ton dossier Chemin = "K:\reactif\Charles\FICHIER PROD\"
si du n'as que des fichiers .xls (ou .xlsx), il se pourrait que le fichier retourné par ta fonction ne soit pas un fichier excel.


pour vérifier tu mets ça

Chemin = "K:\reactif\Charles\FICHIER PROD\"
MsgBox Chemin & DernierFichier(Chemin)
End

tu verras bien ce qu'il t'affiche.
0
charlesprogelec Messages postés 3 Date d'inscription jeudi 10 mai 2012 Statut Membre Dernière intervention 14 mai 2012
14 mai 2012 à 10:25
cela me retourne bien un fichier xlsx qui ne prend pas en compte les macros, il me faut donc des xlsm
Classeur Excel (code) .xlsm Format de fichier XML prenant en charge les macros pour Excel 2010 et Excel 2007. Stocke les codes macro VBA ou les feuilles de macros Excel 4.0 (.xlm).

sur l'image qui suit ça ouvre le fichier le plus recent et créé un nouveau fichier

http://cjoint.com/12mi/BEoj5N6pPsl.htm


je met en xlsm met le probleme reste en plus si je clique deux fois je crée un fichier en plus car en connectant ma carte elle ne voie pas quand ma input est à 1
j'ai créé une feuille que j'ai completé moi meme

http://cjoint.com/12mi/BEokpqh66vr.htm

ainsi quand ma feuille est completée, le test du changement de jour marche
0