Problème sur algorithme VBA

[Résolu]
Signaler
Messages postés
105
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 novembre 2008
-
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
-
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

Messages postés
389
Date d'inscription
dimanche 7 avril 2002
Statut
Membre
Dernière intervention
23 septembre 2016
2
Salut,
pour trouver la premier cellule vide utilise

set cellule=Sheets("abonnements").range("a2:a65535").find("")
if cellule="" then ligne=c.row

@+ Megafan
Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
10
Salut,

et en version simplifier cela donne

Dim LigneCellVide As Long
LigneCellVide=Sheets("abonnements").Columns(1).find("").Row

A+
Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
10
...

remplace :

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

par

Ligne = Ws.Columns(1).find("").Row
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
ou autre code :

Ligne = Ws.Range("A65536").End(xlUp).Row + 1

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
Messages postés
389
Date d'inscription
dimanche 7 avril 2002
Statut
Membre
Dernière intervention
23 septembre 2016
2
moi je préfére mon .find        , mais tout le reste fonctionne aussi.......
@+
Megafan
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
arf, je suis une quiche, trop crevé, j'ai fait une boulette :



dim i as integer

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

correction en orange
@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
Messages postés
105
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 novembre 2008

D'accord mais j'ai pas bien compri à la place de quoi je dois le mettre?
Merci
Messages postés
105
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 novembre 2008

Merci à tous de votre aide ça marche.
J'ai une autre questoin si c'est possible
J'ai une liste déroulante, j'ai farfouillé dans le forum mais ça ne marche pas.
J'ai des valeurs sur excel de la A2 à A16 mais ces cases ne sont pas foécement toutes remplies et le problème c'est que sur ma liste déroulant j'ai les valaurs mais du vide aussi.
Voila mon code que j'ai trouvé sur le forum mais je pense qu'il y a un problème

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

Private Sub type_dact_Initialize()
    Dim DerniereLigne As Integer
    DerniereLigne = Range("A2").End(xlUp).Row
End Sub
Voila si quelqu'un peut m'aider cela serai simpa
Merci deja pour ce que vous avez fait pour moi.
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Et que se passe t il avec ton Find si tu as une case vide au milieu de tes données ?
>> Bah t'es piné. Ca va t'écraser d'autres données.

Et ouais, j'avais fait il y a quelques temps pour le boulot un fichier, mais je ne vérifiais pas la saisie des TextBox (pas bien, je sais ) Dès fois, mes [blaireaux de] collègues, ne mettaient rien dans certains TextBox, mais cela m'occasionnait ce genre de problème.
Bon, j'ai beau maintenant vérifier la saisie et le format tapé, j'ai souvent pris l'habitude de partir d'en bas, et depuis la cellule.

Et juste pour le fun ;)

Option Explicit

Sub qknkls()
    Dim i As Integer
    
For i = 1 To 10000
    Cells(i, 1).Value = i
Next i
End Sub

Sub wfjsjkm()
    Dim tata As Single
    Dim derligne As Integer
    
tata = Timer
derligne = Range("a2:a65535").Find("")
Debug.Print Timer - tata

tata = Timer
derligne = Range("A65536").End(xlUp).Row + 1
Debug.Print Timer - tata

End Sub
~
<small>[code.aspx?ID=39466 Mortalino] ~
Colorisation automatique</small>

3 tests, et dans tous les cas, je suis plus rapide, même si ce n'est pas significatif
 0.078125
 0

 0
 0

0.015625
 0

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
dim i as integer

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

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
Messages postés
389
Date d'inscription
dimanche 7 avril 2002
Statut
Membre
Dernière intervention
23 septembre 2016
2
Ouais.......................

@+ Megafan
Messages postés
105
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 novembre 2008

Heu c'est la réponse à ma question???Lol
Je crois pas mais je pose quand m^me la question. Tu viens de me redire des solutions pour ma première question non?
Merci  quand même
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
lol, on ne lutte pas contre un Timer

Mais chacun sa méthode, le premier commandement étant que ça fonctionne

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
EastPeople
:

oui, je réponds à ta question avec la boucle for to next.
Je ne sais pas comment fonctionne la méthode RowSource, au mieux elle boucle sur les objets (for each, contrairement à mon for to next qui est moins rapide).
Mais le code proposé sert à identifier les cellules vides afin de ne pas les ajouter dans ton CoboBox

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
Messages postés
105
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 novembre 2008

Ok merci baucoup est pour la liste deroulante je le met dans change ou initialize?
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Initialize.

Cet évènement n'est lancée que lors du lancement de ton UserForm, donc dès le chargement de celui-ci, ce code va t'alimenter le ComboBox de tes données contenues dans les cellules.

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
Messages postés
105
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 novembre 2008

Alors j'ai donc mis ça :

Private Sub type_dact_Initialize()
Dim i As Integer
    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

Mais cela ne marche pas!
Peut-être parce que c'est moi même qui est marqué Initialize? il 'est pas dans les possiblités en haut à droite.
Desolée chui vraiment nulle.
Messages postés
105
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 novembre 2008

Alors j'ai donc mis ça :

Private Sub type_dact_Initialize()
Dim i As Integer
    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

Mais cela ne marche pas!
Peut-être parce que c'est moi même qui est marqué Initialize? il 'est pas dans les possiblités en haut à droite.
Desolée chui vraiment nulle.
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
Si ton ComboBox est dans un UserForm, c'est dans l'évènement Initialize de ce UserForm qu'il faut le placer.
Si c'est un Combo placé sur une feuille Excel, place le dans WorkBook_Open()

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
Messages postés
105
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 novembre 2008

Alors j'ai donc mis ça :

Private Sub type_dact_Initialize()
Dim i As Integer
    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

Mais cela ne marche pas!
Peut-être parce que c'est moi même qui est marqué Initialize? il 'est pas dans les possiblités en haut à droite.
Desolée chui vraiment nulle.