Bonjour à tous,
J'ai une base de donnée de 15 colonnes et des lignes dynamiques. C'est à dire que les lignes s'incrémentent au fur et à mesure de la saisie via un formulaire userform.
pour faire simple: mon formulaire est pourvu d'une textbox, la 18, qui peut contenir un nombre à 10 chiffres (au delà j'ai une erreur et je ne sais pas pourquoi alors j'ai limité à 10 chiffres). lorsque je saisis par exemple dans la textbox18 la valeur 1, le code va vérifier dans la base si le nombre 1 existe (Ma base de donnée est telle que les nombres sont classés en ordre décroissant). Si tel est le cas alors affiche le contenu du row (soit les 15 colonnes) dans d'autres textbox's' d'affichage pour IHM. Mais après avoir codé je me rends compte que si ma base s'accroit à 1000 lignes enregistrées alors le séquençage devient long (j'aimerai pouvoir traité jusqu'à 100 000lignes). C'est à dire si je tape 15000 dans mon textbox le temps qui balaye les lignes je peux aller me faire un café. après cette prise de conscience, je me prends maintenant la tête...
comment puis-je rendre ma routine plus fluide dans le traitement de lecture de la base et y afficher le contenu associé selon la ligne saisie dans le champ textbox18 ?
Ma première idée serait de traiter par paquet de ligne. Si ma valeur saisie est 50 alors balaye uniquement la base de 1 à 500. Si ma valeur à présent serait de 4500 alors balaye de 4000 à 4500 mais je ne sais guère par où commencer ? tout ce que je peux comprendre est la "longueur" de traitement en faisant
Range("B9").End(xlDown).Row mais après comment découper ce truc en paquet équitable sachant que ma base s'alimente à chaque saisie, soit en dynamique ?
voici un début de mon code mais pas sur que cela d'une grande aide aux spécialistes. car il n'est pas adapté en cours mais je ne sais pas comment m'y prendre en fait. pour ceux qui on eu la patience de me lire, Ici Ticket correspond à un numéro de ligne en quelque sorte
mais je ne traite pas en dynamique et ma formule ne convient et pas et surtout je voudrais généraliser, si c'est possible, pour éviter des if à gogo pour chaque intervalle. faut il se lancer dans des suites ???
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 Function recherche(ByVal ticket As Long, ByVal debut As Integer) As String Dim i, initial, final, facteur As Double facteur = 10 ^ (Len(TextBox18.Value) - 1) If ticket < 500*facteur Then 'Len(TextBox18.Value) < 4 And Then initial = Range("B9").End(xlDown).Row - 10 * facteur: final = initial + 10 * facteur ElseIf ticket > 499 And ticket < 1000 Then initial = Range("B9").End(xlDown).Row - 1000: final = initial + 1000 ElseIf ticket > 1499 And ticket < 2000 Then initial = Range("B9").End(xlDown).Row - 1500: final = initial + 1500 End If For i = initial To final If Cells(i, 2).Value = ticket Then Me.Controls("TextBox" & debut).Value = Cells(i, 4) Me.Controls("TextBox" & debut + 1).Value = Cells(i, 6) Me.Controls("TextBox" & debut + 2).Value = Cells(i, 10) Me.Controls("TextBox" & debut + 3).Value = Cells(i, 8) End If If Cells(i, 2).Value = ticket And (Cells(i, 10).Value = "T" Or Cells(i, 10).Value = "C" Or Cells(i, 10).Value = "N") Then Me.Controls("TextBox" & debut + 4).Value = Cells(i, 12) Me.Controls("TextBox" & debut + 5).Value = Cells(i, 14) recherche = Cells(i, 10) Exit Function End If
Quelqu'un sait il s'y prendre avec ce genre de problème ?
merci d'avance..
Partager