Tool zur Dateisuche mit einer Exceldatei als Suchmatrix

  • Guten Abend,

    ich brauche wohl doch etwas mehr "Starthilfe" ^^
    Und zwar will ich ein Tool schreiben das mir Werte aus einer Exceldatei, in einem Ordner sucht und diese File Liste dann in einer .txt speichert

    Zitat

    Beispiel: suche nach "M25890102004K" in Ordner "..\S15" und speichere alle gefunden Dateinamen in einer .txt

    geplante Vorgehensweise:
    1. suche in Zeile 1 nach InputBox (z.B. MSN 16) und lese bei gefundener Nr die darunterliegende 2 Spalten in Array 1
    2. hole aus einem Verzeichnis die Dateiliste in Array 2 (FileListToArray?)
    3. die Formate beider Arrays unterscheiden sich und müssen angepasst werden (StringSplit?)

    Erstmal nur die Frage Zu 1.: Wie bekomme ich es hin das 2 Spalten unter dem Suchbegriff der Inputbox eingelesen werden?

    Das habe ich bisher

    Spoiler anzeigen
    [autoit]

    #include<Array.au3>
    #include<Excel.au3>
    #include<File.au3>
    #include<String.au3>
    ;~ #include<ExcelCOM_UDF.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; //////////////////QuellDatei auswählen
    $BlankStat = FileOpenDialog("Datei öffnen", "G:\Ham_Änderung\AEND_2013_06_07_A400M\Orig" & "\", "Excel (*xls;*.xlsx)", 1+2)

    [/autoit] [autoit][/autoit] [autoit]

    $aSheet = Inputbox("Sektion wählen", "Welche Sektion?" & @CRLF & "z.B.: S13; S15...", "S15", "", 100, 130)

    [/autoit] [autoit][/autoit] [autoit]

    $aMSN = Inputbox("MSN wählen", "Welche MSN?", "16", "", 100, 130)

    [/autoit] [autoit][/autoit] [autoit]

    ; /////////////////$oExcel = QuellDatei öffen, Sheet aktivieren
    $oExcel = _ExcelBookOpen($BlankStat, 1)
    _ExcelSheetActivate($oExcel, $aSheet)

    [/autoit] [autoit][/autoit] [autoit]

    ;//////////////////MSN Nr finden////////////////aus der ExcelCOM_UDF "geklaut"^^
    $MSNSelect = _ExcelFindInRange($oExcel, $aMSN, 1, 1, 1, 1, 0, 2)

    [/autoit] [autoit][/autoit] [autoit]

    ;/////////////////Spalten un er MSN Nr in Array einlesen
    $aArray = _ExcelReadSheetToArray($oExcel, 3, $MSNSelect[1][2], 0, 1, True)

    [/autoit] [autoit][/autoit] [autoit]

    ;/////////////////Verzeichnis der NC Dateien auswählen
    $oVerz = FileSelectFolder("Datei öffnen", "O:\SCHNITT_IGES_2003_02_25\A400M", "")
    $FileList = _FileListToArray($oVerz, "*.nc", 1)
    If @error = 1 Then
    MsgBox(0, "", "Keine Ordner gefunden.")
    Exit
    EndIf
    If @Error=4 Then
    MsgBox (0,"","Keine Dateien gefunden.")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay($FileList, "Ordnerinhalt")
    _ArrayDisplay($aArray, "Excelinhalt")

    [/autoit] [autoit][/autoit] [autoit]

    $aArray1 = StringReplace("M258_90118_000C_20c.nc", "_", "")

    [/autoit]

    Ich hoffe das jemand mein Kauderwelsch versteht und mir dabei helfen kann.  :D
    Grüße Elmar

    Bild1: Quelldaten nach denen im Verzeichnis gesucht wird(Excel)
    Bild2: Dateinamen die eingelesen werden sollen (Verzeichnis)
    Bild3: fertig generierte Textdatei

  • *edit* siehe 1. und 3. Post von mir

    2 Mal editiert, zuletzt von ElmarFudd (13. Juni 2013 um 18:46)

    • Offizieller Beitrag

    Tut mir leid, aber deine Erklärungen und dein Code lassen mich nicht wirklich nachvollziehen, was du eigentlich vorhast.
    Wenn du schon Bilder einstellst, dann solltest du auch anhand der dort abgebildeten Daten ein Bsp. aufzeigen. Beschreibe den Vorgang bitte so, wie du es von Hand machen würdest, damit die Prozessreihenfolge ersichtlich wird.

  • Du hast recht, sorry.

    Dann versuche ich das mal verständlich zu erläutern...

    ich erhalte Excel-Tabellen als Bestelllisten, diese wiederum enthalten mehrere Arbeitsblätter , z.B. "S13", "S15", "S17", "S18",
    in den Arbeitsblättern steht immer in der 1. Zeile die Maschinennummern(MSN), z.B. MSN7-8; MSN9,
    unter den jeweiligen MSN stehen die Werte nach denen gesucht wird, z.B. bei MSN9 ist das Spalte "D", die Zeilenanzahl ist unterschiedlich
    (Spalte E sollte immer den aktuellsten Issue enhalten (leider nicht immer der Fall), daher erstmal nicht relevant)

    Ablauf:
    - angefordert wird z.B. Sektion 13, Maschine 9:
    - also gehe ich zu Tabellenblatt "S13" und suche MSN9 (also Spalte "D") und vergleiche den Inhalt der Zellen mit dem Verzeichnis, z.B. "\S13\", das die gleichnamigen Textdateien enthält
    - kopiere die kompletten Namen aller gefunden Dateien mit dem höchsten Buchstaben(Issue) im Dateinamen in eine Textdatei.

    Beispiel anhand Bild 1, :
    -Zelle "D5": "M25890102004" = Suchbegriff -> kopiere gefundene Dateiname(n) "M258_90102_004K_20b" und "M258_90102_004K_10j" in Textdatei
    -Zelle "D6": "M25890103004" = Suchbegriff -> kopiere gefundene Dateiname(n) "M258_90103_004K_20b" in Textdatei
    -Zelle "D7": "M25890104004" = Suchbegriff -> kopiere gefundene Dateiname(n) "M258_90104_004K_20b" und "M258_90104_004K_10d" in Textdatei
    usw. bis zur letzten gefüllten Zelle

    Es können mehrere Ergebnisse gefunden werden, eingelesen werden sollen aber nur die mit dem höchsten Buchstaben

    Problem 1: die Dateinamen in den Verzeichnissen enthalten Unterstriche (siehe Bild 2)
    diese Dateinamen bestehen immer aus der Nummer (M258_90102_004) + Issue(K) + Materialzusatz(_20b; _10j),
    es müssen jeweils alle Dateinamen die den Suchbgriff enhalten eingelesen werden

    Problem 2: die Issues können von A bis Z gehen, wobei A den niedrigsten und Z den höchsten darstellt
    M258_90102_004A_20b (False) --> M258_90102_004G_20b (False) --> M258_90102_004K_20b (True - diese soll eingelesen werden)

    Ich habe zum besseren Verständniss die Bilder und den Code im Start-Post aktualisiert.
    In Bild 3 sieht man die fertige TXT, die dann von einem Programm weiter verarbeitet wird.

    Ich hoffe es ist diesmal verständlicher. Ausfürlicher gehts kaum ist so schon ne Menge Text geworden, sorry nochmal wer bis hierher gekommen ist  ^^

    Ich hoffe das jemand einen Lösungsansatz für mich hat mit dem ich weiterarbeiten kann.

    Und wenn noch etwas unverständlich ist bitte fragen

    2 Mal editiert, zuletzt von ElmarFudd (14. Juni 2013 um 15:22)

    • Offizieller Beitrag

    OK, das ist wesentlich verständlicher. ;)
    Zu Problem 1:
    M258_90102_004...
    - M258 immer ein Buchstabe + 3 Ziffern?
    - 90102 immer 5 Ziffern?
    - 004 immer 3 Ziffern?

    Edit: Da hast du dich aber irgendwie vertan, den von dir als "D5" benannten Wert (M25890102004) gibt es in der Tabelle gar nicht. "D5" enthält hier M25890119004. Meintest du "D6" (M25890120004) ?

    Und was ich überhaupt nicht verstehe: Welchen Sinn hat die Excel-Tabelle? Du entnimmst aus der Tabelle keinerlei Werte für die weiteren Abläufe. Dein Suchbegriff selbst enthält bereits den Stamm für die zu suchenden Dateinamen, es müssen nur noch "_" eingefügt werden und Buchstaben für die neueste Version. Oder habe ich das falsch verstanden?

    Zu Problem 2:
    Das stellt kein Problem dar. Einfach solange lesen bis für den Buchstaben der höchste ASCII-Wert erreicht ist.

    Gesendet von meinem GT-I9001 mit Tapatalk 2

  • zu Problem 1: 3x ja ^^

    *narf* falsches Tabellenblatt, die Beschreibung bezieht sich auf Tabellenblatt "S13" :whistling: hab mal angepasst
    man sollte eben nicht 3 Sachen gleichzeitig machen...zumindest nicht von Hand :D

    Es sind die Suchergebnisse mit den Materialzusätzen an die ich ran will. (s. Bild 2 & 3), da die fertige TXT von einem Programm für einen Table-Cutter weiter verarbeitet wird.

    Zitat

    Beispiel anhand Bild 1, :
    -Zelle "D5": "M25890102004" = Suchbegriff -> kopiere gefundene Dateiname(n) "M258_90102_004K_20b" und "M258_90102_004K_10j" in Textdatei
    -Zelle "D6": "M25890103004" = Suchbegriff -> kopiere gefundene Dateiname(n) "M258_90103_004K_20b" in Textdatei
    -Zelle "D7": "M25890104004" = Suchbegriff -> kopiere gefundene Dateiname(n) "M258_90104_004K_20b" und "M258_90104_004K_10d" in Textdatei


    Jedes Teil besteht aus einer festen Stammnummer = M258...90102, 90103, 90304, und verschiedenen Varianten = 000, 002, 004
    Diese erhalten, auch wenn nur die kleinste Sache geändert wird einen neuen Änderungsbustaben(Issue) = A, D, J, K.
    Ergibt: M258_90102_004K_MaterialX...die Unterstriche sind im Programm so festgelegt worden zu besseren Lesbarkeit, und sind leider fest.
    Ich muss "nur" dafür sorgen das zum Zeitpunkt der Bestellung, die richtigen Teile mit der aktuellsten Änderung geschnitten werden.
    Ein Teil besteht meist aus unterschiedlichen Materialien und ich brauche eben alle Materialien, die die Nummer aus der Exceltabbelle und den höchsten Änderungsbuchstaben enthalten.

    Zu Problem 2: das freut mich das es für Dich kein Problem ist ;)

    • Offizieller Beitrag
    Zitat

    -Zelle "D5": "M25890102004" = Suchbegriff

    Das Wort hatte mich irritiert. Meine Lesart war: -Zelle "M25890102004" ist der Suchbegriff der auf die Excel-Tabelle angewendet wird. Aber wenn ich das jetzt (hoffentlich) richtig verstehe, wird dieser Suchbegriff auf den Dateiordner angewendet.
    OK, ich werde mal ein kurzes Muster erstellen und posten.

    Achja - was hat es mit den Einträgen: "M25890..... - S.13 A" auf sich?

  • Zitat

    wird dieser Suchbegriff auf den Dateiordner angewendet.

    Genau.

    Zitat

    Achja - was hat es mit den Einträgen: "M25890..... - S.13 A" auf sich?

    Jede MSN ist nochmal in Bereiche aufgeteilt, Bereich A, B, C,..(erkennt man etwas an der Rahmenformatierung in Excel)
    Das sind sowas wie Teilüberschriften und für die Suche nicht relevant, bzw werden die nicht gefunden da die Nummern nicht im Verzeichnis existieren.
    Da baue ich evtl. eine Listbox (oder so was in der Art) ein, wo das Script am Ende die nicht gefundenen Einträge auflistet und in einer seperaten TXT speichert.
    Was sowieso sinnvoll wäre, wenn er mal einen Eintrag nicht findet.
    Da habe ich aber grad keine andere Idee.
    Viel lernen ich noch muss :D

    • Offizieller Beitrag

    Mir ist gerade ein elementarer Fehler im Aufbau deiner Excel-Tabelle aufgefallen: Die Maschinennummern sind nicht in gleicher Relation mit den zugehörigen Daten verknüpft. Das ist unklug, da es durch notwendige Ausnahmebetrachtungen eine Fehlerquelle darstellt:
    - A1 - MSN7-8 - Daten in Spalte A
    C1 - MSN9 - Daten in Spalte D !!
    - G1 - MSN10-12, 14-15 - Daten in Spalte G

    Wenn dieser Fehler ausschließlich MSN9 betrifft kann man das in der Abfrage berücksichtigen. Besser wäre aber in jedem Fall, das Tabellenblatt logisch korrekt aufzubauen, also für MSN9 die Daten auch in Spalte C. (Einfach den Zellverbund für "MSN7-8" um eine Spalte erweitern.)

    • Offizieller Beitrag

    Unter Berücksichtung der korrekten Zuordnung MSN <--> Daten sollte dieses Skript den Anforderungen gerecht werden. Wie du siehst, minimiere ich den Vergleichsaufwand etwas, indem ich aus den nc-Dateien vorher nur die mit den höchsten Buchstaben im Namen extrahiere.

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $sFolder = 'Ordner_nc_Dateien'
    $sPathXLS = "Pfad_zur_XLS"
    $sSheet = 'S15'
    $sMSN = 'MSN9'

    [/autoit] [autoit][/autoit] [autoit]

    $aFromMSN = _GetListFromMSN($sPathXLS, $sSheet, $sMSN)
    $aNewFiles = _GetFileListNewest($sFolder)
    $sToWrite = ''

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To UBound($aFromMSN) -1 ; kann etwas dauern, da jedes MSN-Ergebnis mit jeder neuesten Datei verglichen wird
    $sFileRoot = StringRegExpReplace($aFromMSN[$i], '(\w\d{3})(\d{5})(\d{3})', '$1_$2_$3')
    For $j = 1 To $aNewFiles[0]
    If StringLeft($aNewFiles[$j], 14) = $sFileRoot Then $sToWrite &= $aNewFiles[$j] & @CRLF
    Next
    Next
    ;~ FileWrite('Datei', $sToWrite)
    ConsoleWrite($sToWrite & @LF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _GetListFromMSN($_sPathXLS, $_sSheet, $_sMSN)
    Local $fOpen = True, $oExcel = ObjGet($_sPathXLS)
    If @error Then
    $oExcel = ObjCreate("Excel.Application")
    $oExcel.Visible = 0
    $oExcel.Workbooks.Open($_sPathXLS)
    $fOpen = False
    EndIf
    Local $oSheet = $oExcel.Sheets($_sSheet)
    ; === letzte Zeile
    Local $iRows = $oExcel.Worksheets($_sSheet).UsedRange.Rows.Count
    ; == letzte Spalte
    Local $iColumns = $oExcel.Worksheets($_sSheet).UsedRange.Columns.Count
    ; == MSN suchen
    Local $oCell, $iVal, $CellMSN = ''
    For $i = 0 To $iColumns -1
    $oCell = $oSheet.Range("A1").Offset(0, $i)
    If $oCell.Value == $_sMSN Then
    $CellMSN = StringReplace($oCell.Address, '$', '')
    ExitLoop
    EndIf
    Next
    If $CellMSN = '' Then Return MsgBox(0, 'Fehler', 'MSN: "' & $_sMSN & '" nicht vorhanden.')
    ; == aus allen Zellen der Spalte die Werte in ein Array übernehmen
    Local $aOut[$iRows], $iCount = 0
    For $i = 1 To $iRows -1
    $iVal = $oSheet.Range($CellMSN).Offset($i, 0).Value
    If $iVal <> '' Then
    $iVal = StringLeft($iVal, 12)
    If StringRight($iVal, 1) <> ' ' Then
    $aOut[$iCount] = $iVal
    $iCount += 1
    EndIf
    EndIf
    Next
    ReDim $aOut[$iCount]
    If Not $fOpen Then $oExcel.Application.Quit
    Return $aOut
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ; == aus dem Ordner nur die Dateien mit den höchsten Buchstaben extrahieren
    Func _GetFileListNewest($_sPath)
    If StringRight($_sPath, 1) = '\' Then $_sPath = StringTrimRight($_sPath, 1)
    Local $FileList = _FileListToArray($_sPath, "*.nc", 1)
    _ArraySort($FileList, 0, 1)
    Local $sList = '', $sLeft, $sRight, $index, $maxIndex
    For $i = 1 To $FileList[0]
    $sLeft = StringLeft($FileList[$i], 14)
    $sRight = StringRight($FileList[$i], 7)
    $maxIndex = 0
    For $j = 65 To 90 ; A - Z
    $iStart = $maxIndex
    If $j = 65 Then $iStart = 1
    $index = _ArraySearch($FileList, $sLeft & Chr($j) & $sRight, $iStart)
    If $index > $maxIndex Then $maxIndex = $index
    Next
    If Not StringInStr($sList, $FileList[$maxIndex]) Then $sList &= $FileList[$maxIndex] & ' '
    Next
    Local $aOut = StringSplit(StringTrimRight($sList, 1) , ' ')
    _ArraySort($aOut, 0, 1)
    Return $aOut
    EndFunc

    [/autoit]
  • Guten Morgen.

    Erstmal dazu

    Zitat

    - A1 - MSN7-8 - Daten in Spalte A
    - C1 - MSN9 - Daten in Spalte D !!
    - G1 - MSN10-12, 14-15 - Daten in Spalte G

    Das ist zum Glück nur optisch und liegt an der fehlenden/falschen Formatierung. MSN9 steht in Spalte D1.

    Zu Deinem Script... :thumbup:
    Danke das Du Dir die Mühe gemacht hast, und das um die Uhrzeit  ^^
    Es gibt mir auf jeden Fall mehr Einblicke in die Funktionsweise von AutoIt als die faden Beispiele aus der Hilfe.


    1 Frage hätte ich gleich:

    Zitat

    If $oCell.Value == $_sMSN Then
    $CellMSN = StringReplace($oCell.Address, '$', '')
    ExitLoop

    Hier verstehe ich leider nicht ganz wo Du das $-Zeichen ersetzt?
    Es werden auch nur die exakten Werte gefunden, z.B. "MSN7-8", "MSN9", also der komplette Zellinhalt.
    Kann man das so schreiben der er z.B. nur "7" oder "9" findet?
    Das Problem hatte ich auch schon in meinem Script und habe es durch die Funktion _ExcelFindInRange aus der ExcelCOM_UDF gelöst, aber evtl kennst Du eine elegantere Lösung. ?(

    Gruß Elmar

    • Offizieller Beitrag

    Hier verstehe ich leider nicht ganz wo Du das $-Zeichen ersetzt?

    $CellMSN = StringReplace($oCell.Address, '$', '')
    $oCell ist die Referenz auf die Zelle und mit
    $oCell.Address hole ich mir die Adresse als Spalten/Zeilen-Bezug. Da die Zelle einen absoluten Bezug darstellt, wird dieser angegeben mit "$spalte$zeile" ;)

    Kann man das so schreiben der er z.B. nur "7" oder "9" findet?

    Das Problem bei einer insensitiven Suche wäre aber, dass z.B. die Suche nach "MSN1" auf "MSN10" zutreffen würde, wenn kein "MSN1" vorhanden ist. Wenn du derartiges ausschließen kannst ändere Zeile 40:

    [autoit]


    ; statt
    If $oCell.Value == $_sMSN Then
    ; verwende
    If StringInStr( $oCell.Value, $_sMSN ) Then
    ; für $_sMSN dann nur die Ziffer übergeben

    [/autoit]
  • Ahhh,
    und mit der Zeile drüber $oCell = $oSheet.Range("A1").Offset(0, $i) ergibt das sogar für mich Sinn.  ;)
    Also haben ganzen die Excel-Sachen (Objekte und Methoden) in AutoIt die gleiche Bedeutung wie im VBA? Und das ohne die <excel.au3>?

    Mit StringInstr funktioniert es tadellos.
    Danke  :)


    Wenn Du nichts dagegen hast, lass ich das Thema mal offen? Mir fallen bestimmt noch 1, 2 Fragen ein  :whistling:

    • Offizieller Beitrag

    Also haben ganzen die Excel-Sachen (Objekte und Methoden) in AutoIt die gleiche Bedeutung wie im VBA?

    Grundsätzlich ja, diese werden ja durch das genutzte Objekt (hier: "Excel.Application") vorgegeben. AutoIt selbst ist nicht Objekt-orientiert. Allerdings ist die Anzahl der Objekte, auf die AutoIt referenzieren kann, begrenzt. Aber die MS-Office Applicationen sind anwendbar.
    Ein wichtiger Punkt bei Parametern in Methoden: In VBA kannst du Parameter weglassen, da die Übergabe mit "Parametername=Wert" erfolgt. Das ist in AutoIt nicht möglich. Es müssen immer alle Parameter übergeben werden, sofern sie nicht optional sind bzw. ein Parameter folgt dessen Wert nicht als Standard übergeben werden soll. Für die Standardwerte übergibst du dann das Schlüsselwort "Default".

  • Und ich schon wieder ^^

    und zwar wollte ich die Möglichkeit einbauen, das alle Ordner im Verzeichnis durchsucht werden.

    Die Ordnerstruktur ist:
    \S13
    \S15
    \S17... und ich möchte das alle durchsucht werden.

    Leider steh ich mal wieder auf dem Schlauch.
    Es liest die Ordner und die dazugehörigen Dateien in Arrays ein, das zeigt _Arraydisplay auch richtig an.

    Spoiler anzeigen
    [autoit]

    $sNCDIR = "O:\SCHNITT_IGES_2003_02_25\A400M"
    $FolderList = _FileListToArray($sNCDIR, "*", 2)
    _ArrayDisplay($FolderList)
    For $I = 1 To $FolderList[0]
    $FileList = _FileListToArray($sNCDIR & "\" & $FolderList[$I])
    _ArrayDisplay($FileList)
    Next

    [/autoit]

    Aber es wird nicht in die Funktion _GetFileNewest übernommen.
    Oder muss ich da noch ein Ubound($FolderList) einbauen, und wenn ja wo?
    Das Script endet ohne Meldung.
    Der komplette Code:

    Spoiler anzeigen
    [autoit]

    #include<Array.au3>
    #include<Excel.au3>
    #include<File.au3>
    #include<String.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; ===========================================================================================================QuellDatei auswählen
    $sPathXLS = FileOpenDialog("Exceltabelle auswählen", "G:\Ham_Änderung\AEND_2013_06_11_A400M\Orig" & "\", "Excel (*xls;*.xlsx)", 1+2) ; Verzeichniss wählen
    If @error Then
    MsgBox(0, "", "Abbruch")
    Exit
    EndIf
    $sSheet = Inputbox("Sektion wählen", "Welche Sektion?" & @CRLF & "z.B.: S13; S15...", "S15", "", 100, 130) ; Sheet wählen
    If @error Then
    MsgBox(0, "", "Keine Ordner gefunden.")
    Exit
    EndIf
    $sMSN = Inputbox("MSN wählen", "Welche MSN?", "16", "", 100, 130) ; Spalte für Vergleich wählen
    If @error Then
    MsgBox(0, "", "Keine Ordner gefunden.")
    Exit
    EndIf
    ;============================================================================================================Verzeichnis der NC Dateien auswählen
    $sNCDIR = "O:\SCHNITT_IGES_2003_02_25\A400M" ; NC Verz.
    $FolderList = _FileListToArray($sNCDIR, "*", 2)
    _ArrayDisplay($FolderList)
    For $I = 1 To $FolderList[0]
    $FileList = _FileListToArray($sNCDIR & "\" & $FolderList[$I])
    _ArrayDisplay($FileList)
    Next
    ;============================================================================================================
    $aFromMSN = _GetListFromMSN($sPathXLS, $sSheet, $sMSN) ; Übergabe an Func Vergleichsliste aus "G:\Ham_Änderung\...\Orig\*Blankets-Konfiguration-Status.xlsx //Sektion // MSN"
    $aNewFiles = _GetFileListNewest($FileList) ; Übergabe an Func NC Verzeichnis "O:\SCHNITT_IGES_2003_02_25\A400M"
    $sToWrite = ''

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To UBound($aFromMSN) -1 ; kann etwas dauern, da jedes MSN-Ergebnis mit jeder neuesten Datei verglichen wird
    $sFileRoot = StringRegExpReplace($aFromMSN[$i], '(\w\d{3})(\d{5})(\d{3})', '$1_$2_$3') ; Unterstriche einfügen M258([M=1]+3)_90118(+5)_002(+3)
    For $j = 1 To $aNewFiles[0] ; alle Dateien im NC Verzeichnis durchlaufen
    If StringLeft($aNewFiles[$j], 14) = $sFileRoot Then $sToWrite &= $aNewFiles[$j] & @CRLF ; wenn NC = Excel dann schreibe alle in TXT mit Zeilenumbruch
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $ofile = FileOpen("C:\Documents and Settings\ElmarFudd\Desktop\Helferlein\" & $sSheet & ".txt", 1) ; TXT erstellen/öffnen
    If $ofile = -1 Then ; Prüfen, ob Datei im Schreibmodus geöffnet ist
    MsgBox(0, "Fehler", "Die Datei konnte nicht geöffnet werden.")
    Exit
    EndIf
    FileWrite($ofile, $sToWrite & @LF) ; $sToWrite Array mit gefilterten NC Dateien in TXT schreiben
    FileClose($ofile)

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite($sToWrite & @LF) ;===CONSOLE===

    [/autoit] [autoit][/autoit] [autoit]

    ;============================================================================================================Funktion Excel in Array
    Func _GetListFromMSN($_sPathXLS, $_sSheet, $_sMSN)
    ConsoleWrite("Pfad/Sektion/MSN: " & $_sPathXLS & "/" & $_sSheet & "/" & $_sMSN & @CRLF) ;===CONSOLE===
    Local $fOpen = True, $oExcel = ObjGet($_sPathXLS)
    If @error Then
    $oExcel = ObjCreate("Excel.Application")
    $oExcel.Visible = 0
    $oExcel.Workbooks.Open($_sPathXLS)
    $fOpen = False
    EndIf
    Local $oSheet = $oExcel.Sheets($_sSheet)
    ; === letzte Zeile
    Local $iRows = $oExcel.Worksheets($_sSheet).UsedRange.Rows.Count
    ; == letzte Spalte
    Local $iColumns = $oExcel.Worksheets($_sSheet).UsedRange.Columns.Count
    Local $oCell, $iVal, $CellMSN = '' ; == MSN Nr suchen
    For $i = 0 To $iColumns -1
    $oCell = $oSheet.Range("A1").Offset(0, $i) ;setzt Zelle A1 absolut
    If StringInstr($oCell.Value, $_sMSN) Then
    $CellMSN = StringReplace($oCell.Address, '')
    ConsoleWrite($CellMSN & @CRLF) ;===CONSOLE===
    ExitLoop
    EndIf
    Next
    If $CellMSN = '' Then Return MsgBox(0, 'Fehler', 'MSN: "' & $_sMSN & '" nicht vorhanden.')
    Local $aOut[$iRows], $iCount = 0 ; == aus allen Zellen der Spalte MSN die Werte in ein Array übernehmen
    For $i = 1 To $iRows -1
    $iVal = $oSheet.Range($CellMSN).Offset($i, 0).Value
    If $iVal <> '' Then
    $iVal = StringLeft($iVal, 12)
    If StringRight($iVal, 1) <> ' ' Then
    $aOut[$iCount] = $iVal
    $iCount += 1
    EndIf
    EndIf
    Next
    ReDim $aOut[$iCount]
    If Not $fOpen Then $oExcel.Application.Quit
    Return $aOut
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ; ===========================================================================================================Funktion aus dem Ordner nur die NC-Dateien mit den höchsten Buchstaben extrahieren
    Func _GetFileListNewest($_sPath) ; $_sPath = $aNewFiles "O:\SCHNITT_IGES_2003_02_25\A400M\Sektion"
    ConsoleWrite($_sPath & @CRLF) ;===CONSOLE===
    If StringRight($_sPath, 1) = '\' Then $_sPath = StringTrimRight($_sPath, 1) ;
    Local $oFileList = _FileListToArray($_sPath, "*")
    _ArraySort($oFileList, 0, 1)
    Local $sList = '', $sLeft, $sRight, $index, $maxIndex
    For $i = 1 To $oFileList[0]
    $sLeft = StringLeft($oFileList[$i], 14)
    $sRight = StringRight($oFileList[$i], 7)
    $maxIndex = 0
    For $j = 65 To 90 ; Höchsten ISSue suchen (A - Z)
    $iStart = $maxIndex
    If $j = 65 Then $iStart = 1
    $index = _ArraySearch($oFileList, $sLeft & Chr($j) & $sRight, $iStart)
    If $index > $maxIndex Then $maxIndex = $index
    Next
    If Not StringInStr($sList, $oFileList[$maxIndex]) Then $sList &= $oFileList[$maxIndex] & ' '
    Next
    Local $aOut = StringSplit(StringTrimRight($sList, 1) , ' ')
    _ArraySort($aOut, 0, 1)
    Return $aOut

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von ElmarFudd (24. Juni 2013 um 19:37)

    • Offizieller Beitrag

    Probleme treten seltener in der Syntax als in der Logik auf -- so auch bei dir. ;)
    Wenn du mehrere Ordner durchsuchen willst, mußt du die Folgeoperationen auch für jeden dieser Ordner aufrufen.
    - Liste Ordner in einem Stammordner abfragen
    - $sMSN = Suchbegriff (gilt für alle Ordner)
    - für jeden dieser Ordner ausführen:
    -- $sSheet = Ordnername
    -- $_sPathXLS = Stammordner & '\' & Ordnername
    -- _GetToWrite() (s. Spoiler) aufrufen, gibt String zum Schreiben in Datei oder Leerstring zurück (Wenn kein Leerstring, kann danach die Schleife abgebrochen werden

    Spoiler anzeigen
    [autoit]

    Func _GetToWrite($_sPathXLS, $_sSheet, $_sMSN)
    Local $aFromMSN = _GetListFromMSN($_sPathXLS, $_sSheet, $_sMSN)
    If Not IsArray($aFromMSN) Then Return ''
    Local $sFolder = "_STAMM-ORDNER__&_\_&_$_sSheet" ; ### Anpassen ###
    Local $aNewFiles = _GetFileListNewest($sFolder)
    Local $sToWrite = ''

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To UBound($aFromMSN) -1 ; kann etwas dauern, da jedes MSN-Ergebnis mit jeder neuesten Datei verglichen wird
    $sFileRoot = StringRegExpReplace($aFromMSN[$i], '(\w\d{3})(\d{5})(\d{3})', '$1_$2_$3')
    For $j = 1 To $aNewFiles[0]
    If StringLeft($aNewFiles[$j], 14) = $sFileRoot Then $sToWrite &= $aNewFiles[$j] & @CRLF
    Next
    Next
    Return $sToWrite
    EndFunc

    [/autoit]


    Mußt du aber mal selber schauen, ob das mit den Pfaden jetzt so paßt. Hab hier keine Möglichkeit zu testen, daher nur quick&dirty. Etwas soll ja noch für dich übrig bleiben. :D

  • Sorry ich kapier es immer noch nicht ganz.
    Deswegen habe ich noch einige Fragen...
    1. haben diese ' ' und " " Zeichen die selbe Bedeutung? (wird im Script beides verwendet)
    2. das gleiche mit "$Variable[0]" und "Ubound($Variable)-1" - laut Deinem Array Tut :thumbup: haben beide die selbe Bedeutung?
    wann benutzte ich was, oder ist das egal? (Speziell jetzt bei dynamischen Arrays)
    3.

    [autoit]

    If Not StringInStr($sList, $aFileList[$maxIndex]) Then $sList &= $aFileList[$maxIndex] & ' '

    [/autoit]

    kannst Du mir das mal bitte Pseudocoden (Zeile 100) :D
    4. Gibt es bei Scite eine Funktion/Fenster wo ich den Inhalt der Variablen auf einen Blick sehen kann - so wie bei VBA - ohne das ich in jede 2. Zeile "Consolewrite" schreiben muss :?:
    So könnte ich wenigstens nachvollziehen was er wo/wann macht. Mir fehlt offensichtlich leider das abstrakte Denken,
    um das auf Anhieb aus dem Code zu lesen  ^^

    ...mehr fällt mir im Augenblick nicht ein, aber das war sicher noch nicht alles :whistling:

    • Offizieller Beitrag

    zu 1.) Hochkomma und Gänsefüßchen gelten als gleichberechtigte Zeichen zum Markieren von Strings
    zu 2.) "$Variable[0]" und "Ubound($Variable)-1" sind nicht immer identisch. Ich habe in meinem Tut beschrieben, dass einige Funktionen an Arrayposition[0] die Anzahl der Elemente hinterlegen. Das ist dann aber auf die jeweilige Funktion beschränkt. Das jungfräuliche Array ist auch an [0] zur Aufnahme eines jeden beliebigen Wertes bereit. :D
    zu 3.)
    If Not StringInStr($sList, $aFileList[$maxIndex]) Then $sList &= $aFileList[$maxIndex] & ' '
    • Wenn im String($sList) nicht enthalten: der Wert aus dem Array($aFileList) an der Indexposition($maxIndex)
    • Dann füge dem String($sList) diesen Wert aus dem Array($aFileList) hinzu
    zu 4.) Nein, gibt es nicht. Aber was gibt es da zu schreiben? Cursor auf die Variable, "Alt+D" drücken und die Debugzeile steht im Skript.... :whistling:

  • Jetzt bin ich endlich wieder mal zum testen gekommen, und da ist mir gleich ein neues Problem aufgefallen..
    Es gibt in der Exceldatei ausgeblendete Spalten mit gleichen MSN Bezeichnungen wie die sichtbaren.
    Keine Ahnung warum, wahrscheinlich Temporäre Spalten. Das Problem ist wenn die ausgeblendeten Spalten vor den eigentlichen stehen, werden die natürlich zuerst erkannt.
    Diese dürfen aber nicht eingelesen werden da sie andere Varianten enthalten.

    Ich habs jetzt mit

    [autoit]

    If $oSheet.Columns.Hidden = False Then
    For $i = 0 To $iColumns - 1
    $oCell = $oSheet.Range("A1").Offset(0, $i)
    ; If $oSheet.Columns.Hidden = False Then
    If StringInStr($oCell.Value, $_sMSN) Then
    $CellMSN = StringReplace($oCell.Address, ', '')
    ExitLoop
    EndIf
    ; EndIf
    Next
    EndIf

    [/autoit]


    versucht.
    Leider findet es entweder immer die ausgeblendete (True) oder gar keine MSN (False)
    Bin ich auf dem richtigen Weg? Hab leider nichts anderes in der Richtung gefunden.

    • Offizieller Beitrag

    Einmal googeln "excel vba prüfen ob spalte versteckt" bringt dir die Lösung:

    [autoit]

    ;If $oSheet.Columns.Hidden = False Then
    For $i = 0 To $iColumns - 1
    $oCell = $oSheet.Range("A1").Offset(0, $i)
    If $oCell.EntireColumn.Hidden = True Then ContinueLoop ; <=== VERSUCHS MAL DAMIT
    ; ...
    ; ...

    [/autoit]