Copier des cellules d'un onglet A vers un B avec tri

Oui, dans ce code, le rajout se fait à chaque fois.

Mais comment savoir quand c'est la fin ?

3GB,

Bonne question, peut être rajouter un bouton pour demander si on fini de remplir les lignes ou dire avez-vous fini de remplier vos lignes ?

Oui, ça me parait plus simple !

Parfois le tout automatique est vraiment pratique mais il faut savoir passer en manuel quand ça s'avère moins risqué...

Mais je connais pas vraiment l'objectif finalement, je ne sais pas à quoi sert tout ça. Si je le savais, peut-être que j'aurais l'idée d'une meilleure solution.

En tout cas, si on passe par un bouton, il faut 2 macros :

Sub EnvoiConf(Cible As Range)

Dim shV6 As Worksheet, shEnv As Worksheet
Dim Lcible As Long, NvL As Long

Set shV6 = Worksheets("V6.x")
Lcible = Cible.Row 'ligne en cours

If Worksheets(Worksheets.Count).Name = "env.conf" Then 'si env.conf existe
    Set shEnv = Sheets("env.conf") 'shEnv = env.conf 'affectation de shEnv
Else
    Set shEnv = Sheets.Add(After:=Worksheets(Worksheets.Count)) 'sinon, Creation d'un nouvel onglet
    shEnv.Name = "env.conf" 'on le renomme env.conf
End If

With shEnv 'sur env.conf
    NvL = .Cells(Rows.Count, 1).End(xlUp).Row 'NvL = dernière ligne
    If (NvL = 1 And .Cells(NvL, 1).Value <> "") Or NvL > 1 Then NvL = NvL + 1 'si onglet non vierge, décalage : NvL = nvlle ligne   
    .Cells(NvL, 1).Value = "ENV;"
    .Cells(NvL, 2).Value = " ;"
    .Cells(NvL, 3).Value = "XDUAS_COMPANY;"
    .Cells(NvL, 4).Value = shV6.Cells(Lcible, 2).Value & ";" ' !!! l'opérateur & permet de concaténer des chaines de caractères
    .Cells(NvL, 5).Value = "XDUAS_PORT;"
    .Cells(NvL, 6).Value = Left(shV6.Cells(Lcible, 3), 5)
End With

End Sub

et

Sub ParamToConf()

Dim NvL As Long

If not Worksheets(Worksheets.Count).Name = "env.conf" Then Exit Sub  'si env.conf existe pas, fin procédure

With Sheets("env.conf") 'sur env.conf
    NvL = .Cells(Rows.Count, 1).End(xlUp).Row + 1 'NvL = dernière ligne + 1
    Sheets("PARAM").Range("A1:E10").Copy .Range("A" & NvL) 'copie A1:E10 de PARAM vers A:E de env.conf à partir nvlle ligne
End With

End Sub

A plus,

Et ils appelé toute les deux par le même événement ?

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A:D")) Is Nothing And Not Target.Count > 1 Then
If Not Application.CountBlank(Range("A" & Target.Row & ":D" & Target.Row)) > 0 Then
If MsgBox("Voulez-vous envoyer les données ?", vbYesNo, "demande de confirmation") = vbYes Then
Call EnvoiConf(Target)
End If
End If
End If
End Sub

L'objectif final, lors d'installation de Dollar universe via nos script ksh, le env.conf est appelé pour prendre ce qu'il faut comme paramétrés

Les lignes rajoutés à la main dans le V6.x serviront à renseigner le nom de la base et numéro de port

Les dignes fixes rajoutés à la fin servirons pour savoir sur quel serveur Maître doit-il s’enregistrer et avec le quel il va communiquer

Dans l'evenement peut-on rajoueter cette condition

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A:D")) Is Nothing And Not Target.Count > 1 Then
If Not Application.CountBlank(Range("A" & Target.Row & ":D" & Target.Row)) > 0 Then
If MsgBox("Voulez-vous envoyer les données ?", vbYesNo, "demande de confirmation") = vbYes Then
Call EnvoiConf(Target)

=> If MsgBox("Avez-vous fini de remplir votre fichier ?", vbYesNo, "demande de confirmation") = vbYes Then

Call ParamToConf(Target)

End If
End If
End If
End If
End Sub

Oulaaa, d'accord, je comprends mieux mais sans vraiment comprendre . Tu récupères donc des informations pour les réorganiser afin de les inscrire comme du code dans un autre langage ??? Mais sans qu'il n'y ait un dénominateur commun permettant d'automatiser ce que tu fais pour l'instant à la main.

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A:D")) Is Nothing And Not Target.Count > 1 Then
    If Not Application.CountBlank(Range("A" & Target.Row & ":D" & Target.Row)) > 0 Then
        If MsgBox("Voulez-vous envoyer les données ?", vbYesNo, "demande de confirmation") = vbYes Then
            Call EnvoiConf(Target)
            If MsgBox("Avez-vous fini de remplir votre fichier ?", vbYesNo, "demande de confirmation") = vbYes Then
                Call ParamToConf
            End If
        End If
    End If
End If
End Sub

Oui, il y a la possibilité de le faire ainsi (cependant, ParamToConf n'a pas d'argument donc il ne dépend pas de la Target). A chaque fois que tu vas changer (ou double cliquer si tu choisis cette option), il t'affichera le message. Alors que si tu te mets un bouton auquel tu affectes la macro ParamToConf, tu pourras le faire quand tu sauras que ton job est fini.

Sinon, tu peux faire ainsi :

'DANS MODULE V6

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A:D")) Is Nothing And Not Target.Count > 1 Then
    If Not Application.CountBlank(Range("A" & Target.Row & ":D" & Target.Row)) > 0 Then
        If MsgBox("Voulez-vous envoyer les données ?", vbYesNo, "demande de confirmation") = vbYes Then
            Call EnvoiConf(Target)
        End If
    End If
End If
End Sub

'DANS MODULE V6

Private Sub Worksheet_Deactivate()
If MsgBox("Avez-vous fini de remplir votre fichier ?", vbYesNo, "demande de confirmation") = vbYes Then
    Call ParamToConf
End If
End sub

'DANS MODULE ThisWorkbook

Private Sub Workbook_beforeclose(Cancel As Boolean)
If MsgBox("Voulez-vous reporter les paramètres ?", vbYesNo, "demande de confirmation") = vbYes Then
    Call ParamToConf
End If
Me.save
End sub

La 1ère macro, classique

La 2è, lance l'exécution quand tu quittes la feuilles V6.

La 3è lance l'exécution quand tu fermes le classeur.

Mais bon, selon moi, le bouton ne ferait pas de mal... Et tu peux toujours te mettre une alerte évènementielle qui te rappelle de reporter les paramètres.

Bonjour 3GB,

J'ai appliqué les deux macro et leur événement, cela fonctionne très bien

Si je voulais conditionner ma ligne ci-dessous sur les paramètres suivant (CEN DOP2R + DIJON DOP2R + DEV Dijon + CSH DIJON) si la colonne 4 correspond à l'un de ces critères pour me les mettre dans le env.conf et l'inverse de ces critères remplirait un env.conf avec toutes les lignes ne correspondant pas à ces critères

If (NvL = 1 And .Cells(NvL, 1).Value <> "") Or NvL > 1 Then NvL = NvL + 1

Cdt,

Peut-on lui mettre ça ?

With shEnv 'sur env.conf

NvL = .Cells(Rows.Count, 1).End(xlUp).Row 'NvL = dernière ligne
If Target.Column <> 4 = ("CEN DOP2R or DIJON DOP2R or DEV Dijon or CSH DIJON") Then 'Or Target.Column <> 4 Then

1) tu me redirige toutes les lignes du V6.x plus les lignes ajoutés dans le fichier env.conf si la valeur de la colonne 4 correspond à l'un des critères présidé en haut

2) tu me redirige toutes les lignes du V6.x plus les lignes ajoutés dans le fichier env.conf si la valeur de la colonne est différente au critères précités en haut

Ctd,

Salut spoutnik,

Alors, je n'ai strictement rien compris à ce que tu cherches à faire !

Peux-tu m'expliquer tous les cas différents et les instructions dans chaque cas ?

Cdlt,

Désolé, on m'a encore donné d'autres instructions ! du coup l'objectif a encore changé

Le principe reste le même, quand une ligne est renseignée dans le V6.x elle est systématiquement redirigée dans le env.conf

Si cette ligne renseignée contient dans la colonne 4 l'un des valeurs suivantes (DIJON DOP2R, DEV Dijon, CSH DIJON, CNE DOP2R), toutes les lignes du V6.x (fichier source) contenant les même valeur devront être copiés avec

Si la ligne rensignée ne contient pas les valeurs suivantes (DIJON DOP2R, DEV Dijon, CSH DIJON, CNE DOP2R) on copie avec toutes les lignes différentes aux paramètres cités

J'ai commencé à travaillé sur un code pris d'un forum pour l'adapter à ma situation

(Public Sub CopyRows()
Sheets("V6.x").Select
' Find the last row of data
FinalRow = Cells(Rows.Count, 1).End(xlUp).Row
' Loop through each row
For x = 2 To FinalRow
' Decide if to copy based on column D
ThisValue = Cells(x, 4).Value
If ThisValue = "DIJON DOP2R, DEV Dijon, CSH DIJON, CNE DOP2R" Then
Cells(x, 1).Resize(1, 33).Copy
Sheets("env.conf").Select
NextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
Cells(NextRow, 1).Select
ActiveSheet.Paste
Sheets("V6.x").Select
ElseIf ThisValue = ! "DIJON DOP2R, DEV Dijon, CSH DIJON, CNE DOP2R" Then 'En shell le point d’exclamation veut dire une négation, je ne sais pas si ça éxiste en VBA
Cells(x, 1).Resize(1, 33).Copy
Sheets("env.conf").Select
NextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
Cells(NextRow, 1).Select
ActiveSheet.Paste
Sheets("V6.x").Select
End If
Next x
End Sub

Cdt,

Les balises spoutnikousse, les balises !

Mais du coup, je comprends pas à quoi sert l'évènement double clic maintenant. En fait, on inspecte V6 et on copie soit les valeurs DIJON quand elles sont présentes en colonnes 4 soit absolument toutes les valeurs quand elles sont absentes, non ?

Et soit ton code contient une syntaxe que je n'ai jamais pratiquée, soit il contient des morceaux d'un langage différent.

Edit : Ah oui, c'est en shell, d'accord... Je connais le point d'exclamation mais normalement en VBA, on utilise not

ça serait ça le code pour copier toutes les lignes correspondantes au critères ?

Sub EnvoiConf(Cible As Range)

Dim shV6 As Worksheet, shEnv As Worksheet
Dim Lcible As Long, NvL As Long

Set shV6 = Worksheets("V6.x")
Lcible = Cible.Row 'ligne en cours

If Worksheets(Worksheets.Count).Name = "env.conf" Then 'si env.conf existe
Set shEnv = Sheets("env.conf") 'shEnv = env.conf 'affectation de shEnv
Else
Set shEnv = Sheets.Add(After:=Worksheets(Worksheets.Count)) 'sinon, Creation d'un nouvel onglet
shEnv.Name = "env.conf" 'on le renomme env.conf
End If

With shEnv 'sur env.conf
NvL = .Cells(Rows.Count, 1).End(xlUp).Row 'NvL = dernière ligne
If (NvL = 1 And .Cells(NvL, 1).Value <> "") Or NvL > 1 Then NvL = NvL + 1 'si onglet non vierge, décalage : NvL = nvlle ligne
Value = Cells(x, 4).Value
If ThisValue = "DIJON DOP2R, DEV Dijon, CSH DIJON, CNE DOP2R" Then
Cells(x, 1).Resize(1, 33).Copy
.Cells(NvL, 1).Value = "ENV;"
.Cells(NvL, 2).Value = " ;"
.Cells(NvL, 3).Value = "XDUAS_COMPANY;"
.Cells(NvL, 4).Value = shV6.Cells(Lcible, 2).Value & ";" ' !!! l'opérateur & permet de concaténer des chaines de caractères
.Cells(NvL, 5).Value = "XDUAS_PORT;"
.Cells(NvL, 6).Value = Left(shV6.Cells(Lcible, 3), 5)
Else not ThisValue = "DIJON DOP2R, DEV Dijon, CSH DIJON, CNE DOP2R"
Cells(x, 1).Resize(1, 33).Copy
.Cells(NvL, 1).Value = "ENV;"
.Cells(NvL, 2).Value = " ;"
.Cells(NvL, 3).Value = "XDUAS_COMPANY;"
.Cells(NvL, 4).Value = shV6.Cells(Lcible, 2).Value & ";" ' !!! l'opérateur & permet de concaténer des chaines de caractères
.Cells(NvL, 5).Value = "XDUAS_PORT;"
.Cells(NvL, 6).Value = Left(shV6.Cells(Lcible, 3), 5)
End If
End With

End Sub

Sub EnvoiConf(Cible As Range)
Dim shV6 As Worksheet, shEnv As Worksheet
Dim Lcible As Long, NvL As Long

Set shV6 = Worksheets("V6.x")
Lcible = Cible.Row 'ligne en cours

If Worksheets(Worksheets.Count).Name = "env.conf" Then 'si env.conf existe
Set shEnv = Sheets("env.conf") 'shEnv = env.conf 'affectation de shEnv
Else
Set shEnv = Sheets.Add(After:=Worksheets(Worksheets.Count)) 'sinon, Creation d'un nouvel onglet
shEnv.Name = "env.conf" 'on le renomme env.conf
End If

With shEnv 'sur env.conf
NvL = .Cells(Rows.Count, 1).End(xlUp).Row 'NvL = dernière ligne
If (NvL = 1 And .Cells(NvL, 1).Value <> "") Or NvL > 1 Then NvL = NvL + 1 'si onglet non vierge, décalage : NvL = nvlle ligne
Value = Cells(x, 4).Value
If ThisValue = "DIJON DOP2R, DEV Dijon, CSH DIJON, CNE DOP2R" Then
Cells(x, 1).Resize(1, 33).Copy
.Cells(NvL, 1).Value = "ENV;"
.Cells(NvL, 2).Value = " ;"
.Cells(NvL, 3).Value = "XDUAS_COMPANY;"
.Cells(NvL, 4).Value = shV6.Cells(Lcible, 2).Value & ";" ' !!! l'opérateur & permet de concaténer des chaines de caractères
.Cells(NvL, 5).Value = "XDUAS_PORT;"
.Cells(NvL, 6).Value = Left(shV6.Cells(Lcible, 3), 5)
Else not ThisValue = "DIJON DOP2R, DEV Dijon, CSH DIJON, CNE DOP2R"
Cells(x, 1).Resize(1, 33).Copy
.Cells(NvL, 1).Value = "ENV;"
.Cells(NvL, 2).Value = " ;"
.Cells(NvL, 3).Value = "XDUAS_COMPANY;"
.Cells(NvL, 4).Value = shV6.Cells(Lcible, 2).Value & ";" ' !!! l'opérateur & permet de concaténer des chaines de caractères
.Cells(NvL, 5).Value = "XDUAS_PORT;"
.Cells(NvL, 6).Value = Left(shV6.Cells(Lcible, 3), 5)
End If
End With
End Sub

Au niveau de la syntaxe, ça passera pas.

Ensuite le x est la variable de ta boucle mais la boucle n'apparait plus. Tu copies 33 colonnes mais ne les colles pas.

Mais surtout, les conditions ne sont pas claires. Peux-tu m'expliquer avec des mots et pas du code le problème à résoudre, moi qui ne le connais pas ?

Ça me permettra de voir s'il n'y a pas une meilleure option que le double-clic car le problème n'est plus le même qu'au début.

Et au fait, merci pour les balises

En fait si tu te rappelle, nous avions fait un événement conditionné sur le renseignement de 4 cellule sur la même ligne

Il faut juste rajouter une 2eme condition = "DIJON DOP2R, DEV Dijon, CSH DIJON, CNE DOP2R" à la 4eme colonne du V6.x

Ensuite on copie toutes les lignes en gardant le format suivant :

.Cells(NvL, 1).Value = "ENV;"
.Cells(NvL, 2).Value = " ;"
.Cells(NvL, 3).Value = "XDUAS_COMPANY;"
.Cells(NvL, 4).Value = shV6.Cells(Lcible, 2).Value & ";" ' !!! l'opérateur & permet de concaténer des chaines de caractères
.Cells(NvL, 5).Value = "XDUAS_PORT;"
.Cells(NvL, 6).Value = Left(shV6.Cells(Lcible, 3), 5)

Événement :

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("A:D")) Is Nothing And Not Target.Count > 1 Then

If Not Application.CountBlank(Range("A" & Target.Row & ":D" & Target.Row)) > 0 Then
If MsgBox("Voulez-vous envoyer les données ?", vbYesNo, "demande de confirmation") = vbYes Then
Call EnvoiConf(Target)
If MsgBox("Avez-vous fini de remplir votre fichier ?", vbYesNo, "demande de confirmation") = vbYes Then
Call ParamToConf
End If
End If
End If
End If
End Sub

C'est bien ce que j'avais compris en partie... Mais que cherches-tu à faire ? Un tri ?

Enfin bref, essaie avec ça (mais forcément, ça ne fera pas ce que tu veux) :

With shEnv 'sur env.conf
    NvL = .Cells(Rows.Count, 1).End(xlUp).Row 'NvL = dernière ligne
    If (NvL = 1 And .Cells(NvL, 1).Value <> "") Or NvL > 1 Then NvL = NvL + 1 'si onglet non vierge, décalage : NvL = nvlle ligne
    If instr("DIJON DOP2RDEV DijonCSH DIJONCNE DOP2R", cells(Lcible, 4).value) > 0 Then 'recherche correspondance dans chaine
        shV6.Cells(Lcible, 1).Resize(1, 33).Copy destination:=.cells(NvL,1)
        NvL = Nvl + 1
    end if
        .Cells(NvL, 1).Value = "ENV;"
        .Cells(NvL, 2).Value = " ;"
        .Cells(NvL, 3).Value = "XDUAS_COMPANY;"
        .Cells(NvL, 4).Value = shV6.Cells(Lcible, 2).Value & ";" ' !!! l'opérateur & permet de concaténer des chaines de caractères
        .Cells(NvL, 5).Value = "XDUAS_PORT;"
        .Cells(NvL, 6).Value = Left(shV6.Cells(Lcible, 3), 5)
End With

Cdlt,

Oui un tri, on peut commencer par copier dans le env.conf toutes les lignes avec les critères cités ? pour commencer

Si on voulais prendre toutes lignes du fichier source V6.x avec les critères mentionnés, puis on formate ces lignes pour avoir un résultat similaire

Comment on s'y prendrait ?

ENV; ;XDUAS_COMPANY;TEST;XDUAS_PORT;54699
Rechercher des sujets similaires à "copier onglet tri"