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 :

boucle FOR NEXT et remplacer chiffres par lettres ou mots


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 7
    Points : 5
    Points
    5
    Par défaut boucle FOR NEXT et remplacer chiffres par lettres ou mots
    bonjour,

    je ne suis pas très doué, mais j essaie d'avancer. Je vous prie de m'excuser car j arrive pas à comprendre vraiment le VBA, j essaie depuis des années, mais mon cerveau ne veut pas trop j ai l'impression

    ma problématique est la suivante:

    1 - je veux faire une boucle pour que les signets sur modele word soient remplacés par des valeurs de mes champs d'un formulaire access

    2 -je veux que les signets : signet_position1 et signet_position2 et signet_position3
    ainsi que les signets : signet_classement1 et signet_classement2 et signet_classement3 soient remplacées par les valeurs des champs (les champs ont des noms identique d'où mon j &i

    (3 - ceci est un exemple car il y aura beaucoup de signets et beaucoup de champs...)

    je me demande s'il ne faut pas utiliser fonction case, mais je n' arrive pas.
    peut être que c est une autre fonction qu'il faut ?

    au résultat je dois avoir:
    signet_position1
    signet_position2
    signet_position3
    signet_classement1
    signet_classement2
    signet_classement3

    le code de la boucle est le suivant

    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
     For i = 1 To 3
     
                For j = 1 To 2
     
                    Select Case j
                    Case 1 = "signet_position"
                    Case 2 = "signet_classement"
                    Case Else
     
                    .ActiveDocument.Bookmarks(j & i).Range.Text = j & i
     
                    End Select
     
                Next j
     
            Next i
    mon code en entier est le suivant:

    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
    65
    66
    67
    68
    69
    70
    71
    Private Sub Commande20_Click()
     
     
    'Creation of some variables
        Dim word_Appl As Word.Application
        Dim word_Doc As Word.Document
        Dim PathToWord_template_doc As String
        Dim Title_Of_WordDoc As String
        Dim Author_Of_WordDoc As String
        Dim i As Integer
        'Deklaration of the variables
        PathToWord_template_doc = "F:\ESSAI PROG\codelettreimbriquer\S1etScetSpa.dotx"
        Title_Of_WordDoc = "Example Word Document"
        Author_Of_WordDoc = "momo"
        Set word_Appl = CreateObject("Word.Application")
        Set word_Doc = word_Appl.Documents.Add(Template:=PathToWord_template_doc)
     
     
        word_Appl.Visible = False
        With word_Appl
            'Here you make the assignments bookmark in Word to Field.value in formular
            'Attention1: names for placeholder in word document must diffrend to
            'the name of fields in formular
            'Attention2: Each placeholder in word document can use only one time
     
     
     
     
           '1 - je veux faire une boucle pour que les signets sur modele word soient remplacés
           'par des valeurs de mes champs d'un formulaire access
     
           ' 2 -je veux que les signets : signet_position1 et signet_position2 et signet_position3
           ' ainsi que les signets :  signet_classement1 et signet_classement2 et signet_classement3
           'soient remplacées par les valeurs des champs (les champs ont des noms identique d'où mon j &i
     
           '3 - ceci est un exemple car il y aura beacoup de signets et beaucoup de champs...
     
           For i = 1 To 3
     
                For j = 1 To 2
     
                    Select Case j
                    Case 1 = "signet_position"
                    Case 2 = "signet_classement"
                    Case Else
     
                    .ActiveDocument.Bookmarks(j & i).Range.Text = j & i
     
                    End Select
     
                Next j
     
            Next i
     
     
     
            .Visible = True
            .WindowState = 1 'wdWindowStateMaximize
            .Activate
            .ShowMe
            .ActiveDocument.BuiltInDocumentProperties("Title").Value = Title_Of_WordDoc
            .ActiveDocument.BuiltInDocumentProperties("Author").Value = Author_Of_WordDoc
        End With
     
        'to untouch the word template
        Set word_Doc = Nothing
        Set word_Appl = Nothing
     
     
     
    End Sub

    cela est il possible ?

    merci par avance pour votre réponse

  2. #2
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    789
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 789
    Points : 1 266
    Points
    1 266
    Par défaut
    Bonsoir,

    Effectivement Select Case ne focntionne pas comme çà.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim RetVal as String
     
    Select Case j
        'Si j = 1
         Case 1 
             RetVal = "signet_position"
         'Si j = 2
          Case 2 
              RetVal= "signet_classement"
          'Pour tous les autres cas de figure
          Case Else
               RetVal="Autre valeur"
    End Select
    'Exploitation de retVal
    Cordialement

    Christophe

    N'oubliez pas de mettre pour en faire profiter tout le monde.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 7
    Points : 5
    Points
    5
    Par défaut comment l'intégrer dans mon code ?
    merci beaucoup pour la réponse

    j ai essayé, mais j arrive pas à intégrer ce code select case et Dim retval....dans mon code

    je ne sais pas où le placer ni où placer mon ActiveDocument.Bookmarks dans cette formule.

    comme je l ai dit, je suis plutot nul, j'en suis désolé

    (tout le code d'avant a été fait avec de l'aide)

    si vous pouviez m'aider, je pense que c'est le dernier chainon manquant pour ma base de données

  4. #4
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    789
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 789
    Points : 1 266
    Points
    1 266
    Par défaut
    Bonsoir,

    Je ne maitrise pas l'exploitation de signet via VBA et à partir d'Access.
    Celat dit, en première approche ton code ne boucle pas les valeurs de tes champs de formulaires.
    Si cela doit être le cas, il sera de toute façon préférable de boucler les valeurs directement dans la table via un recordset.
    De plus, ne connaissant les valeurs que tu souhaites inscrire, c'est assez flou pour moi.
    Néanmoins, j'aurais tendance à te coder comme ceci :

    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
    Private Sub Commande20_Click()
     
    'Creation of some variables
        Dim word_Appl As Word.Application
        Dim word_Doc As Word.Document
        Dim PathToWord_template_doc As String
        Dim Title_Of_WordDoc As String
        Dim Author_Of_WordDoc As String
        Dim i As Integer
     
        Dim RetVal As String
     
        'Deklaration of the variables
        PathToWord_template_doc = "F:\ESSAI PROG\codelettreimbriquer\S1etScetSpa.dotx"
        Title_Of_WordDoc = "Example Word Document"
        Author_Of_WordDoc = "momo"
        Set word_Appl = CreateObject("Word.Application")
        Set word_Doc = word_Appl.Documents.Add(Template:=PathToWord_template_doc)
     
     
        word_Appl.visible = False
        With word_Appl
           '1 - je veux faire une boucle pour que les signets sur modele word soient remplacés
           'par des valeurs de mes champs d'un formulaire access
     
           ' 2 -je veux que les signets : signet_position1 et signet_position2 et signet_position3
           ' ainsi que les signets :  signet_classement1 et signet_classement2 et signet_classement3
           'soient remplacées par les valeurs des champs (les champs ont des noms identique d'où mon j & i
     
           '3 - ceci est un exemple car il y aura beacoup de signets et beaucoup de champs...
     
           For i = 1 To 3
     
                For j = 1 To 2
                    Select Case j
                        'Si j = 1
                         Case 1
                             RetVal = "signet_position"
                         'Si j = 2
                          Case 2
                              RetVal = "signet_classement"
                    End Select
                    'Remplace le nom du signet défini par RetVal et i par j & i
                    .ActiveDocument.bookmarks(RetVal & i).Range.Text = j & i
                Next j
            Next i
     
            .visible = True
            .WindowState = 1 'wdWindowStateMaximize
            .Activate
            .ShowMe
            .ActiveDocument.BuiltinDocumentProperties("Title").Value = Title_Of_WordDoc
            .ActiveDocument.BuiltinDocumentProperties("Author").Value = Author_Of_WordDoc
        End With
     
        'to untouch the word template
        Set word_Doc = Nothing
        Set word_Appl = Nothing
     
    End Sub
    Cordialement

    Christophe

    N'oubliez pas de mettre pour en faire profiter tout le monde.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 7
    Points : 5
    Points
    5
    Par défaut ca active les bons signets, mais n insere la valeur du champ
    merci beaucoup christophe/marsouin,

    ça avance bien, car ce code active bien les signets de word suivants:
    signet_position1
    signet_position2
    signet_position3
    signet_classement1
    signet_classement2
    signet_classement3

    en revanche il ne remplace pas les signets par le contenu des champs j & i
    je n' ai pas été assez précis
    je ne comprends pas tout ce que tu dis notamment:
    Celat dit, en première approche ton code ne boucle pas les valeurs de tes champs de formulaires.
    Si cela doit être le cas, il sera de toute façon préférable de boucler les valeurs directement dans la table via un recordset.
    en tout cas, dans mon formulaire access, j 'ai des champs qui portent des noms identiques au signet, c'est la valeur des champs qui va "fusionner" et remplacer les signets

    il ne faut pas mettre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .ActiveDocument.bookmarks(RetVal & i).Range.Text = j & i
    mais quelque chose comme cela,ce qui marche pour l'avoir testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    .ActiveDocument.bookmarks(RetVal & i).Range.Text = nom_du_champs.value
     
    'ou encore pour éviter les bugs quand un champs est vide:
    .ActiveDocument.Bookmarks(RetVal & i).Range.Text = Nz(nom_du_champs.Value, "")
    Mais la je n'arrive plus, car, puisque mes noms de champs sont identiques aux noms de signets, et pour profiter de la boucle entièrement, il faudrait écrire quelques choses comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    .ActiveDocument.bookmarks(RetVal & i).Range.Text = RetVal & i.value
    'ou
    .ActiveDocument.Bookmarks(RetVal & i).Range.Text = Nz(RetVal & i.Value, "")
    mais la syntaxe n'est pas bonne car cela ne marche pas

    comment l'écrire ?

    en vous remerciant par avance, sincèrement

  6. #6
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    789
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 789
    Points : 1 266
    Points
    1 266
    Par défaut
    Bonjour,

    Pour que "value" soit prise en compte, il faut que ton curseur soit dans le champ.
    Dans ton cas, ce n'est pas possible, puisque tu pointes sur plusieurs champs.
    Supprimes le termes "value" et essaies ton code comme cela.
    Cordialement

    Christophe

    N'oubliez pas de mettre pour en faire profiter tout le monde.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 7
    Points : 5
    Points
    5
    Par défaut ca avance
    bonjour et merci pour ton aide

    1 - tout d'abord, value n'est effectivement pas nécessaire, j ai testé ca marche pareil avec ou sans
    2 - ensuite j'ai testé, il n'est pas nécessaire que mon curseur soit dans mon champ, et donc je peux mettre plusieurs champs

    ainsi sans boucle cela fonctionne, avec le code suivant :

    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
        .ActiveDocument.Bookmarks("signet_position1").Range.Text = signet_position1.Value
            .ActiveDocument.Bookmarks("signet_position2").Range.Text = signet_position2.Value
            .ActiveDocument.Bookmarks("signet_position3").Range.Text = signet_position3.Value
            'autre variante:   
            .ActiveDocument.Bookmarks("signet_classement1").Range.Text = Nz(signet_classement1.Value, "")
            .ActiveDocument.Bookmarks("signet_classement2").Range.Text = Nz(signet_classement2.Value, "")
            .ActiveDocument.Bookmarks("signet_classement3").Range.Text = Nz(signet_classement3.Value, "")
     
    'et la même chose sans value fonctionne aussi:
     
            .ActiveDocument.Bookmarks("signet_position1").Range.Text = signet_position1
            .ActiveDocument.Bookmarks("signet_position2").Range.Text = signet_position2
            .ActiveDocument.Bookmarks("signet_position3").Range.Text = signet_position3
     
            .ActiveDocument.Bookmarks("signet_classement1").Range.Text = Nz(signet_classement1, "")
            .ActiveDocument.Bookmarks("signet_classement2").Range.Text = Nz(signet_classement2, "")
            .ActiveDocument.Bookmarks("signet_classement3").Range.Text = Nz(signet_classement3, "")
    Avec une boucle, le code suivant fonctionne :

    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
    For i = 1 To 3
     
                For j = 1 To 2
                    Select Case j
                        'Si j = 1
                         Case 1
                             RetVal = "signet_position"
                         'Si j = 2
                          Case 2
                              RetVal = "signet_classement"
                    End Select
     
                'le nom de mon formulaire access dans lequel il y a les champs qui nous intéressent s'appelle POUR_DEVELOPPEZ
               .ActiveDocument.Bookmarks(RetVal & i).Range.Text = Nz([Form_POUR_DEVELOPPEZ].Form.Controls(RetVal & i), "")
     
                Next j
     
            Next i
    j'ai tenté pas mal de formules avant de trouver la bonne, (aussi grâce au code de Tofalu qui m'avait aidé à écrire la boucle)

    DONC CA FONCTIONNE
    MERCI BEAUCOUP
    à toi Christophe marsouin et aussi Tofalu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VB6 Arret boucle FOR NEXT par appui sur un bouton
    Par obel38 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 04/01/2011, 16h35
  2. boucle for next ? peut être mais comment
    Par caro2552 dans le forum VBA Access
    Réponses: 11
    Dernier message: 07/02/2007, 20h26
  3. [VB.net] Boucle for next avec un tableau
    Par grand_prophete dans le forum Windows Forms
    Réponses: 4
    Dernier message: 31/05/2006, 11h08
  4. [VB6] Problème contrôle Timer et boucle For-Next ...
    Par Stéphane BEHMENBURG dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 01/12/2005, 17h36
  5. Réponses: 3
    Dernier message: 03/11/2005, 19h22

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