Foros del Web » Programación para mayores de 30 ;) » Programación General »

Problema al ejecutar un script en visual basic.

Estas en el tema de Problema al ejecutar un script en visual basic. en el foro de Programación General en Foros del Web. Buenos dias, Tengo un script realizado en visual basic que manda emails automaticamente cogiendo las direcciones de un fichero excel. El problema surge cuando el ...
  #1 (permalink)  
Antiguo 29/10/2012, 04:33
 
Fecha de Ingreso: octubre-2012
Ubicación: Pozuelo de Alarcón
Mensajes: 67
Antigüedad: 11 años, 6 meses
Puntos: 1
Pregunta Problema al ejecutar un script en visual basic.

Buenos dias,

Tengo un script realizado en visual basic que manda emails automaticamente cogiendo las direcciones de un fichero excel. El problema surge cuando el array que contiene las direcciones no me funciona bien. El error que me da es el siguiente.

Error: This key is already associated with an element of this collection.
Code: 800A01C9.
Line:80
Col: 2

El codigo del script es el siguiente:

Código vb:
Ver original
  1. '======== DEF. VARIABLES =============
  2.  
  3. 'Fichero con la lista de nombres y emails
  4. Dim mailsFile
  5. mailsFile = "listaEmails.xls"
  6.  
  7. 'Texto del email
  8. Dim textoEmail
  9. textoEmail = "Buenos días" & "<br>" & "<br>" & "Os adjunto los préstamos de >8 días." & "<br>" & "Por favor, actualizad vuestros comentarios en LMT, necesitamos que nos indiquéis lo antes posible, la fecha y detalles de su devolución, nº de Loreto o nº de Pareto <a href=""https://lmt6.atlanta.hp.com/LMTHome_IGSO.aspx""> https://lmt6.atlanta.hp.com/LMTHome_IGSO.aspx </a>" & "<br>" & "<br>" & "Gracias" & "<br>" & "Un saludo" & "<br>" & "Elena"
  10.  
  11. 'Asunto del email
  12. Dim asuntoEmail
  13. asuntoEmail = "Loans >8 Días"
  14.  
  15. 'Variable que define si se incluye el manager en copia
  16. Dim incluirManager
  17. incluirManager = True
  18.  
  19. 'Emails que se incluyen siempre en copia
  20. Dim emailsCopia
  21.  
  22.  
  23. 'Directorio de ejecución del programa
  24. Dim directorioActual
  25. directorioActual = left(WScript.ScriptFullName,(len(WScript.ScriptFullName))-(len(WScript.ScriptName)))
  26.  
  27. 'Ruta del fichero de log
  28. Dim ruta, fechahora
  29. fechahora = Now
  30. ruta = directorioActual & "LOG Script Email [" & replace(asuntoEmail,">","MAS") & "] - " & replace( replace(fechahora, "/", "_"), ":", ".") & ".txt"
  31.  
  32. Dim filesList
  33. filesList = ListFolder (directorioActual, "xls", directorioActual & mailsFile)
  34.  
  35. '============ MAIN ===================
  36.  
  37. 'Muestra ventana de aviso de inicio del script
  38. WScript.Echo("Inicio del Script Email [" & asuntoEmail & "]")
  39.  
  40. 'Crea el fichero de log y escribe la cabecera
  41. WriteOpenFileText(ruta), ("LOG - ENVÍO EMAILS" & vbCrLf & "[" & asuntoEmail & "]" & vbCrLf & fechahora & vbCrLf & "##############" & vbCrLf)
  42.  
  43. 'Abrir el fichero de [nombres - emails] y copiar la información en un array
  44. Dim listaEmails
  45.  
  46. 'Abre Excel
  47. Set appExcel = CreateObject("Excel.Application")
  48. appExcel.Workbooks.Open (directorioActual & mailsFile), false, true
  49. Set hojaActual = appExcel.ActiveWorkbook.Worksheets(1)
  50. 'Obtiene numero de filas de la hoja 1
  51. numFilas = hojaActual.UsedRange.Rows.Count
  52.  
  53. 'Crea el diccionario donde se guardarán los nombres y emails
  54. Set listaEmails = CreateObject("Scripting.Dictionary")
  55. For i=0 to (numFilas-1)
  56.     listaEmails.Add hojaActual.Cells(i+1, 1).Value, hojaActual.Cells(i+1, 2).Value 
  57. Next
  58.  
  59. 'Cierra la lista de emails
  60. appExcel.Workbooks.Close
  61.  
  62. 'Abrir la aplicación Microsoft Outlook
  63. Set MyApp = CreateObject("Outlook.Application")
  64.  
  65. 'Crear diccionario para los nombres de cada fichero Excel
  66. Dim listaNombres
  67. Set listaNombres = CreateObject("Scripting.Dictionary")
  68.  
  69. 'Variable para guardar el nombre del manager
  70. Dim nombreManager
  71.  
  72. 'Recorre los ficheros Excel encontrados en la carpeta
  73. For Each fich In filesList
  74.     'Direcciones de email de copia
  75.     Dim direccionesCc
  76.     direccionesCc = emailsCopia
  77.    
  78.     'Abrir el fichero Excel
  79.     appExcel.Workbooks.Open (fich), false, true
  80.     'Obtener todos los nombres de los destinatarios
  81.     Set hojaActual = appExcel.ActiveWorkbook.Worksheets(1)
  82.    
  83.     'Obtiene el nombre del manager
  84.     nombreManager = hojaActual.Cells(2, 1).Value
  85.     'Obtiene los nombres de la columna 2
  86.     numFilas = hojaActual.UsedRange.Rows.Count
  87.     For i=2 to (numFilas)
  88.         If Not listaNombres.Exists(hojaActual.Cells(i, 2).Value) Then
  89.             listaNombres.Add hojaActual.Cells(i, 2).Value, hojaActual.Cells(i, 2).Value
  90.         End If
  91.     Next
  92.        
  93.     'Nombres encontrados en el fichero Excel (sin repetir)
  94.     Dim arrayTmp
  95.     arrayTmp = listaNombres.Items
  96.    
  97.     'Diccionario que guardará los emails enviados para no repetirlos
  98.     Dim emailsEnviados
  99.     Set emailsEnviados = CreateObject("Scripting.Dictionary")
  100.    
  101.     'Escribe info del fichero en el log
  102.     WriteOpenFileText(ruta), ("FICHERO <" & fich & ">:" & vbCrLf)
  103.    
  104.     'Cadena que almacena el destinatario del email (concatenación de direcciones)
  105.     Dim destinatario
  106.     destinatario = ""
  107.    
  108.     'Cadenas que almacenan los registros de envío
  109.     Dim noEncontrados
  110.     noEncontrados = ""
  111.    
  112.     Dim enviados
  113.     enviados = ""
  114.    
  115.     'Bucle que recorre los nombres encontrados en el fichero Excel para obtener sus emails
  116.     For Each nombre in arrayTmp
  117.         'Obtiene el email que corresponde al nombre
  118.         Dim email
  119.         email = listaEmails.Item(nombre)
  120.         'Si no lo ha enviado ya a la misma dirección y la dirección es distinta de "", envía el email.
  121.         If (Not emailsEnviados.Exists(email)) And (email<>"") Then
  122.             'Almacena la dirección a la que se ha enviado
  123.             emailsEnviados.Add email, email
  124.             destinatario = destinatario & email & "; "
  125.             'Escribe info del mail enviado en el log
  126.             enviados = enviados & nombre & " / " & email & vbCrLf
  127.         ElseIf email="" Then
  128.             'Escribe info del nombre no encontrado en el log
  129.             noEncontrados = noEncontrados & nombre & vbCrLf
  130.         End If 
  131.     Next
  132.    
  133.     'Añade al manager como copia si es necesario
  134.     If incluirManager Then
  135.         email = listaEmails.Item(nombreManager)
  136.         If (email<>"") Then
  137.             direccionesCc = direccionesCc & email
  138.             'Escribe info del mail enviado en el log
  139.             enviados = enviados & nombreManager & " / " & email & " (Manager)" & vbCrLf
  140.         Else
  141.             'Escribe info del nombre no encontrado en el log
  142.             noEncontrados = noEncontrados & nombre & " (Manager)" & vbCrLf
  143.         End If 
  144.     End If
  145.    
  146.     'Envía el correo a la dirección de email con el texto predefinido y adjuntando el fichero Excel
  147.     Set MyItem = MyApp.CreateItem(0)
  148.     With MyItem
  149.         .To = destinatario
  150.         .Cc = direccionesCC
  151.         .Subject = asuntoEmail & " - " & right (fich, len (fich) - len (directorioActual))
  152.         .ReadReceiptRequested = False
  153.         .HTMLBody = textoEmail
  154.         .Attachments.Add fich
  155.     End With
  156.     'MyItem.Send
  157.     'MyItem.Display
  158.     Set MyItem = Nothing
  159.        
  160.     'Vacía la lista de nombres para usarla con el próximo fichero Excel
  161.     listaNombres.RemoveAll
  162.     'Cierra el fichero Excel
  163.     appExcel.Workbooks.Close
  164.    
  165.     'Escribe el registro
  166.     WriteOpenFileText(ruta), ("ENVIADOS:" & vbCrLf & enviados)
  167.     If noEncontrados<>"" Then
  168.         WriteOpenFileText(ruta), ("NO ENCONTRADOS:" & vbCrLf & noEncontrados & vbCrLf & "------------" & vbCrLf)
  169.     Else
  170.         WriteOpenFileText(ruta), ("------------" & vbCrLf)
  171.     End If
  172. Next
  173.  
  174. 'myApp.Quit
  175. appExcel.Quit
  176.  
  177.  
  178.  
  179. '======== DEF. FUNCIONES =============
  180.  
  181. '
  182. '<ListFolder>
  183. 'Lista los ficheros de la ruta indicada que tengan la extensión indicada (no incluye subcarpetas),
  184. ' a excepción del fichero cuyo nombre está en el parámetro exceptionFile.
  185. 'Devuelve un array con el resultado.
  186. '
  187. Function ListFolder (path, extension, exceptionFile)
  188.     Dim filesList()
  189.     Dim index
  190.     index = 0
  191.  
  192.     Set objFSO = CreateObject("Scripting.FileSystemObject")
  193.     Set objFolder = objFSO.GetFolder(path)
  194.     Set colFiles = objFolder.Files
  195.  
  196.     For Each objFile In colFiles
  197.         If ((Right(objFile, len(extension)+1) = "." & extension) And objFile<>exceptionFile) Then
  198.             Redim Preserve filesList (index)
  199.             filesList (index) = objFile
  200.             index = index+1
  201.         End If
  202.     Next
  203.    
  204.     ListFolder = filesList
  205. End Function
  206.  
  207. '
  208. '<WriteOpenFileText>
  209. 'Función que escribe el texto indicado en sText al final del fichero determinado por la ruta sFilePath.
  210. 'Si el fichero no existe, lo crea.
  211. '
  212. Function WriteOpenFileText(sFilePath, sText)
  213.     Dim objFSO 'As FileSystemObject
  214.    Dim objTextFile 'As Object
  215.    
  216.     Const ForReading = 1
  217.     Const ForWriting = 2
  218.     Const ForAppending = 8
  219.     Set objFSO = CreateObject("Scripting.FileSystemObject")
  220.     Set objTextFile = objFSO.OpenTextFile(sFilePath, ForAppending, True)
  221.    
  222.     ' Write a line.
  223.    objTextFile.Write ( sText & vbCrLf)
  224.     objTextFile.Close
  225.  
  226. End Function

He estado mirando y dice que es porque duplico la calve del array, pero no encuentro ningún tipo de solución al respecto.

Muchas gracias de antemano.

Un saludo

Última edición por taboacar; 29/10/2012 a las 04:42

Etiquetas: basic, programa, visual, formulario
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:06.