Générer des chaînes de caractères à partir d'une plage de cellules
-
vendredi 17 février 2012 14:09Bonjour,
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.
- Modifié ArgyronetMVP, Moderator vendredi 17 février 2012 15:13 Titre
Toutes les réponses
-
vendredi 17 février 2012 15:12Modé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:09Modé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).SelectMsgBox ("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--
- Les problèmes sur lesquels je bosse en ce moment c'est de pouvoir compter et itérer sur les autres colonnes,
- Récupérer la valeur des intitulés des colonnes
- 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...
- Modifié Nicolas P. Durand lundi 20 février 2012 13:59
- Modifié Nicolas P. Durand lundi 20 février 2012 14:00
- Modifié Nicolas P. Durand lundi 20 février 2012 14:10
- Modifié Nicolas P. Durand lundi 20 février 2012 14:10
-
lundi 20 février 2012 16:42
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...
- Marqué comme réponse Nicolas P. Durand lundi 20 février 2012 16:42
-
lundi 20 février 2012 21:16Modérateur
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
- Marqué comme réponse Ciprian DuduialaOwner mercredi 29 février 2012 10:14
-
lundi 20 février 2012 22:52
J'en prend bonne note.
Merci pour vos conseils.
-- Je ne suis pas de ce monde...

