Accedé a une feuille cacher via une macro VBA [Résolu/Fermé]

Signaler
Messages postés
39
Date d'inscription
mardi 3 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2009
-
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
-
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+

19 réponses

Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 066
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.
Messages postés
39
Date d'inscription
mardi 3 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2009

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 ?
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 066
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.
Messages postés
39
Date d'inscription
mardi 3 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2009

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 :)
Messages postés
12177
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
26 juin 2020
2 448
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?
Messages postés
39
Date d'inscription
mardi 3 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2009

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.
Messages postés
39
Date d'inscription
mardi 3 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2009

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+
Messages postés
207
Date d'inscription
mardi 20 octobre 2009
Statut
Membre
Dernière intervention
20 juillet 2012
30
bonjour,
normalement le
application.screenupdating=False 
devrai fonctionner (en le placant après le sub ca devrai etre bon)
Messages postés
39
Date d'inscription
mardi 3 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2009

Tout juste apres la declaration de la fonction ? ouki je vais essayer.
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 066
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")
Messages postés
207
Date d'inscription
mardi 20 octobre 2009
Statut
Membre
Dernière intervention
20 juillet 2012
30
joli épuration ^^
c'est bien plus lisible
Messages postés
39
Date d'inscription
mardi 3 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2009

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+
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 066
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
Messages postés
39
Date d'inscription
mardi 3 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2009

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.
Messages postés
39
Date d'inscription
mardi 3 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2009

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 :).
Messages postés
39
Date d'inscription
mardi 3 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2009

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
Messages postés
207
Date d'inscription
mardi 20 octobre 2009
Statut
Membre
Dernière intervention
20 juillet 2012
30
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...
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 066
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.
Messages postés
39
Date d'inscription
mardi 3 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2009

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.
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 066
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
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 066
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