Problème de variables [Résolu]

Signaler
Messages postés
332
Date d'inscription
lundi 29 septembre 2008
Statut
Membre
Dernière intervention
10 avril 2020
-
Messages postés
332
Date d'inscription
lundi 29 septembre 2008
Statut
Membre
Dernière intervention
10 avril 2020
-
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

Messages postés
332
Date d'inscription
lundi 29 septembre 2008
Statut
Membre
Dernière intervention
10 avril 2020
1
j'ai trouvé ma propre erreur !

La solution toute bête:
' 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(X), ",") ' Découpage des lignes
LvView.ColumnHeaders.Add , , T2(1), LvView.Width / Val(T2(2))
Next

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

Et voici l'exemple de MSDN pour VB5 en utilisant Variant également:
Private Sub Form_Load()
Dim Str As String
Dim i As Integer
Str = "Ceci est un test"
For i = 0 To UBound(Split(Str, " ", Len(Str), vbTextCompare))
   MsgBox (Split(Str, " ", Len(Str), vbTextCompare)(i))
Next i
End Sub

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 sRead <> ""
    ReDim Preserve sOut(nC)
    sOut(nC) = sIn
    Split = sOut
End Function
 
Public Function ReadUntil(ByRef sIn As String, sDelim As String, Optional bCompare As VbCompareMethod = vbBinaryCompare) As String
    Dim nPos As String
    nPos = InStr(1, sIn, sDelim, bCompare)
    If nPos > 0 Then
       ReadUntil = Left(sIn, nPos - 1)
       sIn = Mid(sIn, nPos + Len(sDelim))
    End If
End Function



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
La seconde est moins gourmande
Mais, si pour un "split", tu peux savoir d'entrée de jeu quel est le nombre maximum de "parties" possiblement présents (au lieu de ton "50")
soit C la chaîne et S le séparateur ===>>
Dans le pire des cas, le nombre N de "parties" ne saurait être supérieur à
(Len(C)\Len(S))+1
fais gaffe : \ et non / (division entière)

________________________
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.

Bonjour,

as-tu essayé de faire:
Dim T1 As Variant String
Dim T2 As Variant String

???

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique

Non pardon,

Tes variables doivent être déclarées comme ça:
Dim T1() As String
Dim T2() As String



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
332
Date d'inscription
lundi 29 septembre 2008
Statut
Membre
Dernière intervention
10 avril 2020
1
Rebonjour,
merci pour la dernière réponse Acive ...
C'est vrai que j'oublie aussi de déclarer les tableaux avec () ...
Mais comme cela a toujours fonctionné, jusqu’à présent !

et vla ti pas que je découvre comment mettre mon texte Vb en forme sur le forum !
Je suis vraiment un noob sur internet !

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

Une variable VB doit être déclarée pour que VB lui réserve un espace en mémoire centrale et lui assigne un nom. La quantité et l'organisation de l'espace réservé dépend du type de variable.
Si Option Explicit n'est pas présent au début du module VB où se trouve une variable, et que la variable n'est pas déclarée, VB la déclarera automatiquement de type Variant.
Apparemment pratique, cette fonctionnalité est très dangereuse, car elle désactive la détection de fautes de frappe.


Dans ton cas il a considéré ta variable de type variant comme un tableau de string.

je découvre comment mettre mon texte Vb en forme sur le forum !

Comme tu dis... seul celui qui reconnait ses fautes, Progresse jusqu'au bar


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
332
Date d'inscription
lundi 29 septembre 2008
Statut
Membre
Dernière intervention
10 avril 2020
1
hé, hé !
Je déclare toujours
Option Explicit 
!
Bien trop pratique, justement pour l'ignorer !

Pour revenir a mon
Dim 
:
' fonctionne avec mon système de tableau
Dim T1 as variant
' Ne fonctionne pas
Dim T1() as String

Erreur: Impossible d'affecter au tableau
bien qu'il s'agisse de
String

Probablement du au fait que j'utilise encore VB ...5 !

seul celui qui reconnait ses fautes, Progress ..._bar
Galactus le Vrai !
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Ecrire :
' Ne fonctionne pas
Dim T1() as String

s'agissant de VB5 n'est pas exact !
Ton problème n'est pas dans cette déclaration-là !
Ma boule de cristal (je charrie, là ...) me dit qu'il résulte de ta pseudo fonction Split (non native sous VB5 et que tu as donc construite en substitution ).
ou encore dans ta fonction FichiersIni (qu'on ne voit pas !)

________________________
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.
Messages postés
332
Date d'inscription
lundi 29 septembre 2008
Statut
Membre
Dernière intervention
10 avril 2020
1
C'est vrai que ma pseudo Split aurait pu avoir un défaut ... mais elle fonctionne depuis des lustres !

Voici ma fonction "FichierINI", en fait, un système qui me convenait voici fort longtemps:
A l'époque du Qbasic, Oups ! sa date !

'
' Fonctionne ainsi ...
' <Nom du fichier ini>
' <Section> La section cherché
' <X> Nombre de colonne possible, si pas mis, colonne = 1
' <Y> Nombre de ligne possible, Si mis: 1 seule ligne possible
'
Function FichiersIni(Fichier As String, Section As String, _
                    Optional X As Integer = 1, _
                    Optional Y As Integer) As Variant

Dim T1 As String
Dim T2 As Variant
Dim Z As Integer
ReDim T2(2) As Variant
Dim OK As Boolean
    OK = False

Open Fichier For Input As #1
    Do While Not EOF(1)
    ' On cherche la section choisi
        Line Input #1, T1
        If InStr(T1, Section) > 0 Then
            OK = True
            Exit Do
            End If
        Loop

If OK = False Then
    MsgBox "La section :" & Section & " est introuvable"
    Close
    End
    End If
    
' >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
' La section est trouvé, on charge les lignes
' utile de la section "Section"
' >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Do While Not EOF(1)
    Line Input #1, T1
    If Len(T1) < 2 Then Exit Do ' Si ligne vide, on quitte
    ' on découpe le résultat selon X = valeur (1 ou 2)
    Z = Z + 1   ' Si plusieurs lignes
    T2(Z) = T1  ' On garde les lignes tel quel.
    If Y = 1 Then
        FichiersIni = T1
        Close
        Exit Function
        End If
    ReDim Preserve T2(Z + 1)
    Loop

Close
    ReDim Preserve T2(Z)
    FichiersIni = T2

End Function


En fait, j'avais juste fait une erreur bête :
Utiliser X (représentant ligne a ligne)
Au lieu de prendre en compte col 1 et col 2 par ligne.
Col étant les colonnes déclarées ou pas !
Je vous remercie tous d'avoir tenter de m'aider dans mon erreur primaire.
Comme quoi, que parfois, il suffit de faire une pause et de relire un moment après.
seul celui qui reconnait ses fautes, Progress ..._bar
Galactus le Vrai !
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Il est donc bien dans ta fonction FichiersIni, le problème (de dim as variant pour ton tableau) exposé plus haut.
Corrige :
Function FichiersIni(Fichier As String, Section As String, _
Optional X As Integer = 1, _
Optional Y As Integer) As Variant String


ReDim T2(2) As Variant string



________________________
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.
Messages postés
332
Date d'inscription
lundi 29 septembre 2008
Statut
Membre
Dernière intervention
10 avril 2020
1
Ben ... non;
Justement en les mettant string, ce que j'ai fait, cela me provoque une erreur !
De même qu'avec:
Public Function Split(ByVal Chaine As String, _
    Optional Find As String = " ") As Variant

si je remplace le variant par string, c'est aussi une erreur dans mon tableau.
J'aurai du allez a l'école, ils m'auraient dit pourquoi ! toute façon, j'ai toujours eu du mal avec les tableaux, surtout les multiples.

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

Hé bien, je l'ai faite avec une autre logique, mais fonctionnelle.
Bon, c'est du VB6 et j'ai mis Splut à la place de Split pour éviter les erreurs:
Dim Splut() As String
Dim i, t As Integer

Private Sub Form_Click()
Dim Tableau() As String
Spliting "Bonjour Splitter c'est ma passion", ""
Tableau = Splut

For i = 0 To UBound(Tableau)
   MsgBox (Tableau(i))
Next

End Sub

Private Sub Spliting(Chaine As String, Delimit As String)
If Delimit "" Then Delimit " "
ReDim Splut(0) As String

For t = 1 To Len(Chaine)
    If Mid(Chaine, t, 1) = Delimit Then
       ReDim Preserve Splut(UBound(Splut) + 1)
    Else
       Splut(UBound(Splut)) = Splut(UBound(Splut)) & Mid(Chaine, t, 1)
    End If
Next
End Sub



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
332
Date d'inscription
lundi 29 septembre 2008
Statut
Membre
Dernière intervention
10 avril 2020
1
Ben, snif ! rien a faire, je comprend bien ton exemple hyper simple.
(fallait bien sa pour moi ^^)
mais vb5 refuse toute discussion !
En revanche, dès que je supprime les () et que je change String par variant, sa fonctionne!

Serai-ce du a ma version de Vb ?
Pourtant, c'est un CD d'origine.

seul celui qui reconnait ses fautes, Progress ..._bar
Galactus le Vrai !
Messages postés
332
Date d'inscription
lundi 29 septembre 2008
Statut
Membre
Dernière intervention
10 avril 2020
1
J'avais remarquer, en téléchargeant divers code en vb6, sans bien comprendre le pourquoi, que je devais a chaque fois supprimer ses fichus parenthèses et toujours mettre Variant, pour que le code fonctionne sur ma version VB5.
J'ai cherché une version VB6 avec licence, mais c'est mission impossible a l'heure actuel. (Je cherche toujours ...)
si il y a, un volontaire pour me fournir son CD et key bien sur ... je brulerais un cierge rien que pour lui.... lol
Et ne me parlez pas de vb (7) et au delà...

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

De mon coté, moi j'ai trouvé le célèbre "vieux" QBASIC qui fonctionne avec ma DosBox

Mais alors mon ami... je suis à l'école dans la classe CP Quand j'essaye de faire quelque chose la dessus!!!

Pour faire in Mid() ==>> direction google pour découvrir que c'est un Mid$() etc.
Si j'arrive à quelque chose je te dirais

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
332
Date d'inscription
lundi 29 septembre 2008
Statut
Membre
Dernière intervention
10 avril 2020
1
QBASIC ! des souvenirs tout sa ! j'avais la version 4, avec compileur, sa marchait bien en son temps, mais sous dos, et pas très simple pour faire tourner avec Win 3.1 ^^
Je sais pas si j'ai encore les disquettes !
et les tableaux étaient déjà ma bête noir de l'époque !
Me rappel le célèbre symbole $ pour les variables alphanumériques, et l'écriture avec les poke ? et Les Peek !
J'ai même encore plus vieux: La première version DOS 1.0 sur des disquettes immense d'a peine 160Ko! Un disque dur de 5 Méga, le top quand même ! et au plus 64 Ko de mémoire !
Un exploit !


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

Oui... je suis en plein dedans...
Comment on déclare une variable publique ???

(c'est moi le demandeur maintenant)


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique

J'ai cherché une version VB6 avec licence

Tu as aussi VB.Net 2010 express (gratuite) chez microsoft, mais bon ça va te faire changer de "monture"

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Messages postés
332
Date d'inscription
lundi 29 septembre 2008
Statut
Membre
Dernière intervention
10 avril 2020
1
J'avoue que là ! m'en souviens plus trop.
Faut que je regarde dans mes bidouilles d'époques, Il me semble qu'il y'avait qu'un seul module principale, composer de nos sub
Il suffisait de déclare la variable au début du programme, c'est tout.
j'ai bien encore des disquettes la dessus, mais sans lecteur, sa risque problématique,
je vais réfléchir a une soluce, pour extraire sa !

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