Problème de variables

Résolu
Galactus13 Messages postés 335 Date d'inscription lundi 29 septembre 2008 Statut Membre Dernière intervention 16 août 2023 - 6 juin 2013 à 13:45
Galactus13 Messages postés 335 Date d'inscription lundi 29 septembre 2008 Statut Membre Dernière intervention 16 août 2023 - 8 juin 2013 à 09:15
Bonjour a tous,
Je rencontre un problème avec une variable dans un tableau simple avec la fonction split

voici le code:
Sub LViewCls()
Dim T1 As Variant
Dim T2 As Variant
Dim X As Integer

' Mise à jour des ListView
LvView.ListItems.Clear
LvView.ColumnHeaders.Clear
LvView.View = 3
LvCalendar.ListItems.Clear
LvCalendar.ColumnHeaders.Clear
LvCalendar.View = 3

' Chargement des titres utiles pour le listview(Gauche)
T1 = FichiersIni(AppSystem & "config.ini", "[Titre Liste droite]", 2)

For X = 1 To UBound(T1) ' Nombre de ligne
T2 = Split(T1, ",") ' Découpage des lignes
LvView.ColumnHeaders.Add , , T2(X), LvView.Width / Val(T2(X))
Next

Les lignes concerné dans mon fichier ini:
[Titre liste gauche] <- dès qu'on trouve sa
N° Réparation,10 <- On charge
Tranche horaire,4 <- les
Nom du client,4 <- 3 lignes

Avec "Split, je décompose pour donner:
1) Le titre pour le LView
2) Un nombre qui correspond à la largeur du LView
Mais cela me donne l'erreur:
Type incompatible !
Même en plaçant le nombre en alphanumérique.
cela ne change rien!

Je serai content que l'on me donne une solution.
D'avance, merci.

seul celui qui reconnait ses fautes, Progress ..._bar
Galactus le Vrai !

35 réponses

Utilisateur anonyme
7 juin 2013 à 17:36
Le voici le split en QBasic:
OPTION BASE 1
DIM i AS INTEGER
DIM Phrase AS STRING
DIM Tableau(10) AS STRING
DIM Num AS INTEGER
DIM OldNum AS INTEGER
DIM PhraseLen AS INTEGER
DIM Count AS INTEGER
DIM Separateur AS STRING

Separateur = " "
Num = 0
OldNum = 1
Count = 1
Phrase$ = "Je suis nul en QBasic"

CLS

DO
        Num = INSTR(Num + 1, Phrase$, Separateur)
        PhraseLen = Num - OldNum
        IF Num > 0 THEN
                Tableau$(Count) = MID$(Phrase$, OldNum, PhraseLen)
        ELSE
                Tableau$(Count) = MID$(Phrase$, OldNum)
        END IF
        Count = Count + 1
        OldNum = Num + 1
LOOP UNTIL Num = 0

FOR i = 1 TO UBOUND(Tableau$)
   PRINT Tableau$(i)
NEXT




Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Galactus13 Messages postés 335 Date d'inscription lundi 29 septembre 2008 Statut Membre Dernière intervention 16 août 2023 1
7 juin 2013 à 17:44
Cette variable est globale
Dim Shared MaVariable

Celle-ci ne l’est pas
Dim MaVariable

Il y a aussi
Common Shared, mais je sais plus si c'est globale ou pas !

sa chauffe, la haut ^^

seul celui qui reconnait ses fautes, Progress ..._bar
Galactus le Vrai !
0
Utilisateur anonyme
7 juin 2013 à 17:47
Cette variable est globale
Dim Shared MaVariable

Réponse acceptée!!!...

Oui, mais du coup je l'ai fait autrement, regarde si tu peux l'adapter en VB5...

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Galactus13 Messages postés 335 Date d'inscription lundi 29 septembre 2008 Statut Membre Dernière intervention 16 août 2023 1
7 juin 2013 à 17:56
L'astuce en Qbasic, tu n'avais pas besoin de déclarer les String, il suffisait de placer $ a la fin de ta variable:
Dim CetEnLettre$
Dim CetEnChiffre

Dim CetEnChiffre as string
Devient en lettre !
dans ce cas, le symbole $ disparait.
mais ne peux plus être en chiffre dans le module.

sa revient ! sa revient !




seul celui qui reconnait ses fautes, Progress ..._bar
Galactus le Vrai !
0

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

Posez votre question
Galactus13 Messages postés 335 Date d'inscription lundi 29 septembre 2008 Statut Membre Dernière intervention 16 août 2023 1
7 juin 2013 à 19:01
J'ai juste ajouté (pour rendre compatible avec mes boucles)
ReDim sOut(1)
    nC = 1

Ce code est plus court que le mien, je prend pour remplacer, sa ira peut-être plus vite.


seul celui qui reconnait ses fautes, Progress ..._bar
Galactus le Vrai !
0
Utilisateur anonyme
7 juin 2013 à 19:07
On a enfin réussi à progresser
On va surement arriver au bar...


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Utilisateur anonyme
7 juin 2013 à 19:13
Notre ami abhijit a une version plus courte [www.google.fr/url?sa=f&rct=j&url=http://www.vbforums.com/showthread.php%3F276124-Split-Function-In-Vb5&q=split+en+vb5&ei=JwiyUZy0D6iU0AWMh4DoCA&usg=AFQjCNGnhWFlxda9utU3LGi-uos0QiWwtw SUR CE POST], regarde c'est peut-être intéressant.

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Galactus13 Messages postés 335 Date d'inscription lundi 29 septembre 2008 Statut Membre Dernière intervention 16 août 2023 1
7 juin 2013 à 19:45
Impossible d'accéder à ton lien ...
En fait après analyse, pas si sur qu'il fusse plus court, plus complet oui.
voici le mien:
'
' Après quelque bidouille, sa marche au top
'
Public Function Split(ByVal Chaine As String, _
    Optional Cherche As String) As Variant
    
Dim T1 As Variant
Dim Ctr As Integer
Dim X As Integer
Dim Pos As Integer
Dim Tableau() As Variant
    If Cherche "" Then Split Chaine: Exit Function
       
    ReDim Tableau(1)
    X Len(Cherche): T1 Chaine: Ctr = 0: Pos = 1
    
    Do
        Pos = InStr(T1, Cherche)
        If Pos = 0 Then
            If Len(T1) = 0 Then Exit Do
                Ctr Ctr + 1: Tableau(Ctr) T1
                Exit Do
            Else
                Ctr Ctr + 1: Tableau(Ctr) Left(T1, Pos - 1)
            End If
    
        T1 = Mid(T1, Pos + X)
        ReDim Preserve Tableau(Ctr + 1)
    Loop
    
    ReDim Preserve Tableau(Ctr)

Fin:
    Split = Tableau
    
End Function



Tu le trouves comment ?



seul celui qui reconnait ses fautes, Progress ..._bar
Galactus le Vrai !
0
Utilisateur anonyme
7 juin 2013 à 20:23
Oui... en effet, je me suis encore gouré avec l'URL...

Oui ton code est plus court...
Voici le sien:
Public Function Split(ByVal sIn As String, Optional sDelim As _
            String, Optional nLimit As Long = -1, Optional bCompare As _
             VbCompareMethod = vbBinaryCompare) As Variant
          Dim sRead As String, sOut() As String, nC As Integer
          If sDelim = "" Then
              Split = sIn
          End If
          sRead = ReadUntil(sIn, sDelim, bCompare)
          Do
              ReDim Preserve sOut(nC)
              sOut(nC) = sRead
              nC = nC + 1
              If nLimit <> -1 And nC >= nLimit Then Exit Do
              sRead = ReadUntil(sIn, sDelim)
          Loop While Len(sIn) <> 0 ''My Change Over here
          ReDim Preserve sOut(nC)
          sOut(nC) = sIn
          Split = sOut
      End Function


Ce qui me gêne dans les trois cas c'est le Variant, mais bon, si MSDN l'a qualifié ainsi...


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Galactus13 Messages postés 335 Date d'inscription lundi 29 septembre 2008 Statut Membre Dernière intervention 16 août 2023 1
7 juin 2013 à 20:40
C'est sur que mon code n'utilise pas ReadUntil
pas de ci-dessous non plus
Optional nLimit As Long = -1,
Optional bCompare As VbCompareMethod = vbBinaryCompare

Mais pour la majorité de l'usage du split, a ce que j'en ai vu, seul,les deux premières variables sont usité.
Cela me rapelle la fonction replace que j'utilise a ma sauce depuis qbasic:
'
' Supprime une Chaine de caractère et/ou/ remplace par une autre Chaine
'
Function SuprimeCHR(Chaine As String, _
        Cherche As String, _
        Optional Remplace As String)
Dim Pos As Long
Dim I   As Long
    If Cherche "" Then Cherche Chr(34)
    For I = 0 To Len(Chaine)
        Pos = InStr(1, Chaine, Find)
        If Pos <> 0 Then
            Chaine = Mid(Chaine, 1, Pos - 1) & Remplace & Mid(Chaine, Pos + Len(Cherche))
        End If
    Next I    
SuprimeCHR = Chaine

End Function



seul celui qui reconnait ses fautes, Progress ..._bar
Galactus le Vrai !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 juin 2013 à 21:13
Bon ...
Un secret de fou(tu?) (et pas de geek, hein) :
Je ne veux pas trop m'étendre sur ce sujet car il ne s'agit de rien d'autre que de permettre à un vieux logiciel (VB5) de faire des fonctions qu'il n'a pas et qu'offre VB6.
Je vais me contenter ici d'énoncer les principes de base :
Ce qui est gourmand, c'est le redim preserve, notamment lorsque le nombres des parties éclatées est élevé.
Je préfère quant à moi ne le faire qu'une seule fois, y compris au prix d'un tableau trop généreusement dimensionné au début (et ramené au calme in fine).
Quand je dis "généreusement", il me faudrait préciser : le "moins généreusement possible" (et cela peut se calculer arithmétiquement.
Je précise également que je traite très différemment selon que le séparateur est d'une longueur 1 ou non (important). Si 1 === > pas d'utilisation de MID du tout et ruée goulue sur StrConv("ma_chaine", vbFromUnicode)).
Voilà. Vous savez l'essentiel des lignes de ce que j'utilise personnellement lorsque je veux travailler avec VB5


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Galactus13 Messages postés 335 Date d'inscription lundi 29 septembre 2008 Statut Membre Dernière intervention 16 août 2023 1
7 juin 2013 à 22:00
je poserai une simple question:
Est-il mieux de faire:

Dim Tableau as variant
Redim Tableau(1)

' le code ...
ReDim Preserve Tableau(Compteur+1)
' fin de code

ou
Dim Tableau as variant
Redim Tableau(50)

' le code ...
If Compteur Mod 50 = 0 Then ReDim Preserve Tableau(Compteur + 50)
' ...
' ...
Fin:
ReDim Preserve Tableau(Compteur)
    Split = Tableau
' fin de code


Me semblant que la deuxième soluce est plus arbitraire,
Et serait peut être plus rapide ...

seul celui qui reconnait ses fautes, Progress ..._bar
Galactus le Vrai !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 juin 2013 à 08:13
et donc, à main levée (corrige les fautes de frappe éventuelles et ajoute les déclarations) ===>>
private function split(byval c As string, s as string) as variant
    ou = 0
    redim tata((len(c) \ len(s)) + 1) as string
    do while c <> ""
      pos = instr(c, s)
      if pos > 0 then
        tata(ou) = left(c, pos - 1)
        ou = ou + 1
        c = mid(c, pos + len(s))
      else
        tata(ou) = c
        exit do
      end if
    loop
    redim preserve tata(ou)
    split = tata
end function




________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Galactus13 Messages postés 335 Date d'inscription lundi 29 septembre 2008 Statut Membre Dernière intervention 16 août 2023 1
8 juin 2013 à 08:53
"La seconde est moins gourmande "
Réponse fine, mais comprise ^^
Merci beaucoup,
Bonne journée a vous Acive et Ucfoutu.



seul celui qui reconnait ses fautes, Progress ..._bar
Galactus le Vrai !
0
Galactus13 Messages postés 335 Date d'inscription lundi 29 septembre 2008 Statut Membre Dernière intervention 16 août 2023 1
8 juin 2013 à 09:15
Oups ! dans ta dernière démo du split
j'avais bien saisi l'idée mathématique et parfaitement logique de la chose.

redim tata((len(c) \ len(s)) + 1) as string


Je l'ai même ajouté dans mon code avec mes mots.

J'avoue ne jamais avoir pensée a cette option qui m'ouvre d'autres idées.


seul celui qui reconnait ses fautes, Progress ..._bar
Galactus le Vrai !
0
Rejoignez-nous