Microsoft 365 Duplication de tableau après utilisation d'un Userform

meyscal

XLDnaute Occasionnel
Bonsoir le forum,

Je rencontre un problème lors de l'utilisation d'un USF, il se créé un autre tableau par-dessus le premier qui au départ prend le même nom (Tableau1). Donc j'ai 2x Tableau1, ce que je pensais impossible jusque là.
A l'utilisation suivante le USF fonctionne encore mais renomme ensuite en Tableau1_1, ce qui rend après l'utilisation impossible car le tableau n'est plus trouvé. Pire, les formules ne trouvent plus la référence de colonne et passent toutes en "#REF!"

1683228990784.png
1683229019493.png



J'ai adapté à mon besoin un prg de Mr Boisgontier (RIP) et je pense que le problème se situe au niveau de la fonction "Redim Preserve" mais je suis loin d'être expert comme certains le savent déjà 😏

1683229080443.png


Je mets le tableau ici que certains connaissent déjà.
Le USF concerné se nomme "USF_EditAlerte" et le fonction "Redim Preserve" se trouve dans le Sub "Affiche".

Si quelqu'un veut bien éclairer ma lanterne avec de préférence quelques explications.

Merci par avance
 

Pièces jointes

  • meyscal.xlsm
    113.9 KB · Affichages: 4

ChTi160

XLDnaute Barbatruc
Bonsoir meyscal

tu dis :
Je rencontre un problème lors de l'utilisation d'un USF, il se créé un autre tableau par-dessus le premier qui au départ prend le même nom (Tableau1). Donc j'ai 2x Tableau1,
Dans la procédure Initialize de ton Userform "USF_EditAlerte"
tu as :
VB:
Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
If ActiveWorkbook.Name <> ThisWorkbook.Name Then ThisWorkbook.Activate
 
HideBar Me
Dim Rng, i, c
 'Set f = Sheets("Cartes Alerte émises") 'isolé double Emploi
 'Set Rng = f.Range("A2:V" & f.[A65000].End(xlUp).Row)     ' à adapter 'isolé double Emploi
 Set f = Sheets("Cartes Alerte émises")
 Set Rng = f.Range("A2:V" & f.[A65000].End(xlUp).Row)     ' à adapter
 NomTableau = "Tableau1"
 ActiveWorkbook.Names.Add Name:=NomTableau, RefersTo:=Rng                                     ' A adapter
 NbCol = Range(NomTableau).Columns.Count
 '---- A adapter
 TabBD = Range(NomTableau).Resize(, NbCol + 1).Value              ' Array: + rapide
Tu crées une plage Nommée du Même Nom et même adresse que le Tableau Structuré qui existe déjà soit "Tableau1"
Je pense que tu n'as pas encore assimilé le fait que tu utilises déjà Un tableau Structuré qui se Nomme "Tableau1"
Voir le Lien vers un Tutoriel : Tutoriel !
C'est ce tableau Structuré qui doit être Utilisé !
a moins que le fait d'avoir une plage de Données Nommée soit Indispensable essaye de Changer le Nom ..... mais bon !
Jean marie
 

meyscal

XLDnaute Occasionnel
En fait je connais déjà les tableaux structurés car j'en utilise depuis des années maintenant !

Je conçois la VBA et même le codage pour résumer comme apprendre une langue étrangère et lorsqu'on a pas tout le vocabulaire, on procède souvent par déduction, par logique et malheureusement par interprétation ...

Je vois quelques expressions connues et j'en tire des conclusions mais maintenant que tu me dis ça :
Tu crées une plage Nommée du Même Nom et même adresse que le Tableau Structuré qui existe déjà soit "Tableau1"
Effectivement tout s'éclaire !

Il faudrait je suppose partir sur quelque chose comme : With "Tableau1" etc ... Je suppose ?
 

ChTi160

XLDnaute Barbatruc
Re
Un truc du genre (perfectible)
VB:
With Range("t_BDD").ListObject 'Nom du Tableau Structuré"t_BDD" avec ce tableau
  TabEntetes = .HeaderRowRange.Value 'On récupére la Ligne d'entetes
 If Not .DataBodyRange Is Nothing Then 'Si la Base de Données n'est pas Vide
 
  TabBD = .Range.Resize(, .ListColumns.Count + 1) 'On récupére les données du Tableau Structuré "t_BDD" en Y ajoutant une colonne dans un Tableau Temporaire "TabBD"

 End If
 End With
 For i = 1 To UBound(TabBD)'pour Chaque ligne du tableau temporaire'
    TabBD(i, UBound(TabBD, 2)) = i 'On récupére l'index de la Ligne source dan sla Colonne Ajoutée
 Next i
Jean marie
 

meyscal

XLDnaute Occasionnel
Pardon Jean-Marie je n'avais pas vu ton message.
Je suis parti sur ce code en pensant mieux faire ...

VB:
 NomTableau = "Tableau1"
 NbCol = Range(NomTableau).Columns.Count  '---- A adapter
 TabBD = Range(NomTableau).Resize(, NbCol + 1).Value              ' Array: + rapide
 For i = 1 To UBound(TabBD): TabBD(i, NbCol + 1) = i: Next i ' No enregistrement
 Me.ListBox1.List = TabBD
 Me.ListBox1.ColumnCount = NbCol + 1
 Me.ListBox1.ColumnWidths = "35;44;65;45;75;18;13;120;140;45;65;140;45;140;0;0;0;0;0;0;0;0"
 ColCombo = Array(21, 20, 4, 11, 16)                                   ' A adapter (1 à 6 colonnes maxi)
 colInterro = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22)  ' colonnes à interroger (adapter)
 '----
 NcolInt = UBound(colInterro) + 1
 '-- colTri
 Me.ComboTri.List = Application.Transpose(Range(NomTableau).Offset(-1).Resize(1))  ' Ordre tri

'puis le reste : couleur et désactivation, ... des txtb et cbx et enfin'

Affiche

mais ça pose toujours problème ici (lignes 9 & 10 en débogage) :

Code:
Sub Affiche()
  Dim Tbl()
  Dim cbx1, cbx2, cbx3, cbx4, cbx5, cbx6, n, Cb, i, c
  cbx1 = Me.ComboBox1: cbx2 = Me.ComboBox2:  cbx3 = Me.ComboBox3:  cbx4 = Me.ComboBox4: cbx5 = Me.ComboBox5
  n = 0
  Cb = Array(1, 1, 1, 1, 1)
  For i = 0 To UBound(ColCombo): Cb(i) = ColCombo(i): Next i
  For i = 1 To UBound(TabBD)
    If TabBD(i, Cb(0)) Like cbx1 And TabBD(i, Cb(1)) Like cbx2 _
       And TabBD(i, Cb(2)) Like cbx3 And TabBD(i, Cb(3)) Like cbx4 And TabBD(i, Cb(4)) Like cbx5 Then
        n = n + 1: ReDim Preserve Tbl(1 To NbCol + 1, 1 To n)
        c = 0
        For c = 1 To NbCol: Tbl(c, n) = TabBD(i, c): Next c
        'Tbl(6, n) = Format(TabBD(i, 6), "hh:mm")
        Tbl(c, n) = TabBD(i, NbCol + 1)
    End If
  Next i
  If n > 0 Then
     Me.ListBox1.Column = Tbl
  Else
     Me.ListBox1.Clear
  End If
  Gchoix
End Sub

J'ai oublié un truc ?
Franchement ce formulaire est vraiment parfait par rapport à mon besoin 😞
 

cp4

XLDnaute Barbatruc
Bonjour @meyscal:) , @ChTi160 ;),

@meyscal : Maintenant, je comprends mieux pourquoi tu avais un tableau structuré dans ta plage de données.
Me.ListBox1.ColumnWidths = "35;44;65;45;75;18;13;120;140;45;65;140;45;140;0;0;0;0;0;0;0;0"
Je ne comprenais pas aussi tu ne prenais que 14 colonnes au lieu de tout le tableau structuré dans une variable.
Si j'étais toi, je supprimerai les 2 dernières colonnes (mois, années) qui à mon avis sont superflues.
En effet, tu peux les récupérer par code depuis la colonne B (avec les fonctions Month et Year).

Bonne journée.

edit: Peux-tu mettre le lien du fichier de JB, pour comprendre le contexte.
 
Dernière édition:

meyscal

XLDnaute Occasionnel
Bonjour @cp4
Je ne retrouve pas le lien dans mon historique de navigation donc je mets directement le fichier de JB.
Il n'utilise pas de tableau structuré d'où la création du tableau lors de l'événement Initialize du USF.
Bonne journée.
Merci
 

Pièces jointes

  • FormRechercheComboTextBox.xls
    167.6 KB · Affichages: 6

cp4

XLDnaute Barbatruc
Bonjour @cp4
Je ne retrouve pas le lien dans mon historique de navigation donc je mets directement le fichier de JB.
Il n'utilise pas de tableau structuré d'où la création du tableau lors de l'événement Initialize du USF.
Bonne journée.
Merci
Ton fichier pose problème. Par principe de précaution, je ne vais pas l'ouvrir.
1683275757807.png

Ouvre le fichier sur ton pc et enregistre-le au format xlsm.

edit: On va beaucoup patauger ainsi. Joins ton fichier avec une feuille dont le résultat est juste (sans #REF!) . et explique-nous tes attentes.
 
Dernière édition:

meyscal

XLDnaute Occasionnel
Hello cp4

Ok je fais ça après bon les formules je vais mettre quelque chose simple à la place si ça marche pour une ça marche pour les autres 😉
Le message est dû à l'extension mais il est sûr. J'avais déjà enregistré 1 version en .xlsm je l'ajoute !
 

cp4

XLDnaute Barbatruc
Hello cp4

Ok je fais ça après bon les formules je vais mettre quelque chose simple à la place si ça marche pour une ça marche pour les autres 😉
Le message est dû à l'extension mais il est sûr. J'avais déjà enregistré 1 version en .xlsm je l'ajoute !
Ne te tracasses pas pour le fichier. Même pour les formules, je suis sous Excel 2010 donc ta formule ne passe pas chez-moi (n° semaine). J'ai mis ma formule, présentement je n'ai plus les #ref!

Explique-nous ce que veux exactement. J'ai compris que tu voulais affiner les données de la listbox par filtrage du tableau. Un peu plus de détails stp.

As-tu besoin des colonnes mois, années, et même no semaine?

edit: ton fichier en retour à tester
 

Pièces jointes

  • meyscal2_cp4.xlsm
    146.7 KB · Affichages: 3
Dernière édition:

meyscal

XLDnaute Occasionnel
Bonsoir, me voilà rentré 😓
Voici le fichier de JB au format .xlsm

Ce que je cherche à faire : exactement la même chose à part ajouter des données à la BDD. Pour cela je passe par un autre USF.
Comme dit le seul problème apparent est la création du tableau par dessus le 1er ... qui me fait perdre les refs de colonnes et n'incrémentent pas les nouvelles données, voir efface les anciennes si dépendantes de formules.
Sinon tout semble fonctionnel.

Peut-être aussi le tri chronologique - A à Z - croissant dans les combobox si déjà !
Merci @cp4 je jette un oeil au fichier envoyé ;)
 

Pièces jointes

  • FormRechercheComboTextBox2.xlsm
    161 KB · Affichages: 1

ChTi160

XLDnaute Barbatruc
Re
Je pensais avoir répondu pour la résolution de ce problème
Comme dit le seul problème apparent est la création du tableau par dessus le 1er ...
Si tu ne veux pas utiliser de tableau structuré,tu click droit que le tableau et tu fais "Table" puis transformer en plage de données.
Ensuite dans ta procédure Initialize je crois(depuis mon téléphone)
La création (a chaque ouverture )d'une plage nommée "Tableau1"
Si je ne me trompe. Il faudrait faire une vérification pour savoir si la plage existe
La supprimer puis la redéfinir et nommer... A voir non testé
Jean marie
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 206
Messages
2 086 220
Membres
103 158
dernier inscrit
laufin