XL 2010 Aide modification Code VBA

Shpountz

XLDnaute Occasionnel
Bonjour à tous

J'ai un code qui me permets de copier des plages de cellules d'une feuille vers d'autres onglets.
Néanmoins j'ai quelques soucis...

Code:
Sub Macro1()
    Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
    Dim O As Worksheet 'déclare la variable O (Onglet)
    Dim DL As Long 'déclare la variable DL (Dernière Ligne)
    Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
    Dim I As Long 'déclare la variable I (Incrément)
    Dim J As Long 'déclare la variable J (incrément)
    Dim X As Long 'déclare la variable X (incrément)
    Dim TLN() As Variant 'déclare la variable TLN (Tableau des Lignes à Numéro)
    Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
    Dim LD1 As Long, LF1 As Long, LD2 As Long, LF2 As Long 'déclare les variables LD1, LF1, LD2 et LF2 (Ligne Début et ligne Fin)

    Application.ScreenUpdating = False 'masque les rafraîchissements d'écran

   

    '***********************************************
    'Recherche des ligne contenant "N°" en colonne A
    '***********************************************
    DL = OS.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne A de l'onglet OS
    TV = OS.Range(OS.Cells(1, 1), OS.Cells(DL, 1)) 'définit le tableau des valeurs TV
    For I = 1 To DL 'boucle sur toutes les lignes I du tableau des valeur TV
       'si la donnée ligne I colonne 1 de TV est égale à "N°", redimensionne le tableau TLN, récupère dans TLN(X) la ligne I, incrémente X
       If TV(I, 1) = "N°" Then ReDim Preserve TLN(X): TLN(X) = I: X = X + 1
    Next I 'prochaine ligne de la boucle
    'tableau TLN contient désormais toutes les lignes où la colonne A contient "N°"


    '*********************************************
    'Renvoie des donnés dans leur onglet respectif
    '*********************************************
    For I = 0 To UBound(TLN) 'boucle 1 : sur tous les éléments du tableau TLN
       Sheets.Add After:=Sheets(Sheets.Count) 'ajoute un onglet en dernière position
       ActiveSheet.Name = TV(TLN(I) - 1, 1) 'renomme l'onglet (avec la valeur de la donné ligne (TLN(I) moins une,  colonne 1 de TV)
       Set OD = ActiveSheet 'définit l'onglet destination OD
       LD1 = TLN(I) 'définit la ligne de début LD1
       For J = LD1 To DL 'boucle 2 : sur toutes les lignes J de TV (de LD1 à DL)
           'si la donnée ligne J colonne 1 de TV est égale à "Rang : ", définit les lignes LF1, LD2 et LF2 et sort de la boucle
           If TV(J, 1) = "Rang : " Then LF1 = J - 1: LD2 = J + 1: LF2 = J + 11: Exit For
        Next J 'prochaine ligne de la boucle 2
       'copie les lignes LD1 à LF1 de l'onglet source et les colle dans A71 de l'onglet destination
       OS.Rows(LD1 & ":" & LF1).Copy OD.Range("A71")
        'copie les lignes LD2 à LF2 de l'onglet source et les colle dans A94 de l'onglet destination
       OS.Rows(LD2 & ":" & LF2).Copy OD.Range("A94")
        ActiveWindow.ScrollRow = 71 'place la ligne 71 en haut de la fenêtre
    Next I 'prochain élément de la boucle 1
    MsgBox "Traitement des données terminé !" 'message
    End Sub

Soucis N° 1
Ce code me crée de nouveaux onglets et efface tout les autres onglets de mon classeur OR je voudrais qu'il me copie les plages sur les onglets existants et déja nommés.

Soucis N° 2
Ce code me crée des onglets avec le nom "R-C1" (par exemple) et j'aimerais qu'il utilise les onglets déja créer et qui s'appellent "R1C1" (pare exemple)

J'ai tenté d'enlever la partie du code qui crée de nouveaux onglets mais cela ne fonctionne pas.

Si une âme charitable aurait la gentillesse de m'aider.

Très amicalement
françois
 

Pièces jointes

  • Transfert Lignes Vers Onglets.zip
    871.3 KB · Affichages: 67

JBARBE

XLDnaute Barbatruc
Bonsoir à tous,
Je vois que notre ami Guido n'est pas le seul à s’intéresser aux chevaux !
La demande est flou compte tenu qu'il existe déjà dans R3C1 - R3C2 - R3C3 des données qui ne correspondent pas à la feuille Forme et Classe n'y a la feuille Données !
Précisez votre demande SVP !
Sinon on ne comprend rien !
Bonne soirée !
 

Shpountz

XLDnaute Occasionnel
Bonjour le Forum, Bonjour Guido, Bonjour Barbe,

Oui les bases proviennent du même endroit que celles de Guido

En fait la macro "Macro1" fonctionne presque comme je le souhaite.
Elle copie les éléments de "Forme et Classe" dans leur onglets respectifs "R3-C1" (par exemple) en ligne 71 et les éléments de Synthese en ligne 94

LE SOUCI... c'est qu'elle crée de nouveaux onglets et qu'elle supprime tout les autres onglets du classeur en fin de traitement... Or j'aimerai qu'elle agisse sur des onglets EXISTANTS (qui sont créer automatiquement lorsque l'onglet "Reunion" est renseigné)
ET qu'elle ne supprime AUCUN onglets en fin de traitement.

Pour etre un peu plus "lisible" j'ai rempli les 3 premiers onglets "R3C1, R3C2, R3C3"
Les éléments se trouvent à partir de la ligne 74 et de la ligne 94 (ils proviennent de l'onglet "Forme et Classe"

Merci pour votre aide
Amicalement
François
 

Pièces jointes

  • Copie de Transfert Lignes Vers Onglets.xlsm
    1 008.4 KB · Affichages: 48

JBARBE

XLDnaute Barbatruc
Bonsoir à tous,
J'ai créé une macro à ma façon certes moins élégante mais qui fait le même travail !
Cependant s'il y a ajout de une ou plusieurs feuilles il convient d’insérer des lignes de la macro de cette façon :
Macro :
Code:
Sub Copie()
Dim i As Long, j As Long, X As Long, Z As Long, k As Long
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
With Sheets("Forme et Classe")
Z = 1
For k = Z To 1000
For i = Z To 1000
If .Cells(i, 1) Like "*R.3-C.1*" Then
Sheets("R3C1").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.3-C.2*" Then
Sheets("R3C2").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.3-C.3*" Then
Sheets("R3C3").Select
X = 0
Z = i
Exit For
' Inserer les lignes à partir d'ici s'il y a lieu
' exemple
'ElseIf .Cells(i, 1) Like "*R.3-C.4*" Then ( repere dans la feuille Forme et Classe)
'Sheets("R3C4").Select ( feuille suplémentaire)
'X = 0
'Z = i
'Exit For
'ElseIf .Cells(i, 1) Like "*R.3-C.5*" Then ( repere dans la feuille Forme et Classe)
'Sheets("R3C5").Select ( feuille suplémentaire)
'X = 0
'Z = i
'Exit For
End If
Next i
For j = Z To Z + 40
If .Cells(j, 1) = "Synthèse" Then
X = j - 3
Exit For
End If
Next j
Range(.Cells(Z + 4, 1), .Cells(1 + X, 41)).Copy
Range("A71").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Range(.Cells(1 + X + 2, 1), .Cells(1 + X + 12, 41)).Copy
Range("A94").Select
ActiveSheet.Paste
Application.CutCopyMode = False
If Z >= 1000 Then
Sheets("Forme et Classe").Select
Msgbox " Terminé"
Exit Sub
Else
Z = Z + 8
End If
Next k
End With
Application.Calculation = xlCalculationAutomatic
End Sub

Dans la macro il est décrit la méthode d'ajouter une feuille en référence à la base de donnée !
Bonne soirée
 

Pièces jointes

  • Copie de Transfert Lignes Vers Onglets.xlsm
    1.3 MB · Affichages: 46
Dernière édition:

Shpountz

XLDnaute Occasionnel
Re-Bonjour Barbe

Merci encore pour votre aide.
lorsque je lance votre macro "copie" sur le fichier test tout fonctionne très bien.
J'ai donc rajouté les lignes qui me permette de créer de nouvelles feuilles en suivant vos directives avec le code suivant

Code:
Sub Copie()
Dim i As Long, j As Long, X As Long, Z As Long, k As Long
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
With Sheets("Forme et Classe")
Z = 1
For k = Z To 1000
For i = Z To 1000
If .Cells(i, 1) Like "*R.1-C.1*" Then
Sheets("R1C1").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.1-C.2*" Then
Sheets("R1C2").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.1-C.3*" Then
Sheets("R1C3").Select
X = 0
Z = i
Exit For
If .Cells(i, 1) Like "*R.1-C.4*" Then
Sheets("R1C4").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.1-C.5*" Then
Sheets("R1C5").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.1-C.6*" Then
Sheets("R1C6").Select
X = 0
Z = i
Exit For
If .Cells(i, 1) Like "*R.1-C.7*" Then
Sheets("R1C7").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.1-C.8*" Then
Sheets("R1C8").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.1-C.9*" Then
Sheets("R1C9").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.1-C.10*" Then
Sheets("R1C10").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.2-C.1*" Then
Sheets("R2C1").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.2-C.2*" Then
Sheets("R2C2").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.2-C.3*" Then
Sheets("R2C3").Select
X = 0
Z = i
Exit For
If .Cells(i, 1) Like "*R.2-C.4*" Then
Sheets("R2C4").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.2-C.5*" Then
Sheets("R2C5").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.2-C.6*" Then
Sheets("R2C6").Select
X = 0
Z = i
Exit For
If .Cells(i, 1) Like "*R.2-C.7*" Then
Sheets("R2C7").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.2-C.8*" Then
Sheets("R2C8").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.2-C.9*" Then
Sheets("R2C9").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.2-C.10*" Then
Sheets("R2C10").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.3-C.1*" Then
Sheets("R3C1").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.3-C.2*" Then
Sheets("R3C2").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.3-C.3*" Then
Sheets("R3C3").Select
X = 0
Z = i
Exit For
If .Cells(i, 1) Like "*R.3-C.4*" Then
Sheets("R3C4").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.3-C.5*" Then
Sheets("R3C5").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.3-C.6*" Then
Sheets("R3C6").Select
X = 0
Z = i
Exit For
If .Cells(i, 1) Like "*R.3-C.7*" Then
Sheets("R3C7").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.3-C.8*" Then
Sheets("R3C8").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.3-C.9*" Then
Sheets("R3C9").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.3-C.10*" Then
Sheets("R3C10").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.4-C.1*" Then
Sheets("R4C1").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.4-C.2*" Then
Sheets("R4C2").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.4-C.3*" Then
Sheets("R4C3").Select
X = 0
Z = i
Exit For
If .Cells(i, 1) Like "*R.4-C.4*" Then
Sheets("R4C4").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.4-C.5*" Then
Sheets("R4C5").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.4-C.6*" Then
Sheets("R4C6").Select
X = 0
Z = i
Exit For
If .Cells(i, 1) Like "*R.4-C.7*" Then
Sheets("R4C7").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.4-C.8*" Then
Sheets("R4C8").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.4-C.9*" Then
Sheets("R4C9").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.4-C.10*" Then
Sheets("R4C10").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.5-C.1*" Then
Sheets("R5C1").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.5-C.2*" Then
Sheets("R5C2").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.5-C.3*" Then
Sheets("R5C3").Select
X = 0
Z = i
Exit For
If .Cells(i, 1) Like "*R.5-C.4*" Then
Sheets("R5C4").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.5-C.5*" Then
Sheets("R5C5").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.5-C.6*" Then
Sheets("R5C6").Select
X = 0
Z = i
Exit For
If .Cells(i, 1) Like "*R.5-C.7*" Then
Sheets("R5C7").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.5-C.8*" Then
Sheets("R5C8").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.5-C.9*" Then
Sheets("R5C9").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.5-C.10*" Then
Sheets("R5C10").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.6-C.1*" Then
Sheets("R6C1").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.6-C.2*" Then
Sheets("R6C2").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.6-C.3*" Then
Sheets("R6C3").Select
X = 0
Z = i
Exit For
If .Cells(i, 1) Like "*R.6-C.4*" Then
Sheets("R6C4").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.6-C.5*" Then
Sheets("R6C5").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.6-C.6*" Then
Sheets("R6C6").Select
X = 0
Z = i
Exit For
If .Cells(i, 1) Like "*R.6-C.7*" Then
Sheets("R6C7").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.6-C.8*" Then
Sheets("R6C8").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.6-C.9*" Then
Sheets("R6C9").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.6-C.10*" Then
Sheets("R6C10").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.7-C.1*" Then
Sheets("R7C1").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.7-C.2*" Then
Sheets("R7C2").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.7-C.3*" Then
Sheets("R7C3").Select
X = 0
Z = i
Exit For
If .Cells(i, 1) Like "*R.7-C.4*" Then
Sheets("R7C4").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.7-C.5*" Then
Sheets("R7C5").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.7-C.6*" Then
Sheets("R7C6").Select
X = 0
Z = i
Exit For
If .Cells(i, 1) Like "*R.7-C.7*" Then
Sheets("R7C7").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.7-C.8*" Then
Sheets("R7C8").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.7-C.9*" Then
Sheets("R7C9").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.7-C.10*" Then
Sheets("R7C10").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.8-C.1*" Then
Sheets("R8C1").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.8-C.2*" Then
Sheets("R8C2").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.8-C.3*" Then
Sheets("R8C3").Select
X = 0
Z = i
Exit For
If .Cells(i, 1) Like "*R.8-C.4*" Then
Sheets("R8C4").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.8-C.5*" Then
Sheets("R8C5").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.8-C.6*" Then
Sheets("R8C6").Select
X = 0
Z = i
Exit For
If .Cells(i, 1) Like "*R.8-C.7*" Then
Sheets("R8C7").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.8-C.8*" Then
Sheets("R8C8").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.8-C.9*" Then
Sheets("R8C9").Select
X = 0
Z = i
Exit For
ElseIf .Cells(i, 1) Like "*R.8-C.10*" Then
Sheets("R8C10").Select
X = 0
Z = i
Exit For
' Inserer les lignes à partir d'ici s'il y a lieu
' exemple
'ElseIf .Cells(i, 1) Like "*R.3-C.4*" Then ( repere dans la feuille Forme et Classe)
'Sheets("R3C4").Select ( feuille suplémentaire)
'X = 0
'Z = i
'Exit For
'ElseIf .Cells(i, 1) Like "*R.3-C.5*" Then ( repere dans la feuille Forme et Classe)
'Sheets("R3C5").Select ( feuille suplémentaire)
'X = 0
'Z = i
'Exit For
End If
Next i
For j = Z To Z + 40
If .Cells(j, 1) = "Synthèse" Then
X = j - 3
Exit For
End If
Next j
Range(.Cells(Z + 4, 1), .Cells(1 + X, 41)).Copy
Range("A71").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Range(.Cells(1 + X + 2, 1), .Cells(1 + X + 12, 41)).Copy
Range("A94").Select
ActiveSheet.Paste
Application.CutCopyMode = False
If Z >= 1000 Then
Sheets("Forme et Classe").Select
MsgBox "Terminé"
Exit Sub
Else
Z = Z + 8
End If
Next k
End With
Application.Calculation = xlCalculationAutomatic
End Sub

En fait j'ai créer autant de lignes de code que de feuilles peuvent apparaitre
et lorsque je lance la macro j'ai l'erreur suivante qui apparait "Erreur de Compilation - Next sans For" je joint un fichier image

d'autre part l'onglet "Forme et Classe" peut contenir plus de 1 000 lignes je présume donc qu'il faut que je modifie la partie :
With Sheets("Forme et Classe")
Z = 1
For k = Z To 1000
For i = Z To 1000

et la partie :
Application.CutCopyMode = False
If Z >= 1000 Then
Sheets("Forme et Classe").Select

Encore un grand merci pour votre aide
Amicalement
François
 

Pièces jointes

  • Capture.PNG
    Capture.PNG
    32.8 KB · Affichages: 57

JBARBE

XLDnaute Barbatruc
Re,
La macro plantait car il y avait des si à la place des elseif !
J'ai rajouté ces lignes afin que la macro soit plus rapide !
Naturellement plus il y aura de feuilles RC plus le temps de calcul sera long !
Il y a 4 feuilles n'étant pas de feuilles RC !
Ainsi si une feuille est rajoutée il convient de changer le - 4 en - 5 ou 2 feuilles rajoutées le - 4 en - 6 !
Code:
If Z >= 2000 Or Y = nbfeuilles - 4 Then
Sheets("Forme et Classe").Select
MsgBox "Terminé"
Exit Sub
D'autre part, à la place de 1000, j'ai mis 2000 !
Si ce n'est pas suffisant tu peux changer !
Bonne journée !
 

Pièces jointes

  • Copie de Transfert Lignes Vers Onglets.xlsm
    1.3 MB · Affichages: 45

JBARBE

XLDnaute Barbatruc
Re,
J'ai rajouté ceci : .cells(X+20,1)=""
Bien sûr les autres éléments ne sont pas indispensables mais je les laissent quand même !

Code:
If Z >= 2000 Or Y = nbfeuilles - 4 Or .Cells(X + 20, 1) = "" Then
Sheets("Forme et Classe").Select
MsgBox "Terminé"
Exit Sub
En effet, s'il y a que 6 courses ou 4 réunions dans la base de données, la macro s'arrêtera lorsqu'il ne restera plus d'écriture !
Bonne soirée !
 

Pièces jointes

  • Copie de Transfert Lignes Vers Onglets.xlsm
    1.3 MB · Affichages: 91

Membres actuellement en ligne

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16