Anzeige
Archiv - Navigation
1220to1224
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

funktionierendes Makro umschreiben

funktionierendes Makro umschreiben
Sandra
Hallo zusammen,
ich habe ein ganz tolles Makro, das fuktioniert auch ohne Problem. Nun muss ich das ganze für ein anderes Projekt anpassen.
Meine Anpassung besteht in erste Linie daraus, dass sich die Zeilen von 64 bzw 65 auf 21 bzw 22 geändert haben. Dann noch die Speicherorte und die Spaltenbeschriftungen.
Eigentlich nicht schwer. Dennoch bekomme ich jetzt eine Fehlermeldung. Die lautet wie folgt:
Laufzeitfehler '13': Typen unverträglich
Wenn ich mit der Maus auf die gelb markierte Zeile gehe bekomme ich die Fehlermeldung nIndexXML = Fehler 2042.
Habt Ihr eine Idee?
Der Code selbst sieht so aus:
Sub Standard_Maengelliste()
Dim oXlSM As Workbook, oXML As Workbook
Dim nIndexXLSM, nIndexXLM, MaxRow As Long, nIndex As Long
Dim rngXLSM As Range, rngXML As Range, ArrayXLSM
Dim strFehler As String
Dim ArrayQuelle, ArrayZiel
Const sListZeichen$ = "• "
'hier stehen die Überschriften, nach denen gesucht wird
'Wichtig! Die Reihenfolge muss bei beiden identisch sein
ArrayQuelle = Array("Betrifft", "verortete Zustandsbeschreibung", "Mangelart", "Vertragsart", " _
Gewerke-gruppe", "Gewerk", "Bauteil", "Geschoss", "Level C", "Level D", "Raum", "Achse", "Foto", "Frist", "Nachfrist", "letzte Nachfrist", "Auftragnehmer", "funktional", "Vorbereitung der Abnahme", "sicherheitsrelevant", "Restleistung", "Anspruch unsicher")
ArrayZiel = Array("betrifft", "Zustandsbeschreibung", "Mangelart", "Vertragsart", " _
Gewerkegruppe", "Gewerk", "Bauteil", "Geschoss", "Level C", "Level D", "Raum", "Achse", "Foto", "Frist", "Nachfrist", "letzte Nachfrist", "Auftragnehmer", "funktional", "Vorbereitung der Abnahme", "sicherheitsrelevant", "Restleistung", "Anspruch unsicher")
'hier wird festgelegt welche Datei geöffnet werden soll und wo diese gespeichert ist
Set oXML = Workbooks.Open(Filename:= _
"\\xxx.xxx.xx.x\xxx-xxxxxxxx\xxxxxxxx\xxxx\xx-xx xxx\xxxx xxxxxx\" & _
"xxxx xxxxxx\xxx xxxxxxx xxxxxxxxxx.xml")
Set oXlSM = ThisWorkbook 'ThisWorkbook = die xlsm-Datei, in der dieser Code steht
For nIndex = LBound(ArrayQuelle) To UBound(ArrayQuelle)
With oXlSM.Sheets("Mängel vor der Abnahme") 'Name des Tabellenblattes, welches in der xlsm- _
Datei benutzt wird
nIndexXLSM = Application.Match(ArrayQuelle(nIndex), .Rows(2), 0) 'sucht in der Zeile 2  _
nach den Spaltenbeschriftungen
If IsNumeric(nIndexXLSM) Then
MaxRow = .Cells(.Rows.Count, nIndexXLSM).End(xlUp).Row 'letzte Zeile in Spalte
Set rngXLSM = .Range(.Cells(3, nIndexXLSM), .Cells(MaxRow, nIndexXLSM))
If MaxRow > 3 Then
ArrayXLSM = rngXLSM
ElseIf MaxRow = 3 Then
ArrayXLSM = rngXLSM.Resize(, 2)
ReDim Preserve ArrayXLSM(1 To UBound(ArrayXLSM), 1 To 1)
End If
'Fehlermeldung die ausgegeben wird, wenn eine festgelegte Spaltenüberschrift nicht  _
in der xlsm-Datei gefunden werden konnte
strFehler = strFehler & sListZeichen & "Die Spalte'" & _
ArrayQuelle(nIndex) & "' wurde nicht in der Quell-Datei gefunden" &  _
vbCr
End If
End With
If IsArray(ArrayXLSM) Then
With oXML.Sheets("neue Zustandsbeschreibungen") 'Name des Tabellenblattes, welches in  _
der xml-Datei benutzt wird
nIndexXML = Application.Match(ArrayZiel(nIndex), .Rows(21), 0) 'sucht in der Zeile  _
21 nach den Spaltenbeschriftungen
If IsNumeric(nIndexXLM) Then
'alle Inhalte der Zellen ab Zeile 22 werden für neue Daten gelöscht
.Range(.Cells(22, nIndexXML), .Cells(.Rows.Count, nIndexXML)).ClearContents
Set rngXLM = .Cells(22, nIndexXML) 'erste Einfügezelle
rngXLM.Resize(UBound(ArrayXLSM), 1) = ArrayXLSM 'Daten aus Array einfügen
Else
strFehler = strFehler & sListZeichen & "Die Spalte'" & _
ArrayZiel(nIndex) & "' wurde nicht in der Ziel-Datei gefunden" &  _
vbCr
End If
End With
End If
ArrayXLSM = Empty
Next nIndex
Dim Sh_neue_Zustandsbeschreibungen As Worksheet
Dim iCalc As Long
On Error GoTo ErrExit
Set Sh_neue_Zustandsbeschreibungen = Sheets("neue Zustandsbeschreibungen") 'hier wird das  _
Tabellenblatt beschrieben, wo die Leerzeilen gelöscht werden sollen
With Application
iCalc = .Calculation
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
'hier erfolgt die Abschaltung des Blattschutzes
With Sh_neue_Zustandsbeschreibungen
.Unprotect
'hier werden Zeilen die komplett leer sind gelöscht
With .UsedRange.Columns(.UsedRange.Columns.Count).Offset(0, 1)
.FormulaR1C1 = "=IF(AND(ROW()>22,RC1&RC2=""""),TRUE(),ROW())"
Sh_neue_Zustandsbeschreibungen.UsedRange.Sort .Cells(1, 1), xlAscending, , , , , , xlNo
On Error Resume Next
.SpecialCells(xlCellTypeFormulas, 4).EntireRow.Delete
On Error GoTo ErrExit
.EntireColumn.Delete
End With
'hier wird der Blattschutz wieder aktiviert
.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFormattingCells:=True, AllowFormattingColumns:=True, _
AllowFormattingRows:=True, AllowInsertingColumns:=True, AllowInsertingRows _
:=True, AllowInsertingHyperlinks:=True, AllowDeletingColumns:=True, _
AllowDeletingRows:=True, AllowSorting:=True, AllowFiltering:=True, _
AllowUsingPivotTables:=True
End With
ErrExit:
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = iCalc
End With
Set Sh_neue_Zustandsbeschreibungen = Nothing
'hier erfolgt die Prüfung nach ggf. vergessenen Zellen
Dim zeile As Long, spalte As Long
Dim i As Integer
Dim strausgabe As String, strzelle As String, x As String
Dim wks As Worksheet
Dim check As Boolean
Set wks = Sheets(1)
Dim spalten()
Dim spaltennamen()
Dim spaltenausgabe()
x = ""
spalten() = Array(5, 6, 7, 15, 18)
spaltennamen() = Array("In der Spalte Mangelart (E)", "In der Spalte Vertragsart (F)", "In der  _
Spalte Gewerk (G)", "In der Spalte Frist (O)", "In der Spalte Auftragnehmer (R)")
spaltenausgabe() = Array(x, x, x, x, x, x, x, x)
For i = 0 To UBound(spalten())
spaltenausgabe(i) = spaltennamen(i) & " in den Zeilen: "
Next i
With wks
For zeile = 22 To 500
If .Cells(zeile, 2).Value  "" Then
For i = 0 To UBound(spalten())
On Error GoTo schleife
If Cells(zeile, spalten(i)).Value = 0 Then
schleife:
spaltenausgabe(i) = spaltenausgabe(i) & vbCrLf & zeile & ",  " & vbCrLf
check = True
End If
Next i
End If
Next zeile
End With
If check = True Then
For i = 0 To UBound(spalten())
strausgabe = strausgabe & spaltenausgabe(i) & vbCrLf
Next i
MsgBox "Fehlerhaft ausgefüllte Zellen: " & vbCrLf & vbCrLf & _
strausgabe
Else
MsgBox "Es konnten keine leeren Zellen in den Spalten Mangelart (E), Vertragsart (F),  _
Gewerk (G), Frist (O) und Auftragnehmer (R) gefunden werden!"
End If
'Spalte Frist = Datumsformat
Columns("O:O").Select
Selection.NumberFormat = "dd/mm/yyyy"
'speichern der xlm-Datei
Dim Dateiname As String
Dateiname = Left(oXlSM.Name, Len(oXlSM.Name) - 5)
ActiveWorkbook.SaveAs Filename:="\\xxx.xxx.xx.x\xxx-xxxxxxxx\xxxxxxxx\xxxx\xx-xx xxx\xxxx  _
xxxxxx\xxxx xx xxxxx\xxxx\" & Dateiname & ".xml"
End Sub

Vielen lieben Dank & Gruß
Sandra
AW: funktionierendes Makro umschreiben
04.07.2011 11:56:19
Reinhard
Hallo Sandra,
schau dir mal deinen Beitrag an und kopiere ihn mal raus.
Fällt dir auf daß da fehlerhafte Zeilen entstanden sind!?
Also formatiere den Code VOR dem Posten so daß er nicht zu breit ist.
Benutze Option Explicit, dann passiert dir dieses nicht mehr:
nIndexXML = Application.Match(ArrayZiel(nIndex), .Rows(21), 0)
If IsNumeric(nIndexXLM) Then
Nachfolgend der Code wie er auch hier hätte erscheinen sollen/können.
Gruß
Reinhard

Option Explicit
Sub Standard_Maengelliste()
Dim oXlSM As Workbook, oXML As Workbook
Dim nIndexXLSM, nIndexXLM, MaxRow As Long, nIndex As Long
Dim rngXLSM As Range, rngXML As Range, ArrayXLSM
Dim strFehler As String
Dim ArrayQuelle, ArrayZiel
Const sListZeichen$ = "• "
'hier stehen die Überschriften, nach denen gesucht wird
'Wichtig! Die Reihenfolge muss bei beiden identisch sein
ArrayQuelle = Array("Betrifft", "verortete Zustandsbeschreibung", "Mangelart" _
, "Vertragsart", " Gewerke-gruppe", "Gewerk", "Bauteil", "Geschoss", "Level C" _
, "Level D", "Raum", "Achse", "Foto", "Frist", "Nachfrist", "letzte Nachfrist" _
, "Auftragnehmer", "funktional", "Vorbereitung der Abnahme", _
"sicherheitsrelevant", "Restleistung", "Anspruch unsicher")
ArrayZiel = Array("betrifft", "Zustandsbeschreibung", "Mangelart", "Vertragsart" _
, " Gewerkegruppe", "Gewerk", "Bauteil", "Geschoss", "Level C", "Level D" _
, "Raum", "Achse", "Foto", "Frist", "Nachfrist", "letzte Nachfrist" _
, "Auftragnehmer", "funktional", "Vorbereitung der Abnahme" _
, "sicherheitsrelevant", "Restleistung", "Anspruch unsicher")
'hier wird festgelegt welche Datei geöffnet werden soll und wo diese gespeichert ist
Set oXML = Workbooks.Open(Filename:="\\xxx.xxx.xx.x\xxx-xxxxxxxx\xxxxxxxx\xxxx\" _
& "xx-xx xxx\xxxx xxxxxx\" & "xxxx xxxxxx\xxx xxxxxxx xxxxxxxxxx.xml")
'ThisWorkbook = die xlsm-Datei, in der dieser Code steht
Set oXlSM = ThisWorkbook
For nIndex = LBound(ArrayQuelle) To UBound(ArrayQuelle)
'Name des Tabellenblattes, welches in der xlsm- Datei benutzt wird
With oXlSM.Sheets("Mängel vor der Abnahme")
'sucht in der Zeile 2 nach den Spaltenbeschriftungen
nIndexXLSM = Application.Match(ArrayQuelle(nIndex), .Rows(2), 0)
If IsNumeric(nIndexXLSM) Then
'letzte Zeile in Spalte
MaxRow = .Cells(.Rows.Count, nIndexXLSM).End(xlUp).Row
Set rngXLSM = .Range(.Cells(3, nIndexXLSM), .Cells(MaxRow, nIndexXLSM))
If MaxRow > 3 Then
ArrayXLSM = rngXLSM
ElseIf MaxRow = 3 Then
ArrayXLSM = rngXLSM.Resize(, 2)
ReDim Preserve ArrayXLSM(1 To UBound(ArrayXLSM), 1 To 1)
End If
'Fehlermeldung die ausgegeben wird, wenn eine festgelegte Spaltenüberschrift
'nicht in der xlsm-Datei gefunden werden konnte
strFehler = strFehler & sListZeichen & "Die Spalte'" & _
ArrayQuelle(nIndex) & "' wurde nicht in der Quell-Datei gefunden" & vbCr
End If
End With
If IsArray(ArrayXLSM) Then
'Name des Tabellenblattes, welches in der xml-Datei benutzt wird
With oXML.Sheets("neue Zustandsbeschreibungen")
'sucht in der Zeile 21 nach den Spaltenbeschriftungen
nIndexXML = Application.Match(ArrayZiel(nIndex), .Rows(21), 0)
If IsNumeric(nIndexXLM) Then
'alle Inhalte der Zellen ab Zeile 22 werden für neue Daten gelöscht
.Range(.Cells(22, nIndexXML), .Cells(.Rows.Count, nIndexXML)).ClearContents
Set rngXLM = .Cells(22, nIndexXML) 'erste Einfügezelle
rngXLM.Resize(UBound(ArrayXLSM), 1) = ArrayXLSM 'Daten aus Array einfügen
Else
strFehler = strFehler & sListZeichen & "Die Spalte'" & _
ArrayZiel(nIndex) & "' wurde nicht in der Ziel-Datei gefunden" & _
vbCr
End If
End With
End If
ArrayXLSM = Empty
Next nIndex
Dim Sh_neue_Zustandsbeschreibungen As Worksheet
Dim iCalc As Long
On Error GoTo ErrExit
'hier wird das Tabellenblatt beschrieben, wo die Leerzeilen gelöscht werden sollen
Set Sh_neue_Zustandsbeschreibungen = Sheets("neue Zustandsbeschreibungen")
With Application
iCalc = .Calculation
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
'hier erfolgt die Abschaltung des Blattschutzes
With Sh_neue_Zustandsbeschreibungen
.Unprotect
'hier werden Zeilen die komplett leer sind gelöscht
With .UsedRange.Columns(.UsedRange.Columns.Count).Offset(0, 1)
.FormulaR1C1 = "=IF(AND(ROW()>22,RC1&RC2=""""),TRUE(),ROW())"
Sh_neue_Zustandsbeschreibungen.UsedRange.Sort .Cells(1, 1), _
xlAscending, , , , , , xlNo
On Error Resume Next
.SpecialCells(xlCellTypeFormulas, 4).EntireRow.Delete
On Error GoTo ErrExit
.EntireColumn.Delete
End With
'hier wird der Blattschutz wieder aktiviert
.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFormattingCells:=True, AllowFormattingColumns:=True, _
AllowFormattingRows:=True, AllowInsertingColumns:=True, AllowInsertingRows _
:=True, AllowInsertingHyperlinks:=True, AllowDeletingColumns:=True, _
AllowDeletingRows:=True, AllowSorting:=True, AllowFiltering:=True, _
AllowUsingPivotTables:=True
End With
ErrExit:
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = iCalc
End With
Set Sh_neue_Zustandsbeschreibungen = Nothing
'hier erfolgt die Prüfung nach ggf. vergessenen Zellen
Dim zeile As Long, spalte As Long
Dim i As Integer
Dim strausgabe As String, strzelle As String, x As String
Dim wks As Worksheet
Dim check As Boolean
Set wks = Sheets(1)
Dim spalten()
Dim spaltennamen()
Dim spaltenausgabe()
x = ""
spalten() = Array(5, 6, 7, 15, 18)
spaltennamen() = Array("In der Spalte Mangelart (E)", _
"In der Spalte Vertragsart (F)", "In der Spalte Gewerk (G)", _
"In der Spalte Frist (O)", "In der Spalte Auftragnehmer (R)")
spaltenausgabe() = Array(x, x, x, x, x, x, x, x)
For i = 0 To UBound(spalten())
spaltenausgabe(i) = spaltennamen(i) & " in den Zeilen: "
Next i
With wks
For zeile = 22 To 500
If .Cells(zeile, 2).Value  "" Then
For i = 0 To UBound(spalten())
On Error GoTo schleife
If Cells(zeile, spalten(i)).Value = 0 Then
schleife:
spaltenausgabe(i) = spaltenausgabe(i) & vbCrLf & zeile & ",  " & vbCrLf
check = True
End If
Next i
End If
Next zeile
End With
If check = True Then
For i = 0 To UBound(spalten())
strausgabe = strausgabe & spaltenausgabe(i) & vbCrLf
Next i
MsgBox "Fehlerhaft ausgefüllte Zellen: " & vbCrLf & vbCrLf & _
strausgabe
Else
MsgBox "Es konnten keine leeren Zellen in den Spalten Mangelart (E), " _
& "Vertragsart (F), Gewerk (G), Frist (O) und Auftragnehmer (R) gefunden werden!"
End If
'Spalte Frist = Datumsformat
Columns("O:O").Select
Selection.NumberFormat = "dd/mm/yyyy"
'speichern der xlm-Datei
Dim Dateiname As String
Dateiname = Left(oXlSM.Name, Len(oXlSM.Name) - 5)
ActiveWorkbook.SaveAs _
Filename:="\\xxx.xxx.xx.x\xxx-xxxxxxxx\xxxxxxxx\xxxx\xx-xx xxx\xxxx xxxxxx\xxxx" _
& "xx xxxxx\xxxx\" & Dateiname & ".xml"
End Sub

Anzeige
AW: funktionierendes Makro umschreiben
04.07.2011 12:34:11
Sandra
Hallo Reinhard,
wie kann ich den Code vorher richtig formatieren? Einfach Zeilenumbrüche einfügen?
Deine Codezeile existiert in meinem Makro schon (fetter Text), das Problem taucht darunter auf (kursiver Text):
If IsArray(ArrayXLSM) Then
With oXML.Sheets("neue Zustandsbeschreibungen") 'Name des Tabellenblattes, welches in der xml-Datei benutzt wird
nIndexXML = Application.Match(ArrayZiel(nIndex), .Rows(21), 0) 'sucht in der Zeile 21 nach den Spaltenbeschriftungen
If IsNumeric(nIndexXLM) Then
'alle Inhalte der Zellen ab Zeile 22 werden für neue Daten gelöscht
.Range(.Cells(22, nIndexXML), .Cells(.Rows.Count, nIndexXML)).ClearContents
Set rngXLM = .Cells(22, nIndexXML) 'erste Einfügezelle
rngXLM.Resize(UBound(ArrayXLSM), 1) = ArrayXLSM 'Daten aus Array einfügen
Else
strFehler = strFehler & sListZeichen & "Die Spalte'" & _
ArrayZiel(nIndex) & "' wurde nicht in der Ziel-Datei gefunden" & vbCr
End If
End With
End If
ArrayXLSM = Empty
Next nIndex
Ich habe jetzt mal Deinen Code komplett übernommen, da bekomme ich dann eine neue Meldung.
Userbild
Userbild
:(
Hast Du da eine weitere Idee?
Gruß
Sandra
Anzeige
AW: funktionierendes Makro umschreiben
04.07.2011 13:07:21
Sandra
Danke!
AW: funktionierendes Makro umschreiben
04.07.2011 14:24:43
Rudi
Hallo,
Ich habe jetzt mal Deinen Code komplett übernommen, da bekomme ich dann eine neue Meldung.
du benutzt nIndexXLM. Definiert hast du nIndexXLSM.
nIndexXML = Application.Match(ArrayZiel(nIndex), .Rows(21), 0)
der Wert ist in Zeile 21 vermutlich nicht vorhanden.
Gruß
Rudi
AW: funktionierendes Makro umschreiben
04.07.2011 15:15:50
Sandra
Hallo Rudi,
jetzt hab ich den Fehler. XLSM ist richtig. Aber bei der XLM ist ein Buchstabendreher. Das muss eigentlich XML heißen.
Besten Dank & Gruß
Sandra
und deshalb ist es immer gut, ...
04.07.2011 15:36:38
Rudi
Hallo,
... wenn man die Deklaration von Variablen erzwingt (option Explicit).
Gruß
Rudi
Anzeige
AW: funktionierendes Makro umschreiben
06.07.2011 18:03:16
Reinhard
Hallo Sandra,
"wie kann ich den Code vorher richtig formatieren? Einfach Zeilenumbrüche einfügen?"
Ja, in deinem VB-Editor.
Worauf ich hinauswill ist wenn du überlange Codezeilen hier im Code bei herber zeigst so bricht die Software von herber die schon nach irgendeinem System um, aber wenn dann jmd. diesen Code dann rauskopiert und bei sich im VB-Editor einfügt so mag der VB-Editor manche Umbrüche von herber nicht.
Beschränkst du selbst vorher die Breite deines Codes so daß dein VB-Editor das akzeptierst, Faustregel, was rechts aus dem Bildschirm wandert ist zu lang, so greift die Formatierung von Herber nicht ein.
Zu der "neuen" Fehlermeldung. Sie kam durch Benutzung von Option Explicit und weist dich darauf daß du im Code eine Variable benutzt die du nicht mit Dim deklariert hast.
Du hast leider nicht das was ich dir mit dem:
Benutze Option Explicit, dann passiert dir dieses nicht mehr:
nIndexXML = Application.Match(ArrayZiel(nIndex), .Rows(21), 0)
If IsNumeric(nIndexXLM) Then
mitteilen wollte verstanden. Du hast nicht den Unterschied zwischen XML und XLM gesehen in "meinen" zwei Zeilen. Geanu und auch deshalb gibt es Option Explicit, dadurch sieht der Debugger sowas und reagiert.
In Extras---Optionen im VB-Editor mach das Häkchen bei
[X] Variablendeklaration erforderlich
Gruß
Reinhard
Anzeige
AW: funktionierendes Makro umschreiben
08.07.2011 00:05:10
Sandra
Hallo Rudi,
besten Dank für die nachträgliche Erläuterung. Ich gelobe Besserung. :) Man wär ich froh so durchzublicken wie Ihr!!!
Vielen lieben Dank für die tolle Hilfe!!
Gruß
Sandra
AW: funktionierendes Makro umschreiben
08.07.2011 00:07:10
Sandra
Hallo Reinhard,
auch Dir 1.000 Dank für die tolle Hilfe und Erläuterung!!! Ich kenne mich leider nicht so aus. Von Option Explicit hatte ich vorher nie etwas gehört. :(
Besten Dank für alles. Bei Euch frage ich immer wieder gern. :)
Gute Nacht alle zusammen!!!
Gruß
Sandra

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige