Accedé a une feuille cacher via une macro VBA

Résolu/Fermé
goomis95 Messages postés 39 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 3 décembre 2009 - 23 nov. 2009 à 18:14
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 - 3 déc. 2009 à 21:20
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+
A voir également:

19 réponses

gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
23 nov. 2009 à 21:51
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
goomis95 Messages postés 39 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 3 décembre 2009
24 nov. 2009 à 10:07
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
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
24 nov. 2009 à 10:20
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
goomis95 Messages postés 39 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 3 décembre 2009
24 nov. 2009 à 11:35
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
24 nov. 2009 à 11:46
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
goomis95 Messages postés 39 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 3 décembre 2009
24 nov. 2009 à 14:49
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
goomis95 Messages postés 39 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 3 décembre 2009
25 nov. 2009 à 16:32
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
pou pouille Messages postés 207 Date d'inscription mardi 20 octobre 2009 Statut Membre Dernière intervention 20 juillet 2012 31
25 nov. 2009 à 16:53
bonjour,
normalement le
application.screenupdating=False 
devrai fonctionner (en le placant après le sub ca devrai etre bon)
0
goomis95 Messages postés 39 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 3 décembre 2009
25 nov. 2009 à 17:13
Tout juste apres la declaration de la fonction ? ouki je vais essayer.
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
25 nov. 2009 à 18:29
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
pou pouille Messages postés 207 Date d'inscription mardi 20 octobre 2009 Statut Membre Dernière intervention 20 juillet 2012 31
25 nov. 2009 à 22:38
joli épuration ^^
c'est bien plus lisible
0
goomis95 Messages postés 39 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 3 décembre 2009
26 nov. 2009 à 13:02
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
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
26 nov. 2009 à 18:43
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
goomis95 Messages postés 39 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 3 décembre 2009
1 déc. 2009 à 18:23
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
goomis95 Messages postés 39 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 3 décembre 2009
2 déc. 2009 à 10:14
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
goomis95 Messages postés 39 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 3 décembre 2009
2 déc. 2009 à 13:32
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
pou pouille Messages postés 207 Date d'inscription mardi 20 octobre 2009 Statut Membre Dernière intervention 20 juillet 2012 31
2 déc. 2009 à 14:56
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
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
2 déc. 2009 à 22:25
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
goomis95 Messages postés 39 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 3 décembre 2009
3 déc. 2009 à 17:45
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
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
3 déc. 2009 à 21:20
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
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
1 déc. 2009 à 19:19
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