Set ou pas set ?

peper_eliot

XLDnaute Junior
Bonsoir à tous,
Je pensai (bêtement... lol) que ce serai simple de remettre les mains dans le VB après de nombreuses années. Eh ben non! Heureusement, XLD est toujours là :)
D'avance merci pour vos commentaires

Voilà le résumé du problème :
J'ai 4 misérables petites variables (V1 à V4) qui doivent me permettre de mettre a jour une encore plus misérable base.
J'ai commencé bien humblement en mettant tout sur une seule feuille.

Var1 - V2 - V3 - V4
NOM1 - 1 - 5 - Option1
NOM2 - 1 - 5 - Option2

En colonne R, une liste de 1 à 20. L'objectif est, pour moi, d'"essayer" de mettre la Var1 en colonne Q via Offset (0,-1) si Option1 ou en colonne P (0,-2) si Option2

Et le code qui va avec :
Sub test1()
Dim V1, V4 As String
Dim inc, V2, V3 As Long
Dim base
Dim cell

V1 = Range("A2").Value 'Nom
V2 = Range("B2").Value 'N°Départ X
V3 = Range("C2").Value 'N°Fin Y
V4 = Range("D2").Value 'Info
'SET est obligatoire pour faire de 'base' un objet, sinon OBJET REQUIS
'la base est juste une série continue de 1 à 20
Set base = Sheets(1).Range("R2:R" & Range("R65536").End(xlUp).Row)
With base
Set cell = .Find(V2)
MsgBox (cell.Address)
End With​


La ou ça m'interpelle, c'est qu'en mettant SET, ça me met en route une floppée de variables locales
Sans compter la nouvelle floppée de variables locales sur 'cell' mise en 'SET':)

Alors que, si je ne met pas SET, ma ligne:
base = ...
retourne simplement 20 variables locales correspondant à mes 20 numéros

base = Sheets(1).Range("R2:R" & Range("R65536").End(xlUp).Row)
For Each cell In base
MsgBox (cell)
Next​

Sauf que là, je ne peux plus connaitre l'adresse de ma cell... :(
C'est bien embetant pour pouvoir faire mon Offset :( :(

Suis-obligé de passer par SET ?

N'hésitez pas également à me rediriger vers des posts succeptibles de m'aider.
j'ai visité, entre autre
http://www.excel-downloads.com/forum/522602-post1.html
http://www.excel-downloads.com/forum/93049-fonction-find.html
http://www.excel-downloads.com/forum/39413-adresse-cellule.html
D'avance merci pour votre éclairage.
peper_eliot

RESOLU - Nouveau classeur joint dans post plus bas
Merci à tous

:)
 
Dernière édition:

fanfan38

XLDnaute Barbatruc
Re : Set ou pas set ?

Bonjour,
Pris dans l'aide de VBA...

Dim X As New Worksheet

Si le mot clé New n'est pas utilisé pour déclarer une variable objet, la variable qui fait référence à l'objet ne peut être utilisée avant d'avoir été associée à un objet existant par le biais de l'instruction Set. Jusqu'à ce qu'elle soit attribuée à un objet, la variable objet déclarée a la valeur spéciale Nothing, qui indique qu'elle ne fait référence à aucune instance spécifique d'un objet.

Donc dans ton cas:
dim base as new string...

A+ François
 

Pierrot93

XLDnaute Barbatruc
Re : Set ou pas set ?

Bonjour Peper_eliot, François

essaye en modifiant le début comme suit, attention tout de même avec la methode "find", sans arguments explicite, les derniers utilisés seront pris par défaut.
Code:
Sub test()
Dim V1 As String, V4 As String
Dim inc As Long, V2 As Long, V3 As Long
Dim base As Range, cell As Range

V1 = Range("A2").Value 'Nom
V2 = Range("B2").Value 'N°Départ X
V3 = Range("C2").Value 'N°Fin Y
V4 = Range("D2").Value 'Info

Set base = Sheets(1).Range("R2:R" & Range("R65536").End(xlUp).Row)
For Each cell In base
MsgBox (cell.Address)
Next

With base
Set cell = .Find(V2)
MsgBox (cell.Address)
End With

bonne journée
@+
 

Gorfael

XLDnaute Barbatruc
Re : Set ou pas set ?

Salut
Déclarations :
Dim base
Dim cell

Base et cell sont déclarés en Variant : ils peuvent prendre n'importe quel type de variables

Set base = Sheets(1).Range("R2:R" & Range("R65536").End(xlUp).Row)


Défini base comme un objet à cause de SET. Faisant référence à un objet ce classe Range, la définition est équivalente Dim base as Range

base = Sheets(1).Range("R2:R" & Range("R65536").End(xlUp).Row)
Comme ça ne fait pas référence à un objet, Excel déclare le type de variable le plus approprié : Une variable ayant plus de 2 valeurs soit un tableau tes variables seront base(1), base(2), base(3), etc...

Le fait de ne pas préciser le type impose à Excel de prendre une décision. N'étant pas un génie, il va prendre la première qui puisse correspondre. Et il se fout complêtement de ce que tu cherche à faire.

Moralité : déclarer ses variables évite de se court-circuiter les neurones et de perdre du temps sur des recherches en dehors du problème qui a suscité le besoin de faire une macro :D

A+
 

peper_eliot

XLDnaute Junior
Re : Set ou pas set ?

Bonjour à tous et tout d'abord merci pour vos éclairages.
Je viens juste d'en prendre connaissance et vous promet d'y répondre
Merci Gorfael pour la piqure de rappel :
Moralité : déclarer ses variables évite de se court-circuiter les neurones et de perdre du temps sur des recherches en dehors du problème qui a suscité le besoin de faire une macro :D

Je m'y remet dès ce soir et vais compléter en faisant des tests avec
Dim base as New string
Dim base as Range
 

Gorfael

XLDnaute Barbatruc
Re : Set ou pas set ?

Salut peper_eliot
Dim base as New string
Dim base as Range[
Je n'utilise jamais New, je préfère utiliser les méthodes .Add, mais je ne pense pas que ce soit adéquat dans tous les cas pour déclarer un variable en string (ou en petite culotte).
De plus, dans une même macro, tu ne peux déclarer qu'une seule variable d'un même nom

Suivant l'exemple donné, moi j'utiliserai :
Code:
 Dim Base as Range
Dim Cell as Range
....
with Sheets(1)
set base = .range(.[R1], .[R65536].end(xlup))
end with
for each cell in Base
.....
 

peper_eliot

XLDnaute Junior
Re : Set ou pas set ?

Bonsoir à tous
Et grand merci à Pierrot93, Gorfael et fanfan38 pour votre aide.
La leçon est retenue : si l'on veut manipuler des objets, il faut les référencer avec SET et les déclarer en Dim objet as Range.

Merci également au post rechercher-mot-exact pour m'avoir permis de m'en sortir avec l'argument Lookat de .Find (je m'obstinais avec XlLookat)

Malgrè l'utilisation d'un horrible GOTO 10 :eek: le petit projet est opérationnel. Le résultat est en PJ

Son objectif ?
Assigner rapidement au 1700 copies des candidats au concours d'entrée d'un établissement le nom des correcteurs (70 correcteurs en double correction).
Ensuite, on calcule la moyenne des notes de chaque correcteur. Comme ça, il est possible d'appliquer un coef de pondération sur les copies qui sont tombées entre les mains d'un correcteur à la "main lourde" ou "trop légère".
Mais tout le reste, ça passe par des formules classiques dans la feuille (NB.SI, SOMME.SI...)
 

Pièces jointes

  • Test.xls
    38 KB · Affichages: 39
  • Test.xls
    38 KB · Affichages: 39
  • Test.xls
    38 KB · Affichages: 40

Discussions similaires

Réponses
1
Affichages
164
Réponses
0
Affichages
148
Réponses
12
Affichages
246

Statistiques des forums

Discussions
312 195
Messages
2 086 078
Membres
103 111
dernier inscrit
Eric68350