Générer des chaînes de caractères à partir d'une plage de cellules

Traitée Générer des chaînes de caractères à partir d'une plage de cellules

  • vendredi 17 février 2012 14:09
     
     
    Bonjour,

    Je ne suis pas sûr que mon titre soit clair donc je vais développer !
    J'ai une feuille Excel dans lequel se trouve en abscisse (Colonne A) des valeurs et en ordonnée (Colonne 1) d'autres valeurs.
    A chaque croisement de ces lignes des 0 ou des 1.
    Certains sont surlignés.
    J'aimerai, avec un script, trouver toutes les valeurs surlignées et générer une requête dans laquelle j'utiliserai les deux valeurs d'origines de ce croisement.

    Exemple :

    Abscisse = valeur_1
    Ordonnée = valeur_2
    valeur du croisement = 0
    valeur du texte généré souhaité : delete from Table where colonne1 = valeur_1 and colonne2 = valeur_2;
    (si la valeur est 1 c'est un insert, mais peu importe).

    donc l'algo serait quelque chose du genre :

    if (myCell.isHighlighted) {
        if(myCell.value() = 0) {
           monFichierCible.addLigne("Delete From maTable Where colonne1 = " + myCell.ordonneeOrigin + "and colonne 2 = " + myCell.abscisseOrigin);
        } else {
           monFichierCible.addLigne("Insert into ...blablabla);
       }
    }

    ps : Je suis développeur JAVA et je n'y connais rien en VBA. Je suis sous Excel 2007 et avec Microsoft VB 6.3.

    Merci pour votre aide.


Toutes les réponses

  • vendredi 17 février 2012 15:12
    Modérateur
     
     

    Bonjour,

    Il y a des points obscurs dans votre énoncé...

    • Qu'entendez-vous par "surlignés" ? Cellule coloriée ou Police colorié (Interior.Color vs Font.Color)
    • Vous écrivez par ailleur Colonne 1 puis Colonne A et dans votre script attendu, vous parlez de Colonne1, Colonne2 ???
    • D'autre points sont à définir : le nom de la table est-il toujours constant quelque soit l'opération INSERT ou DELETE ?
    • Le type de champ est toujours un String (quote) ?

    J'ai grossièrement compris votre attente et suis à même de vous guider mais soyez un peu plus explicite avec un exemple concret.

    De ce que j'ai compris, voici ce que je vois :

    Valeur_1 Valeur_2 Valeur_3 Valeur_4 Valeur_5
    Valeur_A1 1 1 1 1 1
    Valeur_A2 0 0 0 0 0
    Valeur_A3 0 0 0 0 0
    Valeur_A4 1 1 1 1 1

    Est-ce la présentation existante ?


    Argy

  • vendredi 17 février 2012 15:26
     
     

    Bonjour Argyronet,

    Effectivement, je parle de cellule coloriée.

    La représentation que vous avez décrite est bien ce que j'ai.

    La table est constante, nous n'avons pas à nous en occuper.

    Je me suis un peu embrouillé avec mes colonnes mais, selon votre représentation, j'aimerai que pour le premier 1 (imaginons que sa cellule soit coloriée) en haut à gauche (celui à l'intersection de valeur_1 et valeur_a1) une requête ressorte (je ne sais pas trop où, je ne connais pas les possibilités de VBA) et ressemble à INSERT INTO ma_table (ma_colonne1, ma_colonne2) VALUES (Valeur_a1, valeur_1);

    Et ceci pour toutes les cellules coloriées.

    Valeur_A1, 2, 3, ... et Valeur_1, 2, 3, ... seront des Strings.

     

    Merci pour votre aide.


    -- Je ne suis pas de ce monde...

  • samedi 18 février 2012 17:09
    Modérateur
     
     

    Bon, OK, pour info, on peut tout faire ou presque avec VBA dans limite de la notion d'usage de l'application.

    Pour votre besoin, il n'y a aucune limite. Mais il me manque encore des infos pour vous aider.

    J'ai un peu de mal à cerner le cycle attendu :

    INSERT INTO ma_table (ma_colonne1, ma_colonne2) VALUES (Valeur_a1, valeur_1);

    Ce script est valable pour le croisement la plage A2:B1 donc comment on progresse en fait ?

    • On va de B2 vers F2 et seules les celulles de la ligne 1 sont ou non en surbrillance : On décale vers la droite pour prendre les valeurs de ligne 1 pour construire les script par rapport aux ligne 1 à 4...
    • Ou bien on va de A2 vers A5, on, examine les cellules de lignes 1 qui sont ou non en surbrillance et on applique la règle des 1 et 0 par rapport à chaque ligne de 2 à 4...

    En fait qui détermine l'ordre des colonnes et des valeurs de la clause INSERT autant que qui détermine l'ordre des des colonnes et des valeurs de la clause WHERE pour un DELETE.

    Avez-vous un exemple concret et le résultat attendu à me proposer car ce sera la seule piste pour vous répondre.


    Argy

  • lundi 20 février 2012 09:46
     
     

    Nous avons un tableau :

                                  clients

                                  jean       paul         robert       louis    Sven    etc...

    produits  chocolat     1           0               0              1          1

                   vanille        0           1              1              0           0

                   choux         0           0              0               0          0

                   fleur           0           0               0               0          0

    Les chiffres en gras (qui seront chez moi surlignés) sont des changements.

    Pour ces changements, j'aimerai une requête.

    Imaginons que ma table soit : Le_GOUT_DES_AUTRES

    peu importe que l'itére de a à z ou de 0 à 99 (peu importe que ce soit sur le prénom ou le produit) dans tous les cas, mes lignes seront mises à jour par les requêtes.

    Et nous obtiendrons un fichier du type :

    insert into Le_Gout_des_autres (prenom, produit)  values ('Sven', 'chocolat');

    delete from Le_Gout_des_autres  where prenom like 'jean' and produit like 'vanille'

    insert into Le_Gout_des_autres (prenom, produit) values ('paul', 'vanille');

    ... etc

    ou dans l'autre sens, peu m'importe.

    J'espère que je suis plus clair :)

    Bonne journée !


    -- Je ne suis pas de ce monde...

  • lundi 20 février 2012 13:58
     
     

    Bonjour,

    Je suis (évidement :) ) en train de faire des recherches de mon côté et de m'auto former à VBA et j'en suis pour l'instant à ce niveau :

     (j'ai un tableau qui ressemble à celui que j'ai décrit plus haut, pour mes tests).

    Public Function Creation_requetes()
        'Création de requêtes par rapport aux changements dans le tableau.
        'Chaque cellule surlignée génère une requête ; delete from pour un 0, insert into pour un 1
        
        Dim nb_lignes As Integer
        Dim ligne_en_cours As Integer
        ligne_en_cours = 0
        nb_lignes = WorksheetFunction.CountA(Range("G:G")) - 1
           
        While ligne_en_cours < nb_lignes
           
            Range("G" & 3 + ligne_en_cours).Select

            MsgBox ("Selection : " & Selection)
            MsgBox ("Couleur de la sélection : " & Selection.Interior.Color)
                      
            ' 65535 = couleur jaune !
            If Selection.Interior.Color = 65535 Then
                If Selection.Value = 1 Then
                    'Ecrire dans le fichier l'insert into.
                    MsgBox ("Insert into")
                End If
                   
                If Selection.Value = 0 Then
                    'Ecrire dans le fichier le delete from.
                    MsgBox ("Delete from")
                End If
            End If
            ligne_en_cours = ligne_en_cours + 1
        Wend
       
    End Function

     --

    1. Les problèmes sur lesquels je bosse en ce moment c'est de pouvoir compter et itérer sur les autres colonnes,
    2. Récupérer la valeur des intitulés des colonnes
    3. Ecrire dans un fichier .sql (ou .txt au pire)

    J'espère vous apporter plus d'information.

    Cdt,

    Lynk Hirosue


    -- Je ne suis pas de ce monde...

  • lundi 20 février 2012 16:42
     
     Traitée

    Ca y est, j'ai trouvé ce que je voulais faire.

    Toujours avec mon exemple, il "suffit" de faire ce petit code :

     

    Public Function Creation_requetes()
        'Création de requêtes par rapport aux changements dans le tableau.
        'Chaque cellule surlignée génère une requête ; delete from pour un 0, insert into pour un 1
           
        Dim oFSO As Scripting.FileSystemObject
        Dim oFl As Scripting.File
        Dim oTxt As Scripting.TextStream

        'Instanciation du FSO
        Set oFSO = New Scripting.FileSystemObject
        Set oFl = oFSO.GetFile("D:\essais\monfichier.sql")
        Set oTxt = oFl.OpenAsTextStream(ForWriting)
       
        Dim nb_lignes As Integer
        Dim nb_colonnes As Integer
        Dim ligne_en_cours As Integer
        Dim colonne_en_cours As Integer
       
        ligne_en_cours = 0
        colonne_en_cours = 0
        nb_lignes = WorksheetFunction.CountA(Range("G:G")) - 1
        nb_colonnes = WorksheetFunction.CountA(Range("3:3")) - 1
          
        While colonne_en_cours < nb_colonnes
            While ligne_en_cours < nb_lignes
               
                Cells(ligne_en_cours + 3, colonne_en_cours + 7).Select
                          
                ' 65535 = couleur jaune !
                If Selection.Interior.Color = 65535 Then
                    If Selection.Value = 1 Then
                        'Ecrire dans le fichier l'insert into.
                        oTxt.Write ("Insert into ma_table(prenom, chose) values ('")
                        oTxt.Write (Cells(2, colonne_en_cours + 7).Value)
                        oTxt.Write ("' and '")
                        oTxt.Write (Cells(ligne_en_cours + 3, 2).Value)
                        oTxt.Write ("');")
                        oTxt.WriteBlankLines (1)
                    End If
                       
                    If Selection.Value = 0 Then
                        'Ecrire dans le fichier le delete from.
                        oTxt.Write ("Delete from ma_table where prenom like '")
                        oTxt.Write (Cells(2, colonne_en_cours + 7).Value)
                        oTxt.Write ("' and chose like '")
                        oTxt.Write (Cells(ligne_en_cours + 3, 2).Value)
                        oTxt.Write ("');")
                        oTxt.WriteBlankLines (1)
                    End If
                End If
                ligne_en_cours = ligne_en_cours + 1
            Wend
            ligne_en_cours = 0
            colonne_en_cours = colonne_en_cours + 1
        Wend
       
    End Function

    --

    il m'a aussi fallu activer la ressource Microsoft Scripting Runtime.

    Il faut également que mon fichier soit préalablement créé, je chercherai un moyen de le créer par défaut. Ca ne doit pas être bien compliqué.

    Merci pour aide.

    cdt,

    Lynk Hirosue


    -- Je ne suis pas de ce monde...

  • lundi 20 février 2012 21:16
    Modérateur
     
     Traitée

    Bonjour,

    C'est bien, vous avez réussi... J'avais fini de rédiger une fonction mais lorsque j'ai vu que vous aviez posté et marqué votre réponse...

    N'oubliez pas cependant d'invoquer le Close de votre objet oTxt sinon, vous pourriez être confronté à l'erreur 70 et surtout de mettre toutes vos variables objets à Nothing avec l'instruction Set.

    Par ailleurs, vous pouvez user de blocs With et aussi de vbCrlf pour simplifier l'écriture.


    Argy

  • lundi 20 février 2012 22:52
     
     

    J'en prend bonne note.

    Merci pour vos conseils.


    -- Je ne suis pas de ce monde...