IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

[VBA-EXCEL] Rst.MoveNext don't move next


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 13
    Points : 9
    Points
    9
    Par défaut [VBA-EXCEL] Rst.MoveNext don't move next
    Hello,

    J'ai un problème avec ma boucle qui est supposée passer en revue toutes les lignes d'une table Access "Weights1". Voilà le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
       ...  
        Set Rst = db.OpenRecordset("Weights1", dbOpenTable)
        Rst.MoveFirst
        Do While Not Rst.EOF
     
        Worksheets(sheet).Range("A2").CopyFromRecordset Rst
            Calculate
            temp = Cells(3, 14).Value & ";" & Cells(3, 15).Value & ";" & Cells(3,16).Value & _
            ";" & Cells(3, 17).Value
     
        Write #iFileNum, temp
     
        Rst.MoveNext    
        Loop
    ...
    Donc le code fonctionne correctement jusqu'à Rst.MoveNext puis bug en précisant 'aucun enregistrement'. Je dois dire que je suis coincé, merci pour vos réponses.

  2. #2
    Invité
    Invité(e)
    Par défaut


    Une question peut-être stupide, mais bon
    Dans ta table "Weights1", tu as bien plusieurs lignes d'enregistrements ?

    A+

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    oui oui

    En fait le problème vient de la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Worksheets(sheet).Range("A2").CopyFromRecordset Rst
    Il semble que, après avoir calculer dans la Worksheet, l'enregistrement est effacé en sorte que le programme quitte la boucle.

    J'ai voulu faire la manip suivante avec une nouvelle variable Rst2 mais là, il ne compile plus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    ...
    dim Rst2 As DAO.Recordset
    dim rst as DAO.Recordset
    ...
    Set Rst = db.OpenRecordset("Weights1", dbOpenDynaset)
        'Set Rst = db.OpenRecordset("Weights1", dbOpenForwardOnly, dbReadOnly,dbOpentable)
        Rst.MoveFirst
     
        Do
            Rst = Rst2
            Worksheets(sheet).Range("A2").CopyFromRecordset Rst2
            Calculate
            temp = Cells(3, 14).Value & ";" & Cells(3, 15).Value & ";" & Cells(3, 16).Value & _
            ";" & Cells(3, 17).Value
     
        Write #iFileNum, temp
     
        Rst.MoveNext
     
        Loop Until Rst.EOF
    Il n'aime pas le Rst = Rst2

  4. #4
    Invité
    Invité(e)
    Par défaut
    Combien de champ as-tu dans ta table ?

    Peux tu donner un peu plus de code, pour vérifier si tu déclare comme il faut tous tes objets, ainsi que l'instance Access !?

    A+

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Ok voilà le code en entier. Pour la table access c'est variable, mais disons 10^6 lignes environs.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    'Chope des poids dans Access, calcule les stats dans Excel et insrcrit les résultats
    'dans un fichier JUNK.txt avec ";" comme séparateur
     
    Option Explicit
    Const ML_PATH = "C:bd1.mdb"
    Const sheet = "Sheet_PF"
     
    Sub optimweightsPF_txt_do()
     
        Dim db As DAO.Database, Rst As DAO.Recordset
        Dim sst As DAO.Recordset, Rst2 As DAO.Recordset
        Dim oAccesS As Access.Application
        Dim request As String
        Dim sSQL As String
        Dim temp As String
        Dim strDestFile As String
        Dim iFileNum As Long
     
        ' Ouverture de la base de données
        'creation d'une instance Access par automation
        Set oAccesS = CreateObject("Access.Application")
     
        'chargement de la BDD
        oAccesS.OpenCurrentDatabase ML_PATH
     
        'affectation d'une référence à la BDD
        Set db = oAccesS.CurrentDb
     
        Application.ScreenUpdating = False
     
        strDestFile = "c:JUNK.txt"
     
        iFileNum = FreeFile
     
        Open strDestFile For Output As #iFileNum
     
        Set Rst = db.OpenRecordset("Weights1", dbOpenDynaset)
        Rst.MoveFirst
     
        Do
            Rst = Rst2
            Worksheets(sheet).Range("A2").CopyFromRecordset Rst2
            Calculate
            temp = Cells(3, 14).Value & ";" & Cells(3, 15).Value & ";" & Cells(3, 16).Value & _
            ";" & Cells(3, 17).Value
     
        Write #iFileNum, temp
     
        Rst.MoveNext
     
        Loop Until Rst.EOF
     
        'Next i
     
        Close #iFileNum
     
        Rst.Close
        Set db = Nothing
        Set oAccesS = Nothing
     
     
        MsgBox ("Execution terminée")
     
    End Sub

  6. #6
    Invité
    Invité(e)
    Par défaut


    Ca y est, j'ai compris :yes:

    En fait l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Rst = db.OpenRecordset("Weights1", dbOpenDynaset)
    récupère l'ensemble des enregistrements de la table,
    si tu regardes bien,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets(sheet).Range("A2").CopyFromRecordset Rst
    Colle dans ta feuille toutes les lignes et pas une seule !
    Donc ne sert qu'à te créer une erreur
    puisque tu as déjà tout récupéré !

    Je pense que le mieux est alors de faire une boucle sur chaque cellule
    de ta feuille, contenant une valeur, et d'écrire à ce moment là ton fichier texte !

    Essayes cà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    'Chope des poids dans Access, calcule les stats dans Excel et insrcrit les résultats
    'dans un fichier JUNK.txt avec ";" comme séparateur
     
    Option Explicit
    Const ML_PATH = "C:\bd1.mdb"
    Const sheet = "Sheet PF"
     
    Sub optimweightsPF_txt_do()
     
        Dim db As DAO.Database, Rst As DAO.Recordset
        Dim sst As DAO.Recordset, Rst2 As DAO.Recordset
        Dim oAccesS As Access.Application
        Dim request As String
        Dim sSQL As String
        Dim temp As String
        Dim strDestFile As String
        Dim iFileNum As Long
     
        ' Ouverture de la base de données
        'creation d'une instance Access par automation
        Set oAccesS = CreateObject("Access.Application")
     
        'chargement de la BDD
        oAccesS.OpenCurrentDatabase ML_PATH
     
        'affectation d'une référence à la BDD
        Set db = oAccesS.CurrentDb
     
        'Application.ScreenUpdating = False
     
        strDestFile = "c:\JUNK.txt"
     
        iFileNum = FreeFile
     
        Open strDestFile For Output As #iFileNum
     
        Set Rst = db.OpenRecordset("Weights1", dbOpenDynaset)
        Rst.MoveFirst ' Pourquoi pas
        Worksheets(sheet).Range("A2").CopyFromRecordset Rst
        Calculate
        Dim Cel As Range
        For Each Cel In Sheets(sheet).Range("A2:A" & Range("A65535").End(xlUp).Row)
          temp = Cells(Cel.Row, 14).Value & ";" & Cells(Cel.Row, 15).Value & ";" & Cells(Cel.Row, 16).Value & _
            ";" & Cells(Cel.Row, 17).Value
          Write #iFileNum, temp
        Next
        Close #iFileNum
     
        Rst.Close
        db.Close
        Set db = Nothing
        oAccesS.CloseCurrentDatabase
        Set oAccesS = Nothing
     
        MsgBox ("Execution terminée")  
    End Sub
    Voilà

Discussions similaires

  1. [VBA Excel] On error resume next
    Par alex_95 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 02/03/2007, 19h20
  2. [vba-excel] Le temps de fermeture trop court ?
    Par Damsou dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/01/2005, 10h03
  3. [VBA-Excel]
    Par Damsou dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 05/01/2005, 10h17
  4. [VBA EXCEL] Réduire/Agrandir UserForms
    Par Fench dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/11/2003, 16h02
  5. [VBA Excel] Effacer rapidement une feuille
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/10/2002, 13h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo