VBA : Offset uniquement par rapport à Cells() ?

Résolu
AnthonyS -  
 AnthonyS -
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

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
    1. AnthonyS
       
      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
      1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320 > AnthonyS
         
        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
    2. AnthonyS
       
      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
    3. AnthonyS
       
      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