Créer une référence de nom de cellule réutilisable dans le code

Bonjour,

Plutôt que de taper plusieurs fois dans le code le nom de ma cellule (ex: "A2"), je souhaiterais l'enregistrer et la réutiliser dans une fonction qui défusionne des cellules. Je me sers plusieurs fois ensuite de cette défusion pour créer une base de données à exporter plus tard en csv. Les données sont issues d'un fichier excel que je dois exploiter en l'état (160 fichiers similaires où je dois extraire des données). Le fait d'enregistrer une référence me permettrait d'avoir un code plus clair et plus facilement modifiable si je me suis trompée de cellule en cours de route (vu le nombre de variables à sortir). J'ai pensé à ceci mais çà ne fonctionne pas :

Public Provisoire As Variant
Public CelluleW As Object

Public Function IndirectVBA(ref_text As String)
'pour pouvoir faire référence à une cellule

IndirectVBA = Range(ref_text)
End Function

Public Sub Defusion(Cellule As Object)

'défusionne la cellule et copie la valeur

If Range(Cellule).MergeCells Then
Provisoire = Range(Cellule).MergeArea.Address
Range(Cellule) = Provisoire.UnMerge
End If
Range(Cellule).Copy
End Sub

Sub testAK11()
'utilisation pour créer la base de données
Sheets("data vers csv").Select
''AK11" est le nom que je veux m'éviter de taper plusieurs fois.

Set CelluleW = IndirectVBA("AK11")
Defusion CelluleW
End Sub

Defusion fonctionnait très bien quand je mettais à la place de Cellule directement "AK11" par exemple.

Par contre, quand je lance la sub de testAK11, j'ai une erreur d'exécution 424. Je me demande si le problème se situe dans l'utilisation de la référence "AK11" et où l'appel à la fonction Indirect dans ma sub. Ensuite, possible qu'en fait que Defusion ne fonctionne pas bien avec le référencement à CelluleW.

Pourriez-vous m'aider ?

Bonjour

Vous avez les champs nommés pour faire cela : Menu Formules/Gestionnaire de noms/Nouveau

Merci Jean-Paul, c'est une possibilité que je ne connaissais pas et qui est très intéressante.

Dans mon cas je ne vois pas bien comment l'utiliser?

En effet, si je l'utilise sur un de mes 160 fichiers excel pour nommer des cellules, çà ne fonctionnera pas sur les 159 autres (puisque je n'aurais pas fait la manip de nommer les cellules sur chacun d'eux pour nommer les cellules) ?

Je ne vois pas aussi comment m'éviter en utilisant cette possibilité de nommer à chaque fois la cellule dans la sub Defusion(). J'ai 53 variables, donc 53 noms à créer dans ce cas. Si j'utilise le gestionnaire de noms, en nommant chacune des variables nom i, nom i+1..., il faudrait que je fasse une recopie des lignes ci-dessous en remplaçant à chaque fois nom i dans 53 modules différents pour permettre la défusion.

'défusionne la cellule et copie la valeur
If Range(nom i).MergeCells Then
Provisoire = Range(nom i).MergeArea.Address
Range(nom i) = Provisoire.UnMerge
End If
Range(nom i).Copy
End Sub

Ce que je souhaiterais c'est avoir une fonction que j'appelle 53 fois mais qui m'évite de taper nom i plusieurs fois (juste une) telle que :

Affection de nom i à Cellule puis

Public Sub Defusion(Cellule As Object)

'défusionne la cellule et copie la valeur

If Range(Cellule).MergeCells Then
Provisoire = Range(Cellule).MergeArea.Address
Range(Cellule) = Provisoire.UnMerge
End If
Range(Cellule).Copy

End Sub

En résumé, iI faudrait que j'arrive à expliquer que Cellule est la cellule qui m'intéresse (53 cellules différentes localisées au même endroit dans 160 fichiers) en une seule fois pour appeler directement Defusion () sans retaper les lignes de code ci-dessus.

bonjour Rozé, Jean-Paul,

tout se passe dans un fichier ou cette référence se trouve dans un autre fichier que "ThisWorkbook" ?

Pouvez-vous joindre un fichier anonymisé ?

Bonjour Bart,

Tout se passe dans un fichier. En effet, je travaille sur des fichiers de collecte de données identiques : tous les fichiers auront les mêmes cellules de référence. Exemple F24 sera toujours ma cellule de résultats res.stab.f quelque soit le fichier excel.

Je regarde pour ajouter/joindre un fichier anonymisé dans le prochain envoi aujourd'hui.

et voilà le fichier

Bonjour Rozé , à tous ,

Public Sub Defusion(Cellule As Object)
'défusionne la cellule et copie la valeur
   If Range(Cellule).MergeCells Then
      Provisoire = Range(Cellule).MergeArea.Address
      Range(Cellule) = Provisoire.UnMerge
   End If
   Range(Cellule).Copy
End Sub

Et ce code fonctionne ?!? Quel est le type précis de l'argument Cellule quand vous utilisez la procédure Defusion(...) ?

N'y aurait-il pas un peu de chatGPT ou autre AI dans ce code ?

Bonjour,

Si vous ouvrez plusieurs classeurs depuis un classeur cible pour y récupérer des données, vous avez la possibilité de définir les champs nommés à l'ouverture.

Un exemple ci-dessous :

Public Sub ReadDatas()
    On Error GoTo Catch
    ' // Ici on détermine le nom des classeur
    ' // Il est aussi possible de lire les classeurs d'un répertoire par exemple
    Dim WorkbooksNames As Variant
    WorkbooksNames = VBA.Array("Classeur1.xlsx", "Classeur2.xlsx", "Classeur3.xlsx")

    Dim WorkbookCible As Excel.Workbook
    Set WorkbookCible = ThisWorkbook

    Dim item As String
    For Each item In WorkbooksNames
        ' // Il est possible de définir un autre répertoire que le répertoire du classeur cible
        Dim WorkbookSource As Excel.Workbook
        Set WorkbookSource = Excel.Workbooks.Open(ThisWorkbook.Path & "\" & item)
        If Not WorkbookSource Is Nothing Then
            With WorkbookSource
                .Names.Add Name:="PremierNom", RefersTo:="=Feuil1!$A$5"
                .Names.Add Name:="SecondNom", RefersTo:="=Feuil1!$G$12"
                ' Ici fonction de récupération de données
            End With
        End If
        Set WorkbookSource = Nothing
    Next item

Catch:
    If Err.Number > 0 Then
        ' // Make something
    End If
End Sub

ps. Bien vu le fichier joint, mais il n'est dit nulle part, ce qu'il doit être fait comme importation.

Réponse à "MaFraise" :


Ce code :

Public Sub Defusion(Cellule As Object)
'défusionne la cellule et copie la valeur
If Range(Cellule).MergeCells Then
Provisoire = Range(Cellule).MergeArea.Address
Range(Cellule) = Provisoire.UnMerge
End If
Range(Cellule).Copy
End Sub

fonctionne si à la place de Cellule je mets "A2" par exemple. Sinon çà ne fonctionne pas, c'est bien mon souci... j'aimerais pouvoir utiliser la fonction en faisant du Defusion("A2") ou Defusion("C6") etc.

et non je n'ai pas utilisé ChapGPT ou autre

Réponse à Jean-Paul :

Effectivement, je n'ai pas encore travaillé le sujet importation de données depuis plusieurs fichiers. Du coup, merci pour la proposition de code pour lire les classeurs du répertoire , je vais tester çà lorsque j'aurais résolu mon problème de Defusion, j'espère bientôt !

Je ne vois pas ce que tu veux faire avec la procédure Difusion, quand tu as des cellules fusionnées c'est la première qui est prise en compte par VBA.

000482

Donc la procédure doit faire quoi ?

La procédure doit copier ce qu'il y a dans la cellule fusionnée pour le recopier dans une cellule non fusionnée

Ok,

Si tu connais les cellules qui contiennent les valeurs à copier, pas de problème un simple : Feuille1.Range("A1").Value = Feuille2.Range("A2").Value fera l'affaire.

000483

Si l'on regarde la photo ci-dessus, on voit que l'on peut savoir quel est la première cellule d'une plage fusionnée. On peut se servir de cela pour créer une fonction.

euh çà défusionne pas çà, non ?

La demande est de copier une cellule fusionnée vers une cellule non fusionnée. Pour cela nul besoin de défaire la fusion.

Bonjour Jean-Paul, SI je ne défusionne pas, çà colle une cellule fusionnée et çà efface de fait les données de la cellule d'à côté.

Bonjour

Rozé à écrit :

euh çà défusionne pas çà, non ?

Considérons l'instruction : Feuille1.Range("A1").Value = Feuille2.Range("A2").Value

Cette instruction ne fait pas une copie de ou des cellules. Cette instruction lit la valeur de la cellule Feuille2.Range("A2")

puis l'affecte à la valeur de la cellule Feuille1.Range("A1")

Ce n'est pas une copie entre cellules. On agit directement sur la propriété (value) des deux objets que sont Feuille2.Range("A2") et Feuille1.Range("A1"). On ne défusionne pas car ce n'est pas utile.

On prend la valeur d'une cellule (A2) et on affecte cette valeur à une autre cellule (A1). Attention ceci ne fonctionne que si A2 est la première cellule de la plage fusionnée de départ sans quoi les autres cellules de la plage fusionnée sont vides.

ok compris, merci ! Je vais tester çà.

çà fonctionne ! Merci Jean-Paul et mafraise :-)

Rechercher des sujets similaires à "creer reference nom reutilisable code"