Inserer des valeurs dans un fichier Excel toutes les x cases

Résolu
a506920 Messages postés 21 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 28 mai 2008 - 22 mai 2008 à 20:59
a506920 Messages postés 21 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 28 mai 2008 - 27 mai 2008 à 18:26
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

cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
23 mai 2008 à 00:17
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
3
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
23 mai 2008 à 22:54
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
3
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
24 mai 2008 à 00:19
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
3
a506920 Messages postés 21 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 28 mai 2008
22 mai 2008 à 21:00
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
22 mai 2008 à 21:03
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
0
a506920 Messages postés 21 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 28 mai 2008
22 mai 2008 à 22:07
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)
0
a506920 Messages postés 21 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 28 mai 2008
22 mai 2008 à 22:27
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?
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
22 mai 2008 à 23:49
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
0
a506920 Messages postés 21 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 28 mai 2008
22 mai 2008 à 23:54
Qu est ce qu un MOD?
0
a506920 Messages postés 21 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 28 mai 2008
23 mai 2008 à 00:31
Ah ok un modulo. Merci
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
23 mai 2008 à 00:39
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
0
a506920 Messages postés 21 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 28 mai 2008
23 mai 2008 à 21:48
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 !
0
a506920 Messages postés 21 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 28 mai 2008
23 mai 2008 à 23:12
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.
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
23 mai 2008 à 23:24
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
0
a506920 Messages postés 21 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 28 mai 2008
23 mai 2008 à 23:59
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.
0
a506920 Messages postés 21 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 28 mai 2008
24 mai 2008 à 00:40
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" ...
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
24 mai 2008 à 00:45
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
0
a506920 Messages postés 21 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 28 mai 2008
24 mai 2008 à 00:56
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
0
a506920 Messages postés 21 Date d'inscription vendredi 4 avril 2008 Statut Membre Dernière intervention 28 mai 2008
24 mai 2008 à 00:58
Ben en fait je viens de mettre  NewXlFile.Close True et j ai l impression que tout va bien...
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
24 mai 2008 à 01:02
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
0
Rejoignez-nous