2 pièce(s) jointe(s)
Utiliser des variables tableau en VBA pour remplir une plage de cellules pouvant varier
Bonjour,
Je pense avoir un souci avec les variables tableau. Voilà, j'ai une chaîne de caratères qui est stockée dans une variable (appelée typetable). Selon cette chaîne, le nombre de colonnes à remplir dans une feuille Excel varie (ça doit être effectué automatiquement à la création de la feuille).
Par exemple, si la chaîne = "PDT", on obtient :
Pièce jointe 480346
Mais si la chaîne = "GEST" on aura par exemple que les 4 entêtes en violet qui s'afficheront (et le reste de leurs colonnes auront des bordures).
Pour comprendre je vous affiche la sub principale :
Code:
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
|
Sub Add_Table(ByRef tableUser As String, ByRef typetableUser As String)
'Cette sub ajoute une table (ajoute une feuille Excel, met en forme une colonne ID et d'autres colonnes )
' Déclaration des variables
Dim nomTable As String
Dim nomcomplet As String
Dim valeur As String
Dim typetable As String
Dim plage As Range
Dim tabintermediaire() As String
Dim tabintermediaire2() As String
Dim i As Integer
nomTable = tableUser
typetable = typetableUser
'Attribuer le nom choisi à la feuille
nomcomplet = typetable & nomTable
Sheets.Add 'ajout d'une feuille
ActiveSheet.Name = nomcomplet 'donne le nom voulu à cette feuille
'crée la colonne ID, la met en forme
CreationColID
'verrouillle la colonne ID
ProtectColID
'tabintermediaire est un tableau à 2 colonnes contenant les lettres des types de caractéristiques comme "G" ou "T"
' et le nombre de colonnes pour chaque type
tabintermediaire() = ColsToAdd(typetable)
'tabintermediaire2 est un tableau à deux colonnes contenant les plages où mettre les
'types de caractéristiques, et la valeur que chaque cellule doit prendre dans cette plage
tabintermediaire2() = AssociePlage(tabintermediaire) ' ------------> ça bloque à ce niveau
With Sheets(nomcomplet)
For i = 1 To UBound(tabintermediaire2)
'pour chaque plage
plage = tabintermediaire2(1, i)
'récupération du type de carac associé
valeur = tabintermediaire2(2, i)
'donne la valeur à la plage
Sheets(nomcomplet).Range(plage).Value = valeur
'met en forme la plage
ColorieSelonVal plage, valeur
Centre plage
Bordure plage
Gras plage
Next i
End With
End Sub |
Je vous mets quand même cette fonction, il y a des chances que ce soit elle qui fasse tout buguer :
Code:
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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
Function ColsToAdd(typetable As String)
'Cette fonction renvoie un tableau contenant les types colonnes à ajouter
' à la création de table selon le type de table, et le nombre de colonnes par type
'partant du principe que les caractéristiques sont triées par type
Dim anciennelettret As String
Dim lettret As String
Dim tableaulettre() As String
Dim lig As Integer
Dim drlig As Integer
Dim compteur As Integer 'lig = premiere ligne, derlig = dernière ligne
With Sheets("GEST_CARAC_TABLES")
drlig = .Range("E1").End(xlDown).Row
'initialisation
'parcourir la colonne E pour trouver le type de table donné
If Range("E2").Value = typetable Then
'parcourir la colonne D pour trouver les carac obligatoires
If Range("D2").Value = "oui" Then
lettret = Range("C2").Value
anciennelettret = lettret
compteur = 1
Else
lettret = ""
anciennelettret = ""
compteur = 0
End If
Else
lettret = ""
anciennelettret = ""
compteur = 0
End If
For lig = 3 To drlig
'parcourir la colonne E pour trouver le type de table donné
If Range("E" & lig).Value = typetable Then
'parcourir la colonne D pour trouver les carac obligatoires
If Range("D" & lig).Value = "oui" Then
lettret = Range("C" & lig).Value
If lettret = anciennelettret Then 'si la précédente lettre est la même
compteur = compteur + 1 'comptage du nombre de col de même type à créer
anciennelettret = lettret 'récupération du type de carac
Else
'si la lettre change, alors il s'agit d'une autre caractéristique
'le compteur est remis à 0
ReDim tableaulettre(lig, 2)
tableaulettre(lig, 1) = anciennelettret
tableaulettre(lig, 2) = compteur
compteur = 0
End If
End If
End If
Next lig
ColsToAdd = tableaulettre
End With
End Function |
La feuille Excel GEST_CARAC_TABLES ressemble à ça :
Pièce jointe 480353
J'ai essayé plein de trucs, je me suis dit peut être que c'est à cause de l'indice 0 dans le tableau ( j'avais mis par exemple tableau(0,0) pour avoir la première case mais du coup j'ai remplacé par des 1 au cas où)
Mais rien à faire, ça me bloque. Et comme je commence tout juste à utiliser les variables tableaux ça m'étonne pas que j'aie du mal.
La fonction qui pose problème :
Code:
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
|
Function AssociePlage(table() As String)
'Renvoie un tableau contenant des noms de plages de cellules pour chaque ligne d'un tableau
'(composé d'une lettre dans chaque cellule de la première colonne et d'un nombre dans la deuxième)
'donné et les valeurs des plages
Dim firstcell As Integer 'première cellule de la plage
Dim lastcell As Integer 'dernière cellule de la plage
Dim plage As Range
Dim tableauplage() As String
Dim i As Integer
i = 3
firstcell = 66 ' code chr pour B
ReDim tableauplage(i, 2)
' renvoie le code chr pour la dernière colonne correspondant au type
lastcell = firstcell + table(i, 2) ' <--------------------------- erreur : l'indice n'appartient pas à la sélection
plage = Range(Chr(firstcell) & 1, Chr(lastcell) & 1)
tableauplage(i, 1) = plage
tableauplage(i, 2) = table(i, 1)
For i = 4 To UBound(table)
ReDim tableauplage(i, 2)
firstcell = lastcell + 1
lastcell = firstcell + table(i, 2)
plage = Range(Chr(firstcell) & 1, Chr(lastcell) & 1)
tableauplage(i, 1) = plage 'première colonne du tableau = plages
tableauplage(i, 2) = table(i, 1) 'deuxième colonne = types de caractéristiques (ex: "G")
'ajout de la plage dans 1 tableau à 2 colonnes et du nom du type de col concerné
Next i
AssociePlage = tableauplage
End Function |
Je ne sais pas si vous voyez ce que j'essaie de faire.. Je suis désolée si je m'explique mal..:roll:
Pouvez-vous m'aider s'il vous plaît ? :(
Merciii d'avance