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

Résolu
steeves66 - Modifié le 16 juil. 2020 à 17:39
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 - 19 juil. 2020 à 13:45
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

vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 18 juil. 2020 à 18:17
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



0
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.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 18 juil. 2020 à 23:14
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
0
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656
19 juil. 2020 à 10:54
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
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
19 juil. 2020 à 12:45
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 ++
0
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
19 juil. 2020 à 13:04
Oui très bien et toi?
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
19 juil. 2020 à 13:45
Tout va bien pour nous !
Merci Whis
A ++
0
Rejoignez-nous