Inserer des valeurs dans un fichier Excel toutes les x cases [Résolu]

Signaler
Messages postés
21
Date d'inscription
vendredi 4 avril 2008
Statut
Membre
Dernière intervention
28 mai 2008
-
Messages postés
21
Date d'inscription
vendredi 4 avril 2008
Statut
Membre
Dernière intervention
28 mai 2008
-
Bonjour,

Avec mon programme VB6, j obtiens un tableau à deux dimensions. J aimerais pouvoir remplir une feuille Excel deja existante avec les valeurs de ce tableau 2D mais j aimerais la remplir une cellule sur 3 horizontalement seulement pour 1 cellule sur 2 verticalement (la ou se trouvent les "x" dans l illustration ci dessous)

<col style=\"width: 48pt;\" span=\"7\" width=\"64\" />----
1, 1, 1, 1, 1, 1, 1, ----
x, 1, 1, x, 1, 1, x, ----
1, 1, 1, 1, 1, 1, 1, ----
x, 1, 1, x, 1, 1, x, ----
1, 1, 1, 1, 1, 1, 1

Merci pour votre aide

    A   B   C   D   E
1  5
2
3
4
5

27 réponses

Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
C'est une fonction interne à VB(A)

ex:

Sub Blabla()
    Dim I As Integer, Nb As Integer
   
    Nb = 3  ' change la valeur et teste
   
    For I = 1 To 30
        If I Mod Nb = 0 Then _
            MsgBox I & " est divisible par " & Nb
    Next
   
End Sub

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Tu peux utiliser Cells(Ligne, Colonne) plutôt que Range("Lettre" & ligne)

Quand tu connais la lettre, Range est pratique.....Range("A" & i)
Quand tu ne peux pas écrire la lettre...................Cells(i, 1)

Les 2 sont équivalents, ici

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Ouf, la semaine a été dure... pas faché d'être en week-end...

OK, Tu écris ceci
Set ExcelAppli = CreateObject("Excel.Application")
Set NewXlFile = ExcelAppli.Workbooks.Add  '<<<

Donc tu crées un nouveau classeur qui ne porte pas encore de nom. Si j'ai bien compris, ce n'est pas ce que tu veux. Tu veux plutôt écrire dans un classeur existant.

Donc, plutôt que d'utiliser un Add qui te crées un nouveau classeur, il te faudrait utiliser Open pour ouvrir ce classeur existant.

Set ExcelAppli = CreateObject("Excel.Application")

Set NewXlFile = ExcelAppli.Workbooks.Open("C:\Documents and Settings\Book3.xls")

Donc, en utilisant NewXlFile comme tu le faisais, tu écriras dans le fichier existant que tu viens d'ouvrir.

Par contre, j'ai un doute sur la double-boucle et le résultat que tu obtiendras si tu ne mets pas de IF ou de Exit For, mais bon... on verra... une chose à la fois.

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
21
Date d'inscription
vendredi 4 avril 2008
Statut
Membre
Dernière intervention
28 mai 2008

Ne prenez pas en compte ce qu il y a ecrit apres "Merci pour votre aide". J ai oublie de le supprimer avant d envoyer le message.
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
salut,

pas évident comme ça. Aurais-tu un exemple concrêt ?

genre
range(A2) = TonTab(0, 0)
range(D2) = TonTab(0, 1)
range(G2) = TonTab(1, 1)
range(A4) = TonTab(2, 0)
range(D4) = TonTab(2, 1)
range(G4) = TonTab(2, 2)
etc..

Merci, ce sera je pense une aide pour nous, afin de pouvoir t'aider

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
Messages postés
21
Date d'inscription
vendredi 4 avril 2008
Statut
Membre
Dernière intervention
28 mai 2008

Effectivement, premierement TonTab a 64 colonnes et un nombre fixe mais non determine de lignes disons n.

Je dirais
range(A2) = TonTab(0,0)
range(D2) = TonTab(0, 1)
range(G2) = TonTab(0, 2)
...
range(BL2)=TonTab(0,63) (derniere valeur de la premiere ligne du tableau)

range(A4) = TonTab(1, 0)
range(D4) = TonTab(1, 1)
range(G4) = TonTab(1, 2)
...
range(BL4) = TonTab(1,63)

...
range(A2*n) = TonTab(n-1,0)
...
range(BL2*n) = TonTab(n-1,63)
Messages postés
21
Date d'inscription
vendredi 4 avril 2008
Statut
Membre
Dernière intervention
28 mai 2008

Il me faudrait faire une boucle du genre:

For i = 0 To n - 1
    For j = 0 To 63
         Range([lettre j]2*i) = TonTab(i, j) ' [lettre j] represente la j ème colonne representée par une lettre sous Excel
    Next j
Next i

non?
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Je pense que c'est un peu comme tu l'écris. C'est-à-dire avec 2 boucles imbriquées.

Par contre, ça te prendrait 2 compteurs (ligne et colonne) que tu incrémentes de 1 à chaque boucle. Un compteur dans la boucle i et l'autre dans la boucle j. Ensuite tu dois vérifier l'état de ces compteurs avant d'inscrire la donnée.

Je pense que l'emploi de MOD serait utile pour cette vérification...

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
21
Date d'inscription
vendredi 4 avril 2008
Statut
Membre
Dernière intervention
28 mai 2008

Qu est ce qu un MOD?
Messages postés
21
Date d'inscription
vendredi 4 avril 2008
Statut
Membre
Dernière intervention
28 mai 2008

Ah ok un modulo. Merci
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Effectivement

De mon temps, on faisait les racines carrées à la main et le terme modulo n'existait pas encore, il me semble... mais c'est loin tout ça

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
21
Date d'inscription
vendredi 4 avril 2008
Statut
Membre
Dernière intervention
28 mai 2008

Mais au final je ne sais toujours pas comment ecrire en VB "Range([lettre j]2*i)" car il est simple d ecrire A1,...A5 en ecrivant (Ai), for i=1 to 5 mais comment fait ton pour ecrire de facon simple A1, B1, C1, D1, E1 ? Sans ca je ne peut pas ecrire ma boucle...
Please HELP !
Messages postés
21
Date d'inscription
vendredi 4 avril 2008
Statut
Membre
Dernière intervention
28 mai 2008

J ai essaye ca et ca marche :

For i= 0 To  NombreDeLigne
For j= 0 To  63
NewXlFile.Sheets("Sheet1").Cells(2 * i + 1, 3 * j + 1).Value = Table(i,j)
Next j
Next i

Mais avec cette methode je cree un nouveau fichier or je veux remplir un fichier deja existant...
J ai tente de faire :

nomFichier = "C:\Documents and Settings\Book3.xls"
For i= 0 To  NombreDeLigne

For j= 0 To  63
nomFichier.Sheets("Sheet1").Cells(2 * i + 1, 3 * j + 1).Value = Table(i,j)

Next j

Next i

Evidemment ca ne marche pas.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Il faudrait peut-être récapituler avec ton code... En fait, je ne te suis plus. Je ne vois pas où tu crées un nouveau fichier (?) et je ne vois pas non plus où tu mets ta condition (avec Mod) pour vérifier quand écrire tes données...

Dans ton premier message, tu as une plage avec des 1 partout et quelques X
Le résultat contient un 5
Déjà, je ne vois pas la logique... mais avec un peu plus d'explications ou un exemple plus probant, on va bien finir par y arriver.

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
21
Date d'inscription
vendredi 4 avril 2008
Statut
Membre
Dernière intervention
28 mai 2008

L exemple que j avais donne au debut etait pour illustrer mon probleme de facon simplifier car en realite c est plus complexe comme ca mais comme tu dis on va y arriver LOOOL.

Donc je recapitule:
J ai un fichier Excel deja existant dont le nom complet est : C:\Documents and Settings\Book3.xls
Il contient deja des valeurs. Je souhaiterais prendre toutes valeurs contenues dans un tableau 2D appele Table et ecriredans certaines cellules de la feuille Excel d une facon bien precise qui est "remplir 1 cellule sur 3 en horizontal et 1 cellule sur 2 en vertical" afin de completer la feuille Excel ( les cellules avec des croix rouges dans le tableau suivant)
1, 1, 1, 1, 1, 1, 1, ----
x, 1, 1, x, 1, 1, x, ----
1, 1, 1, 1, 1, 1, 1, ----
x, 1, 1, x, 1, 1, x, ----
1, 1, 1, 1, 1, 1, 1

Desormais je sais comment creer un nouveau fichier Excel et le remplir de la facon dont je souhaite en faisant ce qui suit :
Dim ExcelAppli As Object
Dim NewXlFile As Object

Set ExcelAppli = CreateObject("Excel.Application")
Set NewXlFile = ExcelAppli.Workbooks.Add

For i = 0 To NombreDeLignes
      For j = 0 To 63
            NewXlFile.Sheets("Sheet1").Cells(2 * i + 1, 3 * j + 1).Value = Table(i, j)
      Next j
Next i

NewXlFile.Close False
ExcelAppli.Quit
Set NewXlFile = Nothing
Set ExcelAppli = Nothing

Mais mon probleme est maintenant de faire ce "remplissage"   dans mon fichier  deja existant C:\Documents and Settings\Book3.xls

Voila l unique probleme restant...

Concernant le modulo, je ne l ai pas utilise car ca fonctionne sans l utiliser.
Messages postés
21
Date d'inscription
vendredi 4 avril 2008
Statut
Membre
Dernière intervention
28 mai 2008

Je vais devenir fou !!!!!!!!!

Ta methode est  parfaite et logique ! Mais ca ne marche pas, je ne comprend pas ! En fait ca ne remplit pas le fichier et en plus quand j ouvre le fichier ca me demande si je veux desactiver les macros et ensuite ca me dit que le fichier "book3.xls is locked for editing, Open read Only or click notify" ...
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Assure-toi que le fichier est bien fermé quand tu essaies de l'ouvrir par code. De plus, il te faut fermer la session Excel quand tu termines ton programme (varAppli.Quit, =Nothing,...).

Bien sûr, quand un bogue survient et que tu arrêtes ton programme, la session préalablement ouverte demeure ouverte dans les processus de Windows. Tu pourrais faire Ctrl-Alt-Del et aller voir les processus. Il y a fort à parier qu'il y a d'anciennes sessions encore ouvertes. Efface-les toutes.

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
21
Date d'inscription
vendredi 4 avril 2008
Statut
Membre
Dernière intervention
28 mai 2008

Effectivement j avais d' anciens processus actifs mais le fichier ne se remplit toujours pas, j ai toujours le message sur la desactivation des macros mais celui concernant la lecture seule ne se presente plus.
J ai deja mis des codes pour terminer le programme tels que :
NewXlFile.Close False
ExcelAppli.Quit
Set NewXlFile = Nothing
Set ExcelAppli = Nothing
Messages postés
21
Date d'inscription
vendredi 4 avril 2008
Statut
Membre
Dernière intervention
28 mai 2008

Ben en fait je viens de mettre  NewXlFile.Close True et j ai l impression que tout va bien...
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
J'attends la suite au cas où...

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI