Microsoft 365 écriture via code vba

Keiko

XLDnaute Occasionnel
Bonjour, voici un code qui fonctionne super bien pour ouvrir des onglets d'un excel en rapport avec un user et un mot de passe.
Je souhaiterais qu'en plus d'ouvrir les onglets, il puisse m'inscrire en D10 une information se trouvant en colonne 4 dans l'onglet "DroitsUsers".
Pensez-vous que cela puisse être possible?

On Error Resume Next
Application.ScreenUpdating = False
'on defini un pointeur
Pointeur = 0

'on affiche la feuille Vierge
Sheets("L").Visible = True
'on va dessus
Sheets("L").Activate
'on planque toutes les autres
For x = 1 To ThisWorkbook.Sheets.Count
If Sheets(x).Name <> "L" Then Sheets(x).Visible = xlSheetVeryHidden
Next

'on saisit le user
User = InputBox("Veuillez saisir votre nom d'utilisateur", "Utilisateur")
'on saisit le mot de passe
MDP = InputBox("Veuillez saisir votre mot de passe", "Mot de passe")

'Derniere ligne du tableau de la feuille DroitsUsers pour boucler dessus
DerLigne = Sheets("DroitsUsers").Range("A65536").End(xlUp).Row

'on boucle pour trouver les occurences, x=2 car je pars du principe que la premiere ligne _
contient les entetes de colonne
For x = 2 To DerLigne
'si ce qu'il y a dans la colonne1 (Colonne A : user) = le user saisi _
ET ce qu'il y a dans la colonne2 (Colonne B : mot de passe)
If Worksheets("DroitsUsers").Cells(x, 1) = User And Worksheets("DroitsUsers").Cells(x, 2) = MDP Then
'on affiche la feuille définié en colonne3 (Colonne C : Onglet autorisé)
'on affiche la feuille correspondante
FeuilleVisible = Worksheets("DroitsUsers").Cells(x, 3)
Sheets(FeuilleVisible).Visible = True
'on va dessus
Sheets(FeuilleVisible).Activate
'on se met un pointeur pour voir si on trouve quelque chose, si on trouve rien on quittera
Pointeur = Pointeur + 1


ElseIf User = "JD" And MDP = "Jpc42*" Then
For i = 1 To ThisWorkbook.Sheets.Count
If Sheets(i).Name <> "Intro" Then Sheets(i).Visible = True
Next
Application.ScreenUpdating = True
Exit Sub

End If

Next x

'Si le pointeur est 0 on ferme le fichier.
If Pointeur = 0 Then
MsgBox "Utilisateur ou mot de passe non valide" & vbCrLf & vbCrLf & "Le fichier va se fermer", vbCritical + vbOKOnly, "Sécurité"
ActiveWorkbook.Close SaveChanges:=False
End If

Application.ScreenUpdating = True
 

soan

XLDnaute Barbatruc
Inactif
@Keiko

heureusement que je t'ai dit de joindre un fichier Excel ! 😁

Image.jpg


si vraiment tu veux mettre un code VBA dans un post du forum, alors tu dois le placer entre des balises de code ; pour cela, utilise le bouton "</>" qui est juste à gauche du bouton guillemet (= Citer) ; les boutons sont sur la 1ère ligne d'un post en cours d'édition.​

soan
 

Keiko

XLDnaute Occasionnel
Désolé :/

Bonjour,

voici un code qui fonctionne super bien pour ouvrir des onglets d'un excel en rapport avec un user et un mot de passe.
Je souhaiterais qu'en plus d'ouvrir les onglets, il puisse m'inscrire en D10 une information se trouvant en colonne 4 dans l'onglet "DroitsUsers".
Pensez-vous que cela puisse être possible?

</>On Error Resume Next
Application.ScreenUpdating = False
'on defini un pointeur
Pointeur = 0

'on affiche la feuille Vierge
Sheets("L").Visible = True
'on va dessus
Sheets("L").Activate
'on planque toutes les autres
For x = 1 To ThisWorkbook.Sheets.Count
If Sheets(x).Name <> "L" Then Sheets(x).Visible = xlSheetVeryHidden
Next

'on saisit le user
User = InputBox("Veuillez saisir votre nom d'utilisateur", "Utilisateur")
'on saisit le mot de passe
MDP = InputBox("Veuillez saisir votre mot de passe", "Mot de passe")

'Derniere ligne du tableau de la feuille DroitsUsers pour boucler dessus
DerLigne = Sheets("DroitsUsers").Range("A65536").End(xlUp).Row

'on boucle pour trouver les occurences, x=2 car je pars du principe que la premiere ligne _
contient les entetes de colonne
For x = 2 To DerLigne
'si ce qu'il y a dans la colonne1 (Colonne A : user) = le user saisi _
ET ce qu'il y a dans la colonne2 (Colonne B : mot de passe)
If Worksheets("DroitsUsers").Cells(x, 1) = User And Worksheets("DroitsUsers").Cells(x, 2) = MDP Then
'on affiche la feuille définié en colonne3 (Colonne C : Onglet autorisé)
'on affiche la feuille correspondante
FeuilleVisible = Worksheets("DroitsUsers").Cells(x, 3)
Sheets(FeuilleVisible).Visible = True
'on va dessus
Sheets(FeuilleVisible).Activate
'on se met un pointeur pour voir si on trouve quelque chose, si on trouve rien on quittera
Pointeur = Pointeur + 1


ElseIf User = "JD" And MDP = "Jpc42*" Then
For i = 1 To ThisWorkbook.Sheets.Count
If Sheets(i).Name <> "Intro" Then Sheets(i).Visible = True
Next
Application.ScreenUpdating = True
Exit Sub

End If

Next x

'Si le pointeur est 0 on ferme le fichier.
If Pointeur = 0 Then
MsgBox "Utilisateur ou mot de passe non valide" & vbCrLf & vbCrLf & "Le fichier va se fermer", vbCritical + vbOKOnly, "Sécurité"
ActiveWorkbook.Close SaveChanges:=False
End If

Application.ScreenUpdating = True</>
 

soan

XLDnaute Barbatruc
Inactif
je vois que tu as essayé, mais ce n'est pas comme ça ; n'écris pas "</>" : clique sur le bouton </> ; ça va afficher une fenêtre ; dans cette fenêtre, fais un copier / coller de ton code VBA.

Image.jpg


mais de toutes façons, comment veux-tu qu'on puisse t'aider facilement si tu ne joins pas ton fichier Excel en exemple ? on n'a pas ton onglet "DroitsUsers" (ni le reste).​

soan
 

Keiko

XLDnaute Occasionnel
En faite, je soushaites simplement aller rechercher l'information dans l'onglet "DroitsUsers" comme dans le code ci-dessus.
La j'encode le User en colonne 1 et le MP en colonne 2 et cela me donne les droits des onglets (il s'affiche, si ils sont sélectionnés) en colonne 3 comme tu peux le voir ci dessus.
Ce que je souhaite, c'est qu'en plus, il reprenne l'information en colonne 4 et l'écrive dans l'onglet L en cellule D10.
Malheureusementl'excel est lourd et mon clavier ne permet pas d'ajouter ce que tu demandes :/
 

soan

XLDnaute Barbatruc
Inactif
mon clavier ne permet pas d'ajouter ce que tu demandes

??? ce n'est pas sur le clavier, c'est sur la fenêtre d'un post en cours d'édition ;
regarde l'image que j'ai ajoutée dans mon post #4.

si le fichier est lourd, essaye de le zipper : il passera s'il fait 1 Mo ou moins ;
sinon, tant pis ! mais sans fichier, c'est beaucoup moins évident !

je laisse la suite à un autre intervenant. 🍀

soan
 

Keiko

XLDnaute Occasionnel
Bonjour,

voici un code qui fonctionne super bien pour ouvrir des onglets d'un excel en rapport avec un user et un mot de passe.
Je souhaiterais qu'en plus d'ouvrir les onglets, il puisse m'inscrire en D10 une information se trouvant en colonne 4 dans l'onglet "DroitsUsers".
Pensez-vous que cela puisse être possible?

VB:
On Error Resume Next
Application.ScreenUpdating = False
'on defini un pointeur
Pointeur = 0

'on affiche la feuille Vierge
Sheets("L").Visible = True
'on va dessus
Sheets("L").Activate
'on planque toutes les autres
For x = 1 To ThisWorkbook.Sheets.Count
If Sheets(x).Name <> "L" Then Sheets(x).Visible = xlSheetVeryHidden
Next

'on saisit le user
User = InputBox("Veuillez saisir votre nom d'utilisateur", "Utilisateur")
'on saisit le mot de passe
MDP = InputBox("Veuillez saisir votre mot de passe", "Mot de passe")

'Derniere ligne du tableau de la feuille DroitsUsers pour boucler dessus
DerLigne = Sheets("DroitsUsers").Range("A65536").End(xlUp).Row

'on boucle pour trouver les occurences, x=2 car je pars du principe que la premiere ligne _
contient les entetes de colonne
For x = 2 To DerLigne
'si ce qu'il y a dans la colonne1 (Colonne A : user) = le user saisi _
ET ce qu'il y a dans la colonne2 (Colonne B : mot de passe)
If Worksheets("DroitsUsers").Cells(x, 1) = User And Worksheets("DroitsUsers").Cells(x, 2) = MDP Then
'on affiche la feuille définié en colonne3 (Colonne C : Onglet autorisé)
'on affiche la feuille correspondante
FeuilleVisible = Worksheets("DroitsUsers").Cells(x, 3)
Sheets(FeuilleVisible).Visible = True
'on va dessus
Sheets(FeuilleVisible).Activate
'on se met un pointeur pour voir si on trouve quelque chose, si on trouve rien on quittera
Pointeur = Pointeur + 1


ElseIf User = "JD" And MDP = "Jpc42*" Then
For i = 1 To ThisWorkbook.Sheets.Count
If Sheets(i).Name <> "Intro" Then Sheets(i).Visible = True
Next
Application.ScreenUpdating = True
Exit Sub

End If

Next x

'Si le pointeur est 0 on ferme le fichier.
If Pointeur = 0 Then
MsgBox "Utilisateur ou mot de passe non valide" & vbCrLf & vbCrLf & "Le fichier va se fermer", vbCritical + vbOKOnly, "Sécurité"
ActiveWorkbook.Close SaveChanges:=False
End If

Application.ScreenUpdating = True

Re petit résumé :
En faite, je souhaites simplement aller rechercher l'information dans l'onglet "DroitsUsers" comme dans le code ci-dessus.
La j'encode le User en colonne 1 et le MP en colonne 2 et cela me donne les droits des onglets (il s'affiche, si ils sont sélectionnés) en colonne 3 comme ci dessus.
Ce que je souhaite, c'est qu'en plus, il reprenne l'information en colonne 4 et l'écrive dans l'onglet "L" en cellule D10.

Merci à tous :)
 

soan

XLDnaute Barbatruc
Inactif
Bonjour Keiko,

je crois avoir compris ce que tu veux ; essaye ce code VBA :​

VB:
Option Explicit

Sub Essai()
  Dim FA$, User$, MDP$, DerLigne&, n%, i%, x&
  n = Worksheets.Count: Application.ScreenUpdating = 0
 
  'on affiche la feuille vierge, et on va dessus
  Worksheets("L").Visible = True: Worksheets("L").Select
  'on masque toutes les autres feuilles
  For i = 1 To n
    If Worksheets(i).Name <> "L" Then Worksheets(i).Visible = xlSheetVeryHidden
  Next i
 
  'on saisit le user, puis le mot de passe
  User = InputBox("Veuillez saisir votre nom d'utilisateur", "Utilisateur")
  MDP = InputBox("Veuillez saisir votre mot de passe", "Mot de passe")
  If User = "" Or MDP = "" Then Exit Sub
 
  If User = "JD" And MDP = "Jpc42*" Then
    For i = 1 To n
      If Worksheets(i).Name <> "Intro" Then Worksheets(i).Visible = True
    Next i
    Exit Sub
  End If
 
  With Worksheets("DroitsUsers") 'avec la feuille "DroitsUsers"
    DerLigne = .Cells(Rows.Count, 1).End(xlUp).Row 'Dernière ligne, selon la colonne A
    For x = 2 To DerLigne 'boucle à partir de 2, car 1ère ligne = en-têtes de colonnes
      'si on trouve en colonnes A et B le User ET le Mot de passe qui ont été saisis
      If .Cells(x, 1) = User And .Cells(x, 2) = MDP Then
        'on affiche la feuille autorisée (nom en colonne C), et on va dessus
        FA = .Cells(x, 3): Worksheets(FA).Visible = True: Worksheets(FA).Select
        Worksheets("L").[D10] = .Cells(x, 4) 'info de la colonne D : en feuille L
        Exit Sub 'dès qu'on a trouvé une feuille autorisée, on quitte la sub
      End If
    Next x
  End With
 
  'on n'a pas trouvé de feuille autorisée => on ferme le fichier
  MsgBox "Utilisateur ou mot de passe non valide" & vbCrLf & vbCrLf _
    & "Le fichier va se fermer", vbCritical + vbOKOnly, "Sécurité"
  ActiveWorkbook.Close SaveChanges:=False
End Sub

à te lire pour avoir ton avis. :)

soan
 
Dernière édition:

Keiko

XLDnaute Occasionnel
Bonjour Keiko,

je crois avoir compris ce que tu veux ; essaye ce code VBA :​

VB:
Option Explicit

Sub Essai()
  Dim FA$, User$, MDP$, DerLigne&, n%, i%, x&
  n = Worksheets.Count: Application.ScreenUpdating = 0
 
  'on affiche la feuille vierge, et on va dessus
  Worksheets("L").Visible = True: Worksheets("L").Select
  'on masque toutes les autres feuilles
  For i = 1 To n
    If Worksheets(i).Name <> "L" Then Worksheets(i).Visible = xlSheetVeryHidden
  Next i
 
  'on saisit le user, puis le mot de passe
  User = InputBox("Veuillez saisir votre nom d'utilisateur", "Utilisateur")
  MDP = InputBox("Veuillez saisir votre mot de passe", "Mot de passe")
  If User = "" Or MDP = "" Then Exit Sub
 
  If User = "JD" And MDP = "Jpc42*" Then
    For i = 1 To n
      If Worksheets(i).Name <> "Intro" Then Worksheets(i).Visible = True
    Next i
    Exit Sub
  End If
 
  With Worksheets("DroitsUsers") 'avec la feuille "DroitsUsers"
    DerLigne = .Cells(Rows.Count, 1).End(xlUp).Row 'Dernière ligne, selon la colonne A
    For x = 2 To DerLigne 'boucle à partir de 2, car 1ère ligne = en-têtes de colonnes
      'si on trouve en colonnes A et B le User ET le Mot de passe qui ont été saisis
      If .Cells(x, 1) = User And .Cells(x, 2) = MDP Then
        'on affiche la feuille autorisée (nom en colonne C), et on va dessus
        FA = .Cells(x, 3): Worksheets(FA).Visible = True: Worksheets(FA).Select
        Worksheets("L").[D10] = .Cells(x, 4) 'info de la colonne D : en feuille L
        Exit Sub 'dès qu'on a trouvé une feuille autorisée, on quitte la sub
      End If
    Next x
  End With
 
  'on n'a pas trouvé de feuille autorisée => on ferme le fichier
  MsgBox "Utilisateur ou mot de passe non valide" & vbCrLf & vbCrLf _
    & "Le fichier va se fermer", vbCritical + vbOKOnly, "Sécurité"
  ActiveWorkbook.Close SaveChanges:=False
End Sub

à te lire pour avoir ton avis. :)

soan
On y est presque.
Tu inscris bien l'information en colonne 4 dans la page "L" en D10.
C'est ce que je voulais, c'est super un grand merci.
Mais tu ne m'ouvres que le premier onglet "QH" et le "L".
Alors qu'avant, j'ouvrais tous les onglets en rapport avec le user et le mot de passe.
Car il y a plusieurs lignes et donc plusieurs onglets à ouvrir en colonne 3.
Voici ci dessous les colonnes et informations.
1652863433699.png
 

soan

XLDnaute Barbatruc
Inactif
@Keiko (salut Bruno)

merci d'avoir mis ton titre en minuscules, comme te l'a demandé Bruno. ;)

nouvelle version du code VBA :

VB:
Option Explicit

Sub Essai()
  Dim FX As Worksheet, FA$, User$, MDP$, DerLigne&, flag As Byte, n%, i%, x&
  n = Worksheets.Count: Application.ScreenUpdating = 0
 
  'on affiche la feuille vierge, et on va dessus
  Worksheets("L").Visible = True: Worksheets("L").Select
  'on masque toutes les autres feuilles
  For i = 1 To n
    If Worksheets(i).Name <> "L" Then Worksheets(i).Visible = xlSheetVeryHidden
  Next i
 
  'on saisit le user, puis le mot de passe
  User = InputBox("Veuillez saisir votre nom d'utilisateur", "Utilisateur")
  MDP = InputBox("Veuillez saisir votre mot de passe", "Mot de passe")
  If User = "" Or MDP = "" Then Exit Sub
 
  If User = "JD" And MDP = "Jpc42*" Then
    For i = 1 To n
      If Worksheets(i).Name <> "Intro" Then Worksheets(i).Visible = True
    Next i
    Exit Sub
  End If
 
  With Worksheets("DroitsUsers") 'avec la feuille "DroitsUsers"
    DerLigne = .Cells(Rows.Count, 1).End(xlUp).Row 'Dernière ligne, selon la colonne A
    For x = 2 To DerLigne 'boucle à partir de 2, car 1ère ligne = en-têtes de colonnes
      'si on trouve en colonnes A et B le User ET le Mot de passe qui ont été saisis
      If .Cells(x, 1) = User And .Cells(x, 2) = MDP Then
        'on affiche la feuille autorisée (nom en colonne C)
        FA = .Cells(x, 3): Worksheets(FA).Visible = True
        'c'est pour aller, après la sortie de boucle, sur la 1ère feuille autorisée ;
        'note qu'il ne faut pas aller sur chaque feuille autorisée dans la boucle !
        If flag = 1 Then Set FX = Worksheets(FA)
        Worksheets("L").[D10] = .Cells(x, 4) 'info de la colonne D : en feuille L
        flag = flag + 1 'si au moins une feuille a été trouvée, on quittera la sub
      End If
    Next x
  End With
 
  'comme au moins une feuille a été trouvée, on va sur la 1ère feuille autorisée,
  'puis on quitte la sub pour ne pas faire la suite (qui est : fermer le fichier)
  If flag > 0 Then FX.Select: Exit Sub
 
  'on n'a pas trouvé de feuille autorisée => on ferme le fichier
  MsgBox "Utilisateur ou mot de passe non valide" & vbCrLf & vbCrLf _
    & "Le fichier va se fermer", vbCritical + vbOKOnly, "Sécurité"
  ActiveWorkbook.Close SaveChanges:=False
End Sub

ma variable flag (drapeau) est ton ancienne variable Pointeur ; mais vu l'utilisation qui en est faite, c'est bien un drapeau et pas un pointeur ; voici la différence : un pointeur pointe vers quelque chose, par exemple vers un objet ou une adresse ; un drapeau sert à signaler un état, puis à faire un aiguillage selon cet état ; ici, l'état est : « on a trouvé au moins une feuille » et l'aiguillage est de sortir de la sub si flag > 0 ➯ on fait la suite de fermer le fichier seulement si flag = 0 (aucune feuille n'a été trouvée, car le user et le mot de passe ne correspondent pas) ; c'est inutile de mettre dans le code flag = 0 car c'est fait automatiquement lors de la déclaration des variables par Dim (par défaut : nombre = 0 et chaîne de caractères = "").​



c'est inutile aussi de mettre Application.ScreenUpdating = True : c'est fait automatiquement juste avant la sortie de la sub ; mais des fois, c'est nécessaire de le mettre quand même si y'a un MsgBox et qu'on veut voir en arrière-plan des résultats récents.


J'ai renommé ta variable FeuilleVisible en FA (= Feuille Autorisée) ; ainsi, c'est mieux nommé ; et au lieu de :
FeuilleVisible = .Cells(x, 3): Worksheets(FeuilleVisible).Visible = True

c'est plus court d'écrire :
FA = .Cells(x, 3): Worksheets(FA).Visible = True


attention : il ne faut pas aller sur chaque feuille autorisée car c'est dans la boucle For x = 2 To DerLigne ; comme on veut sélectionner une seule feuille autorisée (la première), c'est inutile d'aller sur toutes ! c'est pourquoi j'utilise FX pour mémoriser la 1ère feuille autorisée (c'est celle pour laquelle flag = 1 ; et comme flag est augmenté ensuite, c'est mémorisé qu'une seule fois) ; en sortie de boucle, on va sur la feuille mémorisée FX (donc sur la 1ère feuille autorisée).


j'espère que tu as remarqué que j'ai beaucoup changé ton code VBA initial ; comme mon code VBA est plus optimisé, j'espère que tu n'as pas pris seulement la ligne :

Worksheets("L").[D10] = .Cells(x, 4) 'info de la colonne D : en feuille L



comme tu n'as joint qu'une image et pas de fichier Excel, je n'ai pas pu tester. ;)

soan
 
Dernière édition:

Statistiques des forums

Discussions
311 711
Messages
2 081 786
Membres
101 817
dernier inscrit
carvajal