Utilisation de VBA pour nommer une zone de nom de cellule dans Excel


2

Je voudrais parcourir les lignes d'une feuille de travail et affecter les zones de nom d'une colonne (la colonne E) à la valeur de cette ligne respective dans une autre colonne (la colonne B).

J'aimerais le faire de cette façon car le principe restera le même pour un addendum qui sera ajouté à ce script pour une maintenance à long terme. Par exemple, si je devais le faire manuellement, j'activerais la cellule "E2" et cliquerais sur la case du nom, puis taper "Coil_Width", qui correspond à la valeur de la cellule "B2". Cela ajoute correctement le nom au gestionnaire de noms et je peux modifier dynamiquement la valeur en tapant quelque chose dans la barre de formule pour cette cellule. J'ai essayé d'attribuer via la propriété eCell.Name = (etc.), mais il semble que cela ne fonctionne pas de la même manière pour les cellules que pour la propriété de plage car j'obtiens une erreur définie par l'application (1003).

En outre, en utilisant la norme

ActiveWorkbook.Names.Add Name:=bCell.Value, RefersTo:= eCell.Address()

ajoute simplement le nom au gestionnaire de noms et définit RefersTo sur "$ E $ 2" ou sur une cellule quelconque (ce qui est correct, je pense), mais la valeur est également définie sur "E2" (et ne peut pas être modifiée même en tapant manuellement un caractère). valeur dans la barre de formule pour cette cellule.En outre, la zone de nom de cette cellule reste toujours "E2".

Voici un exemple de code:

For Each bCell In thisWkSht.Range("B:B").Cells
'For Each bCell In thisWkSht.Range("B:B:) - this is the changed line
If bCell.Value = "" Then
    'Do Nothing
ElseIf bCell.Value = "Variables" Then
    'Do Nothing
    'This allows me to skip the first row without much hassle
Else
    Set eCell = bCell.Offset(0, 3).Cells 
    'Set eCell = bCell.Offset(0, 3) - this is the other changed line
    eCell.Name = bCell.Value ' This line now correctly assigns the value from my
                             ' B row and column to the name of my E row cell

End If
Next

Mes résultats montrent que je peux accéder correctement à la propriété bcell.Value, mais elle se rompt pendant la bCell.Name.Name. Il me semble que je devrais pouvoir faire quelque chose comme eCell.Name = bCell.Value ou quelque chose de similaire, mais je n'ai encore rien reçu d'autre qu'une erreur définie par l'application.

Je m'en tiens actuellement à la méthode des cellules car je ne sais pas comment aborder une sélection de plage changeante dans une instruction For Each; c'est-à-dire que je peux comprendre comment adresser mon bCell à l'ensemble de la plage ("B: B"), mais je ne saurais pas comment configurer mon eCell afin que la plage à laquelle il fait référence soit en réalité la plage du bCell compensée par trois colonnes.

Me manque-t-il quelque chose d'évident à propos de ces propriétés?


Je ne suis pas un expert en VBA, mais j'utilise normalement Range au lieu de cellules pour éviter certains maux de tête. Avez-vous essayé de travailler avec des plages plutôt que des cellules (par exemple: ActiveWorkBooks.Names.Add Name: = Range ("B2"). Value, RefersToR1C1: = Range ("E2"))?
shinjijai

1
Vous pouvez répondre à votre propre question et si vous avez trouvé la solution vous-même, il est en fait conseillé de le faire.
Ce Guy brésilien

Donc, vous dites qu'il y a un moyen de marquer la question comme une réponse? J'ai essayé de regarder en arrière dans la section d'édition, mais je n'ai pas vu de moyen de le signaler comme résolu ou quoi que ce soit. Où est-ce que je cherche à faire ça?
NateDawg

2
Vous avez ajouté la réponse modifiée à la question. Au lieu de cela, sur les sites Stack Exchange, vous devez ajouter la réponse dans un message séparé ci-dessous . Il n'y a absolument rien de mal à répondre à votre propre question, telle que décrite ici . Vous pouvez ensuite (dans un jour ou deux) cliquer sur la coche à côté de cette réponse pour marquer la question résolue.
Daniel Beck

Saisissez votre réponse sur superuser.com/posts/701056/revisions et nettoyez-la. Puis postez-le comme une réponse et acceptez-le.
random

Réponses:


0

Tout ce dont vous avez besoin est de changer cette ligne:

Set eCell = bCell.Offset(0, 3).Cells 

Pour ça:

Set eCell = bCell.Offset(0, 3)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.