Copie d'un fichier à un autre, suppression lignes vides
Bonjour,
Je souhaiterai recopier des données saisies dans un classeur A, afin de les enregistrer dans un classeur B.
Je ne sais pas comment expliquer simplement, mais je vais essayer.
En gros, le classeur A contient des menus (petit dej, dej, dînner), au jour le jour (1 jour par feuille)
Le classeur B présente les menus sur la semaine.
Le truc, c'est que je viens d'arriver dans cette entreprise, et j'ai plusieurs mois à recopier.
Je pense donc qu'il est possible d'y arriver en visual basic, mais je n'ai aucune connaissance dans ce milieu ^^;
J'ai essayé de schématiser avec des couleurs sur les fichiers joints.
Les positions sont toujours les mêmes :
fichier source = B5:B12 pour petit dej, B16:B23 pour dej, B27:B34 pour dînner, pour tous les jours
fichier destination = C5:C12, C13:C20, C22:C29 pour le 1er jour, D5:D12,xxx pour le 2e jour, jusqu'à I5:I12,xxx pour le 7e jour
En plus de cela, la version jour par jour présente les plats par catégories, il peut donc y avoir des lignes vides.
L'idée, vous l'aurez compris, est de tester si une ligne est vide, on passe à celle du dessous, jusqu'à la fin de la sélection (ex:B5:B12 pour petit dej)
Pour l'instant, c'est le principal.
Et je dois vous avouer qu'après mes recherches sur le net et l'aide d'excel, je n'ai même pas réussi à copier d'un fichier à l'autre sans tester les lignes vides ^^;
J'ai essayé un
Workbooks("source").Worksheets("source").Range("B5:B12").Autofill destination:=Workbooks("dest").Worksheets("dest").Range("C5:C12")
Et rien que ça, il me dit "erreur d'exécution 9"
Donc voilà, si une âme charitable pouvait au moins me mettre sur la piste, sans forcément me donner tout le code final, mais au moins en m'expliquant le fonctionnement pour la copie entre plusieurs fichiers, la navigation entre les feuilles, et les cellules, et les tests des données ^^;
Merci d'avance. ^^
-- 10 Nov 2010, 06:42 --
Bon, j'avance à petits pas, mais j'avance quand même.
J'arrive à copier des cellules en incrémentant la ligne d'un classeur vers un autre.
J'ai essayé de tester les lignes à copier avec If Not IsEmpty mais ça ne fonctionne pas.
J'ai également un problème, j'ai beau sélectionner les Ranges du fichier destination, il copie à la même hauteur que le fichier source. Par exemple :
For i = 0 To 7
Set SourceRange = Workbooks("SOURCE.xls").Worksheets("SHEET1").Range("B27:B" & i + 5)
Set fillRange = Worksheets("SHEET7").Range("C22:C" & i + 5)
SourceRange.Copy
If Not IsEmpty(SourceRange) Then Worksheets("SHEET7").Paste destination:=fillRange
Next iIl me copie les cellules B27:B34 de SOURCE dans C27:C34 de DESTINATION... Et il reprend également la mise en forme des cellules (cadres) et supprime celle du fichier destination (adapter texte à la cellule).
Bref, j'ai avancé dans un sens, mais découvert de nouveaux problèmes ^^;
Merci d'en tenir compte ^-^
-- 10 Nov 2010, 09:58 --
ça avance, mais c'est pas encore ça.
voici mon code actuel :
MsgBox Workbooks("検食簿チェック.xls").Worksheets("8,23").CodeName
For j = 0 To 6
For i = 0 To 7
Set SourceRange = Workbooks("SOURCE").Worksheets("NOM_SHEET_SOURCE").Range("B" & i + 5)
Set fillRange = Worksheets("DESTINATION").Range(Chr(j + 67) & i + 5)
SourceRange.Copy
If Not IsEmpty(SourceRange) Then fillRange.PasteSpecial Paste:=xlPasteValues
Set SourceRange = Workbooks("SOURCE").Worksheets("NOM_SHEET_SOURCE").Range("B" & i + 16)
Set fillRange = Worksheets("DESTINATION").Range(Chr(j + 67) & i + 13)
SourceRange.Copy
If Not IsEmpty(SourceRange) Then fillRange.PasteSpecial Paste:=xlPasteValues
Set SourceRange = Workbooks("SOURCE").Worksheets("NOM_SHEET_SOURCE").Range("B" & i + 27)
Set fillRange = Worksheets("DESTINATION").Range(Chr(j + 67) & i + 22)
SourceRange.Copy
If Not IsEmpty(SourceRange) Then fillRange.PasteSpecial Paste:=xlPasteValues
Next i
Next jBon, le test des cellules non vides ne marche toujours pas, mais ce n'est pas la priorité.
J'arrive à naviguer entre les colonnes de DESTINATION, maintenant, je voudrais naviguer entre les FEUILLES de SOURCE. Hors, quand j'utilise de codename, j'ai encore cette erreur 9 qui me dit que l'index n'existe pas, etc... c'est pourtant le codename que je récupàre avec la message box, il existe forcément ^^;
Bref, encore test pour ne pas copier les lignes vides, et la navigation entre les feuilles de SOURCE (uniquement vers la droite Sheet285--Sheet286--Sheet287...
A ce train là je risque de trouver seul, mais si quelqu'un pouvant m'aider passe dans le coin, merci d'avance ^^
Bonjour,
Ci-joint un fichier avec une macro qui copie sans les vides, on peut partir de ce principe et l'adapter à tes plages, feuilles et classeurs.
Si tu peux joindre tes fichiers ça sera plus facile à adapter car là à vue d'oeil c'est "du chinois" pour moi le code avec les caractères japonais.
Sub Copie()
Ligne = 1
For L = 1 To 5
If Range("A" & L) <> "" Then
Range("D" & Ligne) = Range("A" & L)
Ligne = Ligne + 1
End If
Next
End SubA+
Merci beaucoup, dachevid ! Grâce à toi, je me suis aperçu pourquoi mon test not isempty ne fonctionnait pas !!
Peu importe le résultat du test, j'incrémentais la variable des lignes par le FOR ^^;
Du coup j'ai fait une variable que j'incrémente uniquement quand la ligne n'est pas vide ^^
Merci beaucoup !!!
Maintenant, mon seul problème est de naviguer entre les feuilles du classeur source... je n'y arrive pas avec le codename...
-- 11 Nov 2010, 03:06 --
Bon, ça y est, j'arrive à naviguer entre les feuilles ^^;
En fait, il ne fallait pas utiliser le codename, mais juste le numéro (285 dans mon exemple)
Donc en gros, ce que je voulais faire fonctionne plutôt pas mal, même si c'est très grossier dans le code, le résultat est là.
maintenant, ne reste plus qu'à modifier ^^
merci encore à dachevid qui m'a bien aidé !!