VBA Si plage vide alors on copier les données

Hicsygrek

XLDnaute Occasionnel
Bonjour à tous !

J'ai un petit souci de code VBA :confused:
Après plusieurs recherches, j'ai trouvé plusieurs choses :
- Trouver la première cellule vide dans une colonne
- Trouver la première ligne vide (j'ai pas réussi :( )

Sauf que c'est pas ce que je cherche exactement.

Je voudrais que mon code détecte la première ligne vide d'un autre fichier excel mais uniquement sur les colonnes A, B et C. :eek:

Une fois trouvée, je voudrais y copier une plage (de 1, 2 ou 3 colonnes sur plusieurs lignes) depuis mon fichier excel en cours.

Après plusieurs essais, j'ai eu droit à plusieurs "problèmes" :
- Le code ne tenait compte que de la première colonne
- Le code copiait des #NA sur les cellules vides à l'origine
- Il ne se passe rien :mad:
Code:
Cells(Range("A1000:C1000").End(xlUp).Row, 1) = ThisWorkbook.Sheets("FicheB203").Range("T14:U18").Value

Le seul qui fonctionne mais uniquement sur la colonne A c'est celui-là :
Code:
Range("A1000").End(xlUp).Offset(1, 0) = ThisWorkbook.Sheets("FicheB203").Range("T14").Value

Quelqu'un a-t-il une idée ? Ci-dessous un extrait du code :

Code:
Private Sub CdeButOK_Click()

Dim ccb1 As Integer 'déclare la variable ccb1 (Colonne ComboBox1)
Dim P As Integer 'déclare la variable P (pourrait être déclarée comme Byte ?)
Dim col As Integer 'déclare la variable col (COLonne)
Dim cb1 As String 'déclare la variable cb1 (ComboBox1)
Dim cb3 As String 'déclare la variable cb3 (ComboBox3)
Dim ShtS As Worksheet 'déclare la variable ShtS
 
cb1 = ComboBox1.Value 'définit la variable cb1
Set ShtS = Sheets("Polyvalence") 'définit la variable ShtS
ccb1 = ShtS.Range("C1:AO1").Find(What:=cb1).Column 'définit la colonne Ccb1
'P = 0, 1 ou 2
cb3 = ComboBox3.Value 'définit la variable cb3
For n = 3 To ShtS.Range("A65536").End(xlUp).Row
 If ShtS.Range("A" & n) = cb3 Then cb3n = n
Next n
If ComboBox2.Value = "Conducteur" Then 'condition : si la valweur de la ComboBox2 est "Chef"
    P = 0 'définit la variable P
    col = ccb1 + P 'définit la colone col
    ShtS.Cells(CInt(cb3n), col) = Former.Label2.Caption 'place dans la cellule la caption du Label2
End If 'fin de la condition

Dim Wk As Workbook
Dim Ws As Worksheet
MyPath = ThisWorkbook.Path
Dim fso As Object, x As Boolean

        
    Set fso = CreateObject("Scripting.FileSystemObject") 'vérifie si un fichier porte le nom de la personne formée
    x = fso.FileExists(MyPath & "\" & cb3 & ".xlsx")
    If x = True Then 'si oui, on ouvre ce fichier
        
    Set Wk = Workbooks.Open(Filename:=ThisWorkbook.Path & "\" & cb3 & ".xlsx")
    
    Wk.Activate

        For Each Ws In ActiveWorkbook.Worksheets 'on vérifie si une feuille porte le nom de la machine sélectionnée
            If Ws.Name = cb1 Then 'si oui, on ajoute la sélection sur cette feuille
                
                             
                If ChkB11 = True Then
                
                Cells(Range("A1000:C1000").End(xlUp).Row, 1) = ThisWorkbook.Sheets("FicheB203").Range("T14:U18").Value         
                
                End If
                         
            Else 'si non, on créé une feuille avec le nom de la machine et on ajoute la sélection
                Sheets.Add
                ActiveSheet.Name = cb1
                
                If ChkB11 = True Then
                
'même opération
                                
                End If

            End If
        Exit For
        Next
        ActiveWorkbook.Save 'on sauvegarde le fichier
        
    Else 'si aucun fichier n'existe sous le nom de cette personne, on créé : un classeur,une feuille et on ajoute la sélection
        Workbooks.Add
        Sheets.Add
        ActiveSheet.Name = cb1
        Worksheets(cb1).Range("A1") = ThisWorkbook.Sheets("FicheB203").Range("T14:U18").Value
        ActiveWorkbook.SaveAs MyPath & "\" & cb3 & ".xlsx" 'on sauvegarde le fichier dans le dossier contenant Compétence Perso
    End If
    
ActiveWorkbook.Close 'on ferme le fichier

Unload Me 'on ferme la fenêtre et affiche l'USF Formations
Formations.Show

End Sub

Merci d'avance pour vos réponses
 

TempusFugit

XLDnaute Impliqué
Re : VBA Si plage vide alors on copier les données

Bonjour

Voir si cela peut t'aider
Code:
Sub test() 'fonctionne jusqu'à Excel 2003
Dim premierecellulevide As Range
Set premierecellulevide = Range("A65536").End(xlUp)(2)
MsgBox "Premiere cellule vide de la colonne A : " & premierecellulevide.Address
If Application.CountBlank(premierecellulevide.Resize(, 256)) = 256 Then
MsgBox "La première ligne vide est la ligne : " & premierecellulevide.Row
End If
End Sub

Pour moi une ligne vide (sur Excel 2003) est une ligne dans les 256 cellules sont vides.

Ce qui explique le if / End if de ma macro.
 
Dernière édition:

TempusFugit

XLDnaute Impliqué
Re : VBA Si plage vide alors on copier les données

Voir si cela peut t'aider
veut bien dire ce que cela veut dire, non ?

La macro du précédent message n'est pas une solution.

C'était juste pour monter comment trouver une ligne vide.
C'est pour cela que j'utilise des MsgBox.

L'idée étant que tu adaptes cela et que tu l'ajoutes à ton code VBA existant (présent dans ton premier message)
 
Dernière édition:

TempusFugit

XLDnaute Impliqué
Re : VBA Si plage vide alors on copier les données

Bonjour de nouveau


Voici un exemple plus concret
Dans un nouveau classeur avec deux feuilles
Mettre quelques données sur la feuille 1 dans les colonnes A B C
puis sur la feuille 2 mettre des données dans les cellules A1, B1 et C1

Lancer la macro ci-dessous
Code:
Sub trouvelignevide()
Dim pcv As Range, testvide As Boolean
Set pcv = Range("A65536").End(xlUp)(2)
testvide = Application.CountBlank(pcv.Resize(, 3)) = 3
If testvide Then
Feuil2.Range("A1:C1").Copy pcv
End If
End Sub
La copie se fait bien dans la première ligne vide.
 

Hicsygrek

XLDnaute Occasionnel
Re : VBA Si plage vide alors on copier les données

Re bonjour,

C'est bien en adaptant le premier code que j'en arrivais à ce résultat.
Je viens de tester ton code sur un fichier test et effectivement ça ne copie pas les données de la page 2 vers la page 1.
Elles ne sont copiées que si toutes les cellules sur les 3 colonnes sont occupées (ex: fonctionne sur feuille 2 et 3).
Je joins le fichier Test ...
 

Pièces jointes

  • Test.xlsm
    14.4 KB · Affichages: 133
  • Test.xlsm
    14.4 KB · Affichages: 140
  • Test.xlsm
    14.4 KB · Affichages: 150

TempusFugit

XLDnaute Impliqué
Re : VBA Si plage vide alors on copier les données

Bonjour de nouveau


Pour moi cela fonctionne
J'ai ajouté de qoui faire le test dans la macro ci-dessous
Code:
Sub Macro1()
'
' Macro1 Macro
'
' Touche de raccourci du clavier: Ctrl+t
'
Feuil1.Range("A1:C10") = Rnd

Dim pcv As Range, testvide As Boolean
Set pcv = Range("A65536").End(xlUp)(2)

testvide = Application.CountBlank(pcv.Resize(, 3)) = 3
If testvide Then
Feuil2.Range("A1:C1").Copy pcv
End If
End Sub
La première ligne vide est pour moi la ligne 11
et c'est là que seront les données de A1:C1 de la feuille 2.
 

Pierrot93

XLDnaute Barbatruc
Re : VBA Si plage vide alors on copier les données

Re,

regarde ceci, fonctionne dans le fichier fourni :
Code:
With Feuil1
    Feuil2.Range("A1:C1").Copy .Cells(.Columns(1).Resize(, 3).Find("*", .Cells(Rows.Count, 3), xlValues, , 1, 2, 0).Row + 1, 1)
End With
 

Hicsygrek

XLDnaute Occasionnel
Re : VBA Si plage vide alors on copier les données

Re le fil.

@TempusFugit, ton code fonctionne chez moi uniquement si les 3 cellules de la ligne du dessus sont complétées.

@Pierrot93, ton code fonctionne mais comme TempusFugit j'aimerais bien quelques explications pour pouvoir l'adapter à mon fichier

Merci :)
 

TempusFugit

XLDnaute Impliqué
Re : VBA Si plage vide alors on copier les données

With Feuil1
MsgBox .Cells(.Columns(1).Resize(, 3).Find("*", .Cells(Rows.Count, 3), xlValues, , 1, 2, 0).Row, 1).Address
End With

renvoie A5

Je ne comprends pas comment le code permet de trouver la dernière cellule.

Car si on le fait manuellment, la première cellule trouvée est A1 et il faut cliquer sur Suivant pour trouver les suivantes
 

Pierrot93

XLDnaute Barbatruc
Re : VBA Si plage vide alors on copier les données

Re,

selon les arguments de la méthode :
argument "after"
Code:
.Cells(Rows.Count, 3)
cellule après laquele s'effectue la recherche, soit la C65536 (sous 2003)
argument "SearchOrder", le 1 dans les arguments soit = à xlByRows
argument "SearchDirection", le 2 dans les arguments soit = à xlPrevious
donc on fait une recherche par ligne à partir de C65536 en recherchant la précédante...
 

Discussions similaires

Réponses
6
Affichages
121
Réponses
5
Affichages
166
Réponses
7
Affichages
316

Statistiques des forums

Discussions
312 080
Messages
2 085 144
Membres
102 793
dernier inscrit
volfy