copier- coller colonne

jujudeo

XLDnaute Nouveau
Bonjour,

C'est un problème certainement simple pour les experts d'Excel mais pas facile pour moi

Code:
Sub Traitement()
 
Dim td As Sheets
Dim taille As Range
Dim myDate As Date
Dim derligne As Long
 
      With Sheets("donnee")
        Set taille = .Range("A2:DX761")
         For Each cell In taille
          If InStr(1, cell.Text, "%") > 0 Then
           cell.EntireColumn.Rows("2:761").Select
           Selection.Copy
           Selection.Paste after column.select
 
            End If
            Next
            End With
 
End Sub
Voici une partie de mon code. Mon but est que si je rencontre une cellule au format pourcentage, je la sélectionne entièrement, je la copie et je la colle juste après celle-ci mais c'est la ou sa coince pour moi :(

Je vous remercie
 

CISCO

XLDnaute Barbatruc
Re : copier- coller colonne

Bonjour

Je ne suis pas du tout bon en VBA et je ne comprend peut être pas bien ta macro, mais il me semble qu'il y a effectivement un pb : Si tu copies une partie d'une colonne contenant un pourcentage, et que tu colles tout cela dans la colonne suivante, le For Each cell In Taille, If InStr... va trouver un nouveau pourcentage, et recommencer la copie et le collage encore une fois, et ainsi de suite jusqu'à la colonne DX. A la fin, presque tout ton tableau sera remplacé par le contenu de la première colonne rencontrée contenant un pourcentage !

@ plus
 

jujudeo

XLDnaute Nouveau
Re : copier- coller colonne

Au départ, j'ai plusieurs colonnes au format pourcentage %

J'aimerai créer une condition afin que si la macro détecte une cellule avec un format pourcentage, elle crée une colonne (2) a coté de cette colonne (1), copie les données (1) au format numéro dans la colonne (2), et ensuite passer la colonne (1) au format numéro. Dans cette colonne (1), insérer une formule pour avoir les données de la colonne (2) format numéro *100 ( ex : 0.4 x 100 = 40) et, a la fin, supprimer la colonne 2

Mon but final est d'avoir une colonne qui, à la base était au format pourcentage, une colonne format numéro mais avec par exemple les chiffres entiers : 20 , 23.69 etc..

Je sais pas trop si je suis assez clair et si vous avez d'autres méthodes pour réaliser ceci, je suis volontiers preneur

Julien
 

Pièces jointes

  • suivi.xlsx
    34.1 KB · Affichages: 28
  • suivi.xlsx
    34.1 KB · Affichages: 28
Dernière modification par un modérateur:

CISCO

XLDnaute Barbatruc
Re : copier- coller colonne

Bonjour

Cela fonctionne avec
Code:
Sub Multiply()
     
    Dim x As Range 'cellule affichant le coefficient multiplicateur 100
    Dim taille As Range '1ère ligne contenant le symbole % dans les en-tête
    Dim colonne As Integer 'n° de la colonne à modifier
    Dim lignefin As Integer 'n° de la dernière ligne
 
        Set x = Range("A65536")
        x.Value = 100
        
         Set taille = Range("A1:DX1")
         For Each cell In taille
          If InStr(1, cell.Text, "%") > 0 Then
            colonne = cell.Column
            lignefin = cell.End(xlDown).Row
            x.Copy
            Range(Cells(2, colonne), Cells(lignefin, colonne)).PasteSpecial _
            Paste:=xlPasteValues, Operation:=xlMultiply, SkipBlanks:=True
                For i = 2 To lignefin
                If CStr(Cells(i, colonne)) = "Erreur 2015" Then Cells(i, colonne) = ""
                Next i
            Selection.NumberFormat = "#0.00"
          End If
          Next

J'ai dû rajouter une boucle
For i = 2 To lignefin
If CStr(Cells(i, colonne)) = "Erreur 2015" Then Cells(i, colonne) = ""
Next i
pour éliminer les #VALEUR! liés certainement au Operation:=xlMultiply

@ plus
 

Pièces jointes

  • suivi2.xlsm
    52.1 KB · Affichages: 26

CISCO

XLDnaute Barbatruc
Re : copier- coller colonne

Bonjour

une variante
Code:
Sub Multiply()
     
    Dim x As Range 'cellule affichant le coefficient multiplicateur 100
    Dim taille As Range '1ère ligne contenant le symbole % dans les en-tête
    Dim colonne As Integer 'n° de la colonne à modifier
    Dim lignefin As Integer 'n° de la dernière ligne
 
    Application.ScreenUpdating = False
    Set taille = Range("A1:DX1")
         For Each cell In taille
          If InStr(1, cell.Text, "%") > 0 Then
           i = 2
           colonne = cell.Column
            lignefin = cell.End(xlDown).Row
            Plage = cell.EntireColumn.Rows("2:" & lignefin)
                For Each cell2 In Plage
                If cell2 <> "" Then Cells(i, colonne) = cell2 * 100
                Cells(i, colonne).Select
                Selection.NumberFormat = "#0.00"
                i = i + 1
                Next
          End If
          Next
          Application.ScreenUpdating = True
End Sub

@ plus
 

Pièces jointes

  • suivi4.xlsm
    60.6 KB · Affichages: 33

jujudeo

XLDnaute Nouveau
Re : copier- coller colonne

Bonjour Cisco,

je suis content, je me suis inspiré de votre macro et j'ai réussi à faire marché la mienne comme je désirais donc je suis assez satisfait ! la voici :

Code:
Sub Traitement()

Dim td As Worksheet
Dim myDate As Date
Dim derligne As Long
Dim x As Range 'cellule affichant le coefficient multiplicateur 100
Dim taille As Range '1ère ligne contenant le symbole % dans les en-tête
Dim colonne As Integer 'n° de la colonne à modifier
Dim lignefin As Integer 'n° de la dernière ligne

On Error Resume Next 'si la feuille n'existe pas !
Application.DisplayAlerts = False: Sheets("traitement date").Delete: Application.DisplayAlerts = True
On Error GoTo 0 'plus de gestionnaire d'erreurs
Worksheets("PO - PB").Copy After:=Worksheets("base donnee") 'création de la feuille
ActiveSheet.Name = "traitement date" 'nom de la feuille'
Sheets("base donnee").Range("A1:DX1").Copy Sheets("traitement date").Range("A1:DX1")
ActiveSheet.AutoFilterMode = False 'desactiver les filtres'
ActiveWindow.FreezePanes = False 'désactiver les volets'
ligne = Range("A" & Rows.Count).End(xlUp).Row
colomne = Cells(1, Cells.Columns.Count).End(xlToLeft).Column
With Sheets("traitement date")

   
        Set taille = .Range("A2:DX100")
        For Each cell In taille
            'detecter date et la mettre en texte + bon format
            If IsDate(cell) Then
            cell.EntireColumn.Rows("2:761").Select
            Selection.NumberFormat = "@"
            Selection.NumberFormat = "yyyy-mm-dd"
            End If
                
            If InStr(1, cell.Text, "€") > 0 Then
            cell.EntireColumn.Rows("2:761").Select
            Selection.NumberFormat = "0.00"  'pour 2 décimales
            End If

            Next
            
            End With
            
               
            
       Set x = Range("A" & ligne + 10)
         x.Value = 100
      With Sheets("traitement date")
        Set taille = .Range("A2:DX100")
     For Each cell In taille
           If InStr(1, cell.Text, "%") > 0 Then
             colonne = cell.Column
             lignefin = cell.End(xlDown).Row
             x.Copy
             Range(Cells(1, colonne), Cells(lignefin, colonne)).PasteSpecial _
             Paste:=xlPasteValues, Operation:=xlMultiply, SkipBlanks:=True
                 For i = 2 To lignefin
                 If CStr(Cells(i, colonne)) = "Erreur 2015" Then Cells(i, colonne) = ""
                 Next i
             Selection.NumberFormat = "0.00"
             Selection.Copy
            'Selection.Offset(0, 0).Select
            'Selection.EntireColumn.Insert
            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone
            'Selection.Offset(0, 0).Delete
           End If
           Next
    End With
    'on efface la valeur 100 en bas du tableau (utilisée pour le collage spécial)
    Range("A" & ligne + 10).Clear
 
    
End Sub

Pour l'optimiser encore plus, j'aimerais optimiser cette ligne : Set taille = .Range("A2:DX100") c'est a dire que je mets 100 car sur une colonne la première valeur qui arrive est a la 100eme ligne, avant se n'est que des cellules vides... Penses-vous qu'il y aurait une fonction qui repère dans la colonne la première valeur non nulle pour ensuite la traiter ?
 

CISCO

XLDnaute Barbatruc
Re : copier- coller colonne

Bonsoir

Pour trouver le n° de la ligne de la première cellule non vide de la colonne A, tu peux essayer avec
Code:
lignedébut = Columns(1).Find("?", Cells(Rows.Count, 1), xlValues, , 1, 1, 0).Row

Code:
 lignedébut = Selection.End(xlDown).Row

@ plus
 
Dernière édition:

CISCO

XLDnaute Barbatruc
Re : copier- coller colonne

Bonjour

Bonjour Cisco,

Set taille = .Range("A2:DX100")
For Each cell In taille
.....
End Sub

Comme je comprend ton code, la recherche des % est faite dans la plage taille A2:DX100. A lire le texte de ton dernier post, j'ai l'impression que toutes les cellules avant la ligne 100 sont vides. J'ai l'impression qu'il y a comme un pb...

Pourrais-tu préciser ce point ?

@ plus
 

jujudeo

XLDnaute Nouveau
Re : copier- coller colonne

En effet, pour ma première boucle FOR, puisque je veux que toutes mes colonnes soient traitées, j'ai mis jusqu'à DX100 car il y une colonne où la première cellule non vide arrive à la ligne 93 donc pour assurer le coup j'ai mis 100 pour que tout soit traité. En ce qui concerne la deuxième boucle FOR pour les %, j'ai "bêtement" recopié le premier range. Mon but est donc de trouver une astuce afin que ce ne soit pas moi qui rentre le Range manuellement, mais que la macro détecte elle même la cellule pour traiter la colonne, en gros que le range se fasse automatiquement ! Je ne sais pas si je suis assez clair... je reste a disposition quand vous voulez !! :)
 

CISCO

XLDnaute Barbatruc
Re : copier- coller colonne

Bonjour

Je suis débutant en VBA, et avec mes connaissances dans ce domaine, je ne vois pas comment trouver la première ligne contenant une cellule non vide autrement qu'avec une boucle sur les diverses colonnes de ton fichier (puisque chaque colonne ne commence pas sur la même ligne) ou peut-être sur les diverses lignes. Dans ces conditions, est-ce vraiment intéressant, utiliser une boucle plutôt qu'une plage prise trop grande par défaut?

@plus
 

Discussions similaires

Réponses
1
Affichages
196
Réponses
2
Affichages
303

Statistiques des forums

Discussions
312 497
Messages
2 088 992
Membres
104 000
dernier inscrit
dinelcia