Copier Coller avec n° de ligne variable
Bonjour à tous,
Je me suis tout récemment mis à la VBA dans le cadre d'un projet perso, et avec succès. L'idée était d'ouvrir un classeur Excel pour copier coller certaines cellules ou plage de cellule d'un ficher classeur à l'autre, avec l'un des noms de classeur qui change.
Aujourd'hui pour continuer je bloque légèrement.
Je souhaite pouvoir ouvrir un fichier (dont le nom changera à chaque fois), puis de copier certaines cellules ou plages de cellules définies (toujours les mêmes) vers le classeur (en pièce jointe).
Là ou je bloque c'est dans la définition de la ligne de destination.
Je souhaite que mon code recherche la ligne à partir de laquelle copier les données, et définir cette ligne comme variable.
Par exemple :
Aller cherche la ligne 43 -> définir la ligne 43 comme variable
Coller une cellule en K43 puis une autre en K44, et ce jusque K45
Répéter l'opération pour toutes les colonnes dans les sous catégories ne sont pas remplies.
Rebelotte à partir de la ligne 84
Puis ligne 125
Etc..
A tout hasard, ce tableau est mis sous cette forme afin d'en extraire de Tableaux Croisé Dynamiques
Merci de votre aide !
PS,
Voici le code de mon premier fichier (avec l'aide d'un certain moteur de recherche!)
Dim a As Variant, Nom2 As String
Nom = ActiveWorkbook.Name
ChDrive "C:" ' Choix du lecteur
ChDir "C:\" 'Choix du répertoire
a = Application.GetOpenFilename("fichier excel (*.xlsxm, *.xlsm", _
, "Sélection de vos fichiers excel", , True)
Select Case TypeName(a)
Case Is = "Boolean"
Exit Sub
Case Else
For b = LBound(a) To UBound(a)
Workbooks.Open a(b)
Next
End Select
Nom2 = ActiveWorkbook.Name
'Import Feuille Frigo Zone 1
'Buv Ext
Windows(Nom2).Activate
Sheets("Onglet1").Select
Range("F7:F8").Select
Selection.Copy
Windows("Préparation").Activate
Sheets("Onglet 3").Select
Range("B16:B17").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Bonsoir Jay_Stu, bonsoir le forum,
J'avoue ne pas avoir bien saisi les adresses des cellules source et celles des cellules destination... Je te propose le code ci-dessous à adapter :
Sub Macro1()
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD As Object 'déclare la variable OD (Onglet Destination)
Dim BO As FileDialog 'déclare la variable BO (Boîte Ouvrir)
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim OS As Object 'déclare la variable OS (Onglet Source)
Dim LI As Long 'déclare la variable LI (Ligne)
Set CD = ThisWorkbook 'définit la classeur destination CD
Set OD = CD.Sheets("Onglet 3") 'définit l'onglet destination OD
Set BO = Application.FileDialog(msoFileDialogOpen) 'définit la boîte de dialogue BO
With BO 'prend en compte la boîte de dialogue BO
If .Show = -1 Then 'condition si le bouton "Ouvrir" est appuyé avec un fichier sélectionné
Workbooks.Open (.SelectedItems(1)) 'ouvre le fichier sélectionné
Set CS = ActiveWorkbook 'définit le classeur source CS
Else 'sinon (si le bouton "Annuler" est appuyé)
MsgBox "Aucun fichier n'a été sélectionné !" 'message
Exit Sub 'sort de la procédure
End If 'fin de la condition
End With 'fin de la prise en compte de la boîte de dialogue BO
Set BO = Nothing 'vide de la mémoire l'objet BO
Set OS = CS.Sheets("Onglet 1") 'définit l'onglet source OS
LI = OD.Cells(Application.Rows.Count, 10).End(xlUp).Row 'définit la dernière ligne éditée LI de la colonne 10 (=J) de l'onglet OD
If LI < 43 Then 'condition : si LI est inférieure à 43
LI = 43 'LI devient la ligne 43
Else 'sinon
LI = (LI \ 42) * 42 + 43 'LI est définie comme la première ligne d'un bloc de 42 lignes, après la ligne 43
End If 'fin de la condition
'ici tes copier/coller (je n'ai pas bien compris entre le code et le fichier exemple)
OS.Range(Ta_plage).Copy
OD.Cells(LI, 10).PasteSpecial (xlPasteValues) 'colle dans la colonne 10 (=J) à partir de la ligne LI
End Sub
Bonjour ThauTheme,
Désolé pour le délai de réponse.
Effectivement, mes explications sont confuses, pas facile !
Néanmoins tu as bien répond à ma question, j'ai repris une partie de ton code et l'ai adapté à mon besoin... et puis Miracle (ou pas), ca marche !
Tu m'as enlevé une épine du pied !
Pour infor voici le code utilisé :
' on repère le numéro de la dernière ligne non vide'
LI = 1
Do Until IsEmpty(OD.Cells(LI, 29))
LI = LI + 1
Loop
Merci de l'aide !
Bonsoir Jay_stu, bonsoir le forum,
Pourquoi une boucle alors que :
LI = OD.Cells(Application.Rows.Count, 29).End(xlUp).Row
fait tout aussi bien l'affaire ?...
Bonjour,
Désolé pour, e retour tardif, un stagiaire au boulot m'a aidé à finir le mordeau de code restant !
Tout marche à merveille maintenant !
Merci encore de ton aide, et joyeuses fêtes !