Chaîne de caractères

hobine

XLDnaute Nouveau
Bonjour,
je coince et j'ai besoin de votre aide.
j'ai un tableau (array) avec +sieurs chaines de caractères , tout contenanat des virgules(,) exple b65,c60,t16.
je cherche un programme excel vba qui a chaque fois qu'il trouve une virgule(,), il compte chaque chaîne comme une valeur
exple: tableau(1,2) =b65,c60,t16
a=tableau(1,2)
a1=b65 a2=c60 et a3=t16
la nouvelle dim tableau est 3 et contient les valeurs a1,a2,a3

merci
 

Banzai64

XLDnaute Accro
Re : Chaîne de caractères

Bonjour

Un essai à adapter

VB:
Option Explicit

Sub Essai()
Dim Tbl
Dim Tableau(1, 2)
Tableau(1, 2) = "b65,c60,t16"
 Tbl = Split(Tableau(1, 2), ",")
 Range("A1").Resize(UBound(Tbl) + 1, 1).Value = Application.Transpose(Tbl)
End Sub

Bonne journée
 
Dernière édition:

hobine

XLDnaute Nouveau
Re : Chaîne de caractères

Bonjour Banzai,
je n'ai pas pu exploiter votre reponse suite à un nouveau survenu que je n'ai pas resoudre depuis hier et je ne comprends pas où est la faute.
Je veux lire une serie de cellules(ou colonnes) et affecter ses valeurs dans un tableau. mon tableau doit contenir normalement 153 cellules(car D4 à T12) non seulement ma macro compte 34 en plus il refuse d'affecter les valeurs dans mon tableau. voir le programme ecrit ci dessus
Vous pourrez voir en image où il signale la faute. Merci d'avance pour votre aide


Dim Plage As Range
Dim tableau() As String
Dim tab_projet() As String, tab_caisse() As String, tab_UCM() As String
Dim tab_moteur() As String, tab_IndMot() As String, tab_UFM() As String, tab_Puiss() As String, tab_Norme() As String
Dim tab_Boit() As String, tab_IndBoit() As String, tab_GPlant As String
Dim tab_NvEquipt() As String, tab_CteDir() As String, tab_Chauf As String, tab_Roue() As String
Dim tab_NAV() As String, tab_Radio As String
Dim i As Integer, j As Integer, m As Integer
Dim nb_col As String, nb_lignes As Integer

'La plage des cellules à tester

'Set Plage = Range("D4:D" & Range("G12").End(xlUp).Row)
Set Plage = Range(Range("D4"), Range("T12").End(xlUp))
'lecture des colonnes D à T et affecter les valeurs dans Array
MsgBox Plage.Count
tableau = Plage.Value
'MsgBox tableau(1, 1)

' plage count est égal au nombre de cellules sélectionnées sur toutes les colonnes




'MsgBox Plage.Count
'For i = 1 To Plage.Count
' tableau(1, i) = Str(tableau(1, i))
' Next i

' tab_projet = tableau(1, 1)
' tab_projet = Split(tableau(1, 1), ",")
 
Dernière édition:

JNP

XLDnaute Barbatruc
Re : Chaîne de caractères

Bonjour le fil :),
Pour ne plus avoir l'erreur, il faut que tu dimensionne ton tableau sans préciser As String (je sais, les tableaux sont bizares :p...).
Par contre, j'ai un peu de mal à comprendre pourquoi tu veux mettre les cellules dans un tableau pour les splitter ensuite :confused:...
Ne serait-il pas plus simple de splitter tes cellules au moment de remplir ton tableau :rolleyes: ?
Code:
Dim Tableau() As String, Cellule As Range, I As Integer, J As Integer, Temp
I = 0
For Each Cellule In Plage
Temp = Split(Cellule, ",")
For J = LBound(Temp) To UBound(Temp)
ReDim Preserve Tableau(I)
Tableau(I) = Temp(J)
I = I + 1
Next J
Next Cellule
Bonne journée :cool:
 

hobine

XLDnaute Nouveau
Re : Chaîne de caractères

Bonjour JNP,
merci déjà pour ta reponse mais il ne ressoud pas le problème, et je dois t'avouer que je vous explique juste une infine partie de mon programme et en plus je viens juste d'apprendre à programmer(aussi dans le VBA). Pour le cas mentionné plus haut, je vais essayer de vous expliquer cette partie et mettre un fichier à votre disposition pour vous puissiez saissir mon problem.
Normalement dans mon classeur , j'ai 4 feuil, dans la feuil"groupement [voir PJ, piece jointe ]" , ,il sera question pour ma macro, dès l'utilisateur ecrirera sur la colonne selec "x" sur un groupement, macro devrait aller dans une autre feuil eyant les criteres de ce groupement , recuperer les les volomes par semaines et faire me calculer souhaiter.
C'est quoi un groupement? exple si l'on clique sur sur G1= X79, ca va dire que mon grp correspond uniquement au projet X79 et tous les autres options(caisse,usine, moteur) bref si une cellule d'une ligne d'un grpmt est vide ,il prendra tous les differents elements de cette sous-ens, exple moteur est composé de +sieurs moteurs differents.
Exple G2=B85,S85 , cela veut dire mon grpmt est composé dans ce cas uniquement des caisses B85 et S85 dans l'option caisse et tous les autres elts dans les autres options.
Je ne sais pas je me suis fait comprendre.
 
Dernière édition:

JNP

XLDnaute Barbatruc
Re : Chaîne de caractères

Re :),
Je ne sais pas je me suis fait comprendre.
Ben non, désolé, mais c'est pas grave :p...
Par contre, je viens de retester ton code :
Code:
Sub test()
Dim Plage As Range
Dim tableau() As String
Set Plage = Range(Range("D4"), Range("T12").End(xlUp))
tableau = Plage.Value
End Sub
plante, mais
Code:
Sub test()
Dim Plage As Range
Dim tableau()
Set Plage = Range(Range("D4"), Range("T12").End(xlUp))
tableau = Plage.Value
End Sub
ne plante pas, lui...
Et
Code:
MsgBox UBound(tableau)
donne bien un résultat, donc c'est bien un tableau et non pas un Range :p...
Que te dire d'autre, je ne sais pas :eek:...
Bon courage :cool:
 

Banzai64

XLDnaute Accro
Re : Chaîne de caractères

Bonjour

Je rejoins l'avis de JNP
Il ne faut pas préciser le type du Tableau sauf si tu y mets Variant (Type par défaut)

En plus comme ta colonne T est vide c'est pour cela que plage.Count te retourne 34
Remplaces la ligne
Code:
MsgBox Plage.Count

Par celle ci qui t'indiquera la plage sélectionnée
Code:
MsgBox "Nombre de cellules : " & Plage.Count & vbCr & _
      " Adresse : " & Plage.Address(rowabsolute:=False, columnabsolute:=False)

Il serait bien de fournir d'autres explications si tu veux de l'aide
Dans un fichier indiques ce que tu as et ce que tu dois avoir et quels éléments tu dois récupérer

Bonne journée
 

hobine

XLDnaute Nouveau
Re : Chaîne de caractères

bonsoir,
vous avez raison, j'essaie comme recommande le bug a disparu, mais par contre je constacte que mon tableau(1,1) ne donne plutôt projet au lieu de X79 et en plus j'aimerai qu'il prenne en compte toutes les cellules , même celle qui sont vides

Merci

Dim Tableau()
Set Plage = Range("D4:D" & Range("T12").End(xlUp).Row)
'Set Plage = Range(Range("D4"), Range("T12").End(xlUp)) (ici, les 2 cas ne marchent pas)
MsgBox Plage.Count (je vaudrai par exple qu'il me dise 153)
Tableau = Plage.Value
MsgBox Tableau(1, 1) (ici, qu'il me renvoit X79 ou bien sur tableau(2,2) il renvoit B85,S85)
 

Banzai64

XLDnaute Accro
Re : Chaîne de caractères

Bonjour

Tu peux essayer

Code:
Set Plage = Range("D4:T" & Range("B65536").End(xlUp).Row)

Qui renverra une plage de 136 cellules car la ligne 12 est vide

Mais si tu veux vraiment 153 rajoute 1 à .row

Code:
Set Plage = Range("D4:T" & Range("B65536").End(xlUp).Row + 1)

Bonne journée
 

hobine

XLDnaute Nouveau
Re : Chaîne de caractères

super, cela fonctionne comme voulu, mais je viens de faire face à une nouvelle difficulte (jamais 2 sans 3)
mon tableau (2,2) = B85,S85 tandis tab_projet contient B85 alors que je voulais tab_projet = B85 S85 comme 2 elts ou valeurs distints appertenant à tab_projet et la dim de tab_projet devient 2, comment faire s'il vous plaît?
Autre question, comment associer une lettre qui declengera une macro à partir de sa saisie sur une feuille excel , autrement dit, chaque fois que j'ecrit par exple "z" sur une feuille excel, ma macro se met automatiquement en marche?

Dim Plage As Range
Dim Tableau()
Dim tab_projet() As String
Set Plage = Range("D4:T" & Range("B65536").End(xlUp).Row)
Tableau = Plage.Value
MsgBox Tableau(2, 2)
If Tableau(2, 2) <> "" Then
test_tmp = Tableau(2, 2)
tab_projet = Split(test_tmp, ",")
Else
ReDim tab_projet(1)
tab_projet(1) = Tableau(2, 2)
End If
MsgBox tab_projet(1)
 
Dernière édition:

Banzai64

XLDnaute Accro
Re : Chaîne de caractères

Bonjour

Pas facile de suivre sans savoir exactement ce que tu veux

Split te retourne un tableau avec comme indice du premier élément égale à 0 alors si tu fais
MsgBox tab_projet(1)
Tu n'auras que le 2ème élément

Testes cette macro

VB:
Sub test()
Dim Plage As Range
Dim Tableau()
Dim tab_projet() As String
Dim J As Integer

  Set Plage = Range("D4:T" & Range("B65536").End(xlUp).Row)
  Tableau = Plage.Value
  tab_projet = Split(Tableau(2, 2), ",")
  If UBound(tab_projet) >= 0 Then
    MsgBox "Il y a " & UBound(tab_projet) + 1 & " éléments dans cette cellule"
    For J = 0 To UBound(tab_projet)
      MsgBox "Elément : " & J + 1 & " = " & tab_projet(J)
    Next J
  Else
    MsgBox "Il n'y a rien dans cette cellule"
  End If
End Sub

A suivre

Bonne soirée
 

Discussions similaires

Réponses
16
Affichages
491