VBA Syntaxe

Bonsoir à tous,

Ce code fonctionne mais n'est vraiment pas esthétique,

on doit pouvoir éviter tous ces "On Error" et ces "Goto"

Je n'y parviens pas !

Sub Test3()
'--- Fonction EQUIV "L11" et "L12" soit en colonne "A" ou "A+1" ---
Dim Lg%, A%
    A = 2 'N° colonne
On Error GoTo Ou
    Lg = Application.Match(Range("L11"), Columns(A), 0)
        Cells(11, 14) = Cells(Lg, A + 1)
On Error GoTo 0
GoTo Suite
Ou:
    Lg = Application.Match(Range("L11"), Columns(A + 1), 0)
        Cells(11, 14) = Cells(Lg, A)
Suite:
On Error GoTo 0
'-------------------
On Error GoTo Ou2
    Lg = Application.Match(Range("L12"), Columns(A), 0)
        Cells(12, 14) = Cells(Lg, A + 1)
On Error GoTo 0
GoTo Fin2
Ou2:
    Lg = Application.Match(Range("L12"), Columns(A + 1), 0)
        Cells(12, 14) = Cells(Lg, A)
On Error GoTo 0
Fin2:
End Sub

merci de m'éclairer

Amicalement

Claude

27question1.zip (12.79 Ko)

Bonsoir,

dans la première partie du code juste avant "saisie", essaie comme ceci :

Sub Test3()
Dim Lg As Integer, A As Integer
A = 2 'N° colonne
On Error Resume Next
Lg = Application.Match(Range("L11"), Columns(A), 0)
If Lg <> 0 Then
Cells(11, 14) = Cells(Lg, A + 1)
Else: Lg = Application.Match(Range("L11"), Columns(A + 1), 0): Cells(11, 14) = Cells(Lg, A)
End If
End Sub

Amicalement

Bonsoir Claude,Dan

avec la méthode find

Sub Test3()
Dim c, Lig%
With Worksheets(1).Range("B:C")
    For Lig = 11 To 12
        Set c = .Find(Range("L" & Lig), LookIn:=xlValues, LookAt:=xlWhole)
        If Not c Is Nothing Then
            If Range(c.Address).Column = 2 Then
                Range("N" & Lig) = c.Offset(0, 1).Value
            ElseIf Range(c.Address).Column = 3 Then
                Range("N" & Lig) = c.Offset(0, -1).Value
            End If
        End If
    Next
End With
End Sub

re,

Dan,

çà fait déjà + sérieux et + clair

Sub Test3()
'--- Fonction EQUIV "L11" et "L12" soit en colonne "A" ou "A+1" ---
Dim Lg%, A%
    A = 2 'N° colonne
    '----- pour L11 -----
    On Error Resume Next
    Lg = Application.Match(Range("L11"), Columns(A), 0)
    If Lg <> 0 Then
        Cells(11, 14) = Cells(Lg, A + 1)
        Else: Lg = Application.Match(Range("L11"), Columns(A + 1), 0)
        Cells(11, 14) = Cells(Lg, A)
    End If
    Lg = 0
    '----- pour L12 -----
    Lg = Application.Match(Range("L12"), Columns(A), 0)
    If Lg <> 0 Then
        Cells(12, 14) = Cells(Lg, A + 1)
        Else: Lg = Application.Match(Range("L12"), Columns(A + 1), 0)
        Cells(12, 14) = Cells(Lg, A)
    End If
End Sub

Bob,

Je regarde pour adapter ton code qui me plait bien,

dans mon projet, les 2 colonnes sont en fait 5*2 colonnes (variables)

merci à vous deux

Amicalement

Claude

21question2.zip (15.22 Ko)

Bonsoir, Claude

Sur tes 5*2 colonnes, essaie ainsi :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim FirstAddress As String
Dim C As Range
If Target.Count > 1 Then Exit Sub
If Not Application.Intersect(Target, Range("L11:L12")) Is Nothing Then
    Application.EnableEvents = False
    Target.Offset(, 2).Resize(1, 5).ClearContents
    With Sheets("Feuil1").Rows("1:9")
        Set C = .Find(Target, LookAt:=xlWhole, SearchOrder:=xlByColumns)
            If Not C Is Nothing Then
                    FirstAddress = C.Address
                    Do
                        Cells(Target.Row, 256).End(xlToLeft).Offset(, 1) = IIf(C.Offset(, 1) = "", C.Offset(, -1), C.Offset(, 1))
                        Set C = .FindNext(C)
                    Loop While Not C Is Nothing And C.Address <> FirstAddress
            End If
    End With
End If
Application.EnableEvents = True
End Sub

Le fichier :

16question2-v1.zip (9.97 Ko)

Bonne soirée

Bonjour à tous,

merci cousinhub,

Ce n'est pas vraiment ce que je cherche, mais ton code pourra servir

quand j'aurais compris comment çà marche.

En fait, je voudrai faire fonctionner le code de Bob, mais avec les colonnes "valeur" en feuille "Temp"

Je ne pige pas le With Worksheets(1) et çà plante quand je mets With Sheets("Temp")

Sub Test4() 'Solution Bob
Dim c, Lig%, A%
    A = Range("L7") * 3 - 1

With Worksheets(1).Range(Columns(A), Columns(A + 1))
    For Lig = 11 To 12
        Set c = .Find(Range("L" & Lig), LookIn:=xlValues) ', LookAt:=xlWhole)
        If Not c Is Nothing Then
            If Range(c.Address).Column = A Then
                Range("N" & Lig) = c.Offset(0, 1) '.Value
            ElseIf Range(c.Address).Column = A + 1 Then
                Range("N" & Lig) = c.Offset(0, -1) '.Value
            End If
        End If
    Next
End With
End Sub

Sinon j'en reste à la solution de Dan, qui elle je comprend et fonctionne.

Voir nouveau fichier

Bonne journée

Claude

17question3.zip (15.79 Ko)

Re-, Claude...

Lorsque tu fais référence à une feuille, du style "With Sheets("Temp").....", il faut précéder toutes les plages et/ou cellules par un point.... ( . )

du style :

...
With Worksheets("Temp")
    With .Range(.Columns(A), .Columns(A + 1))
        For Lig = 11 To 12
...

Je n'ai pas testé plus avant.....

Mais la solution que je t'ai proposé est très peu différente de celle-ci....

Bonne soirée

re cousinhub,

Je testerais ce soir, tu m'aurai fait gagner du temps en complétant mon dernier fichier,

En gros il faut ajouter un With

J'essayais avec :

With Worksheets("Temp").Range(Columns(A), Columns(A + 1))

Bon, je dois y aller ! je verrais çà ce soir

Claude

Bonsoir Claude, cousinhub, Dan, forum

fichier avec correction de cousinhub

merci cousinhub pour l'astuce du double with

je cherchais en vain depuis un moment comment affectée une variable a la plage

Claude,

la différence entre la solution de cousinhub et celle que je t'ai proposée est surtout sur le c.find next

cela veux dire que si dans la plage de cellules, il y en a deux ou plus identiques

ex

2 12

2 18

2 6

sans le find next tu aura comme résultat 2 12 et avec le find next tu aura 2 6

re,

Ok Bob, c'est quand même autre chose que mes "Goto" du départ !

merci à tous

Amicalement

Claude

Rechercher des sujets similaires à "vba syntaxe"