Copier coller de ligne sous condition de remplissage

  • Auteur de la discussion Marine0288
  • Date de début

Marine0288

Nouveau membre
Bonjour,

Je suis débutante en VBA.
J'aimerais copier les lignes d'un fichier A dans un fichier B si et seulement si la cellule C de la ligne source contient une valeur. Si elle est vide, passer à la ligne suivante.
Je sais que je dois faire une boucle If mais je ne sais pas exprimer le fait que la cellule contienne une valeur ou non.
Pourriez-vous m'aider s'il vous plaît ?

Merci
 

zeb

Modérateur
Salut,

Les boucles If, ça n'existe pas !

Qu'appelles-tu un fichier ?
Quel logiciel utilises-tu ?
 

Marine0288

Nouveau membre
Bonjour,
Merci pour votre réponse.
J'utilise Excel 2010.
Ce que j'appelle un fichier c'est un classeur du type : classeur.xls
Je ne sais pas si j'utilise les thermes appropries. Comme je l'ai dit je suis débutante en VBA alors veuillez m'excuser pour mes erreurs de vocabulaire.
J'ai bien avancé depuis hier, j'ai le code suivant:

Code:
Sub ecoglass()
'
' ecoglass Macro
    Dim n As Long
    Dim Fini As Workbook
    Dim Fdes As Workbook
    Set Fini = Workbooks("Eco_2013.xls")
    Set Fdes = ThisWorkbook
    n = 9
  
    Fini.Sheets("Q-ROT").Activate
        For n = 9 To Range("A65536").End(xlUp)

            If Not IsEmpty(("C" & n)) Then
                Fini.Sheets("Q-ROT").Activate
                Range("A" & n).Copy
                Fdes.Sheets("Eco").Activate
                Range("A65536").End(xlUp).Offset(1, 0).Select
                Selection.PasteSpecial Paste:=xlPasteValues
            End If
         
            If Not IsEmpty(("C" & n)) Then
                Fini.Sheets("Q-ROT").Activate
                Range(Cells(n, 3), Cells(n, 11)).Copy
                Fdes.Sheets("Eco").Activate
                Range("B65536").End(xlUp).Offset(1, 0).Select
                Selection.PasteSpecial Paste:=xlPasteValues
            End If
         
    Next
       
End Sub
Le problème c'est que la première condition (if) ne fonctionne pas.
La macros copie et colle les valeurs même si la cellule de la colonne C de la ligne n est vide et je ne comprends pas pourquoi car la condition suivante est formulée de la même manière et fonctionne parfaitement.

Je suis vraiment motivée pour comprendre ce que je fais et non pas faire de simple copier-coller de code existant.

Merci beaucoup pour votre aide
 

zeb

Modérateur
Eh, il y a du très bon !
(...et du très mauvais, mais tu es là pour ça ;) )

Bon, alors d'abord, tu vas mettre ton pointeur sur IsEmpty et appuyer sur la touche [F1].
Tu lis tout et après tu arrêtes de te demander pourquoi ça ne marche pas !

-----------------

En fait, on s'en fout, on veut que ça marche. :D

-----------------

Alors d'après ce que je vois, tu veux copier des données d'un onglet d'un classeur Excel, vers un onglet d'un autre classeur, sous condition.
Facile ! (si, si tu vas voir.)

Et pour ça, tu te donnes des variables pour accéder à tes classeurs. Excellent !
Sauf que tu as fait la moitié seulement de la démarche.
Parce que je résumerai bien ton énoncé en "copier des données d'une feuille de calcul vers une autre, sous condition".
Et donc, c'est à chacune des feuilles que je préfèrerais me référer.

Ça se fait comme ça :

Code:
Dim ws_des As Worksheet
Dim ws_ini As Worksheet

Set ws_des = ThisWorkbook.Worksheets("Eco")
Set ws_ini = Workbooks("Eco_2013.xls").Worksheets("Q-ROT")

Pour ce qui est de la zone à parcourir, l'utilisation de End() est judicieuse, mais mal appliquée.
Révisons un peu :

Et oui, tu ramènes par défaut, la valeur de la dernière ligne non-vide.
Il aurait fallu écrire :
Code:
For n = 9 To Range("A65536").End(xlUp).Row

Sauf, que je préfère travailler avec des cellules, des lignes, des colonnes plutôt qu'avec des coordonnées de cellules.

Code:
Dim curr_row As Range
For Each curr_row In ws_ini.Range(ws_ini.Rows(9), ws_ini.Cells(65536, 1).End(xlUp).EntireRow)
    ...
Next
Et voilà comment parcourir toutes les lignes de ta zone !

Un truc me chifonne. D'où sors-tu ce nombre, 65536 ?
Selon les versions d'Excel, la dernière ligne n'est pas forcément la 2^16-ème.
Alors on va demander à Excel de trouer lui-même cette valeur :
Code:
For Each curr_row In ws_ini.Range(ws_ini.Rows(9), ws_ini.Cells(ws_ini.Rows.Count, 1).End(xlUp).EntireRow)
    ...
Next

Que cherche-t-on, déjà ? Ah oui : qu'y-a-t-il dans la case C ?
Je compte A1, B2, C3. On va donc regarder dans la troisième case de chaque ligne :
Code:
For Each curr_row In ws_ini.Range(ws_ini.Rows(9), ws_ini.Cells(ws_ini.Rows.Count, 1).End(xlUp).EntireRow)
    If curr_row.Cells(3).Text <> "" Then
       MsgBox "Cette cellule [" & curr_row.Cells(3).address(0, 0) & "] n'est pas vide. Copions-là !"
    End If
Next
Pas mal, hein ?

Bon, on continue.
Arggggggggggggh ! x_X
Mais quelle horreur !
Tu oses utiliser le presse-papier pour te servir de mémoire tampon.
T'imagines si tous les programmes qui tournent en même temps sur ton ordi en faisait tous autant ! :pt1cable:
JE T'INTERDIS D'UTILISER LE PRESSE-PAPIER (*) :fou:

Bon digère tout ça.
Tu as toute la nuit pour me trouver une solution pour copier tout ça dans ton autre onglet.
Que tu trouves ou pas, je te proposerai une soluce demain matin.
Sauf si t'arrives à faire aussi bien sinon mieux que ce que j'ai à te montrer, bien sûr.

_____________________
(*) tu fais bien ce que tu veux en fait :lol:
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 128
Messages
6 717 832
Membres
1 586 367
Dernier membre
ramkin
Partager cette page
Haut