Sélection d'une colonne dans un flexgrid ?

Messages postés
11
Date d'inscription
dimanche 21 avril 2002
Statut
Membre
Dernière intervention
8 août 2006
-
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
-
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...

Avez vous un idée ?

Cordialement, Stéphan.

9 réponses

Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
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.
Messages postés
11
Date d'inscription
dimanche 21 avril 2002
Statut
Membre
Dernière intervention
8 août 2006

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

End Function
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
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 !
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
La "perte de temps" est dans la création de l' objet Excel .
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
Pourquoi tu n' utilise pas un Tableau ?

Function ExportExcel()
      
    Dim Appli As New Excel.Application
    Dim Lignes As String
    Dim MaxCell As String
    Dim compt As Integer
   
     Lignes = Form1.MSFlexGrid1.Rows
    
****
    Dim T() as String
    Redim T(Lignes,2)
****    
   'On rend visible EXCEL
    Appli.Visible = True

    '     
    MaxCompt = Form1.MSFlexGrid1.Rows - 1
    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-1
      Appli.ActiveWorkbook.Worksheets("Feuil1").... _
     =Appli.ActiveWorkbook.Worksheets("Feuil1").... _
      & T(compt,1)
    Next 
     
    MaxCell = "B1:B" & Lignes
    Appli.ActiveWorkbook.Worksheets("Feuil1").Range(MaxCell).Select
    Appli.ActiveWorkbook.Worksheets("Feuil1").Cells.NumberFormat = "@"
    
    For compt=0 To lignes-1
      Appli.ActiveWorkbook.Worksheets("Feuil1").")....... _
     =Appli.ActiveWorkbook.Worksheets("Feuil1")......._
      & T(compt,2)
    Next 

>avec un peut d' imagination, tu peux faire une seule boucle.
>et oubli Clipboard.
>ça ira comme ça ?
Messages postés
11
Date d'inscription
dimanche 21 avril 2002
Statut
Membre
Dernière intervention
8 août 2006

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

End Function
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Salut,

Essaie comme ceci

Sélectionne les données de la grille que tu veux copier dans le presse-papier, puis appuie sur un bouton avec ce code


Private Sub Command1_Click()

    Clipboard.SetText Grid1.Clip

End Sub


Il te reste ensuite à faire un coller dans Excel

MPi
Messages postés
11
Date d'inscription
dimanche 21 avril 2002
Statut
Membre
Dernière intervention
8 août 2006

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.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
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.

MPi