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
 

Hicsygrek

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

Re,

Hum, j'ai beau bidouiller ce code dans tous les sens j'ai toujours cette erreur 1004.
Il est pourtant pas sorcier et j'arrive à le faire fonctionner sur le fichier test.

Est-ce que le fait de copier les données vers un autre classeur excel peut poser problème ?
Ca me parrait peu probable vu que j'arrive à transférer les données (tant que je ne cherche pas la ligne vide).

Code:
With Sheets(cb1)
ThisWorkbook.Sheets("FicheB203").Range("T14:U18").Copy .Cells(.Columns(1).Resize(, 3).Find("*", .Cells(Rows.Count, 3), xlValues, , 1, 2, 0).Row + 1, 1)
End With

ThisWorkbook = Fichier 1, celui depuis lequel j'exécute le code (depuis un USF)

Le classeur actif est le Fichier 2 dans lequel on trouve la feuille dont le nom correspond à la valeur d'un combobox ...

J'y arrive de façon classique, donc je vois pas où est le problème :confused:
 

Pierrot93

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

Re,

sur quelle ligne l'erreur ?? essaye peut être ceci, non testé bien sur...
Code:
With Workbooks("classeurDestination.xls").Sheets(cb1)
    Workbooks("classeurSource.xls").Sheets("FicheB203").Range("T14:U18").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 bonjour,

l'erreur 1004 est sur cette ligne :
Code:
Workbooks("CdP9").Sheets("FicheB203").Range("T14:U18").Copy .Cells(.Columns(1).Resize(, 3).Find("*", .Cells(Rows.Count, 3), xlValues, , 1, 2, 0).Row + 1, 1)

Sinon :
cb1 = une valeur dans un combobox donnant le nom d'une machine qu'on attribue à une feuille
cb3 = également une valeur dans une combobox qui permet de trouver le fichier

ChkB11 = une Checkbox, si elle est cochée alors des informations du fichier doivent être envoyées dans le classeur cb3 sur la feuille cb1. :confused:

Si je mets simplement :
Code:
Range("A1") = ThisWorkbook.Sheets("FicheB203").Range("T14").Value
... ça fonctionne.

Le problème c'est que je peux pas attribuer l'emplacement des données de cette façon car il n'est pas sûr que toutes les checkbox soient cochées (y en a une 20aine). :confused:
 

Hicsygrek

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

Re bonjour Pierrot93,

J'ai réessayé de créer la même situation en créant un fichier exemple sauf que cette fois ci le code fonctionne.
Je ne comprends pas, j'ai pourtant fait un simple copier coller.

Est-il possible de t'envoyer par PM le ficher original ?
 

Hicsygrek

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

Re,

J'ai peut être une piste ...
J'ai supprimé le fichier excel dont je me servais à titre d'essai pour tester mon code.

En relançant mon code, comme prévu, il créé un fichier, créé une feuille et ajoute une donnée.
En relançant le code, comme tout existait déjà, il s'est contenter d'ajouter les données sélectionnées normalement sans bug.

Est-il possible que le code pose problème si on effectue une modification manuelle sur le fichier cible ??

EDIT : si je supprime le contenue de la feuille manuellement par exemple, il me met une erreur 91 :confused:
 
Dernière édition:

Pierrot93

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

Re,

Est-il possible que le code pose problème si on effectue une modification manuelle sur le fichier cible ??

EDIT : si je supprime le contenue de la feuille manuellement par exemple, il me met une erreur 91

bah.. risque de poser problème avec une feuille vide.... Après tout dépend des modifs faites...
 

Discussions similaires

Réponses
4
Affichages
418

Statistiques des forums

Discussions
314 629
Messages
2 111 345
Membres
111 109
dernier inscrit
djameldel