Wir wünschen allen Forenteilnehmern ein frohes Fest und einen guten Rutsch ins neue Jahr. x

csv-import
#1
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 Sad

Achja, da unsere EDV alle eingehenden Excels blockt, hier bitte nur Code schreiben.

Vielen Dank im Voraus

PS. Sch... jetzt werden alle xls geblockt Sad

Gruss Igel

2.Versuch


Angehängte Dateien
.xlsx   Test.xlsx (Größe: 155,24 KB / Downloads: 4)
Ich kann nicht alles wissen,
aber vieles lernen ! 19
Antworten Top
#2
Hallo Igel,

versuch mal so:
Code:
Sub CSV_import()

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:
  • Igelbauer
Antworten Top
#3
Moin Lutz,
Vielen Dank schon mal.
Werd ich testen, kann aber etwas dauern.
Ich meld mich dann.

Gruss Igel
Ich kann nicht alles wissen,
aber vieles lernen ! 19
Antworten Top
#4
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

End Sub


Sorry, wie ging das nochmal mit dem Codefenster

Gruss Igel
Ich kann nicht alles wissen,
aber vieles lernen ! 19
Antworten Top
#5
Hi Igel,

Deine Anforderungen:


Zitat:
  1. Ich kann aus meiner Brandmeldeanlage die Texte für Melder/Meldergruppe als .csv exportieren.
  2. Diese kopiere ich mir dann in meine grosse BMA-Datei.
  3. 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.

Ciao, Ralf

Antworten Top
#6
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 ?

Gruss Igel
Ich kann nicht alles wissen,
aber vieles lernen ! 19
Antworten Top
#7
Hallo Igel,

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


Angehängte Dateien Thumbnail(s)
   
[-] Folgende(r) 1 Nutzer sagt Danke an Lutz Fricke für diesen Beitrag:
  • Igelbauer
Antworten Top
#8
(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.

Ciao, Ralf

Antworten Top
#9
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. ???

Gruss Igel
Ich kann nicht alles wissen,
aber vieles lernen ! 19
Antworten Top
#10
Hi,

(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...
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste