Bonjour , j'ai crée un code avec une gestion un peu compliqué des exceptions de lecture.
Mon probleme se trouve à la ligne en italique. En fait il devrait gérer le fait qu'il n'y ais pas de saut de ligne mais il ne le fait pas

(Juré, tel que je pense l'avoir écrit ça devrait marcher

) il me renvoie une erreur d'execution 5
Code :
If MemeFiche(c, cSuivant, cAutre) Then
' NB - Contrairement aux fonctions homologues d'Excel (CHERCHE() et TROUVE()), "Instr" renvoie 0 (zéro)
' et non une valeur d'erreur lorsque la chaîne recherchée n'est pas trouvée.
Pos = InStr(1, cAutre, ":", vbTextCompare)
' La select Case ... permet de différencier le traitement selon que Pos renvoie 0 (":" non trouvés) ou non.
Select Case Pos
Case 0
' Si les ":" sont absents, on vérifie que l'avant-dernier caractère de la cellule correspond à la variable Lettre ("F" ou "R") selon le cas.
' puis on recherche la première ligne non vide.
If Mid(cAutre, Len(cAutre) - 1, 1) = Lettre Then
Set cRef = cRef.Offset(1)
cAutre.Select
NonVide = cRef <> ""
k = 1
Do Until NonVide
Set cRef = cRef.Offset(1)
If cRef <> "" Then
NonVide = True
End If
Loop
Sequence = cRef
' Si "F" et pas de ":", ce qui le cas ici, info sur 2 lignes. Il faut alors decaler cAutre d'une ligne vers le bas pour ne pas commencer
' 1 ligne trop haut la recherche de ligne non vide pour le repérage du "R" orrespondant.
If Lettre = "F" Then Set cAutre = cRef
End If
Je vous met le code complet de la sub
Code :
Private Function Sequence(cRef As Range, Lettre$)
Dim NonVide As Boolean, k As Integer, Pos As Integer
' L'information peut se trouver sur la ligne suivant cAutre sous la forme "F : TGAAGGCAGTCACACTGGG"
' ou sur la ligne suivante (avec une ligne vide après cAutre, fichier "Transfert_Marqueurs_Sep36_22_11_07_BGWY077_101).txt"),
' sous la forme "0006-A-F1*: TTCACATGGTTCCCTCCG" ou "0004-A-F2*: CTAGCTGCCTGCCAAATTAC"
' ******************************* Il faut alors tester la présence de "F", 3 caractères avant ":" *******************************
' Un troisième cas de figure (au moins) existe, également sur le fichier "Transfert_Marqueurs_Sep36_22_11_07_BGWY077_101).txt"
' (cf lignes 4864 et suivantes), le fichier texte ayant été ouvert avec Excel
' Séquences des amorces PCR*:
'
' 126 F2R2 -D - F1
' GCTTCTGAAGAAGTACAGTGGCT
'
'
' 126 F2R2 -D - R1
' TGCTGAATACAGATATCTTTCCAAC
'
' ou (variante où un saut de ligne précède les séquences (lignes 1956 et suivantes))
' Séquences des amorces PCR*:
'
' 0077-F1
'
' GTAGGCCAGCGAGCTAA
'
' 0077_A_R1
'
' CAGGCTCTACATGCATTTGTTTTCA
'
' ou (autre variante (lignes 1192 et suivantes))
' Séquences des amorces PCR*:
' 0075_F2R2_D_F1
' TGCACAAGATTGATTGCAC
' 0075_F2R2_D_R1
' CAGAATACATACCTGAGCAAG
' Il faut alors vérifier (si ":" absents), que "F" (ou "R", pour *********************************
' la seconde séquence prise en compte) est en avant-dernière ***********************************
' position, et récupérer la séquence sur la première ligne non vide. *******************************
NonVide = cRef <> ""
Do Until NonVide
Set cRef = cRef.Offset(1)
If cRef <> "" Then
NonVide = True
End If
Loop
' Emploi de la fonction "MemeFiche" pour vérifier que cAutre est sur la fiche en cours. Le test est à répéter pour chaque donnée
' de la fiche à ajouter à la base. C'est ce qui justifie l'emploi d'une fonction.
If MemeFiche(c, cSuivant, cAutre) Then
' NB - Contrairement aux fonctions homologues d'Excel (CHERCHE() et TROUVE()), "Instr" renvoie 0 (zéro)
' et non une valeur d'erreur lorsque la chaîne recherchée n'est pas trouvée.
Pos = InStr(1, cAutre, ":", vbTextCompare)
' La select Case ... permet de différencier le traitement selon que Pos renvoie 0 (":" non trouvés) ou non.
Select Case Pos
Case 0
' Si les ":" sont absents, on vérifie que l'avant-dernier caractère de la cellule correspond à la variable Lettre ("F" ou "R") selon le cas.
' puis on recherche la première ligne non vide.
If Mid(cAutre, Len(cAutre) - 1, 1) = Lettre Then
Set cRef = cRef.Offset(1)
cAutre.Select
NonVide = cRef <> ""
k = 1
Do Until NonVide
Set cRef = cRef.Offset(1)
If cRef <> "" Then
NonVide = True
End If
Loop
Sequence = cRef
' Si "F" et pas de ":", ce qui le cas ici, info sur 2 lignes. Il faut alors decaler cAutre d'une ligne vers le bas pour ne pas commencer
' 1 ligne trop haut la recherche de ligne non vide pour le repérage du "R" orrespondant.
If Lettre = "F" Then Set cAutre = cRef
End If
Case Else
' Si les ":" sont présents, on vérifie que le premier caractère (info du type"F : TGAAGGCAGTCACACTGGG") ou que le 3ème caractère avant les ":"
' (info du type "0004-A-F2*: CTAGCTGCCTGCCAAATTAC"), correspond à la variable Lettre ("F" ou "R") selon le cas.
' On ne peut utiliser "If Left(cAutre, 1) = Lettre Or Mid(cAutre, Pos - 3, 1) = Lettre Then", car si la 1ère condition est remplie (Lettre ("F" ou "R"))
' comme premier caractère, Pos = 3 et "Pos - 3", utilisé dans la seconde condition ("Mid(cAutre, Pos - 3, 1)") génère une erreur, car le second argument
' de Mid ne peut =atre égal à 0. C'est pour cela que le test est décomposé, avec un "ElseIf"
If Left(cAutre, 1) = Lettre Then
Sequence = Mid(cAutre, Pos + 1 + IIf(Asc(Mid(cAutre, Pos + 1, 1)) = 32 Or Asc(Mid(cAutre, Pos + 1, 1)) = 160, 1, 0))
ElseIf Mid(cAutre, Pos - 3, 1) = Lettre Then
Sequence = Mid(cAutre, Pos + 1 + IIf(Asc(Mid(cAutre, Pos + 1, 1)) = 32 Or Asc(Mid(cAutre, Pos + 1, 1)) = 160, 1, 0))
End If
End Select
' MAJ de cAutre si lettre = "F" afin de commencer le traitement relatif à "R" 1 cellule + bas
If Lettre = "F" Then Set cAutre = cAutre.Offset(1)
End If
End Function
Si quelqu'un pouvait regarder ça de près, je ne vois plus rien