VBA : Offset uniquement par rapport à Cells() ?

Résolu/Fermé
AnthonyS - Modifié par AnthonyS le 14/07/2016 à 11:52
 AnthonyS - 18 juil. 2016 à 08:06
Bonjour,

J'ai une petite question qui peut-être assez facile mais à laquelle je n'arrive à répondre et je n'ai pas trouvé de cas similaire sur le net.

Il s'agit d'un soucis de VBA.
J'ai réussi à créer ma macro quasiment complète, cependant, je n'arrive pas à la finaliser à cause d'un petit soucis.

Voici le code :

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Application.ScreenUpdating = False

Dim expert As String
Dim nbexpert As Integer

If Not Application.Intersect(Target, Range("B6:NC36")) Is Nothing Then

nbbexpert = Cells(77, 1)

For nbexpert = 1 To nbbexpert

jouractu = ActiveCell.Column

jour = Cells(nbexpert + 6, jouractu)

If jour = "A" Then

jour.Offset(0, 368 - jouractu).Select 'Ces deux lignes la sont la cause de mes soucis
Visa = Selection.Value 'Ces deux lignes la sont la cause de mes soucis
MsgBox (Visa & " est absent.")

End If

Next

End If

End Sub


Je suis novice en VBA, et c'est probablement très mal écris mais la n'est pas la question.

Quand dans la 1ère des deux lignes, j'écris le développement de jour Cells(nbexpert+6,jouractu.Offset) ça passe, mais si j'écris jour.Offset ça n'accepte pas.

Deuxièmement, je pense qu'à cause de la sélection, s'il y a plusieurs "A" dans les colonnes, ça ne prends plus en compte les autres, uniquement le 1er. (Donc la solution serait plutôt de savoir comment récupérer la valeur de la cellule au bout du tableau sans faire de select) (J'ai essayé une V/HLookup mais j'ai pas réussi...)

Avez-vous une solution pour ce soucis la ?

Je vous remercie d'avance.

Cordialement,
Anthony

1 réponse

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
14 juil. 2016 à 12:24
Bonjour

Jour est ici une données String : tu ne peux faire un Offset que sur un range
De toutes façons en VBA, evite au maximum les Select-selection!

plusieurs solution par exemple

Dim jour as range
Set jour=Cells(nbexpert + 6, jouractu)
If jour.value ="A" then: Visa=jour.offset(0, 368 - jouractu)



0
Bonjour,

C'est magnifique tout fonctionne !

Du coup j'ai une autre question si j'ose. En fait, maintenant, comme tu peux t'en douter, tout se fait sur X MsgBox. Penses-tu qu'il y aurait un moyen (simple) de les faires s'afficher à la suite sur une même MsgBox ?

J'ai pensé à copier les sélections dans une zone tampon puis de reprendre cette zone tampon pour la MsgBox puis ensuite de vider son contenu pour que cela se fasse à chaque fois mais il y a probablement une méthode plus simple...

Ne te tracasse surtout pas trop pour cela.

ça fonctionne et c'est le principal pour moi ! :)

Excellente journée !

P.S. j'attends ta réponse avant d'afficher mon problème comme résolu mais du coup si tu ne trouve pas, tu peux l'afficher comme résolu si tu en as la possibilité. Sinon j'attends lundi pour l'afficher comme résolu sans aucunes réponses d'ici la. :)

Merci encore et bonne journée
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310 > AnthonyS
14 juil. 2016 à 13:55
Tu crées une vaiable type string

dim zaza as string
dans la boucle
zaza= zaza & " " & visa

et aorès sortie de boucle
msgbox zaza & " sont absents."
0
En dédicace j'ai laissé "Zaza" comme nom de variable ! :p

Je te remercie encore et encore ! :)

Du coup je te re-dérange pour te demander (et je pense que ce sera la dernière fois que je vais t'embêter) si tu aurais une autre solution magique pour définir si y a eu qu'un seul "A" dans la colonne ou pas ?

A savoir que de nouveau je peux me compliquer la vie mais que si tu as un code "simple" ce serait avec plaisir :)

Je te remercie encore et te souhaite une merveilleuse fin de journée ! :)
0
Si jamais, j'ai essayé et avec l'aide d'une connaissance j'ai réussi.

Voici le code si cela peut intéresser quelqu'un :)

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Application.ScreenUpdating = False

Dim expert As String
Dim nbexpert As Integer
Dim tablstutil() As String
Dim cptinterne As Integer

If Not Application.Intersect(Target, Range("B6:NC36")) Is Nothing Then

nbbexpert = Cells(77, 1)
ReDim tablstutil(1)
For nbexpert = 1 To nbbexpert

jouractu = ActiveCell.Column

Dim jour As Range
Set jour = Cells(nbexpert + 6, jouractu)

If jour.Value = "A" Then
cptinterne = cptinterne + 1
visa = jour.Offset(0, 368 - jouractu)
ReDim Preserve tablstutil(cptinterne)
tablstutil(cptinterne) = visa

End If


Next

Dim strresultat As String
Dim element As Integer
For element = 1 To cptinterne
strresultat = strresultat & vbCrLf & tablstutil(element)
Next
Select Case cptinterne
Case 0
MsgBox "Tout le monde est présent"
Case 1
MsgBox "Est absent :" & strresultat
Case Else
MsgBox "Sont absent :" & strresultat


End Select

End If

End Sub
0