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

VBA Access Discussion :

Déclaration d'une variable "dynamique" dans une boucle


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Août 2005
    Messages : 525
    Par défaut Déclaration d'une variable "dynamique" dans une boucle
    Bonjour à tous

    L'idée est de faire "monter" ou "descendre" une ligne d'un enregistrement dans un formulaire continu sur le click d'un bouton.

    Voici ce à quoi j'avais pensé:
    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
     
    Private Sub btn_LineUp_Click()
    On Error GoTo Err_Btn_LineUp
     
        Dim i As Integer
        Dim IdEnCours As Long
        Dim Rs As DAO.Recordset
     
        Set Rs = CurrentDb.OpenRecordset("SELECT * FROM T_ProtocoleVVC WHERE ID_Protocole =" & Me.ID_Protocole, dbOpenDynaset)
        Rs.FindFirst "ID_ProtocoleVVC =" & Me.ID_ProtocoleVVC
     
        'Si c'est le premier enregistrement on ne peut pas faire monter toute la ligne
         If Rs.AbsolutePosition = 1 Then
        MsgBox "Vous ne pouvez pas déplacer cette ligne vers le haut"
        Exit Sub
        Else
            For i = 2 To Rs.Fields.Count
            Dim Temp(i), ActStr(i) As String
                'Mémorise la valeur du champ correspondant de l'enregistrement en cours
                ActStr(i) = Nz(DLookup(Rs.Fields(i).Name, "T_ProtocoleVVC", Rs("ID_ProtocoleVVC") = Me.ID_ProtocoleVVC), "")
                Rs.MovePrevious
                'Mémorise la valeur de l'enregistrement précédent
                Temp(i) = Nz(DLookup(Rs.Fields(i).Name, "T_ProtocoleVVC", Rs("ID_ProtocoleVVC") = Me.ID_ProtocoleVVC), "")
     
                'Mise à jour de l'enregistrement précédent avec la valeur correspondante en cours
                    .Update Rs.Fields(i), ActStr(i)
                'Mise à jour de l'enregistrement en cours avec la valeur précédente mémorisée
                Rs.MoveNext
                    .Update Rs.Fields(i), Temp(i)
            Next i
                DoCmd.RunCommand acCmdSaveRecord
                Me.Form.Requery
        End If
     
        Rs.Close
        Set Rs = Nothing
    End Sub
    Je mémorise la valeur d'un champ de l'enregistrement en cours puis du précédent et je colle la valeur du champ en cours en lieu et place du précédent et vice versa. Puis la boucle passe au champ suivant et ainsi de suite.
    La syntaxe Temp(i) ne fonctionne pas. Comment faire varier cette déclaration de variable qui m'éviter de passer en revue les champs de la table.
    Merci d'avance pour votre aide qui me fera gagner un temps précieux, ma recherche du jour sur le sujet ne m'ayant pas permis de trouver de réponse.
    Je suis aussi preneur d'une autre stratégie.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Août 2005
    Messages : 525
    Par défaut
    A force de persévérance et de recherche j'ai trouvé une solution qui fonctionne pour moi. Il semble qu'il faille "redéfinir" la variable avec Redim. Mais je n'ai pas trouvé d'information sur ce sujet. Comment déclarer initialement la variable, d'autant qu'elle va prendre le type "texte", "numérique", null, etc ..?

    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
     
    Private Sub btn_LineUp_Click()
    On Error GoTo Err_btn_LineUp
     
        Dim i As Integer
        Dim temp(), ActStr() As Variant
        Dim IdEnCours As Long
        Dim Rs As DAO.Recordset
     
        Set Rs = CurrentDb.OpenRecordset("SELECT * FROM T_ProtocoleVVC WHERE ID_Protocole =" & Me.ID_Protocole, dbOpenDynaset)
        Rs.FindFirst "ID_ProtocoleVVC =" & Me.ID_ProtocoleVVC
     
            ReDim temp(Rs.Fields.Count), ActStr(Rs.Fields.Count)
     
            If Rs.AbsolutePosition > 0 Then
                For i = 2 To Rs.Fields.Count - 1
                    'Mémorise la valeur du champ correspondant de l'enregistrement en cours
                    ActStr(i) = Rs.Fields(i).Value
                    Rs.MovePrevious
                    'Mémorise la valeur de l'enregistrement précédent
                    temp(i) = Rs.Fields(i).Value
                    'Mise à jour de l'enregistrement précédent avec la valeur correspondante en cours
                    Rs.Edit
                    Rs.Fields(i).Value = ActStr(i)
                    Rs.Update
                    'Mise à jour de l'enregistrement en cours avec la valeur précédente mémorisée
                    Rs.MoveNext
                    Rs.Edit
                    Rs.Fields(i).Value = temp(i)
                    Rs.Update
     
                Next i
                    DoCmd.RunCommand acCmdSaveRecord
                    Me.Form.Requery
            Else
            MsgBox "Vous ne pouvez pas déplacer cette ligne vers le haut"
            Exit Sub
            End If
     
     
        Rs.Close
        Set Rs = Nothing
     
    Exit_btn_LineUp:
        Exit Sub
     
    Err_btn_LineUp:
        MsgBox Err.Description
        Resume Exit_btn_LineUp
    End Sub
    Pour commentaire et critiques...

  3. #3
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    3 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 045
    Par défaut
    Bonjour,
    si je comprends bien
    L'idée est de faire "monter" ou "descendre" une ligne d'un enregistrement dans un formulaire continu sur le click d'un bouton.
    Or ton formulaire continu a pour source de données une requête qui est ordonnée par un certain "ORDER BY ..."

    Une idée possible pourrait etre de créer dans ta requete un champ Ordre indépendant de type long, qui serait initialement la valeur de l'ordre dans la requete
    Ensuite pour ta problématique de faire monter une ligne tu UPDATE cette valeur Ordre et tu lance un .Requery sur le formulaire

    A voir

Discussions similaires

  1. Récupération de la valeur d une variable elle même contenue dans une variable
    Par guiplongeur dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 16/03/2015, 16h23
  2. Réponses: 2
    Dernier message: 14/05/2014, 10h23
  3. Réponses: 3
    Dernier message: 13/12/2009, 17h04
  4. Réponses: 1
    Dernier message: 17/01/2007, 21h52

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