Accedé a une feuille cacher via une macro VBA

Résolu
goomis95 Messages postés 40 Statut Membre -  
gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
Et désolé pour l'orthographe dans le titre sinon cela ne rentrait pas entièrement :)

Voila en fait sous excel j'ai des requêtes d'insertion, de modification, de suppression et de vue. ( en langage base de données : insert, select, update, delete ).

Seulement mon problèmes c'est que si je cache les feuilles de "tables" servant de BDD je ne peux pas insérer de données ni les modifier elles sont donc obligés d'être "disponibles" donc non cachés et accessible sans avoir recours à mes requêtes. Cela facilite les choses me direz vous, mais est-il possible de rendre ces feuilles de "tables" cachés tout en rendant les requêtes exécutables ?

Je ne sais pas si j'ai été clair mais j'espère l'avoir été :). En espérant une réponse m'éclairant sur ma question.

A+
Configuration: Windows XP
Firefox 3.0.15

19 réponses

  1. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    As-tu essayé d'afficher tes feuilles, faire ta requête puis cacher tes feuilles ?

    Si tu inhibes la mise à jour écran, cela devrait être totalement transparent.
    0
  2. goomis95 Messages postés 40 Statut Membre
     
    Quand j'affiche les feuilles mes requêtes fonctionnent , si je les cache après c'est bon mais le problèmes c'est que si l'on doit faire une requête d'ajout et devoi démasquer les feuilles a chaque fois alors autant ne pas faire de requête :).

    Qu'entend tu pas inhibé les feuille ?
    0
  3. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    Qu'entend tu pas inhibé les feuille ?

    Tu n'as pas bien lu : Si tu inhibes la mise à jour écran

    devoi démasquer les feuilles a chaque fois alors autant ne pas faire de requête

    C'est sûr que l'exécution d'une ligne de code avant et après que tu ne verras pas doit être très pénalisante.

    Tu fais comme tu veux mais essaies de lire ce qui est écrit pour comprendre la totalité de la proposition.
    0
  4. goomis95 Messages postés 40 Statut Membre
     
    J'ai bien compris ce que tu voulais dire ( maintenant ) mais j'ai du mal m'expliquer ( enfin je pense ).

    En fait sur une feuille "formulaire" j'ai une requete pour inserer les donnée dans la feuille "ordi" par exemple.
    Si je cache la feuille "ordi" la requete d'insertion via la macro ne marche pas.

    Donc pour que la requete fonctionne je dois laisser la feuille "ordi" afficher et je ne peux pas la masquer.

    Maintenant je veux bien tester ta proposition mais je ne sais pas comment faire pour inhiber la mise a jour d'ecran peut etre est-ce Application.ScreenUpdating = False qui empeche de voir le changement de feuille lors de l'execution de la macro mais cela ne fonctionne pas ( ou alors je le met au mauvais endroit ou je dois en mettre beaucoup plus ).

    Voiloo :)
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Bonjour à vous,
      Je viens de faire un petit test qui, à moins d'une incompréhension totale de votre question, devrait résoudre votre problème.
      Voyons si j'ai bien compris.
      Une feuille "formulaire" dite de saisie
      Une feuille "ordi" masquée qui recueille les données saisies en "formulaire".
      Essayez ceci :
      Sub test()
      With Sheets("ordi")
      .Range("A65536").End(xlUp).Offset(1, 0) = Range("A1")
      End With
      End Sub
      Si vous êtes placés sur la feuille "formulaire", ce test "envoie" dans la première cellule vide de la colonne A feuille "ordi" (masquée) la valeur de formulaire!A1;
      C'est bien ce que vous souhaitiez?
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. goomis95 Messages postés 40 Statut Membre
     
    Effectivement cela donne ce que je souhaite. Mais la formulation ne m'arrange guere car avec mon code ( pres de 1000 lignes ) je ne peux pas mettre cette ligne, donc je vais devoir chercher a partir de votre solution la facon de l'adapté a mon code.

    Si y'en a qui veulent m'aider je post le code (pas tout le code mais si une fonction ou deux est resolu alors je pourrais l'appliquer partout ailleurs :) ):

    Sub Vue_Ordi()
    Dim valeur
    Dim comparaison As Byte
    Dim tablo
    Dim ligne As Byte, compteur_y As Byte, compteur_x As Byte
    Dim a, b, c, d As Integer
    Dim tableau()
    ReDim tableau(6)
    Sheets("ordi").Select
    b = ActiveSheet.Range("A65356").End(xlUp).Row
    For a = 1 To b
    tableau(0) = Sheets("ordi").Range("A" & a).Value
    tableau(1) = Sheets("ordi").Range("B" & a).Value
    tableau(2) = Sheets("ordi").Range("C" & a).Value
    tableau(3) = Sheets("ordi").Range("D" & a).Value
    tableau(4) = Sheets("ordi").Range("E" & a).Value
    tableau(5) = Sheets("ordi").Range("F" & a).Value
    tableau(6) = Sheets("ordi").Range("G" & a).Value
    Sheets("recherche").Select
    d = ActiveSheet.Range("A65356").End(xlUp).Row + 1
    For c = 0 To 6
    ActiveSheet.Cells(d, (c + 1)) = tableau(c)
    Next
    Next
    Application.ScreenUpdating = False
    valeur = Range("case_user")
    If IsEmpty(valeur) Then
    MsgBox "Veuillez choisir le nom de la personne pour que la requête fonctionne", vbCritical
    Exit Sub
    End If
    With Sheets("recherche")
    comparaison = Application.CountIf(.Columns(1), valeur)
    ReDim tablo(comparaison - 1, colonne_user - 1)
    ligne = 1
    For compteur_y = 0 To UBound(tablo)
    ligne = .Columns(1).Find(valeur, .Cells(ligne, 1), xlValues).Row
    For compteur_x = 0 To colonne_user - 1
    tablo(compteur_y, compteur_x) = .Cells(ligne, compteur_x + 1)
    Next
    Next
    End With
    nettoyerVueOrdi
    nettoyerSearch
    Application.ScreenUpdating = False
    Sheets("requete de vue").Activate
    With Range("resultatuser").Resize(comparaison, colonne_user)
    .Value = tablo
    .Borders.Weight = xlThin
    End With
    Rows("20:24").Select
    With Selection.Font
    .Name = "Arial"
    .Size = 8
    .Strikethrough = False
    .Superscript = False
    .Subscript = False
    .OutlineFont = False
    .Shadow = False
    .Underline = xlUnderlineStyleNone
    .ColorIndex = xlAutomatic
    End With
    Range("I3").Select
    End Sub

    deuxoeme fonction :

    Sub formulaire_ordinateur()
    Dim tableau()
    Dim compteur, dlu As Integer
    ReDim tableau(11)
    Sheets("formulaire").Select
    tableau(0) = Range("C4").Value
    tableau(1) = Range("D4").Value
    tableau(2) = Range("E4").Value
    tableau(3) = Range("F4").Value
    tableau(4) = Range("G4").Value
    tableau(5) = Range("H4").Value
    tableau(6) = Range("I4").Value
    tableau(7) = Range("J4").Value
    tableau(8) = Range("K4").Value
    tableau(9) = Range("L4").Value
    tableau(10) = Range("M4").Value
    tableau(11) = Range("N4").Value
    Sheets("ordi").Select
    dlu = ActiveSheet.Range("A65356").End(xlUp).Row + 1
    For compteur = 0 To 11
    ActiveSheet.Cells(dlu, (compteur + 1)) = tableau(compteur)
    Next compteur
    Sheets("formulaire").Select
    Range("C4:N4").ClearContents
    End Sub

    Voiloo :) en attendant merci de m'avoir deja aider pijaku.
    0
  7. goomis95 Messages postés 40 Statut Membre
     
    Personne n'a d'idée pour faire en sorte que la fonction :

    Sub formulaire_ordinateur()
    Dim tableau()
    Dim compteur, dlu As Integer
    ReDim tableau(11)
    Sheets("formulaire").Select
    tableau(0) = Range("C4").Value
    tableau(1) = Range("D4").Value
    tableau(2) = Range("E4").Value
    tableau(3) = Range("F4").Value
    tableau(4) = Range("G4").Value
    tableau(5) = Range("H4").Value
    tableau(6) = Range("I4").Value
    tableau(7) = Range("J4").Value
    tableau(8) = Range("K4").Value
    tableau(9) = Range("L4").Value
    tableau(10) = Range("M4").Value
    tableau(11) = Range("N4").Value
    Sheets("ordi").Select
    dlu = ActiveSheet.Range("A65356").End(xlUp).Row + 1
    For compteur = 0 To 11
    ActiveSheet.Cells(dlu, (compteur + 1)) = tableau(compteur)
    Next compteur
    Sheets("formulaire").Select
    Range("C4:N4").ClearContents
    End Sub

    Puisse fonctionner sans avoir besoin que la feuille ordi soit ouverte ( en d'autre terme faire en sorte qu'elle soit masquée et que cela fonctionne ) ?

    A+
    0
  8. pou pouille Messages postés 212 Statut Membre 31
     
    bonjour,
    normalement le
    application.screenupdating=False 
    devrai fonctionner (en le placant après le sub ca devrai etre bon)
    0
  9. goomis95 Messages postés 40 Statut Membre
     
    Tout juste apres la declaration de la fonction ? ouki je vais essayer.
    0
  10. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    Pour que ta macro fonctionne avec la feuille masquée, tu peux la simplifier ainsi :
    Sub formulaire_ordinateur()
    Dim compteur, dlu As Integer
    Sheets("formulaire").Select
    With Sheets("ordi")
        dlu = .Range("A65356").End(xlUp).Row + 1
        For compteur = 0 To 11
            .Cells(dlu, (compteur + 1)) = Cells(4, compteur + 3).Value
        Next compteur
    End With
    Range("C4:N4").ClearContents
    End Sub
    

    La feuille "ordi" n'est pas affichée et même masquée et cela ne l'empêche aucunement de récupérer le Range("C4:N4") de ta feuille "formulaire".

    Le "." initial des instructions est qualifié par With Sheets("ordi")
    0
  11. pou pouille Messages postés 212 Statut Membre 31
     
    joli épuration ^^
    c'est bien plus lisible
    0
  12. goomis95 Messages postés 40 Statut Membre
     
    J'ai compris le fait que de faire ActiveSheet.blabla et sheets("test").select ne pouvait pas être compatible avec le fait de masquer une feuille tout en y insérant des données et cela grâce a ton code. Merci beaucoup. J'ai plus qu'à modifier ... toutes mes lignes de codes pour faire en sorte que cela marche partout :). Encore merci. A+
    0
  13. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    Merci de ton message et dans la simplification, je n'avais pas été tout à fait au bout pour ne pas trop te perturber mais tu peux encore simplifier ainsi maintenant que tu as compris le précédent :
    Sub formulaire_ordinateur()
    Dim dlu As Integer
    Sheets("formulaire").Select
    With Sheets("ordi")
        dlu = .Range("A65356").End(xlUp).Row + 1
        .Cells(dlu, 1).Resize(1, 12).Value = Range("C4:N4").Value
    End With
    Range("C4:N4").ClearContents
    End Sub
    

    ou bien même ceci qui fonctionne sans aucun positionnement
    Sub formulaire_ordinateur()
    With Sheets("ordi")
        .Cells(.Range("A65356").End(xlUp).Row + 1, 1).Resize(1, 12).Value _
            = Sheets("formulaire").Range("C4:N4").Value
    End With
    Sheets("formulaire").Range("C4:N4").ClearContents
    End Sub
    
    0
  14. goomis95 Messages postés 40 Statut Membre
     
    C'est exactement ce que j'ai fait quand j'ai compris ton message d'avant :)

    Encore merci seulement j'ai un petit souci en fait la pour convertir mon ancienne macro sans masquer à une macro qui fonctionne en pouvant masquer la feuille. Apparament il n'aime pas trop :

    code 1 : masquant la feuille ordi

    With Sheets("ordi")
    i = 1
    For i = 1 To 2000
    If Range("A" & i) = valeur Then
    If Range("B" & i) = valeur2 Then
    Rows(i & ":" & i).Select
    Selection.Delete Shift:=xlUp
    End If
    End If
    Next
    End With

    (On se situe dans la feuille "effacer"). Avec la feuille ordi , je met un compteur i de 1 a 2000 pour lire mon fichier, si la valeur Ai = à valeur alors je rentre dans le si qui regarde si Bi = valeur2 et si c'ets le cas il efface la ligne i dans la feuille Ordi.

    alors que bizaremment pour la même chose sans essayer de cacher la feuille ordi cela fonctionne avec :

    code 2 : sans masquer feuille ordi

    Sheets("ordi").select
    i = 1
    For i = 1 To 2000
    If Range("A" & i) = valeur Then
    If Range("B" & i) = valeur2 Then
    Rows(i & ":" & i).Select
    Selection.Delete Shift:=xlUp
    End If
    End If
    Next

    Le problème c'est qu'il exécute le code1 tranquillement sans erreur mais n'efface pas la ligne voulu ...
    J'ai essayé une vingtaine de codage différent sans résultat ou bien catastrophique.

    Peux tu m'aider s'il te plait ? La je coince, il ne doit pas apprécier les IF combiné avec cette méthode car tout le reste de mon code fonctionne.

    A+ et merci d'avance.
    0
  15. goomis95 Messages postés 40 Statut Membre
     
    Salut,

    Message d'erreur sur le code que tu me donnes :
    propriete ou methode non gerer par l'objet au niveau de la ligne ' .Rows(i & ":" & i).Delete Shift:=xlUp '
    si je met un .rows cela ne fonctionne pas ... et si j'essaie de faire .clearcontents a la fin d'un .range en remplacant la ligne cela ne fonctionne pas non plus. SI j'arrivais a faire clear contents je peux ensuite faire en sorte d'effacer les lignes vides mais la ... je n'arrive a rien :'(

    L'espoir fait vivre alors je vais quand même continuer a chercher :).
    0
  16. goomis95 Messages postés 40 Statut Membre
     
    RE salut,

    Voila j'ai trouver la solution ... un peu tordu comme truc j'en était venu a faire toute une manip en commencant part supprimer le contenu puis la ligne avec plusieurs boucle , et une variable ne plus mais finalement pas besoin j'ai trouver le truc :).

    Je le post pour ceux qui en aurait besoin :

    With Sheets("ordi")
    For i = 2000 To 1 Step -1
    If .Range("A" & i) = valeur Then
    If .Range("B" & i) = valeur2 Then
    With Sheets("ordi")
    .Rows(i & ":" & i).Delete shift:=xlUp
    End With
    End If
    End If
    Next i
    End With

    et merci encore d'avoir passer du temps a m'aider gbinforme.

    A+

    GooM
    0
    1. pou pouille Messages postés 212 Statut Membre 31
       
      bonjour,
      Heu , c'est pratiquement la meme chose que le post 15 de gbinforme... appart que tu rajoute un With alors qu'il est défini au début...
      0
  17. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    Tu peux tout simplement mettre :
                       .Rows(i).Delete Shift:=xlUp

    Tu n'as effectivement besoin que tu numéro de ligne et non d'une plage mais je n'avais pas vu ce surplus sur le moment et après j'ai dû partir et je n'ai pas pu corriger.
    0
  18. goomis95 Messages postés 40 Statut Membre
     
    Ouai je sais pou pouille mais ca marche comme ca et pas dans celui de gbinforme alors que veux tu que je te dise :)
    c'est lourd et moche mais si ca marche ... :)

    Ouai je sais je l'ai modifié par la suite, je simplifie le code en meme temps que je note les commentaires, et j'en etait pas encore la niveau commentaire ^^.

    A pluche.
    0
  19. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    ca marche comme ca et pas dans celui de gbinforme alors que veux tu que je te dise

    Que veux-tu que l'on te dise en effet si tu est sûr de ton fait ?

    Cependant la programmation obéie à quelques règles précises et ce que tu racontes est plus de l'ésotérisme que des notions de codage informatique : la double qualification ne peut en aucun cas améliorer un fonctionnement.

    Quand tu écris aussi :
    With Sheets("ordi")
    i = 1
    For i = 1 To 2000
    If Range("A" & i) = valeur Then
    If Range("B" & i) = valeur2 Then
    Rows(i & ":" & i).Select
    Selection.Delete Shift:=xlUp

    Cela révèle que tu n'as pas compris le fonctionnement de With Sheets("ordi") puisque tu l'écris sans l'utiliser ensuite et tu prétends ensuite que "alors que bizaremment pour la même chose" cela fonctionne avec Sheets("ordi").select

    Soyons sérieux avant d'écrire que le code agit bizarrement : il ne fait que ce qu'on lui dit de faire !
    Lorsque cela ne fonctionne pas il faut d'abord vérifier ce qui est écrit avant d'implorer le hasard ou un bug VBA.

    En employant le mot requête dans ta question, tu n'en maitrise pas non plus le sens et tu peux le vérifier ici
    0
  20. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    Comme ceci cela devrait fonctionner :
    - il ne faut pas utiliser les "select" car tu es alors obligé d'avoir la feuille affichée.
    - il est préférable de supprimer en partant du bas sinon tes index sont perturbés par les suppressions.
    - pour que "with" fonctionne il faut que les positionnements commencent par "." sinon tu restes sur la feuille active.
    With Sheets("ordi")
        For i = 2000 To 1 Step -1
            If .Range("A" & i) = valeur Then
                If .Range("B" & i) = valeur2 Then
                        .Rows(i & ":" & i).Delete Shift:=xlUp
                End If
            End If
        Next i
    End With
    
    -1