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