Problème sur algorithme VBA

Résolu
eastpeople Messages postés 105 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 novembre 2008 - 29 mai 2008 à 15:48
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 - 3 juin 2008 à 20:40
Bonjour,
Je reposte un message car j'ai de nouveau un problème sur un de mes codes.
J'ai un textebox où on rentre des activités puis quand on valide elle se met dans excel et quand on veut en rentrer une autre, il faut qu'elle se mette en dessous de celle qui est déja inscrite.
Voila mon code:

Private Sub ok_click()
Dim Ws As Worksheet
Dim Ligne As Integer


Set Ws = Sheets("abonnements")
Ligne = Ws.Range("A2").End(xlDown).Row + 1


Ws.Cells(Ligne, 1) = Act
Ws.Cells(Ligne, 2) = prix1
Ws.Cells(Ligne, 3) = prix2
Ws.Cells(Ligne, 4) = prix3
Ws.Cells(Ligne, 5) = prix4
Ws.Cells(Ligne, 6) = prix5


Unload ADM


rep = MsgBox("Voulez-vous rentrer une autre activité ?", _
vbYesNo + vbQuestion, "Programmer une autre activité ?")


If rep = vbYes Then
    ADM.Show
End If
End Sub

Avec ce code ma premiere activité se met dans A8 et la suivante recouvre la première et je ne sais pas pourquoi.
Merci de m'aider.
Bonne journée à tous.

42 réponses

eastpeople Messages postés 105 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 novembre 2008
29 mai 2008 à 19:26
D'accord, j'ai compri merci beaucoup, je sais pas pourquoi mon message c'est mis 3fois.
Merci pour tout.
0
eastpeople Messages postés 105 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 novembre 2008
29 mai 2008 à 19:31
Nonnnnnnnn ça marche pas!!!!! à l'aide
Je l'ai bien mis dans le userform et c'est bien Initialize.
Snifffffffffffffffff
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
29 mai 2008 à 19:40
sub TonUserform_initialize()
' remplace le bon nom

dim i as integer, DerniereLigne as integer
DerniereLigne = Ws.Range("A65536").End(xlUp).Row + 1

for i = 14 to DerniereLigne
    If range("A" & i).Value <> vbNullString Then
       type_dact.AddItem range("A" & i).Value
    end if
next i

end sub

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
29 mai 2008 à 20:00
...

mortalino, je pense que le find est une bonne solution mais souvent mal utilisé. find estpas vraiment
la bonne fonction pour une recherche de cellule vide par contre efficace pour les cellules non vide.
Donc quand on recherche une cellule avec il est preferable de le faire comme suit :

Dim LinePremCellVide As Long
LinePremCellVide = Sheets("feuil1").Columns(1).Find("*", , , xlByRows, xlPrevious).Row + 1

Cette methode recherche la derniere celule non vide et ne tient pas compte des cellules vides intercalées en suite il suffit de lui ajouté 1
pour avoir la premiere cellule vide.

essais avec ton timer et dit moi ce que tu en penses

A+
0

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

Posez votre question
eastpeople Messages postés 105 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 novembre 2008
29 mai 2008 à 20:44
Bon ben écoutez je désespere aucune de vos solutions ne marche.
Je vous remet mon code pour voir si g pa fé une betise

Private Sub UTIL_Initialize()
Dim LinePremCellVide As Long
LinePremCellVide = Sheets("abonnements").Columns(1).Find("*", , , xlByRows, xlPrevious).Row + 1

    For i = 14 To DerniereLigne
        If Range("A" & i).Value <> vbNullString Then
            type_dact.AddItem Range("A" & i).Value
        End If
    Next i
End Sub

J'ai mis la deuxième solution mais même l'autre ne marche pas.
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
29 mai 2008 à 21:26
...

non mais non ! ce que j'ai donné n'est pas pour toi... desolé pour la confusion que cela provoque

Si tu utilises ce que je t'ai donné tu doit utiliser les meme variables ! Ce que t'a donné mortalino marche tres bien sauf que dans un de tes precedent poste tu l'as induit en erreur avec

Private Sub type_dact_Change()
    type_dact.RowSource = "abonnements!A14:A" & DerniereLigne
End Sub

ca c'est pas bon donc dans le code qu'il t'as donné remplace dans la boucle for le 14 par 2

Private Sub UTIL_Initialize()
    dim i as integer, DerniereLigne as integer
    DerniereLigne = Ws.Range("A65536").End(xlUp).Row + 1
    for i = 2 to DerniereLigne
        If range("A" & i).Value <> vbNullString Then
           type_dact.AddItem range("A" & i).Value
        end if
    next i
end sub

on vas y arriver
0
eastpeople Messages postés 105 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 novembre 2008
29 mai 2008 à 21:43
Alors on reprends j'ai marqué:

Private Sub UTIL_Initialize()
    Dim i As Integer, DerniereLigne As Integer
    DerniereLigne = Ws.Range("A65536").End(xlUp).Row + 1
    For i = 2 To DerniereLigne
        If Range("A" & i).Value <> vbNullString Then
           type_dact.AddItem Range("A" & i).Value
        End If
    Next i
End Sub

mais ca marche toujours pas.
Je comprend vraiment pas.
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
29 mai 2008 à 22:17
...

Ok je veux bien addmetre que cela ne marche mais il doit quand bien ce passer quelque chose
nous dire que cela ne marche pas ne t'aidera vu qu'on pourra pas t'aider avec si peut d'info, donc:

- la liste est vide ? la liste n'est pas complete ? la liste est complete mais les lignes blanches sont toujours la ?
- le code plante ? si le code plante quel est le message d'erreur ? quelle ligne est surlignée par le VBE ?

quelque question bete mais on ne sais jamias :

la Sub UTIL_Initialize() est telle dans le code du userform nomé UTIL  ? la liste est t'elle dans le userform UTIL ? quel type de controle utilises-tu pour ta liste, une listbox une combobox ? son nom est-il type_dact ?
0
eastpeople Messages postés 105 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 novembre 2008
29 mai 2008 à 22:24
Oui c'est vrai desolée mais la panique me gagne.
Alors la liste est compléte mais les lignes blanches sont toujours la.
 La sub est bien dans le code du userform UTIL, la liste est dans le userform
Pour la liste j'ai juste changé une proprieté pour qu'on ne puisse rien marquer dedans.C'est une combobox
et son nom est bien type_dact.
Merci de votre aide
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
29 mai 2008 à 22:31
...

eeeeeeeeh ! mais !! dit donc il y une partie qui a disparu depuis ton premier poste !?!

Dim Ws As Worksheet
Set Ws = Sheets("abonnements")

sans ça cela ne peut fonctionner. aarf ! pourquoi je ne l'ai pas vu avant ?

Private Sub UTIL_Initialize()
    Dim i As Integer, DerniereLigne As Integer
    Dim Ws As Worksheet
    Set Ws = Sheets("abonnements")
    DerniereLigne = Ws.Range("A65536").End(xlUp).Row + 1
    For i = 2 To DerniereLigne
        If Range("A" & i).Value <> vbNullString Then
           type_dact.AddItem Range("A" & i).Value
        End If
    Next i
End Sub

bon la maintenant ça devrait aller

A+
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
29 mai 2008 à 22:45
...

donc la liste est bien créée mais les lignes blanches sont toujours la ! tien tien... pas sur que la correction dans mon dernier poste resolve le probleme ???
Si la liste est bien creee et ce avec les lignes blanches cela veut dire que la condition if est toujours vrai, donc :

Si cela ne marche toujours pas essai de remplacer vbNullString par "" ou alors Range("A" & i).Value par Range("A" & i).textmais surtout pas les deux !!!
0
eastpeople Messages postés 105 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 novembre 2008
29 mai 2008 à 22:57
Alors j'ai donc mis

Private Sub UTIL_Initialize()
    Dim i As Integer, DerniereLigne As Integer
    Dim Ws As Worksheet
    Set Ws = Sheets("abonnements")
    DerniereLigne = Ws.Range("A65536").End(xlUp).Row + 1
    For i = 2 To DerniereLigne
        If Range("A" & i).Value <> vbNullString Then
           type_dact.AddItem Range("A" & i).Value
        End If
    Next i
End Sub

mais malheureusement ça marche pas, toujours pareil pas de message d'erreur, mais toujours ces mêmes lignes blanches.
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
29 mai 2008 à 23:07
...

regarde mon dernier poste
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
29 mai 2008 à 23:53
t'auirais pas des espaces dans les cellules 'vides' ?
Si t'as un espace, ce n'est plus une cellule vide

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
0
eastpeople Messages postés 105 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 novembre 2008
30 mai 2008 à 09:39
Bonjour, reprenons, j'ai essayé de changer vbNullString par "", pas de changement, j'ai donc essayé de changer value par text, idem pas de changement.
Comme tu dis la liste est créer, mais toutes ces eternelles lignes blanches.
Je confirme qu'il n'y a aucun espace dans mes cellules excel vides.
0
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
30 mai 2008 à 11:29
Tiens Mortalino, ça faisait longtemps ^^

Un moyen très simple de vérifier si tes cellules sont réellements vides ou non.
Tu rajoutes une formule dans une colonne de ton fichier EXCEL :
=ESTVIDE(TaCellule)
et tu copies cette formule sur toutes tes lignes.
Si tu n'as pas de VRAI, c'est que ta cellule contient quelque chose, que ça soit un espace, une tabulation, un retour charriot ... un truc qui ne se voit pas à l'écran quoi.

Parce que je confirme qu'un simple :
if range("A1").value <>"" then blabla fonctionne si la cellule est réellement vide.

Sinon, tu peux aussi tenter de rajouter une ligne dans ton code :
If Range("A" & i).Value <> vbNullString Then
   type_dact.AddItem Range("A" & i).Value
   debug.print Range("A" & i).Value
End If

Une fois que ta macro a tourné, tu retournes dans l'éditeur VB, tu ouvres la fenêtre d'exécution (ctrl+G) et tu regardes ce qui a été ajouté à ta comboBox. Si tu as un espace ou une tabulation (suffit de déplacer la flèche vers le bas pour le voir, tu dois rester coller à gauche si c'est vide), tu le verras tout de suite.

Molenn
0
eastpeople Messages postés 105 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 novembre 2008
30 mai 2008 à 15:21
Ok donc si jme souvien bien dans mes cours le 0=faux et le 1=vrai donc je peux en deduire que toute mes cases contiennent quelque chose???
Mais quoi et commen faire pour le supprimer?
Merci beaucoup
0
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
30 mai 2008 à 16:28
Tu obtiens des 0 et des 1 avec la formule ESTVIDE ? Etonnant, mais pourquoi pas.

Ce que tu peux faire, c'est par exemple mettre le bout de code suivant dans un module (et bien dans un module, si tu le mets dans le code d'une feuille, ça ne fonctionnera pas) :

Public Function CodeCaractère(Cellule As Range)
       
        CodeCaractère = Asc(Cellule.Value)
   
End Function

Ensuite, sur ta feuille, tu colles le code suivant :
=CodeCaractère(A1)
et tu copies la formule sur toutes les lignes dont tu as besoin.

Si la cellule est bien vide, ta formule devrait t'afficher #VALEUR, si elle contient quelque chose, tu obtiendras le code caractère de ce qui est contenu, par exemple 10 pour un retour charriot, 13 pour le retour à la ligne (ou l'inverse, je ne sais jamais ), 9 pour une tabulation de mémoire, 32 pour un espace.
Charge à toi de vider tes cellules proprement, soit à la main soit par une macro (le code pour vider est cellule, c'est Range("A1").Clearcontents ).

Molenn
0
eastpeople Messages postés 105 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 novembre 2008
31 mai 2008 à 13:12
Molenn j'ai bien fait toute ta procédure mais dans mes cases il y a toujours des 0.
Je ne sais plus quoi faire.
0
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
3 juin 2008 à 10:42
Dans tes cases des 0 ? Je ne comprends pas.
Reprenons un truc tout simple, tu as bien mis dans un module le bout de code donné plus haut.

Mettons que la seule cellule vide que tu veuilles tester est la "A1" (tu remplaceras bien entendu par ta bonne référence de cellule).

En B1, tu vas écrire la formule suivante :
=CodeCaractère(A1)

Quand tu valides la formule, qu'est-ce qu'il y a d'affiché en B1 ?
Si c'est 0, à priori, ça correspondrait au caractère Null (que je ne connaissais pas tiens) : http://www.commentcamarche.net/base/ascii.php3

Si c'est ça, tu peux toujours bidouiller ton code, au lieu de faire :
       If Range("A" & i).Value <> vbNullString Then
et bien, tu fais
       If Asc(Range("A" & i).Value) <> 0 Then

Ca devrait fonctionner

Molenn
0
Rejoignez-nous