cs_Stephan
Messages postés11Date d'inscriptiondimanche 21 avril 2002StatutMembreDernière intervention 8 août 2006
-
8 août 2006 à 02:07
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 2018
-
9 août 2006 à 00:24
Hello,
Je cherche à selectionner en une fois toutes les données contenue dans un colonne d'un MSFlexgrid sous VB6 pour les insérer dans une variable.
L'idée est d'utiliser ensuite :
Clipboard.SetText = variable
Pour avoir ces données dans le presse papier.
J'arrive sans problème à selectionner une celulle avec TextMatrix(colonne, ligne), mais pas une colonne entière.
Donc j'utilise pour le moment une boucle for / next qui tourne autant de fois qu'il n'y a de ligne pour une colonne donnée, mais c'est trés long comme ça.
Je n'ai rien trouvé dans les sources ou sur le forum, je me dit que ça n'est peut être pas prévu...
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 8 août 2006 à 02:26
Bonsoir,
trés long... combien ?
Tu parcour ton Grid, cellule par cellule et tu concatène au fur et à mesure.
Clipboard.SetText = Clipboard.SetText & " " & TextMatrix(colonne, ligneCourante),
C ' est la seule façon.
Enfin je crois.
cs_Stephan
Messages postés11Date d'inscriptiondimanche 21 avril 2002StatutMembreDernière intervention 8 août 2006 8 août 2006 à 02:42
Bonsoir,
Merci de cette attention.
En fait avec un flexgrid d'une centaine de lignes c'est rapide, mais je prévois des flexgrid de 50000 lignes, et c'est en essayant que j'ai constaté au moins une minute d'attente pour lire les deux colonnes (je pense que la perte de temp est bien dans la constitution de la boucle, car le collage est quasi-instatané).
Pour être plus clair, je met ma fonction ci-dessous :
Function ExportExcel()
On Error Resume Next
Dim Appli As New Excel.Application
Dim Lignes As String
Dim MaxCell As String
Dim compt As Integer
Dim ColA As String
Dim ColB As String
compt = 0
Lignes = Form1.MSFlexGrid1.Rows
'On rend visible EXCEL
Appli.Visible = True
' On créé un nouveau classeur EXCEL
Appli.Workbooks.Add.Activate
' on rempli ColA avec ColA et un CR autant de fois qu'il y a de lignes
' dans le flexgrid.
' on vide le presse papier et on y insère ColA.
' on selectionne les celulles de A1 à An.
' on indique un format texte pour éviter des modifications
' de contenu => 00 ne doit pas devenir 0
' On colle les données dans les celulles selectionnées.
MaxCompt = Form1.MSFlexGrid1.Rows - 1
For compt = 0 To MaxCompt
ColA = ColA & Form1.MSFlexGrid1.TextMatrix(compt, 1) & vbCrLf
Next compt
Clipboard.Clear
Clipboard.SetText ColA
MaxCell = "A1:A" & Lignes
Appli.ActiveWorkbook.Worksheets("Feuil1").Range(MaxCell).Select
Appli.ActiveWorkbook.Worksheets("Feuil1").Cells.NumberFormat = "@"
Appli.ActiveWorkbook.Worksheets("Feuil1").Paste
' Pareil avec ColB
For compt = 0 To Form1.MSFlexGrid1.Rows - 1
ColB = ColB & Form1.MSFlexGrid1.TextMatrix(compt, 2) & vbCrLf
Next compt
Clipboard.Clear
Clipboard.SetText ColB
MaxCell = "B1:B" & Lignes
Appli.ActiveWorkbook.Worksheets("Feuil1").Range(MaxCell).Select
Appli.ActiveWorkbook.Worksheets("Feuil1").Cells.NumberFormat = "@"
Appli.ActiveWorkbook.Worksheets("Feuil1").Paste
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 8 août 2006 à 02:50
Et tu arrives à affecter autant de données à une variable de Type string ?
Ce que je sais moi, c' est que les variables ont une capacité de stockage limité.
Même les Memos, il arrive un moment ou il vous disent : Assez !
cs_Stephan
Messages postés11Date d'inscriptiondimanche 21 avril 2002StatutMembreDernière intervention 8 août 2006 8 août 2006 à 05:57
Bonjour,
Merci pour ces réponses...
Je reprend dans l'ordre,
Effectivement j'arrive à faire rentrer 32767 lignes (pour ce que j'ai testé ce soir) dans un variable string. J'ai pas vérifié quel est la limite, mais il y a environs 18 caractères par ligne, ça fait dans les 590000 caractères par variables.
C'est effectivement pas trés propre ;), mais si je tiens 65536 lignes avec le nombre de caractères que j'ai à placer, ça devrait suffir.
Par contre je ne suit pas certain que la perte de temp vienne de la création de l'objet Excel, pour un fichier de 60 lignes, c'est immédiat.
J'ai donc mis des msgbox avant et après mes deux boucles :
For compt = 0 To MaxCompt
ColA = ColA & Form1.MSFlexGrid1.TextMatrix(compt, 1) & vbCrLf
Next compt
et la suivante avec ColB, et là je constate que la première dure environs 1 minute 10 pour 32767 lignes, alors que la deuxième ne dure que 7 secondes...
J'en ai inversé l'ordre, l'assignation des colonnes, mais c'est toujours la boucle qui concerne les données ColA qui dure 1 minutes.
J'ai suivi ton conseil et ça donne ce qui suit. Mais là, il faut 10 minutes pour remplir la feuille Excel, j'avais commencé par des boucles de ce type, mais sans tableaux, je lisait et assignait directement le contenu des celulles du flexgrid.
Function ExportExcel()
On Error Resume Next
Dim Appli As New Excel.Application
Dim Lignes As String
Dim MaxCell As String
Dim compt As Integer
compt = 0
Lignes = Form1.MSFlexGrid1.Rows
Dim T() As String
ReDim T(Lignes, 2)
'Rendre visible EXCEL
Appli.Visible = True
MaxCompt = Form1.MSFlexGrid1.Rows
For compt = 0 To MaxCompt
T(compt, 1) = Form1.MSFlexGrid1.TextMatrix(compt, 1)
T(compt, 2) = Form1.MSFlexGrid1.TextMatrix(compt, 2)
Next compt
' On créé un nouveau classeur EXCEL
Appli.Workbooks.Add.Activate
MaxCell = "A1:A" & Lignes
Appli.ActiveWorkbook.Worksheets("Feuil1").Range(MaxCell).Select
Appli.ActiveWorkbook.Worksheets("Feuil1").Cells.NumberFormat = "@"
For compt = 0 To Lignes
Appli.ActiveWorkbook.Worksheets("Feuil1").Range("A" & compt).Value = T(compt, 1)
Next compt
MaxCell = "B1:B" & Lignes
Appli.ActiveWorkbook.Worksheets("Feuil1").Range(MaxCell).Select
Appli.ActiveWorkbook.Worksheets("Feuil1").Cells.NumberFormat = "@"
For compt = 0 To Lignes
Appli.ActiveWorkbook.Worksheets("Feuil1").Range("B" & compt).Value = T(compt, 2)
Next compt
cs_Stephan
Messages postés11Date d'inscriptiondimanche 21 avril 2002StatutMembreDernière intervention 8 août 2006 8 août 2006 à 17:50
Bonjour,
C'est ce que je veux faire, mais je n'arrive pas a selectionner les celulles en question dans le flexgrid. Je peux les selectionner une par une dans une boucle pour les intégrer dans une variable, mais pas en une fois.
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 9 août 2006 à 00:24
Salut,
Dans les propriétés de la FlexGrid, tu peux modifier SelectionMode
0 = libre
1 = par ligne
2 = par colonne
Dans ton cas j'opterais pour le 2
Donc, en cliquant sur une cellule et en glissant légèrement au besoin,
la colonne entière se sélectionnera. Tu n'auras qu'à mettre le code que
je t'ai donné pour copier tout d'un coup.