16.05.2023, 13:17 (Dieser Beitrag wurde zuletzt bearbeitet: 16.05.2023, 13:46 von Igelbauer.)
Hallo Leute, ich brauch auch mal wiedr Hilfe. Ich kann aus meiner Brandmeldeanlage die Texte für Melder/Meldergruppe als .csv exportieren. Diese kopiere ich mir dann in meine grosse BMA-Datei. Dann muss ich die Texte von der csv ins Blatt "Peripherie" übertragen. Dazu hab ich mir ein kleines Makro zusammengekritzelt. Funktioniert auch fast schon. Nur... 1. kann es vorkommen, dass es Zellen mit Endeung /00 mehrfach gibt und der Text in alle übertragen werden muss. (Bsp. Zeile 27) 2. Falls eine "MG" nicht gefunden wird hab ich einen Fehler in meiner BMA-Datei. Das müsste ich natürlich wissen, um es korrigieren zu können. (Bsp. Zeile 28) Am Besten im Blatt "Fehler" ein kleiner Eintrag - "1908/01" nicht gefunden. o.ä.
Stark abgespeckte Test.xlsx habe ich beigefügt.
Mein Code:
Sub CSV_import() Dim MG As String Dim Celle As Range Dim Zelle As Range Dim Textneu As String
For Each Celle In Worksheets("csv").Range("C2:C1000") If Celle.Value = "" Then GoTo leer If Celle.Offset(0, 1).Value = "" Then MG = Celle.Text & "/00" ElseIf Len(Celle.Offset(0, 1).Text) = 1 Then MG = Celle.Text & "/0" & Celle.Offset(0, 1).Text Else: MG = Celle.Text & "/" & Celle.Offset(0, 1).Text End If
Textneu = Celle.Offset(0, 2).Text Set Zelle = Sheets("Peripherie").Columns("B:B").Find(what:=MG)
'falls es statt Einzeltexten nur einen Gruppentext gibt If Celle.Offset(0, 2).Value = "" Then Zelle.Offset(0, 7).Value = Zelle.Offset(-1, 7).Value Else: Zelle.Offset(0, 7).Value = Textneu End If
leer: Next Celle End Sub
So, hier komme ich nicht weiter
Achja, da unsere EDV alle eingehenden Excels blockt, hier bitte nur Code schreiben.
Dim MG As String Dim Celle As Range Dim Zelle As Range Dim Zeile as Integer Dim Textneu As String Dim blnGefunden As Boolean
For Each Celle In Worksheets("csv").Range("C2:C1000")
blnGefunden = False
If Celle.Value <> "" Then
If Celle.Offset(0, 1).Value = "" Then MG = Celle.Text & "/00" Else MG = Celle.Value & "/" & Format(Celle.Offset(0, 1), "00") End If
If Celle.Offset(0, 2).Text <> "" Then Textneu = Celle.Offset(0, 2).Text End If
For Zeile = 1 To 69 If Sheets("Peripherie").Cells(Zeile, 2).Value = MG Then Sheets("Peripherie").Cells(Zeile, 9).Value = Textneu blnGefunden = True End If Next Zeile
If blnGefunden = True Then blnGefunden = False Else Sheets("Fehler").Cells(Sheets("Fehler").Cells(Rows.Count, 1).End(xlUp).Row, 1) = MG & " nicht gefunden" End If End If Next Celle
End Sub
Code ist ungetestet.
Allerdings wird der beschriebene Fehler aus Zeile 28, dass in deiner BMA-Liste ein leeres Feld ist, nicht gefunden.
Du solltest bei der Benennung deiner Variablen deutlicher variieren, Celle, Cells, Zelle ist alles irgendwie sehr ähnlich.
Gruß, Lutz
Folgende(r) 1 Nutzer sagt Danke an Lutz Fricke für diesen Beitrag:1 Nutzer sagt Danke an Lutz Fricke für diesen Beitrag 28 • Igelbauer
So, jetzt hab ich mal ein wenig Zeit gefunden. Hab den Code vom Lutz nochmal überarbeitet. Variablen vernünftig benannt. (Bei meinen miserablen Augen echt besser) Der Ansatz mit dem Boolean war gut, nur die Reihenfolge passte nicht. Und noch ein paar andere Kleinigkeiten. Läuft ein wenig langsam, aber läuft. Bin mal gespannt wie es in der Originaldatei läuft, weil dort das Sheet "Peripherie" ca. 15000 Zeilen hat. Ich bin noch dran.
Code:
Sub CSV_import()
Dim strMG As String Dim rngCelle As Range Dim intRow As Integer Dim strNeu As String Dim blnGefunden As Boolean
For Each rngCelle In Worksheets("csv").Range("C2:C1000")
blnGefunden = False
If rngCelle.Value <> "" Then
If rngCelle.Offset(0, 1).Value = "" Then strMG = rngCelle.Text & "/00" Else strMG = rngCelle.Value & "/" & Format(rngCelle.Offset(0, 1), "00") End If
If rngCelle.Offset(0, 2).Text <> "" Then strNeu = rngCelle.Offset(0, 2).Text End If
For intRow = 1 To Sheets("Peripherie").UsedRange.Rows.Count If Sheets("Peripherie").Cells(intRow, 2).Value = strMG Then Sheets("Peripherie").Cells(intRow, 9).Value = strNeu blnGefunden = True End If Next intRow
If blnGefunden = False Then Sheets("Fehler").Cells(Sheets("Fehler").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row, 1) = strMG & " nicht gefunden" Else blnGefunden = False End If End If Next rngCelle
17.05.2023, 10:18 (Dieser Beitrag wurde zuletzt bearbeitet: 17.05.2023, 10:20 von Ralf A.)
Hi Igel,
Deine Anforderungen:
Zitat:
Ich kann aus meiner Brandmeldeanlage die Texte für Melder/Meldergruppe als .csv exportieren.
Diese kopiere ich mir dann in meine grosse BMA-Datei.
Dann muss ich die Texte von der csv ins Blatt "Peripherie" übertragen.
Dazu hab ich mir ein kleines Makro zusammengekritzelt.
Ich hab mir Dein Makro jetzt nicht angeschaut, aber, das ließe sich doch insgesamt vereinfachen: 1. Melder als csv speichern statt via Makro exportieren. Oder noch einfacher, diese Daten via PQ laden und entsprechend bearbeiten (womit 2. und 3. entfielen) 2. Wenn doch als csv gespeichert, diese csv per PQ laden und ggf. bearbeiten, womit sich 3. erledigt hätte, weil das über Laden in... gleich mit erschlagen wird.
Oder hab ich hier was falsch verstanden?
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben. Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.
17.05.2023, 11:09 (Dieser Beitrag wurde zuletzt bearbeitet: 17.05.2023, 11:10 von Igelbauer.)
Hi Ralf,
ich versuch es mal halbwegs knapp zu erklären.
Unsere BMA (Brandmeldeanlage) ist recht gross. Ca. 7500 Melder, Alt- und Neutechnik gemischt, 20 vernetzte Zentralen, zur Bedienung und
Visualisierung angekoppelter Rechner, Telefonansteuerung bei Alarm und, und, und.
Um das alles zu überwachen und dokumentieren hab ich schon vor 15 Jahren eine Excel-Datei
erstellt, die ALLE Informationen über die gesamte BMA beinhaltet. Usedrange ca. 300.000 Zellen ! Prüfzyklen, Wartungen, Alter der Melder, Batterien, Akkus aber auch technische Informationen.
Die Datei ist vollgestopft mit Makros zum Suchen, Filtern, Sortieren und viele andere Gimmicks. Vieles muss händisch gepflegt werden, aber irgendwie muss ich ja den Überblick behalten.
Alle 2 Jahre kontrolliert der TÜV meine Arbeit (DIN 14675) und war von Anfang an begeistert über
die Art wie ich es betreibe.
Das mit dem csv-import ist nur eine weitere Kleinigkeit um mir die Arbeit zu erleichtern.
Gruss Igel Ok, Laufzeit ist akzeptabel. Allerdings ist beim testen noch ein Problem aufgetaucht. Bei Texten mit Umlaut, die in der BMA korrekt angezeigt werden, wird beim csv-export zum Beispiel aus "Wärmeleitkabel" - "Wärmeleitkabel". Das kann ich in meiner BMA-Datei natürlich nicht gebrauchen. Hat da wer eine Idee ?
das Codefenster bekommst Du über die Schaltflächen über der Texteingabe (s. Screenshot).
Ok, dass wir über 15000 Zeilen reden, hast Du verschwiegen... Da wäre der Weg über Arrays angebracht. Oder auch ein bisschen mehr Grips in der "For intRow = 1 To Sheets("Peripherie").UsedRange.Rows.Count"-Schleife.
Theoretisch muss ja in der csv jeder Melder aus der Peripherie auftauchen und umgekehrt, beide in die richtige Reihenfolge gebracht usw.
Den Fehler in der csv-Datei kann der Exporteur der Datei korrigieren oder du suchst in jedem Schriftzug nach allen dir bekannten Fehlern...
Gruß, Lutz
Folgende(r) 1 Nutzer sagt Danke an Lutz Fricke für diesen Beitrag:1 Nutzer sagt Danke an Lutz Fricke für diesen Beitrag 28 • Igelbauer
(17.05.2023, 11:09)Igelbauer schrieb: ich versuch es mal halbwegs knapp zu erklären. ... ... Alle 2 Jahre kontrolliert der TÜV meine Arbeit (DIN 14675) und war von Anfang an begeistert über
die Art wie ich es betreibe.
...schon klar. Das ist zwar keine Erklärung dafür, weshalb Du es nicht auf einen einfacheren Weg versuchen willst, aber wenn der TÜV alle 2 Jahre begeistert ist, gibt es ja auch keinen Grund etwas verändern zu wollen...
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben. Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.
Hi Lutz, das mit den 15000 Zeilen hab ich verschwiegen und nur eine stark abgespeckte Beispieldatei geliefert. OK. Das mit den Arrays und mehr Grips bei der Schleife wüsste ich nicht umzusetzen. Die Melder sind in csv und Peripherie nicht gleich, da die Alttechnik keinen csv-export kann und auch bei der Neutechnik nur Teile exportiert werden. Unterzentralen/Objekte/Abschnitte. Aber im Test hat das Makro für eine Zentrale 2-3 s gebraucht. Kein Vergleich zu vorherigen händischen copy and paste.
Du hast mir für die ersten Probleme den richtigen Anschubs gegeben, ich hab es angepasst bekommen. Jetzt bleibt nur noch das Problem mit den Umlauten, aber auf die Entwicklungsabteilung bei Siemens hab ich wenig Einfluss. Ich fürchte damit muss ich leben.
Vielen Dank nochmal.
Ach, was dein Screenshot zeigt ist bei mir nicht vorhanden. ???
(17.05.2023, 11:09)Igelbauer schrieb: Bei Texten mit Umlaut, die in der BMA korrekt angezeigt werden, wird beim csv-export zum Beispiel aus "Wärmeleitkabel" - "Wärmeleitkabel".
Das liegt einfach daran, dass dein UTF8-Text als ANSI-Text ausgegeben wird - oder umgekehrt. Da musst du einfach an deinem Import feilen...