Msgbox con todos los resultados de búsqueda si el valor no se encuentra

Resuelto
bassmart Mensajes publicados 281 Fecha de registro   Estado Miembro Última intervención   -  
bassmart Mensajes publicados 281 Fecha de registro   Estado Miembro Última intervención   -
Hola foro, Tengo una macro con dentro una consulta SQL para buscar un valor en un archivo cerrado (gracias a Michel por eso) que funciona muy bien. Cuando el valor buscado no se encuentra, añadí un "msgbox" para avisar al usuario que no se encontró el valor. El problema es que si proceso varios archivos a la vez, se muestra tras el procesamiento de cada archivo. Lo que me gustaría es que se muestre solo una vez al final de todo el procesamiento de todos los archivos. Aún mejor, podría generar una especie de informe o diario (tipo Word) con todos los archivos en los que el valor no se encontró. He probado en distintos lugares de mi código, pero sin éxito. Aquí está mi código que se encuentra en un módulo:
Option Explicit '------------------------------------------------------------ Sub compter_dans_fermé() Dim Source As Object, Requete As Object Dim Prefix As String, Fichier2 As String, Table As String, texte_SQL As String Dim i As Integer Dim Msg As String 'initialisation Msg = "" '----------------------------------Initialisations Prefix = ActiveSheet.Cells(2, "A") If Prefix = "" Then MsgBox "cellule vide", vbCritical, vbOKOnly Exit Sub End If 'Définit le classeur fermé servant de base de données Fichier2 = "M:\Entrepot\BDFS\0_Sondages_a_saisir_Geotec\" & "SONDAGE.xlsx" 'Nom de la feuille dans le classeur fermé Table = "SONDAGE" & "$" ' colonne de recherche 'Champ = "NO_SONDAGE" '-----------------------------------connexion Set Source = CreateObject("ADODB.connection") With Source .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _ & Fichier2 & ";Extended Properties=""Excel 12.0;HDR=YES;""" .Open End With '--------------------------requete Set Requete = CreateObject("ADODB.Recordset") texte_SQL = "SELECT NO_SONDAGE FROM [" & Table & "]" Set Requete = Source.Execute(texte_SQL) '-------------------------restitution With Requete .MoveFirst Do While Not .EOF If .Fields(0) Like Prefix & "*" Then ActiveSheet.Cells(2, "A") = .Fields(0) i = 1 Exit Do End If .MoveNext Loop If i = 0 Then Msg = Msg & "La valeur " & ActiveSheet.Cells(2, "A") & " n'as pas été trouvé dans la table «SONDAGE»" & Chr(10) End If End With 'Affichage du msgbox If Msg <> "" Then MsgBox Msg, vbExclamation, "Attention!!!" End If End Sub 
Pouvez-vous m'aider? Configuration: Windows / Chrome 55.0.2883.87

3 respuestas

  1. f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención   1 717
     
    Hola, Justamente, he seguido los episodios sobre la solicitud que hicieron y que al final, aun así, utilizan el código de Michel_M. De hecho, había creado un código en tu archivo con tu programación inicial y al final hago un
     .CopyFromRecordset 
    en lugar de un bucle para encontrar el/los números correctos. una pequeña pregunta: ¿estás seguro de que solo hay una sola encuesta que corresponda al número puesto al principio en la celda, porque en tu archivo de ejemplo hay un caso en el que hay dos C12003-004-08 C12003-004-09 y en este caso !! C12096-004-12 C12096A-004-12 Varios archivos, ok, pero ¿cómo los buscas?
    0
    1. bassmart Mensajes publicados 281 Fecha de registro   Estado Miembro Última intervención   1
       
      Hola,

      Buen punto, ¡no lo había pensado!!

      Hice la prueba y efectivamente en los 2 casos tengo un problema. Si tengo C28209A en mi celda de búsqueda, me copia el valor C28209-005-12 y no C28209A-005-12.

      La forma en que busco en el libro cerrado es con el valor que está escrito en la celda (A2) de mi archivo, que corresponde a C28209A.

      ¿Cómo hacer para corregir el problema? ¿Existe alguna forma de avisarnos cuando encuentra 2 valores que coinciden y escoger cuál queremos usar?

      ¿Sería una mejor opción usar
      .copyfromrecordset
      ?

      ¡Muchas gracias!!
      0
    2. bassmart Mensajes publicados 281 Fecha de registro   Estado Miembro Última intervención   1
       
      Hola de nuevo, Estoy resolviendo el problema para los números como C28209A; había un pequeño error en la transcripción del nombre del cuaderno que corresponde a NO_SONDAGE dentro del cuaderno, me truncaba el nombre al quitar la "A" final. ¡Ahora funciona bien para estos casos!
      0
      1. f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención   1 717 > bassmart Mensajes publicados 281 Fecha de registro   Estado Miembro Última intervención  
         
        Hola a todos,

        un archivo con los dos métodos de búsqueda y visualización no resuelve el problema de los msgbox, pero esto es bastante fácil de resolver
        En "mi código" uso una consulta SQL con un WHERE y LIKE

        Volvemos a hacer la misma pregunta:
        -¿Cómo seleccionan los archivos a procesar y con qué llaman a su subrutina
        Sub compter_dans_fermé()
        0
      2. bassmart Mensajes publicados 281 Fecha de registro   Estado Miembro Última intervención   1 > f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención  
         
        Para seleccionar los libros, los seleccioné con un UserForm.

        La forma en que llamo a la subrutina, uso
        Call contar_dans_fermé


        Aquí está mi macro completa:
        Option Explicit Private Sub CommandButton1_Click() Dim QuelFichier() Dim Chemin, Fichier, Nomclasseur, strSONDAGE, Cible, Sondage, Value As String Dim DerLig, Lig, Dercol, Dercol2, NewDercol, DerLigS, DerLigF As Long Dim Prof, Prof2 As String Dim i, x, N, ligne, col, C, V, a As Integer Dim TInfos, nomfichier Dim celluletrouve, celluletrouve2, MaPlage As Range Dim Cn As ADODB.Connection Dim Fichier2 As String Dim NomFeuille As String, texte_SQL As String Dim Rst As ADODB.Recordset ChDrive "m" 'ChDir "M:\Temporaire\Martin D'Anjou\Travail nouveau formulaire\Test piézocône" ChDir "M:\Entrepot\BDFS\1_Données de forages et sondages\" 'On Error GoTo fin QuelFichier = Application.GetOpenFilename("Fichier excel(*.xls; *.xlsx),*.xls;*.xlsx", , , , True) If IsArray(QuelFichier) Then For i = LBound(QuelFichier, 1) To UBound(QuelFichier, 1) Workbooks.Open QuelFichier(i) '------------------------------------------- 'Nom de fichier SANS extention en partant du chemin complet Nomclasseur = Left(Mid(QuelFichier(i), InStrRev(QuelFichier(i), "\") + 1), Len(Mid(QuelFichier(i), InStrRev(QuelFichier(i), "\") + 1)) - 4) If Left(Nomclasseur, 1) <> "C" Then If InStr(Nomclasseur, "C") > 6 Then Nomclasseur = Mid(Nomclasseur, InStr((Nomclasseur), "C"), Len(Nomclasseur)) ElseIf Mid(Nomclasseur, 3, 2) = "cp" Or Mid(Nomclasseur, 3, 2) = "CP" Then Nomclasseur = "C" & Left(Nomclasseur, 2) & Mid(Nomclasseur, 5, Len(Nomclasseur) - 4) ElseIf Left(Nomclasseur, 1) = "c" Then Nomclasseur = "C" & Mid(Nomclasseur, 2, Len(Nomclasseur)) Else Nomclasseur = "C" & Nomclasseur End If End If '------------------------------------------- Application.ScreenUpdating = False 'traitement de chacune des feuilles ici '--------------------------------------- For x = 1 To Sheets.Count With Sheets(x) .Unprotect 'Trouver la valeur Depth dans la colonne A sinon on delete '---------------------------------------------------------- Prof = "depth" Set celluletrouve = Range("A1:D10").Find(Prof, lookat:=xlWhole) If celluletrouve Is Nothing Then Prof2 = "Profondeur" Set celluletrouve2 = Range("A1:D10").Find(Prof2, lookat:=xlPart) If celluletrouve2 Is Nothing Then MsgBox "Colonne DEPTH n'as pas été trouvé", vbCritical Cells(1, 1).Value = "PROF" Cells(1, 2).Value = "Qt" Cells(1, 3).Value = "Fs" Cells(1, 4).Value = "U" Else ligne = celluletrouve2.Row col = celluletrouve2.Column Cells(ligne + 1, col).EntireRow.Delete Cells(ligne, col).Value = "PROF" If col > 1 Then Range(Cells(1, 1), Cells(1, col - 1)).EntireColumn.Delete If ligne > 1 Then Range(Cells(1, 1), Cells(ligne - 1, 1)).EntireRow.Delete End If Else ligne = celluletrouve.Row col = celluletrouve.Column Cells(ligne + 1, col).EntireRow.Delete Cells(ligne, col).Value = "PROF" If col > 1 Then Range(Cells(1, 1), Cells(1, col - 1)).Columns.Delete If ligne > 1 Then Range(Cells(1, 1), Cells(ligne - 1, 1)).EntireRow.Delete End If 'On enlève les ligne vides du fichier '------------------------------------ Columns(2).SpecialCells(xlCellTypeBlanks).EntireRow.Delete ' problème ici delete tout 'Ajout de NO_SITE et NO_SONDAGE au bout du tableau + changement de nom '----------------------------------------------------------------------- Dercol = Cells(1, Cells.Columns.Count).End(xlToLeft).Column .Cells(1, Dercol + 1).Value = "NO_SITE" .Cells(1, Dercol + 2).Value = "NO_SONDAGE" Application.CutCopyMode = False Dercol2 = Cells(1, Cells.Columns.Count).End(xlToLeft).Column Range(Cells(1, 1), Cells(1, Dercol2)).NumberFormat = "General" nomfichier = Nomclasseur For N = 2 To Dercol2 Select Case .Cells(1, N).Value Case "Qt", "qt" .Cells(1, N).Value = "QT" Case "Pw", "U", "u" .Cells(1, N).Value = "U2" Case "Fs", "fs" .Cells(1, N).Value = "FS" Case "Temp" .Cells(1, N).Value = "TEMP" Case "NO_SITE" .Cells(2, N).Value = "6.02.06.MT.02." & Mid(Nomclasseur, 2, 2) & "000" .Cells(2, N).EntireColumn.AutoFit Case "NO_SONDAGE" .Cells(2, N).Value = Mid(Nomclasseur, 1, Len(Nomclasseur)) .Cells(1, N).EntireColumn.AutoFit N = Dercol2 'Case "Qc" '.Cells(1, N).Value = "QC" Case Else .Columns(N).Delete '.Cells(1, N).EntireColumn.Delete N = N - 1 End Select Next N .Columns(1).Insert NewDercol = Cells(1, Cells.Columns.Count).End(xlToLeft).Column For C = 3 To DerLig .Range(Cells(C, NewDercol - 1), Cells(C, NewDercol)).Value = .Range(Cells(2, NewDercol - 1), Cells(2, NewDercol)).Value Next C .Columns(NewDercol).Cut Destination:=Columns(1) End With Next x ' Spécifie le chemin du fichier à comparer '------------------------------------------- strSONDAGE = "M:\Entrepot\BDFS\0_Sondages_a_saisir_Geotec\" & "SONDAGE.xlsx" ' Vérifier que les fichiers A et B se trouvent dans le répertoire '---------------------------------------------------------------- If Dir(strSONDAGE) = "" Then MsgBox "Le fichier SONDAGE.xlsx est introuvables", vbCritical + vbOKOnly, "Problème de fichier..." Exit Sub End If 'Comparaison des deux fichiers '----------------------------- Call compter_dans_fermé 'Copier la valeur cherché sur toute la colonne '--------------------------------------------- DerLig = Range("B" & Rows.Count).End(xlUp).Row Dercol = Cells(1, Cells.Columns.Count).End(xlToLeft).Column Cells(2, 1).Copy With Range(Cells(3, 1), Cells(DerLig, 1)) .PasteSpecial xlPasteValues End With Cells(2, Dercol).Copy With Range(Cells(3, Dercol), Cells(DerLig, Dercol)) .PasteSpecial xlPasteValues End With Chemin = CurDir & "\Transfert_Geotec\" If Dir(Chemin, vbDirectory) = "" Then MkDir "Transfert_Geotec" Fichier = Nomclasseur & "_Geotec" & ".csv" Else Chemin = CurDir & "\Transfert_Geotec\" Fichier = Nomclasseur & "_Geotec" & ".csv" End If With ActiveWorkbook Application.DisplayAlerts = False .SaveAs Filename:=Chemin & Fichier, FileFormat:=xlCSV, CreateBackup:=False, local:=True .Close Application.DisplayAlerts = True End With '------------------------------------------- Next i Else MsgBox "Annuler" End If UserForm1.Hide ThisWorkbook.Saved = True Application.ScreenUpdating = True UserForm2.Show Application.ScreenUpdating = True End Sub 
        0
      3. f894009 Mensajes publicados 17417 Fecha de registro   Estado Miembro Última intervención   1 717 > bassmart Mensajes publicados 281 Fecha de registro   Estado Miembro Última intervención  
         
        Re,
        Gracias por todo
        0
  2. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   Embajador 1 588
     
    hola, ¿dices que llamas varias veces count_in_closed(), y que quieres mostrar el mensaje después de la última llamada?
    ¿cómo se realizan las múltiples llamadas a count_in_closed()?
    si quieres crear un informe, basta con escribir Msg en un archivo en lugar de hacer el MsgBox.
    0
    1. bassmart Mensajes publicados 281 Fecha de registro   Estado Miembro Última intervención   1
       
      Hola yg_be,

      Sí, puedo llamar a compter_dans_fermé() varias veces, en caso de que quiera procesar más de un libro a la vez.

      Este macro está colocado en un módulo que forma parte de una macro mucho más grande que abre los libros seleccionados, realiza la maquetación de cada libro y los guarda con un nombre nuevo.

      Si selecciono 5 libros, realiza el procesamiento de los 5 libros uno por uno en un bucle.

      ¿Quieres decir que debo cambiar la línea
      MsgBox Msg, vbExclamation, "Attention!!!"
      ?

      ¡Gracias!
      0
  3. michel_m Mensajes publicados 18903 Fecha de registro   Estado Colaborador Última intervención   3 320
     
    Cuando el valor buscado no se encuentra, añadí un "msgbox" para advertir al usuario que el valor no fue encontrado.

    TE AVISÉ QUE TE PROPUSE ESTE PUNTO EN MIS RESPUESTAS :-(((

    TU i=1 ES RIDÍCULO
    --


    Tengo una macro con dentro una consulta SQL para buscar un valor en un archivo no abierto (gracias a Michel en este asunto)

    ME ARREPIENTO DE HABERTE AYUDADO
    Michel
    0
    1. bassmart Mensajes publicados 281 Fecha de registro   Estado Miembro Última intervención   1
       
      Hola Michel,

      Lo siento por haberte ofendido, ¡no era mi intención! Funcionaba muy bien cuando abro un solo archivo.

      Pero cuando abro 5 archivos a la vez (los proceso uno por uno), si no encuentra ninguna de las valores buscadas me envía 5 mensajes al final de cada uno de los archivos.

      Para el i=1, tienes razón que es ridículo! Supondré que no soy un pro de la programación en VBA; hago lo mejor que puedo para lograr el resultado deseado.

      ¡Otra vez, perdón por haberte ofendido!!
      0
    2. michel_m Mensajes publicados 18903 Fecha de registro   Estado Colaborador Última intervención   3 320 > bassmart Mensajes publicados 281 Fecha de registro   Estado Miembro Última intervención  
       
      Para i=1, tienes razón que eso es ridículo! Supongo que no soy un profesional de la programación VBA, hago lo mejor que puedo para alcanzar los resultados deseados.


      No eres en absoluto un experto en leer las soluciones que te proponemos
      0
    3. bassmart Mensajes publicados 281 Fecha de registro   Estado Miembro Última intervención   1 > michel_m Mensajes publicados 18903 Fecha de registro   Estado Colaborador Última intervención  
       
      Tu solución funcionaba muy bien, Michel.

      Solo intenté modificar tu código un poco para que me muestre el mensaje solo una vez después de haber procesado todos mis archivos, pero no tuvo éxito. ¡Debería haber puesto la versión original de tu código en mi pregunta!

      ¡Sinceramente, lo siento!!
      0
    4. michel_m Mensajes publicados 18903 Fecha de registro   Estado Colaborador Última intervención   3 320 > bassmart Mensajes publicados 281 Fecha de registro   Estado Miembro Última intervención  
       
      Tú persistes y firmas

      a continuación copia del post 19 que no has querido leer...

      .....

      pequeña modificación a aportar para señalizar un fallo

      With Requete
      .MoveFirst
      Do While Not .EOF
      test = .fields(0)
      If .fields(0) Like Prefix & "*" Then
      ActiveSheet.Cells(2, "A") = .fields(0)
      Exit Sub
      End If
      .MoveNext
      Loop
      End With
      'gestionnaire erreur
      MsgBox "Référénce cherchée: " & Cells(2, "A") & " introuvable.", vbCritical, vbOKOnly
      End Sub


      I ly a d'ailleurs beaucoup simple mais....
      0
    5. bassmart Mensajes publicados 281 Fecha de registro   Estado Miembro Última intervención   1 > michel_m Mensajes publicados 18903 Fecha de registro   Estado Colaborador Última intervención  
       
      No persisto y firmo Michel!

      Tu código (que mencionas) funciona muy bien, ¡lo he intentado!

      Pero bueno, no puedo cambiar lo que ya se hizo. ¡No tenía ninguna intención de ofender a nadie aquí en el foro!

      ¡Otra vez, lo siento!
      0