Problème pour récupérer des données de mon tableau vers un array [Résolu]

Signaler
-
Messages postés
2193
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
11 août 2020
-
Bonjour,
J'ai deux problème, le premier problème concerne la récupération des valeurs de mon tableau vers un array.
Et le deuxième est que après avoir saisir du texte dans mon tableau et que je réexécute ma macro le tableau ne s'affiche pas correctement et mon signet disparait alors je sauvegarde sa position et je le crée de nouveau après tout opération.

Voici tout le code

Public Sub StockSignet()

    Dim AC As String
    Dim Objet As String
    Dim Imputation As String
    Dim AnneeBudgetaire As String
    Dim DaoPrixChiffre As String
    Dim DaoPrixLettre As String
    Dim RetraitBP As String
    Dim RetraitCel As String
    Dim RetraitTel As String
    Dim nb_lot As String
    Dim lots As Integer
    Dim tab_range As Range
    Dim tab_lots As Table
    Dim rRange As Range
    Dim myTable As Table
    Dim BkMkName As String
    Dim n As Integer
    Dim libLots()
    libLots = Array(n)

    
    If ActiveDocument.Bookmarks.Exists("autorite_contract") Then
        AC = ActiveDocument.Bookmarks("autorite_contract").Range.Text
        AC = Replace(AC, "FORMTEXT ", "")
    End If
    
    If ActiveDocument.Bookmarks.Exists("objet") Then
        Objet = ActiveDocument.Bookmarks("objet").Range.Text
        Objet = Replace(Objet, "FORMTEXT ", "")
    End If
    
    If ActiveDocument.Bookmarks.Exists("imput_bud") Then
        Imputation = ActiveDocument.Bookmarks("imput_bud").Range.Text
        Imputation = Replace(Imputation, "FORMTEXT ", "")
    End If
    
    If ActiveDocument.Bookmarks.Exists("annee_bud") Then
        AnneeBudgetaire = ActiveDocument.Bookmarks("annee_bud").Range.Text
        AnneeBudgetaire = Replace(AnneeBudgetaire, "FORMTEXT ", "")
    End If
    
    If ActiveDocument.Bookmarks.Exists("DaoPrixChiffre") Then
        DaoPrixChiffre = ActiveDocument.Bookmarks("DaoPrixChiffre").Range.Text
        DaoPrixChiffre = Replace(DaoPrixChiffre, "FORMTEXT ", "")
    End If
    
    If ActiveDocument.Bookmarks.Exists("DaoPrixLettre") Then
        DaoPrixLettre = ActiveDocument.Bookmarks("DaoPrixLettre").Range.Text
        DaoPrixLettre = Replace(DaoPrixLettre, "FORMTEXT ", "")
    End If
    
    If ActiveDocument.Bookmarks.Exists("RetraitBP") Then
        RetraitBP = ActiveDocument.Bookmarks("RetraitBP").Range.Text
        RetraitBP = Replace(RetraitBP, "FORMTEXT ", "")
    End If
    
    If ActiveDocument.Bookmarks.Exists("RetraitCel") Then
        RetraitCel = ActiveDocument.Bookmarks("RetraitCel").Range.Text
        RetraitCel = Replace(RetraitCel, "FORMTEXT ", "")
    End If
    
    If ActiveDocument.Bookmarks.Exists("RetraitTel") Then
        RetraitTel = ActiveDocument.Bookmarks("RetraitTel").Range.Text
        RetraitTel = Replace(RetraitTel, "FORMTEXT ", "")
    End If

    If ActiveDocument.Bookmarks.Exists("nb_lot") Then
        Selection.GoTo What:=wdGoToBookmark, Name:="nb_lot"
        nb_lot = Selection.Text
        If IsNumeric(nb_lot) Then
            lots = CInt(nb_lot)
        End If
    End If
    
    BkMkName = "pos_tab_lots"

 <bold> <ital>  ' vérifier l'existance du signet</ital></bold>
    If Not ActiveDocument.Bookmarks.Exists(BkMkName) Then
        MsgBox prompt:="Bookmark '" & BkMkName & "' not found", Title:="Error"
        Exit Sub
    End If

  <bold>  <ital>' sauvegarder le range du signet</ital></bold>
    Set rRange = ActiveDocument.Bookmarks(BkMkName).Range


<bold><ital>' Dans le cas ou le tableau existe exportation des données</ital></bold>
    With rRange
  <bold> <ital> ' recupérer les données</ital></bold>
        If .Tables.Count > 0 Then
            For i = 2 To n
                libLots(i - 2) = myTable.Cell(i, 2).Range.Text
            Next
            MsgBox ActiveDocument.Tables(1).Cell(2, 2).Range.Text
            MsgBox libLots(1)   <bold><ital>' le premier problème se trouve à ce niveau</ital></bold>
  <bold> <ital>' suppimer le tableau existant</ital></bold>
            .Tables(1).Delete
        End If

      <bold> <ital> ' ajouter le tableau en fonction du nombre de lots</ital></bold>
        Set myTable = .Tables.Add(Range:=rRange, NumRows:=lots + 1, NumColumns:=4)
        myTable.Borders.Enable = True
        myTable.Cell(1, 1).Range.Text = " N° lot "
        myTable.Cell(1, 2).Range.Text = " Libellé "
        myTable.Cell(1, 3).Range.Text = " Cautionnement provisoire "
        myTable.Cell(1, 4).Range.Text = " Délai d'exécution "
        
        i = 2
        Do While i < lots + 2
            myTable.Cell(i, 0).Range.Text = i - 1
            i = i + 1
        Loop
        
        ActiveDocument.Bookmarks.Add Name:=BkMkName, Range:=myTable.Range
    
    End With

sortie:
End Sub

4 réponses

Messages postés
2193
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
11 août 2020
111
bonjour
1) Dans les déclarations tu ne définis pas le type de variable de
libLots()

Plus loin dans le code on se rend compte que c'est du type String
libLots(i - 2) = myTable.Cell(i, 2).Range.Text


2) A la ligne 19 tu définis
Dim n As Integer
. Par défaut sa valeur est 0 .
Or à la ligne 93 tu te sers de n :
For i = 2 To n
    libLots(i - 2) = myTable.Cell(i, 2).Range.Text
Next

A quoi sert le 2 dans ton For Next surtout que n = 0 .
Dans ce cas le seul libLots qui existe est libLots(0). A moins qu'en VBA les tableaux ne commencent qu'a 1 .
donc erreur à la ligne 97 :
MsgBox libLots(1) 


3) Inutile de mettre les <bold> <ital> pour les commentaires . Cela surcharge le code plus que cela ne l'éclaire



Oui effectivement tu as raison. J'ai modifier le code et j'ai pris en compte tes remarques avec un redim de libLots avant la boucle et hop ça marche.
Messages postés
2193
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
11 août 2020
111
Tant mieux que cela fonctionne .
Il te reste juste à marquer le post comme étant résolu avec le bouton adéquat à la fin de ton premier message
Messages postés
14596
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 août 2020
426
Bonjour

@vb
3) Inutile de mettre les <bold> <ital> pour les commentaires . Cela surcharge le code plus que cela ne l'éclaire
en fait steeves n'avait pas mis la coloration syntaxique. Quand Karamel l'a fait il n'a pas vu ces balises devenues inutiles

@steeves pour tes prochains post, il faut donc utiliser la coloration syntaxique https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

vec un redim de libLots avant la boucle
redim est une aberration de VB(6, A, S), un tableau ça a une taille et point barre, donc quand tu redimensionnes, en vrai, ça crée un nouveau tableau d'une nouvelle taille et ça y copie tous les éléments (si y'a le mot clé preserve si je me souviens bien) =>
  • perte de temps d'exécution,
  • utilisation abusive de la ram,
  • fuite de mémoire potentielle


Depuis les premiers langage pour palier à ça, un autre "conteneur" a été inventé: la liste chainée. https://fr.wikipedia.org/wiki/Liste_cha%C3%AEn%C3%A9e
Elle permet d'ajouter (à la fin), d'insérer (n'importe où) et même d'enlever un item à tout moment.
L'implémentation de la liste chainée en VBA c'est Collection https://riptutorial.com/fr/vba/topic/5838/collections
Messages postés
2193
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
11 août 2020
111
Salut Whis
Merci pour ce petit rappel ( c'est vrai que VBA et aussi VB6 est loin pour moi )
J'espère que tout va bien pour toi et ta famille .
A ++
Messages postés
14596
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 août 2020
426 >
Messages postés
2193
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
11 août 2020

Oui très bien et toi?
Messages postés
2193
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
11 août 2020
111
Tout va bien pour nous !
Merci Whis
A ++