Formulaire VBA sans un userform
Bonjour,
je vient de faire scripte mais un bug figure j'ai pas compri svp aide moi
Bonjour,
Ton fichier modifié, je n'ai pas compris d'où provenait l'erreur. J'ai modifié ta macro pour copier dans la feuille rapport.
Cordialement.
Bonjour
Dans votre code, vu que le bouton Enregistrement se trouve sur la feuille du formulaire, le code contrôle sur la colonne M qui au final se retrouve à la ligne 32xxx. Et là votre déclaration de variable n'est plus Integer mais devrait passer en type Long.
Autre souci, votre code ne spécifie pas la feuille qui est la feuille Rapports ou Feuil2 comme dans la proposition de Zebulon
Au delà de ce souci et vu que votre feuille Rapport est au format structuré votre code serait plutôt à voir comme ceci
Sub enregistrement()
Dim ligne As Integer
With Worksheets("Rapports").ListObjects("t_Rapport") 'ou With Feuil2.ListObjects("t_Rapport")
If .ListRows.Count = 0 Then
.ListRows.Add: ligne = 1
Else: .ListRows.Add: ligne = .ListRows.Count
End If
With .DataBodyRange
.Item(ligne, 1) = Range("C10")
.Item(ligne, 2) = Range("C12")
.Item(ligne, 3) = Range("C14")
.Item(ligne, 4) = Range("C16")
.Item(ligne, 5) = Range("C18")
.Item(ligne, 6) = Range("C19")
.Item(ligne, 7) = Range("C20")
'etc....
End With
End with
End Sub
Rem : pour bien démarrer sur la ligne 2 de votre tableau structuré, sélectionnez A2 à Vx (donc uniquement les cellules du tableau structuré et pas les lignes complètes de la feuille !!), puis click droite et choisir l'option Supprimer --> Lignes de Tableau
Cordialement
MERCI BOUCOUP POSSIBLE DE FAIRE AUSSI SUR CE MODULE UN GESTION D'ACCÈS POUR QUE chaque un puis voire c’a feuille ?
re
MERCI BEAUCOUP.
POSSIBLE DE FAIRE AUSSI SUR CE MODULE UN GESTION D'ACCÈS POUR QUE chaque un puisse voire c’a feuille ?
et aussi modifier le contenue et faire la recherche des contenue ? SVP
Re
Petit message par rapport à vos deux derniers messages où vous écrivez en majuscules
Pour le cas où vous ne le sauriez pas, le fait d'écrire en majuscule sur un forum revient à "crier" et est considéré comme irrespectueux.
Merci de votre compréhension et participation
Salut à tous,
@Kheiroran, cela fait beaucoup de demande tout cela !
Je pense que pour que l'on t'aide il va falloir un tout petit peut mettre les pieds dans le plat, je n'ai pas vu un once de code de ta part depuis le post 1.
Je me répète surement, mais nous ne sommes pas là pour écrire tout un code à ta place, bien que certains sur le site seront prêt à le faire (Ha la gentillesse quand tu nous tient)
- On donne des noms aux plages de ta feuille formulaire
- On crée un tableau structuré sur la feuille rapport
- On lit bien le sujet envoyé en lien dans mon premier post
- On crée un fonction d'incrément pour l'ID.
Je ne pense pas que l'on ai besoin de créer un tableau pour chaque chargé de reporting, mais bon...
Et je me répète aussi sur ce point penser d'abord Access avant de penser Excel pour une base de donnée.
désole jean Paul avant de contacte j'ai fait beaucoups d'essai mes tjr des bug ces pour ça je vient verre vous
Bonjour,
désole jean Paul avant de contacte j'ai fait beaucoups d'essai mes tjr des bug ces pour ça je vient verre vous
Il y a plusieurs intervenants sur le fil. Donc une peu dans le sens de Jean Paul, faites un choix dans les propositions données qui sont :
- Soit le fichier de Zebulon2 avec un code plus "traditionnel" (qui fonctionne mais sans tenir compte de votre tableau structuré en feuille Rapport)
ou
- le code Enregistrement que je vous ai donné et basé sur votre tableau structuré nommé "t_rapport" dans la feuille rapport qu'il vous suffit de mettre à la place de celui que vous avez placé dans le fichier posté.
Le cas échéant, sans savoir votre choix, on ne sait pas avancer.
Sub enregistrement()
Dim ligne As Integer
With Worksheets("Rapports").ListObjects("t_Rapport") 'ou With Feuil2.ListObjects("t_Rapport")
If .ListRows.Count = 0 Then
.ListRows.Add: ligne = 1
Else: .ListRows.Add: ligne = .ListRows.Count
End If
With .DataBodyRange
fd.Range("B" & ligne) = Application.VLookup(Feuil1.Range("B6"), Range("t_Chargé_Report"), 2)
fd.Range("C" & ligne) = Application.VLookup(Feuil1.Range("J6"), Range("t_Unite"), 2)
.Item(ligne, 1) = Range("C10")
.Item(ligne, 2) = Range("C12")
.Item(ligne, 3) = Range("C14")
.Item(ligne, 4) = Range("C16")
.Item(ligne, 5) = Range("C18")
.Item(ligne, 6) = Range("C19")
.Item(ligne, 7) = Range("C20")
.Item(ligne, 8) = Range("g10")
.Item(ligne, 9) = Range("M10")
.Item(ligne, 10) = Range("J10")
.Item(ligne, 11) = Range("g12")
'fd.Range("J" & ligne) = [???]
.Item(ligne, 12) = Range("g14")
.Item(ligne, 13) = Range("g16")
.Item(ligne, 14) = Range("g18")
.Item(ligne, 15) = Range("G20")
.Item(ligne, 16) = Range("g22")
.Item(ligne, 17) = Range("C22")
.Item(ligne, 18) = Range("C12")
.Item(ligne, 19) = Range("g24")
.Item(ligne, 20) = Range("C26")
End With
End With
End Sub
@DAN
voila ce que je vient de faire
il y'a que ce bou j'ai pas su comment faire
fd.Range("B" & ligne) = Application.VLookup(Feuil1.Range("B6"), Range("t_Chargé_Report"), 2)
fd.Range("C" & ligne) = Application.VLookup(Feuil1.Range("J6"), Range("t_Unite"), 2)
vous pense quoi ,,,,?
Salut,
Ci l'on commence par le début :
If .ListRows.Count = 0 Then
.ListRows.Add: ligne = 1
Else
.ListRows.Add: ligne = .ListRows.Count
End If
Danc ce cas de figure il vaut mieux affecter un Objet sans te soucier si le tableau comporte déjà des entrées, le fait d'associer un Objet ne t'oblige plus à savoir sur quelle ligne tu es car par défaut la nouvelle ligne sera sélectionnée.
Set NewLine = .ListRows.Add
' Tu peux par contre décider de l'emplacement en ajoutant ,1 à la fin (pour ajouter en début de tableau), par défaut les enregistrements sont ajoutés en fin de tableau
Puisque par défaut la nouvelle ligne est sélectionnée plus besoin de la variable ligne seule la colonne nous importe
With NewLine
.Range(1) = Range("C10")
.Range(2) = Range("C12")
...
...
End With
Maintenant il faut toujours se constituer une petite boites à outils où seront garder nos principales fonctions.
Première fonction celle qui va nous servir à ajouter une ligne sur un tableau
Elle ne demande que le nom du tableau, et un Array de valeurs qui irons par paires Ex. VBA.Array("Nom client", [r_NomsClient], "Prénom client", [r_PrenomClient]). Comme tu peux le constater pour faciliter la compréhension et l'utilisation, j'ai nommé les plages du formulaire de la feuille formulaire.
' // AddData By Jean-Paul (Valtrase) le : 27/03/2022
' // Ajoute une ligne au tableau et y inscris les valeurs passées en paramètres
Function AddData(Tablename As String, Map)
Dim r As Long
Dim i As Long
Dim t As ListObject
Set t = Range(Tablename).ListObject
r = t.ListRows.Add.Index
For i = LBound(Map) To UBound(Map) Step 2
t.ListColumns(Map(i)).DataBodyRange(r).Value = Map(i + 1)
Next i
Set t = Nothing
End Function
Une petite fonction qui va incrémenter l'Id du tableau...
' // Increment By Jean-Paul (Valtrase) le : 27/03/2022
' // Calcule le max des ID lors de l'ajout d'une ligne dans le tableau
Public Function Increment(ByVal Entry As Range) As Long
Increment = Application.WorksheetFunction.Max(Entry) + 1
End Function
Et voilà il ne reste plus qu'à mettre tout cela ensemble pour faire prendre la mayonnaise.
Je récupère les valeur du chargé de reporting, et de unité avec la fonction Choose.
Sub enregistrement()
Dim strReporting As String
Dim strUnite As String
strReporting = Choose(CLng([r_Reporting]), "Kawter", "Naila", "Didi")
strUnite = Choose(CLng([r_Unite]), "Es Senia", "El Kerma")
Select Case MsgBox("Un nouvel enregistrement va être ajouté à la base de donnée." & vbCrLf _
& "" & vbCrLf _
& "Voulez-vous vraiment continuer ?", vbYesNo Or vbQuestion Or vbDefaultButton2, Application.Name)
Case vbYes
xlTools.AddData "t_Datas", VBA.Array("ID", Increment([t_Datas[ID]]), "Nom Reporteur", strReporting, "Unité", strUnite, "Nom client", [r_ClientNom], "Prénom Client", [r_ClientPrenom], "Lieu", _
[r_Lieu], "Date", Format(Now, "Short Date"), "Emballage", [r_Emballage], "Ticket", _
[r_Ticket], "Désignation", [r_Designation], "Expediteur", "Non renseigné", "Date livraison cmd", [r_DateLivraison], "Qté Lvr", _
[r_QteLivree], "Nbr Plt", [r_NbPlt], "Ste Trsp", [r_SteTrsp], "Nom chauffeur", [r_NomChauffeur], "Type véhicule", _
[r_TypeVehicule], "immatriculation", [r_Immatriculation], "Num téléphone", [r_Telephone], "F mission", _
[r_FMission], "Num facture", [r_NumFacture], "Num accusé", [r_NumAccuse], "Bon Trsf", _
[r_BonTrsf], "Notes", [r_Notes])
Case vbNo
MsgBox "L'action à été annulée par l'utilisateur"
End Select
End Sub
Voilà regarde le fichier exemple
@ Jean-Paul merci beaucoup et infiniment .
en même temps j'ai fait un peut scripte si vous pouvez me le corrige
qui gère le controle de visualisation des pages des utilisateur
et avant j'ai crée une feuille vide
Option Explicit
Private Sub Workbook_Open()
Dim i As Integer
Dim MonPassword As Variant
Worksheets("GA").Activate
For i = 1 To Sheets.Count - 1
Sheets("Rapport () " & i).Visible = False
Next i
MonPassword = InputBox("Veuillez entrer votre Password pour accéder à la feuille:", "Identification")
If MonPassword = "kawter" Then
Sheets("Rapport (1)").Visible = True
Worksheets("Rapport (1)").selecte
Range("B2").Select
End If
If MonPassword = "naila" Then
Sheets("Rapport (2)").Visible = True
Worksheets("Rapport (2)").selecte
Range("B2").Select
End If
If MonPassword = "didi" Then
Sheets("Rapport (3)").Visible = True
Worksheets("Rapport (3)").selecte
Range("B2").Select
End If
If MonPassword = "admin" Then
For i = 1 To Sheets.Count
Sheets("Rapport " & i).Visible = True
Next i
End If
End Sub
Re
Désolé de mon retour tardif
voila ce que je vient de faire il y'a que ce bou j'ai pas su comment faire
fd.Range("B" & ligne) = Application.VLookup(Feuil1.Range("B6"), Range("t_Chargé_Report"), 2)
fd.Range("C" & ligne) = Application.VLookup(Feuil1.Range("J6"), Range("t_Unite"), 2)
vous pense quoi ,,,,?
C'est le code proposé par Zébulon2. Vous vouliez faire quoi ?
Remarques au sujet de votre dernier post
- Evitez les espaces dans le nom des feuilles, mettez plutot --> Rapport1, Rapport2
- il ne faut pas de E à la fin des SELECTE
Private Sub Workbook_Open()
Dim i As Byte
Dim MonPassword As Integer
'..... le début du code
If MonPassword = "kawter" Then
With Worksheets("Rapport (1)") 'mieux --> with Worksheets("Rapport1")
.Visible = True
.Select
.Range("B2").Select
End With
End If
'.... le reste de votre code corrigé
Pour le reste et vu les propositions de Jean Paul qui vous conviennent, le mieux est que je vous laisse continuer avec lui
Cordialement
re,
Oui Dan m'a devancé a-t-il un fille qui le tiens trois plombe au téléphone
Donc pas de .selecte le fait qu'il soit rester en minuscule aurait du te mettre la puce à l'oreille.
J'ai modifié le fichier pour avoir un tableau par chargé de reporting même si je ne suis pas pour.
@jean paul s.v.p la fonctionnalité de "Display Names" j'ai pas sue .
mercu d'avance .
bonjour ,a tous *
en même temps je vous remercie pour votre aide en meme temps possible de savoir si en je peut avoir une formation de votre part?
Salut,
@jean paul s.v.p la fonctionnalité de "Display Names" j'ai pas sue .
Elle ne sert juste qu'à cacher les noms de plages va voir dans le menu Formules et puis Gestionnaire de noms, si tu cliques sur display Names tu affiches ou cache les noms de plages.
en même temps je vous remercie pour votre aide en meme temps possible de savoir si en je peut avoir une formation de votre part?
Je pense que tout le monde sera d'accord avec moi il faut beaucoup de temps pour cela, mais il existe plein de formations et de livres si tant est que l'on veuille investir une trentaine d'euros pour cela...
re
je vous remercie pour votre aide en meme temps possible de savoir si en je peut avoir une formation de votre part?
Comme Jean Paul le fait remarquer, il faut du temps .... qui plus est, si vous êtes autodidacte comme moi...
Un petit lien que j'avais écrit il y a quelques années --> https://forum.excel-pratique.com/s/goto/45708
Cordialement
salut @DAN
voila j'ai adapte ton script mais cette anomalie me sort concernant le mot de passe pour la page si tu a autre proposition .
Option Explicit
Private Sub Workbook_Open()
Dim i As Byte
Dim MonPassword As Integer
'afficher la feuille 'Sommaire'des l'ouverture du classeur
Worksheets("Sommaire").Activate
'on faire une boucle permettant de masquer toutes autre feuilles'Rapports Kawter .....
For i = 1 To Sheets.Count - 1
Sheets("Rapport" & i).Visible = False
Next i
'pour recupere le code ou mot de passe normalement ces dans une boite de type inputBox comment faire maintenent???
If MonPassword = "kawter" Then 'il ma cree une anomalie que j'arrive pas a la regle ces msg"erreur d'execution13
With Worksheets("RapportsKawter")
.Visible = True
.Select
.Range("B2").Select
End With
End If
If MonPassword = "naila" Then
With Worksheets("RapportsNaila")
.Visible = True
.Select
.Range("B2").Select
End With
End If
If MonPassword = "didi" Then
With Worksheets("RapportsDidi")
.Visible = True
.Select
.Range("B2").Select
End With
End If
If MonPassword = "admin" Then
With Worksheets("Rapports " & i)
.Visible = True
.Select
.Range("B2").Select
End With
End If
End Sub
et il fonctionne pas le scripte sur la page ! pourquoi ? svp