[VBA]Remplacer le contenu d'une ligne sur deux

TheLio

XLDnaute Accro
Bonjour,
Je me retrouve avec un classeur de 60 onglets allant jusqu'à 400 lignes.
Une ligne sur deux est la traduction française de l'article mais les données relatives au produit sont sur la ligne allemande.
L'idéal serait de pouvoir remplacer le contenu de la cellule en colonne B par celui qui est inférieur.
Le bonheur, dans tout ça, c'est que le classeur est construit de manière identique pour chaque onglet.
Mais c'est bien audessus de mes capacités vébéistiques:)
Je vous remercie d'avance pour vos éclairages.
 

Pièces jointes

  • Exemple.xls
    20.5 KB · Affichages: 98
  • Exemple.xls
    20.5 KB · Affichages: 91
  • Exemple.xls
    20.5 KB · Affichages: 104

Etienne2323

XLDnaute Impliqué
Re : [VBA]Remplacer le contenu d'une ligne sur deux

Bonjour TheLio,
vois si quelque chose comme ceci te convient.

Si tu souhaites effectuer l'opération sur l'ensemble des feuilles de ton fichier, rajoute ceci :

Code:
Dim Sheet As Object
 
For Each Sheet in Sheets
et

Code:
Next


Cordialement,

Étienne
 

Pièces jointes

  • Exemple.xls
    35.5 KB · Affichages: 112
  • Exemple.xls
    35.5 KB · Affichages: 95
  • Exemple.xls
    35.5 KB · Affichages: 99
Dernière édition:

TheLio

XLDnaute Accro
Re : [VBA]Remplacer le contenu d'une ligne sur deux

Hello,
Je n'avais pas vu ta modif de message et j'ai procédé ainsi:
Sub test()
Dim DerniereLigne As Integer
Dim a As Byte, x As Byte
Application.ScreenUpdating = False
x = Sheets.Count 'Par Exemple, ou ce qu'on veut
For a = 1 To x
Sheets(a).Select
DerniereLigne = Cells(65536, 1).End(xlUp).Row
For i = 1 To DerniereLigne
If Cells(i, 1).Value = "" Then
Cells(i, 2).Cut
Cells(i - 1, 2).Select
ActiveSheet.Paste
Selection.Font.ColorIndex = 0
If Cells(i, 5).Value <> "" Then
Cells(i, 5).Cut
Cells(i - 1, 5).Select
ActiveSheet.Paste
Selection.Font.ColorIndex = 0
End If
Cells(i, 1).EntireRow.Delete
End If
Next i
Next

Application.ScreenUpdating = True
End Sub
Les puristes des variables bien déclarées vont certainement tousser, mais je devais finir ceci avant demain.
Merci pour tout l'attention apportée
A++
Lio
 

PMO2

XLDnaute Accro
Re : [VBA]Remplacer le contenu d'une ligne sur deux

Bonjour,

Une piste avec le code suivant à copier dans un module standard.

CELA FAIT
1) crée un nouveau classeur
2) y copie toutes les feuilles du classeur source
3) fait le traitement demandé

Copiez le code et lancez la macro TraductionFrance
Code:
*******************
Sub TraductionFrance()
Dim WB As Workbook
Dim WB2 As Workbook
Dim S As Worksheet
Dim R As Range
Dim var
Dim A$
Dim i&
On Error GoTo Erreur
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set WB = ActiveWorkbook
Set WB2 = Workbooks.Add(xlWBATWorksheet)
For Each S In WB.Worksheets
  S.Copy after:=WB2.Sheets(WB2.Sheets.Count)
Next S
WB2.Sheets(1).Delete
For Each S In WB2.Worksheets
  Set R = S.UsedRange
  var = R
  For i& = 1 To UBound(var, 1) Step 2
      '--- colonne B ---
    A$ = var(i& + 1, 2)
    If A$ <> "" Then
      var(i&, 2) = A$
      var(i& + 1, 2) = ""
    End If
      '--- colonne E ---
    A$ = var(i& + 1, 5)
    If A$ <> "" Then
      var(i&, 5) = A$
      var(i& + 1, 5) = ""
    End If
  Next i&
  R = var
  For i& = UBound(var, 1) To 1 Step -2
    S.Rows(i&).Delete
  Next i&
Next S
Windows.Arrange ArrangeStyle:=xlHorizontal
Erreur:
Application.DisplayAlerts = True
Application.ScreenUpdating = True
If Err <> 0 Then MsgBox "Erreur " & Err.Number & vbCrLf & _
    Err.Description & vbCrLf & "Arrêt sur la feuille " & S.Name
End Sub
*******************
Cordialement.

PMO
Patrick Morange
 

TheLio

XLDnaute Accro
Re : [VBA]Remplacer le contenu d'une ligne sur deux

Wow...
Merci patrick
Avec détection des onglets qui ne sont pas conformes, c'est la classe,
Par contre, je ne comprend rien de rien à ton code...
(pas grave diront certains, tant que ça fonctionne)
Mais si un jour tu repasses ici et que tu me le commente un peu, c'est volontiers.
[je sais, je suis gourmand (déformation professionnelle):)]
A++
Lio
 

ChTi160

XLDnaute Barbatruc
Re : [VBA]Remplacer le contenu d'une ligne sur deux

Salut TheLio
Bonsoir le fil
Bonsoir le Forum

en pièce jointe
une autre façon de faire via des tableaux Lol

dans le fichier la Feuil4 et la seule à ne pas être prise en compte
il suffit de copier la Feuille Feuil1 autant de fois que nécessaire , puis de lancer la macro via le bouton de la feuille Feuil4 (les données de la feuil4 servent à la recopie de celles ci dans les autre feuilles, pour les tests Lol)

Le Fichier : Regarde la pièce jointe ExempleV1.zip

Bonne fin de Soirée
Bonnes Fêtes de fin d' Année ;)
 

Pièces jointes

  • ExempleV1.zip
    40.4 KB · Affichages: 60
  • ExempleV1.zip
    40.4 KB · Affichages: 59

PMO2

XLDnaute Accro
Re : [VBA]Remplacer le contenu d'une ligne sur deux

Bonsoir,

Ci-dessous, mon code commenté :
Code:
Option Explicit

'*******************
Sub TraductionFrance()

'### Déclaration explicite des variables ###
Dim WB As Workbook
Dim WB2 As Workbook
Dim S As Worksheet
Dim R As Range
Dim var As Variant
  '--- typage par suffixe $=string &=long ---
Dim A$
Dim i&

'### gestion d'erreur et désactivation écran et alertes ###
On Error GoTo Erreur
Application.ScreenUpdating = False
Application.DisplayAlerts = False

Set WB = ActiveWorkbook
'### création d'un nouveau classeur avec 1 seule feuille ###
Set WB2 = Workbooks.Add(xlWBATWorksheet)

'### chaque feuille du classeur source sont copiées dans le nouveau ###
For Each S In WB.Worksheets
  S.Copy after:=WB2.Sheets(WB2.Sheets.Count)
Next S

        '/// on est sur le nouveau classeur ////
'### supprime la 1ère feuille (initiale) du nouveau classeur ###
WB2.Sheets(1).Delete

'### boucle sur toutes les feuilles ###
For Each S In WB2.Worksheets
  Set R = S.UsedRange   'affecte toute la plage de la feuille dans un Range
  var = R               'le contenu du range mis en mémoire dans un variant
  
      '--- le variant est comme un tableau bidimensionné ---
      '--- on fait une boucle sur toutes ses lignes  ---
      '--- elle part de 1 et s'incrémente de 2 (Step 2)
  For i& = 1 To UBound(var, 1) Step 2
      '--- colonne B ---
  '--- assigne la valeur du tableau (i&=ligne 2=colonne) ---
                          'commentaires variables en fonction de i&
    A$ = var(i& + 1, 2)   'si i&=1 lit ligne+1, colonne2 = "B2"
    If A$ <> "" Then      'si i&=1 si "B2" n'est pas vide
      var(i&, 2) = A$     'on affecte sa valeur a "B1"
      var(i& + 1, 2) = "" 'on met à vide "B2"
    End If
      '--- colonne E ---
    A$ = var(i& + 1, 5)   'même principe qu'au dessus
    If A$ <> "" Then      'mais avec la colonne 5 "E2"
      var(i&, 5) = A$
      var(i& + 1, 5) = ""
    End If
  Next i&
  '--- On passe les nouvelles valeurs au Range ---
  R = var
  
  '--- on boucle à l'envers sur toutes lignes ---
  For i& = UBound(var, 1) To 1 Step -2
    S.Rows(i&).Delete     'on élimine les lignes paires
  Next i&
Next S

'--- arrange les 2 classeurs pour visualisation---
Windows.Arrange ArrangeStyle:=xlHorizontal

'### pseudo traitement d'erreur car on y passe systématiquement ###
Erreur:
Application.DisplayAlerts = True
Application.ScreenUpdating = True
'--- si erreur, affiche son N°,sa description ---
'--- et la feuille où l'arrêt se produit      ---
If Err <> 0 Then MsgBox "Erreur " & Err.Number & vbCrLf & _
    Err.Description & vbCrLf & "Arrêt sur la feuille " & S.Name
End Sub
'*******************

J'espère que c'est maintenant plus clair. Bonne lecture.

PMO
Patrick Morange
 

TheLio

XLDnaute Accro
Re : [VBA]Remplacer le contenu d'une ligne sur deux

Bonjour Patrick, Jean-Marie,
Merci beaucoup pour vos codes et commentaires.
:)A vous tous une excellente fin d'année et tous mes voeux pour la suivante.:)
Lio
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 193
Messages
2 086 062
Membres
103 110
dernier inscrit
Privé