steeves66
-
Modifié le 16 juil. 2020 à 17:39
vb95
Messages postés3467Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention24 mars 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
vb95
Messages postés3467Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention24 mars 2024168 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
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.
vb95
Messages postés3467Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention24 mars 2024168 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
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) =>