Excel-Kontakt-Tabelle nach Outlook importieren (Kontakte erzeugen)

  • Excel

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Adde.

    Excel-Kontakt-Tabelle nach Outlook importieren (Kontakte erzeugen)

    Hallo,
    ich habe vor ein Programm (kein Makro) zu schreiben, welches in der Lage ist, Kontakte von Outlook zu exportieren, eine Excel-Tabelle zu erstellen und die ausgelesenen Kontakte schießlich dort einzutragen (dies geschieht zeilen weise, also jeder Kontakte bekommt ein Zeile). Nun habe ich jedoch ein Problem dabei, die Kontalte aus Excel wieder auszulesen und mit ihrn Eigenschaften ein Outlook Kontakt zu erstellen. Hier nun der bisherige Code mit Anmerkungen zu meinen Problemen :)

    ~entfernt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Adde“ ()

    Das Ganze ist recht chaotisch.
    Vielleicht solltest du dir einzelne Probleme rauspicken und Fragen dazu einzeln stellen.

    Adde schrieb:

    Row = xlWorksheet.Row(xlWorksheet.Cells(intRow, 1), xlWorksheet.Cells(intRow, 8))
    Willst du die ganze Zeile?
    Row = xlWorksheet.Rows(intRow)
    Oder die ersten 8 Zellen?
    Row = xlWorksheet.Range(xlWorksheet.Cells(intRow, 1), xlWorksheet.Cells(intRow, 8))
    Aber beides passt natürlich nicht zu der Signatur ​Dim Row As Integer. Das sind Ranges.

    Adde schrieb:

    For Each Row In xlWorkbook.Sheets(1)
    ​For Each Row As Excel.Range In xlWorkbook.Sheets(1).Rows
    Dann solltest du aber auch die Row-Objekte ansprechen.

    Wenn du einfach durchloopen willst:
    For intRow = 1 to xlWorkbook.Sheets(1).Rows.Count
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hi,
    ersteinmal vielen Dank für die schnelle Hilfe!
    Habe Row nun als Outlook.Row deklariert

    VB.NET-Quellcode

    1. Dim Row As Outlook.Row
    2. Row = xlWorksheet.Range(xlWorksheet.Cells(intRow, 1), xlWorksheet.Cells(intRow, 8))
    3. intRow = 2
    4. For Each Row In xlWorkbook.Sheets(1)
    5. 'neuen Kontakt erzeugen
    6. olContact = olApp.CreateItem(Outlook.OlItemType.olContactItem)
    7. 'Eigenschaften zuweisen
    8. olContact.FirstName = "" + xlWorksheet.Cells(intRow, 1).Value
    9. olContact.LastName = "" + xlWorksheet.Cells(intRow, 2).Value
    10. olContact.Email1Address = "" + xlWorksheet.Cells(intRow, 3).Value
    11. olContact.BusinessAddressStreet = "" + xlWorksheet.Cells(intRow, 4).Value
    12. olContact.BusinessAddressPostalCode = "" + xlWorksheet.Cells(intRow, 5).Value
    13. olContact.BusinessAddressCity = "" + xlWorksheet.Cells(intRow, 6).Value
    14. olContact.BusinessAddressCountry = "" + xlWorksheet.Cells(intRow, 7).Value
    15. olContact.BusinessTelephoneNumber = "" + xlWorksheet.Cells(intRow, 8).Value
    16. intRow = intRow + 1
    17. Next Row


    aber ich muss laut VB einen vollqualifizierten Namen verwenden, da der Typ für die Variable Row nicht abgeleitet werden kann, da er an ein Feld in einem einschließenden Bereich eingebunden sei.

    Damit kann ich nicht wirklich viel anfangen :/

    zur besseren Übersicht der ganze Quellcode:

    VB.NET-Quellcode

    1. Imports Outlook = Microsoft.Office.Interop.Outlook
    2. Imports Excel = Microsoft.Office.Interop.Excel
    3. Public Class Form1
    4. Dim olApp As Outlook.Application
    5. Dim olNamespace As Outlook.NameSpace
    6. Dim olFolder As Outlook.Folder
    7. Dim olContact As Outlook.ContactItem
    8. Dim olItem As Outlook.Items
    9. Dim olAll As Outlook.Items
    10. Dim Row As Outlook.Row
    11. Dim xlApp As Excel.Application
    12. Dim xlWorkbook As Excel.Workbook
    13. Dim xlWorksheet As Excel.Worksheet
    14. Dim intRow As Integer
    15. Dim syncSuccess As Boolean
    16. Dim AllProcesses() As System.Diagnostics.Process = System.Diagnostics.Process.GetProcesses()
    17. Dim MyProcess As System.Diagnostics.Process
    18. Private Sub cmdStart_Click(sender As Object, e As EventArgs) Handles cmdStart.Click
    19. If cmbAuswahl.Text = "Export" Then
    20. 'Outlook-Objekte öffnen
    21. olApp = CreateObject("Outlook.Application")
    22. olNamespace = olApp.GetNamespace("MAPI")
    23. olFolder = olNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts)
    24. olAll = olFolder.Items
    25. 'Excel-Objekte öffnen
    26. xlApp = CreateObject("Excel.Application") 'Neue Excel-Instanz
    27. xlWorkbook = xlApp.Workbooks.Add 'Neues Workbook anlegen
    28. xlWorksheet = xlWorkbook.Sheets(1) 'Erstes Sheet
    29. xlWorksheet.Name = "Outlook-Kontakte" 'Worksheet benennen
    30. 'Excel-Worksheet aufbereiten
    31. With xlWorksheet
    32. 'Spaltenüberschriften
    33. .Cells(1, 1).Value = "Vorname"
    34. .Cells(1, 2).Value = "Nachname"
    35. .Cells(1, 3).Value = "E-Mail"
    36. .Cells(1, 4).Value = "Strasse"
    37. .Cells(1, 5).Value = "PLZ"
    38. .Cells(1, 6).Value = "Ort"
    39. .Cells(1, 7).Value = "Land"
    40. .Cells(1, 8).Value = "Telefon"
    41. .Rows("1:1").Font.Bold = True 'Spaltenüberschriften Fett
    42. 'Outlook-Kontakte nach Excel übertragen
    43. intRow = 2
    44. For Each itmContacts In olAll
    45. .Cells(intRow, 1).Value = itmContacts.FirstName
    46. .Cells(intRow, 2).Value = itmContacts.LastName
    47. .Cells(intRow, 3).Value = itmContacts.Email1Address
    48. .Cells(intRow, 4).Value = itmContacts.BusinessAddressStreet
    49. .Cells(intRow, 5).Value = itmContacts.BusinessAddressPostalCode
    50. .Cells(intRow, 6).Value = itmContacts.BusinessAddressCity
    51. .Cells(intRow, 7).Value = itmContacts.BusinessAddressCountry
    52. .Cells(intRow, 8).Value = itmContacts.BusinessTelephoneNumber
    53. intRow = intRow + 1
    54. Next itmContacts
    55. 'automatische Anpassung der Spaltenbreite (optimale Breite)
    56. .Columns.AutoFit()
    57. syncSuccess = True
    58. End With
    59. 'Ausgabe, ob der Export nach Excel erfolgreich war
    60. If syncSuccess = True Then
    61. MsgBox("Die Synchronisierung war erfolgreich", vbInformation)
    62. Me.Close()
    63. Else
    64. MsgBox("Die Synchronisierung ist fehlgeschlagen", vbInformation)
    65. End If
    66. 'Excel einblenden
    67. xlApp.Visible = True
    68. xlWorkbook.SaveAs("C:\Kontakte\Kontakte " & DateString & ".xlsx")
    69. 'Outlook beenden
    70. For Each Process In System.Diagnostics.Process.GetProcessesByName("outlook")
    71. Process.Kill()
    72. Next
    73. 'Excel beenden
    74. For Each Process In System.Diagnostics.Process.GetProcessesByName("excel")
    75. Process.Kill()
    76. Next
    77. ElseIf cmbAuswahl.Text = "Import (von Master-Vorlage)" Then
    78. olApp = CreateObject("Outlook.Application")
    79. xlApp = CreateObject("Excel.Application")
    80. 'Excel Datei mit vorhandenen Kontakten öffnen
    81. xlWorkbook = xlApp.Workbooks.Open("C:\Kontakte\Kontakte " & DateString & ".xlsx")
    82. xlWorksheet = xlWorkbook.Sheets(1)
    83. 'Der Versuch eine Zeile zu definieren um pro Zeile einen neuen Kontakt zu erstellen
    84. Row = xlWorksheet.Range(xlWorksheet.Cells(intRow, 1), xlWorksheet.Cells(intRow, 8))
    85. intRow = 2
    86. For Each Row In xlWorkbook.Sheets(1)
    87. 'neuen Kontakt erzeugen
    88. olContact = olApp.CreateItem(Outlook.OlItemType.olContactItem)
    89. 'Eigenschaften zuweisen
    90. olContact.FirstName = "" + xlWorksheet.Cells(intRow, 1).Value
    91. olContact.LastName = "" + xlWorksheet.Cells(intRow, 2).Value
    92. olContact.Email1Address = "" + xlWorksheet.Cells(intRow, 3).Value
    93. olContact.BusinessAddressStreet = "" + xlWorksheet.Cells(intRow, 4).Value
    94. olContact.BusinessAddressPostalCode = "" + xlWorksheet.Cells(intRow, 5).Value
    95. olContact.BusinessAddressCity = "" + xlWorksheet.Cells(intRow, 6).Value
    96. olContact.BusinessAddressCountry = "" + xlWorksheet.Cells(intRow, 7).Value
    97. olContact.BusinessTelephoneNumber = "" + xlWorksheet.Cells(intRow, 8).Value
    98. intRow = intRow + 1
    99. Next Row
    100. syncSuccess = True
    101. If syncSuccess = True Then
    102. MsgBox("Die Synchronisierung war erfolgreich", vbInformation)
    103. Me.Close()
    104. Else
    105. MsgBox("Die Synchronisierung ist fehlgeschlagen", vbInformation)
    106. End If
    107. 'Outlook einblenden (funktioniert aus einen mir nicht eingänglichen Grund nicht, im Gegensatz zu Excel -> siehe oben)
    108. olApp.Visible = True
    109. ElseIf cmbAuswahl.Text = Nothing Then
    110. MsgBox("Wählen Sie eine Aktion aus!", vbInformation)
    111. End If
    112. End Sub
    113. End Class

    Adde schrieb:

    Dim Row As Outlook.Row
    Row = xlWorksheet.Range(...)
    Merkst du was?
    Wie kommst du darauf, dass Outlook.Row und Excel.Range dasselbe sein soll?

    Ich würde dir ja gerne den Rat geben, dass du Option Strict On programmieren sollst.
    Aber mit dem von dir verwendeten Late Binding, müsste ich zu weit ausholen und diese Energie finde ich heute nicht mehr.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hi,

    ich habe meine Idee von einem automatisierten Kontaktex- und import in
    die Tat umgesetzt und ein Programm geschreiben. Hier kann man nun
    auswählen ob die Kontakte von Outlook exportiert, in eine Excel-tabelle
    übertragen und als .xlxs gespeichert werden, oder aber ob man Kontakte
    aus einer vorher erstellten Exceltabelle importieren möchte.

    Der Export und das Schreiben der Kontakte in eine Excel.Tabelle
    funktioniert super und flüssig - jedoch habe ich ein paar Probleme bei
    dem Import zurück bzw. in das lokal gespeicherte Adressbuch eines
    anderen Outlooks.

    Hier einmal meine bisherigen Stolpersteine aufgelistet:

    - es fängt damit an, dass trotz des Befehls, welcher bei dem Eport
    einwandfrei funktioniert weder Outlook, noch Excel geöffnet werden
    (Zeilen 96 und 97)

    - danach bin ich mir nicht sicher ob meine Definition einer Zeile (Row) so richtig und für VB lesbar ist (da jeder Kontakt eine Zeile Besitzt, soll pro Zeile ein neuer Kontakt in Outlook erstellt werden) (Zeile 104)

    - des Weitern bin ich mir unsicher bei der Übernahme der
    Kontakt-Eigenschaften (Name, Adresse usw.), da ich den Prozess oben
    (beim Export) einfach umgekehrt habe (Zeilen 109 bis 119)

    das wars erstmal. Ich wäre froh, wenn mir jemand helfen könnte.



    Vielen Dank schonmal im Voraus

    Andi

    Hier nun der Code

    VB.NET-Quellcode

    1. Imports Outlook = Microsoft.Office.Interop.Outlook
    2. Imports Excel = Microsoft.Office.Interop.Excel
    3. Public Class Form1
    4. Dim olApp As Outlook.Application
    5. Dim olNamespace As Outlook.NameSpace
    6. Dim olFolder As Outlook.Folder
    7. Dim olContact As Outlook.ContactItem
    8. Dim olItem As Outlook.Items
    9. Dim olAll As Outlook.Items
    10. Dim Row As Excel.Range
    11. Dim xlApp As Excel.Application
    12. Dim xlWorkbook As Excel.Workbook
    13. Dim xlWorksheet As Excel.Worksheet
    14. Dim intRow As Integer
    15. Dim syncSuccess As Boolean
    16. Dim AllProcesses() As System.Diagnostics.Process = System.Diagnostics.Process.GetProcesses()
    17. Dim MyProcess As System.Diagnostics.Process
    18. Private Sub cmdStart_Click(sender As Object, e As EventArgs) Handles cmdStart.Click
    19. If cmbAuswahl.Text = "Export" Then
    20. 'Outlook-Objekte öffnen
    21. olApp = CreateObject("Outlook.Application")
    22. olNamespace = olApp.GetNamespace("MAPI")
    23. olFolder = olNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts)
    24. olAll = olFolder.Items
    25. 'Excel-Objekte öffnen
    26. xlApp = CreateObject("Excel.Application") 'Neue Excel-Instanz
    27. xlWorkbook = xlApp.Workbooks.Add 'Neues Workbook anlegen
    28. xlWorksheet = xlWorkbook.Sheets(1) 'Erstes Sheet
    29. xlWorksheet.Name = "Outlook-Kontakte" 'Worksheet benennen
    30. 'Excel-Worksheet aufbereiten
    31. With xlWorksheet
    32. 'Spaltenüberschriften
    33. .Cells(1, 1).Value = "Vorname"
    34. .Cells(1, 2).Value = "Nachname"
    35. .Cells(1, 3).Value = "E-Mail"
    36. .Cells(1, 4).Value = "Strasse"
    37. .Cells(1, 5).Value = "PLZ"
    38. .Cells(1, 6).Value = "Ort"
    39. .Cells(1, 7).Value = "Land"
    40. .Cells(1, 8).Value = "Telefon"
    41. .Rows("1:1").Font.Bold = True 'Spaltenüberschriften Fett
    42. 'Outlook-Kontakte nach Excel übertragen
    43. intRow = 2
    44. For Each itmContacts In olAll
    45. .Cells(intRow, 1).Value = itmContacts.FirstName
    46. .Cells(intRow, 2).Value = itmContacts.LastName
    47. .Cells(intRow, 3).Value = itmContacts.Email1Address
    48. .Cells(intRow, 4).Value = itmContacts.BusinessAddressStreet
    49. .Cells(intRow, 5).Value = itmContacts.BusinessAddressPostalCode
    50. .Cells(intRow, 6).Value = itmContacts.BusinessAddressCity
    51. .Cells(intRow, 7).Value = itmContacts.BusinessAddressCountry
    52. .Cells(intRow, 8).Value = itmContacts.BusinessTelephoneNumber
    53. intRow = intRow + 1
    54. Next itmContacts
    55. 'automatische Anpassung der Spaltenbreite (optimale Breite)
    56. .Columns.AutoFit()
    57. syncSuccess = True
    58. End With
    59. 'Ausgabe, ob der Export nach Excel erfolgreich war
    60. If syncSuccess = True Then
    61. MsgBox("Die Synchronisierung war erfolgreich", vbInformation)
    62. Me.Close()
    63. Else
    64. MsgBox("Die Synchronisierung ist fehlgeschlagen", vbInformation)
    65. End If
    66. 'Excel einblenden
    67. xlApp.Visible = True
    68. xlWorkbook.SaveAs("C:\Kontakte\Kontakte " & DateString & ".xlsx")
    69. 'Outlook beenden
    70. For Each Process In System.Diagnostics.Process.GetProcessesByName("outlook")
    71. Process.Kill()
    72. Next
    73. 'Excel beenden
    74. For Each Process In System.Diagnostics.Process.GetProcessesByName("excel")
    75. Process.Kill()
    76. Next
    77. ElseIf cmbAuswahl.Text = "Import (von Master-Vorlage)" Then
    78. olApp = CreateObject("Outlook.Application")
    79. xlApp = CreateObject("Excel.Application")
    80. 'Excel Datei mit vorhandenen Kontakten öffnen
    81. xlWorkbook = xlApp.Workbooks.Open("C:\Kontakte\Kontakte " & DateString & ".xlsx")
    82. xlWorksheet = xlWorkbook.Sheets(1)
    83. 'Der Versuch eine Zeile zu definieren um pro Zeile einen neuen Kontakt zu erstellen
    84. Row = xlWorksheet.Rows(intRow)
    85. intRow = 2
    86. For Each Row As Excel.Range In xlWorkbook.Sheets(1).Rows
    87. 'neuen Kontakt erzeugen
    88. olContact = olApp.CreateItem(Outlook.OlItemType.olContactItem)
    89. 'Eigenschaften zuweisen
    90. olContact.FirstName = "" + xlWorksheet.Cells(intRow, 1).Value
    91. olContact.LastName = "" + xlWorksheet.Cells(intRow, 2).Value
    92. olContact.Email1Address = "" + xlWorksheet.Cells(intRow, 3).Value
    93. olContact.BusinessAddressStreet = "" + xlWorksheet.Cells(intRow, 4).Value
    94. olContact.BusinessAddressPostalCode = "" + xlWorksheet.Cells(intRow, 5).Value
    95. olContact.BusinessAddressCity = "" + xlWorksheet.Cells(intRow, 6).Value
    96. olContact.BusinessAddressCountry = "" + xlWorksheet.Cells(intRow, 7).Value
    97. olContact.BusinessTelephoneNumber = "" + xlWorksheet.Cells(intRow, 8).Value
    98. intRow = intRow + 1
    99. Next Row
    100. syncSuccess = True
    101. If syncSuccess = True Then
    102. MsgBox("Die Synchronisierung war erfolgreich", vbInformation)
    103. Me.Close()
    104. Else
    105. MsgBox("Die Synchronisierung ist fehlgeschlagen", vbInformation)
    106. End If
    107. 'Outlook einblenden (funktioniert aus einen mir nicht eingänglichen Grund nicht, im Gegensatz zu Excel -> siehe oben)
    108. olApp.Visible = True
    109. ElseIf cmbAuswahl.Text = Nothing Then
    110. MsgBox("Wählen Sie eine Aktion aus!", vbInformation)
    111. End If
    112. End Sub
    113. End Class

    Adde schrieb:

    es fängt damit an, dass trotz des Befehls, welcher bei dem Eport
    einwandfrei funktioniert weder Outlook, noch Excel geöffnet werden
    Nicht geöffnet oder nicht sichtbar?
    Steht in den Objektvariablen olApp und xlApp etwas drin oder sind die Nothing?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Das hier hat der Debugger ausgegeben, nachdem ich ein Breakpoint in Z.100 gesetzt hab :

    Der Thread 0x14b8 hat mit Code 259 (0x103) geendet.
    "Export-Import-Kontakte.vshost.exe" (CLR v4.0.30319: Export-Import-Kontakte.vshost.exe): "C:\Users\Andreas\documents\visual studio 2013\Projects\Export-Import-Kontakte\Export-Import-Kontakte\bin\Debug\Export-Import-Kontakte.exe" geladen. Symbole wurden geladen.
    "Export-Import-Kontakte.vshost.exe" (CLR v4.0.30319: Export-Import-Kontakte.vshost.exe): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Runtime.Remoting\v4.0_4.0.0.0__b77a5c561934e089\System.Runtime.Remoting.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.
    Der Thread 0x6088 hat mit Code 259 (0x103) geendet.
    Der Thread 0x10dc hat mit Code 259 (0x103) geendet.
    Das Programm "[24400] Export-Import-Kontakte.vshost.exe" wurde mit Code 0 (0x0) beendet.
    Dann würde ich mal den Breakpoint etwas höher setzen und im Einzelschritt soweit gehen, bis du weisst, wo er abstürzt.
    Du kannst ja dein Late Binding mal ersetzen durch ein Strict-On-fähiges Dim xlApp As New Excel.Application.
    Vielleicht kriegst du dann genauere Informationen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hi, Ich habe nun den Code etwas abgeändert, dass es zumindest funkitioniert, dass Excel und Outlook geöffnet werden etc :D
    Nun ergibt sich beim Debuggen jedoch der Fehler: Ein Ausnahmefehler des Typs "System.InvalidCastException" ist in Microsoft.VisualBasic.dll aufgetreten.
    Zusätzliche Informationen: Ungültige Konvertierung von der Zeichenfolge in Typ Double.
    (Zeile 127)
    PS: Ich bin dir sehr dankbar für die Hilfe die du bereits geleistet hast :thumbsup:

    Hier der neue Code:

    ~entfernt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Adde“ ()

    Textverkettung wird mit dem &-Operator durchgeführt, nicht mit +.

    Möglich wäre aber auch
    olContact.FirstName = xlWorksheet.Cells(j, i).Text

    Wie schon erwähnt, wenn du Option Strict On einschalten würdest, hätte das die IDE schon lange angemeckert.
    Aber dann musst du vermutlich die Hälfte deines Codes nachbessern.
    Du kannst es dennoch versuchsweise mal einschalten, damit du siehst, wo du überall unsauber programmiert hast.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --