IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Erreur 1004 liée à une commande Set


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Points : 29
    Points
    29
    Par défaut Erreur 1004 liée à une commande Set
    Bonjour,

    Je suis confrontée à une erreur de type 1004 et je n'ai pas la moindre idée de ce qui la provoque (apprentissage de VBA sur le tas...).
    J'ai créé une macro pour substituer des caractères dans des cellules :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    Dim i As Integer, j As Integer, k As Integer, nbreLignes As Long
        Dim Feuillet(1 To 1) As String, Caract(1 To 16) As String, Subst(1 To 16) As String
        Dim c As Range
        Dim ColNom, ColPrenom As Integer
        Dim Nom As String
     
        Nom = InputBox("Quel est le nom du feuillet contenant les caractères à modifier ?", vbQuestion, "")
        ColNom = InputBox("Quel est le numéro de la colonne contenant le nom ? (1 pour A, 2 pour B...)", vbQuestion, "")
        ColPrenom = InputBox("Quel est le numéro de la colonne contenant le prenom ? (1 pour A, 2 pour B...)", vbQuestion, "")
     
        Caract(1) = "é"
        ...
        Subst(1) = "e"
        ...
     
        Sheets(Feuillet(1)).Activate
        Sheets(Feuillet(1)).Range("A1").Select
        nbreLignes = Range(ActiveCell, ActiveCell.End(xlDown)).Count
     
            For k = 1 To 16
                For i = 1 To nbreLignes
                    Set c = Sheets(Feuillet(1)).Cells(i, ColNom).Find(Caract(k))
                    If Not c Is Nothing Then
                        Sheets(Feuillet(1)).Cells(i, ColNom).Value = Replace(Sheets(Feuillet(1)).Cells(i, ColNom).Value, Caract(k), Subst(k))
                    End If
                    Set c = Sheets(Feuillet(1)).Cells(i, ColPrenom).Find(Caract(k))
                    If Not c Is Nothing Then
                        Sheets(Feuillet(1)).Cells(i, ColPrenom).Value = Replace(Sheets(Feuillet(1)).Cells(i, ColPrenom).Value, Caract(k), Subst(k))
                    End If
                Next i
            Next k
    La macro plante au moment de l'affectation "Set c".
    Quelqu'un pourait-il m'éclairer sur le problème ?

    Merci d'avance
    Christelle

  2. #2
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut ERREUR
    Bonjour Chrisbdx, Bonjour le Forum,

    Pour mieux repérer l'origine de l'erreur, imprime dans la fenêtre Exécution toutes les composantes de la ligne en erreur.
    k, Caract(k), etc..

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    D'une je ne comprends pas ce qui suit, et de deux je ne vois pas où tu le renseignes!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Feuillet(1 To 1) As String

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 637
    Points
    28 637
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Il n'est pas utile de faire une boucle pour remplacer des caractères.
    La méthode Replace de l'objet Range est suffisante
    Exemple d'un remplacement de é par e dans colonne 2 de la plage de données commencant en cellule A1 de la feuille nommée db
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With ThisWorkbook.Worksheets("db").Range("A1").CurrentRegion
    .Columns(2).Replace "é", "e"
    End With
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Points : 29
    Points
    29
    Par défaut
    Bonjour,

    @rudupt

    Je n'avais pas collé entièrement mon code, j'ai effectivement une instruction pour affecter le nom dans mon code initial. Sinon, le code est prévu pour pouvoir passer d'un feuillet à un autre, mais limité ici à un feuillet en phase de test.

    @MarcelG

    À l'éxécution, la fenêtre reste vide...

    @Philippe Tulliez,

    Votre remarque me permet de voir comment je peux mieux utiliser la méthode "Replace". Néanmoins, et j'aurais dû dès le début mettre mon code en entier, cette macro n'a pas seulement pour objectif de remplacer des caractères (c'ets la 1re étape), elle a pour but de créer une clé d'identification en concaténant 3 variables, dont Nom et Prenom. C'est pourquoi, je souhaite gommer les problèmes d'écriture en substituant toute une liste de caractères. J'avoue que je ne suis pas très au fait des commandes qui permettent de sélectionner des plages complètes. Naturellement, je reviens toujours à des boucles pour me déplacer ligne par ligne. Du fait de mes connaissances limitées, c'est plus sûr. Du coup, puis-je "mixer" toutes ces méthodes pour obtenir uen concaténation à la fin ?

    Voici mon code complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    Option Explicit
     
    Sub CaracteresAccentuesEtSpeciaux()
        Dim i As Integer, j As Integer, k As Integer, nbreLignes As Long
        Dim Feuillet(1 To 1) As String, Caract(1 To 16) As String, Subst(1 To 16) As String
        Dim c As Range
        Dim ColNom, ColPrenom As Integer
        Dim Nom As String
     
        Nom = InputBox("Quel est le nom du feuillet contenant les caractères à modifier ?", vbQuestion, "")
        ColNom = InputBox("Quel est le numéro de la colonne contenant le nom ? (1 pour A, 2 pour B...)", vbQuestion, "")
        ColPrenom = InputBox("Quel est le numéro de la colonne contenant le prenom ? (1 pour A, 2 pour B...)", vbQuestion, "")
     
        Feuillet(1) = Nom
     
        Caract(1) = "é"
        Caract(2) = "è"
        Caract(3) = "ë"
        Caract(4) = "ê"
        Caract(5) = "ï"
        Caract(6) = "î"
        Caract(7) = "ö"
        Caract(8) = "ô"
        Caract(9) = "ü"
        Caract(10) = "û"
        Caract(11) = "ç"
        Caract(12) = "'"
        Caract(13) = "-"
        Caract(14) = ";"
        Caract(15) = ","
        Caract(16) = " "
     
     
        Subst(1) = "e"
        Subst(2) = "e"
        Subst(3) = "e"
        Subst(4) = "e"
        Subst(5) = "i"
        Subst(6) = "i"
        Subst(7) = "o"
        Subst(8) = "o"
        Subst(9) = "u"
        Subst(10) = "u"
        Subst(11) = "c"
        Subst(12) = ""
        Subst(13) = ""
        Subst(14) = ""
        Subst(15) = ""
        Subst(16) = ""
     
        Sheets(Feuillet(1)).Activate
        Sheets(Feuillet(1)).Range("A1").Select
        nbreLignes = Range(ActiveCell, ActiveCell.End(xlDown)).Count
     
            For k = 1 To 16
                For i = 1 To nbreLignes
                    Set c = Sheets(Feuillet(1)).Cells(i, ColNom).Find(Caract(k))
                    If Not c Is Nothing Then
                        Sheets(Feuillet(1)).Cells(i, ColNom).Value = Replace(Sheets(Feuillet(1)).Cells(i, ColNom).Value, Caract(k), Subst(k))
                    End If
                    Set c = Sheets(Feuillet(1)).Cells(i, ColPrenom).Find(Caract(k))
                    If Not c Is Nothing Then
                        Sheets(Feuillet(1)).Cells(i, ColPrenom).Value = Replace(Sheets(Feuillet(1)).Cells(i, ColPrenom).Value, Caract(k), Subst(k))
                    End If
                Next i
            Next k
                Sheets(Feuillet(1)).Columns("G:G").Select
                Selection.EntireColumn.Insert
                For i = 2 To nbreLignes
                    Sheets(Feuillet(1)).Cells(i, 7).Value = LCase(Sheets(Feuillet(1)).Cells(i, 4)) & LCase(Sheets(Feuillet(1)).Cells(i, 5)) & Sheets(Feuillet(1)).Cells(i, 6)
                Next i
     
    End Sub

  6. #6
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Bonjour à vous, Bonjour au Forum,

    J'ai l'impresion que tu ne sais pas de quoi je parle.
    Ce qui est légitime.
    Au demeurant, recherche le mot clé "Fenêtre Exécution" (son affichage, son usage...).
    Et reviens si nécessaire.

    Si je peux me permettre, le message de Philippe (salut à lui), est que la simplification du code est toujours à privilégier.
    Comme dirait Pierre, penser Excel avant de coder VBA.
    Autrement dit, utilise la fonction SommeProd dans ta feuille de travail, et ne code en VBA que les actions utiles qui ne peuvent outrepasser une procédure.

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 637
    Points
    28 637
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pour renchérir sur l'intervention de Marcel que je salue, il est important pour une programmeur même amateur de bien connaître les outils et l'environnement qu'il utilise;
    Je te conseille donc la lecture de ce deux tutoriels
    Le débogage sous Visual Basic 6 (1ère partie)
    Vos premiers pas dans l'éditeur de macros Excel
    C'est essentiel

    @MarcelG
    À l'éxécution, la fenêtre reste vide...
    Voir donc le chapitre II-3. Les outils dédiés au débogage
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Sub test()
    Dim Caract()
    Dim Subst()
    Caract = Array("", "é", "è", "ë", "ê", "ï", "î", "ö", "ô", "ü", "û", "ç", "'", "-", ";", ",", " ")
    Subst = Array("", "e", "e", "e", "e", "i", "i", "o", "o", "u", "u", "c", "", "", "", "", "")
    For i = 1 To 16
    ReplacChar Sheets("Feuil1").Columns(1), Caract(i), Subst(i)
    ReplacChar Sheets("Feuil1").Columns(1), UCase(Caract(i)), UCase(Subst(i))
    Next
    End Sub
     
    Sub ReplacChar(Plage As Range, Quoi, Par)
        Plage.Replace What:=Quoi, Replacement:=Par, LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
            ReplaceFormat:=False
    End Sub

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Points : 29
    Points
    29
    Par défaut
    Merci à tous pour vos contributions.

    @MarcelG & Philippe Thulliez
    Effectivement, je m'étais limitée à afficher la fenêtre Exécution. Je pensais que si problème il y avait, un message d'erreur s'afficherait dans cette fenêtre. Mais je ne vois pas comment l'utiliser ici. Le code est syntaxiquement correct (Compilation OK), les variables bien affectées (fenêtre var locales). J'avais aussi fait des tests avec des MsgBox. Malgré la lecture du document (rapide j'avoue), je n'arrive pas à obtenir plus d'éclaircissements sur l'origine de cette erreur.
    PS : Je ne vois pas le lien avec la fonction SommeProd qui pour moi effectue du calcul matriciel. Est-ce juste un exemple ?

    @rdurupt : Merci pour le code qui fonctionne parfaitement. Cela clôt mon problème. Mais j'aurais bien aimé quand même comprendre pourquoi le mien ne fonctionne pas, comprendre ce qui bloque cette affectation "Set"

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Points : 29
    Points
    29
    Par défaut
    En fait, je viens juste de trouver pourquoi cela ne fonctionnait pas...Le typage d'une variable n'était syntaxiquement pas correct et j'étais passée complètement à côté.

  11. #11
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 637
    Points
    28 637
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Le typage d'une variable n'était syntaxiquement pas correct et j'étais passée complètement à côté.
    Si la syntaxe n'est pas bonne, le VBA doit envoyer un message d'erreur, sauf si on utilise un On error GoTo.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. erreur 1004 sur une méthode select
    Par lollo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2008, 19h21
  2. Réponses: 1
    Dernier message: 17/07/2008, 22h07
  3. Réponses: 16
    Dernier message: 13/03/2008, 21h51
  4. Erreur 1004 sur une boucle simple
    Par ruzakruzak dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 06/07/2007, 09h00
  5. [VB-E] Erreur 1004 dans une boucle For
    Par lycaon dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 02/11/2006, 22h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo