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

Re, suite à ta demande.

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

Rechercher des sujets similaires à "formulaire vba userform"