das war ja einfach vielen vielen Dank Water
Beiträge von creativewonders
-
-
Woher soll das "Y" kommen?
Kannst Du bitte Dein Skript posten?Hallo water, hier mein Script ...
Spoiler anzeigen
#include <Array.au3>
#include <Excel.au3>
#include <MsgBoxConstants.au3>
Local $oExcel = _Excel_Open(True)
If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeFind Example", "Error creating the Excel application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
Local $oWorkbook = _Excel_BookOpen($oExcel, "C:\Users\hfrommon\Documents\search.xlsm")
Global $sConcern = "C14416821"
Global $sSelected = "UC-F01/2"
Global $sRow = ""
Global $aData = _Excel_RangeRead($oWorkbook) ; Komplettes Worksheet einlesen, inkl Headerlines
;_ArrayDisplay($aData)
For $i = 0 To UBound($aData) - 1 ; Kompletten Array durchlaufen und Suchargument 1 suchen
If $aData[$i][0] = $sConcern Then
If $aData[$i][1] = $sSelected Then ; Suchargument 2 vergleichen. Wenn gefunden
For $j = 2 To UBound($aData, 2) - 1 ; alle Spalten rechts davon verarbeiten
$sRow &= $aData[$i][$j] & "|" ; mit | als TrennzeichenWenn verknüpfen
Next
ConsoleWrite($sRow & @CRLF) ; und auf Konsole ausgeben
$sRow = ""
$zeile = _Excel_ColumnToLetter($i + 1); Wenn Suchargument 1 gefunden
ConsoleWrite($zeile & @CRLF)
EndIf
EndIf
Next
;_Excel_BookClose ( $oWorkbook , True )
;_Excel_Close($oExcel, Default, True)
-
egal wo ich es platziere im Script, als Ergebnis gibt er mir Y raus
ich kapier es nicht
In meinem Codeteil
wird die komplette eingelesene Tabelle durchsucht. $i ist dabei die Zeile (in Deinem Beispiel 26).
Da der Index eines Array bei 0 und die Zeilennummer in Excel bei 1 beginnt, musst Du $i + 1 nehmen um die Zeile/Reihe zu ermitteln.
Wenn Du dann die ConsoleWrite Zeile durch Deinen Code ersetzt kannst Du mit $i + 1 die Zeile in Excel adressieren.
-
$i + 1 ist die Zeile und $j + 1 ist die Spalte. Mit der Funktion _Excel_ColumnToLetter kannst Du die Spaltennummer in den entsprechenden Buchstaben umwandeln.
... irgendwie kriege ich es nicht hin
ich bekomme den Wert Y raus
ich möchte doch nur wie in meinem Beispiel bei den gefundenen Werten "Reihe" 26 herausbekommen, damit ich dann damit weiterarbeiten kann ...
Spoiler anzeigen
$zeile = _Excel_ColumnToLetter($i + 1)
ConsoleWrite($zeile & @CRLF)
-
Excel durch einen Array ersetzt, Excel-spezifische Zeilen auskommentiert. Skript getestet und läuft:
AutoIt
Alles anzeigen#include <Array.au3> ;~ #include <Excel.au3> #include <MsgBoxConstants.au3> ;~ Local $oExcel = _Excel_Open(True) ;~ If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeFind Example", "Error creating the Excel application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended) ;~ Local $oWorkbook = _Excel_BookOpen($oExcel, "C:\Users\hfrommon\Documents\search.xlsm") Global $sConcern = "C14435440" Global $sSelected = "UC-L01" Global $sRow = "" Global $aData[][] = [["C14483040", "UC-L03", 1, 2, 3], ["C14435440", "UC-L01", 11, 12, 13, 14]] ;~ Global $aData = _Excel_RangeRead($oWorkbook) ; Komplettes Worksheet einlesen, inkl Headerlines _ArrayDisplay($aData) For $i = 0 To UBound($aData) - 1 ; Kompletten Array durchlaufen und Suchargument 1 suchen If $aData[$i][0] = $sConcern Then ; Wenn Suchargument 1 gefunden If $aData[$i][1] = $sSelected Then ; Suchargument 2 vergleichen. Wenn gefunden For $j = 2 To UBound($aData, 2) - 1 ; alle Spalten rechts davon verarbeiten $sRow = $sRow & $aData[$i][$j] & "|" ; mit | als TrennzeichenWenn verknüpfen Next ConsoleWrite($aData[$i][0] & "|" & $aData[$i][1] & "|" & $sRow & @CRLF) ; Concern, Model-Nr und alle anderen Spalten und auf Konsole ausgeben $sRow = "" EndIf EndIf Next
BTW: Die Art der Verknüpfung von Strings ist nicht relevant.
Hallo Leute
vielen Dank nochmal, das hat dann alles funktioniert in meinem Hauptscript, aber ....
jetzt möchte ich die Zell Adresse der beiden überprüften werte haben, um damit weiter zu arbeiten - wer kann mir hier weiterhelfen ??
Hier in meinem Beispiel das gefundene Ergebnis in Reihe 26 ( B26 und C26 )
Vorab vielen Dank
AutoIt
Alles anzeigen#include <Array.au3> #include <Excel.au3> #include <MsgBoxConstants.au3> Local $oExcel = _Excel_Open(True) If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeFind Example", "Error creating the Excel application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended) Local $oWorkbook = _Excel_BookOpen($oExcel, "C:\Users\hfrommon\Documents\search.xlsm") Global $sConcern = "C14416821" Global $sSelected = "UC-F01/2" Global $sRow = "" Global $aData = _Excel_RangeRead($oWorkbook) ; Komplettes Worksheet einlesen, inkl Headerlines ;_ArrayDisplay($aData) For $i = 0 To UBound($aData) - 1 ; Kompletten Array durchlaufen und Suchargument 1 suchen If $aData[$i][0] = $sConcern Then ; Wenn Suchargument 1 gefunden If $aData[$i][1] = $sSelected Then ; Suchargument 2 vergleichen. Wenn gefunden For $j = 2 To UBound($aData, 2) - 1 ; alle Spalten rechts davon verarbeiten $sRow &= $aData[$i][$j] & "|" ; mit | als TrennzeichenWenn verknüpfen Next ConsoleWrite($sRow & @CRLF) ; und auf Konsole ausgeben $sRow = "" EndIf EndIf Next ;_Excel_BookClose ( $oWorkbook , True ) ;_Excel_Close($oExcel, Default, True)
-
Okay, danke, versuche es jetzt mal umzusetzen und in mein "eigentliches" Script einzubauen - erst mal vielen vielen Dank an Alle - TOP !!
Ich lasse den Beitrag noch offen - für alle Fälle
-
ändere mal
$sRow = $sRow & $aData[$i][$j] & "|" ; mit | als TrennzeichenWenn verknüpfen
in
$sRow &= $sRow & $aData[$i][$j] & "|" ; mit | als TrennzeichenWenn verknüpfen
(also mach aus = ein &= )
es wird nichts in die Konsole geschrieben
-
Wo liegt der Fehler ??
AutoIt
Alles anzeigen#include <Array.au3> #include <Excel.au3> #include <MsgBoxConstants.au3> Local $oExcel = _Excel_Open(True) If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeFind Example", "Error creating the Excel application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended) Local $oWorkbook = _Excel_BookOpen($oExcel, "C:\Users\hfrommon\Documents\search.xlsm") Global $sConcern = "C14435440" Global $sSelected = "L01" Global $sRow = "" Global $aData = _Excel_RangeRead($oWorkbook) ; Komplettes Worksheet einlesen, inkl Headerlines _ArrayDisplay($aData) For $i = 0 To UBound($aData) - 1 ; Kompletten Array durchlaufen und Suchargument 1 suchen If $aData[$i][0] = $sConcern Then ; Wenn Suchargument 1 gefunden If $aData[$i][1] = $sSelected Then ; Suchargument 2 vergleichen. Wenn gefunden For $j = 2 To UBound($aData, 2) - 1 ; alle Spalten rechts davon verarbeiten $sRow = $sRow & $aData[$i][$j] & "|" ; mit | als TrennzeichenWenn verknüpfen Next ConsoleWrite($sRow & @CRLF) ; und auf Konsole ausgeben $sRow = "" EndIf EndIf Next
-
Moin,
vielleicht liegt es daran, dass in der zweiten Spalte in Deinem Auszug in Beitrag #1 nicht L01 sondern SA-L01 steht?
ändert leider nichts - egal ob L01 oder SA-L01 ..... Verzweiflung naht
-
Velted stimmt. Das ist natürlich an dieser Stelle verkehrt.
Korrigierte Version:
AutoIt
Alles anzeigenGlobal $sConcern = "C14435440" Global $sSelected = "L01" Global $sRow = "" Global $aData = _Excel_RangeRead($oWorkbook) ; Komplettes Worksheet einlesen, inkl Headerlines For $i = 0 To UBound($aData) - 1 ; Kompletten Array durchlaufen und Suchargument 1 suchen If $aData[$i][0] = $sConcern Then ; Wenn Suchargument 1 gefunden If $aData[$i][1] = $sSelected Then ; Suchargument 2 vergleichen. Wenn gefunden For $j = 2 To UBound($aData, 2) - 1 ; alle Spalten rechts davon verarbeiten $sRow = $sRow & $aData[$i][$j] & "|" ; mit | als TrennzeichenWenn verknüpfen Next ConsoleWrite($sRow & @CRLF) ; und auf Konsole ausgeben $sRow = "" EndIf EndIf Next
... ich frag mich nur, warum in der "Console" nix ausgegeben wird ... ???
als msgbox hat es einmal funktioniert, jetzt kommt da auch nix mehr
-
Mein Fehler - war wohl Kaffeemangel
AutoIt
Alles anzeigenGlobal $sConcern = "C14435440" Global $sSelected = "L01" Global $sRow = "" Global $aData = _Excel_RangeRead($oWorkbook) ; Komplettes Worksheet einlesen, inkl Headerlines For $i = 0 To UBound($aData) - 1 ; Kompletten Array durchlaufen und Suchargument 1 suchen If $aData[$i][0] = $sConcern Then ; Wenn Suchargument 1 gefunden If $aData[$i][1] = $sSelected Then ; Suchargument 2 vergleichen. Wenn gefunden For $j = 2 To UBound($aData, 2) - 1 ; alle Spalten rechts davon verarbeiten $sRow = $sRow & $aData[$i][$j] & "|" ; mit | als TrennzeichenWenn verknüpfen ConsoleWrite($sRow & @CRLF) ; und auf Konsole ausgeben $sRow = "" Next EndIf EndIf Next
kann schon mal passieren
funktioniert soweit , nur in der Console zeigt er nix, aber als Msgbox, ich werde es mal einbauen und testen und mich melden.
Schönes Wochenende
-
Von wievielen Zeilen/Spalten sprechen wir hier?
Du hast ja den Großteil des Arbeitsblattes mit _Excel_RangeRead bereits nach $aData gelesen. Danach würde ich nur noch diesen Array durchsuchen.
Beispiel (ungetestet):
AutoIt
Alles anzeigenGlobal $sConcern = "C14435440" Global $sSelected = "L01" Global $aData = _Excel_RangeRead($oWorkbook) ; Komplettes Worksheet einlesen, inkl Headerlines For $i = 0 To UBound($aData) - 1 ; Kompletten Array durchlaufen und Suchargument 1 suchen If $aData[$i, 0] = $sConcern Then ; Wenn Suchargument 1 gefunden If $aData[$i, 1] = $sSelected Then ; Suchargument 2 vergleichen. Wenn gefunden For $j = 2 To UBound($aData, 2) - 1 ; alle Spalten rechts davon verarbeiten $sRow = $sRow & $aData[$i, $j] & "|" ; mit | als TrennzeichenWenn verknüpfen ConsoleWrite($sRow & @CRLF) ; und auf Konsole ausgeben $sRow = "" Next EndIf EndIf Next
Hi water,
vielen Dank dafür - ich bekomme einen Syntax Error angezeigt und $sRow ist nicht deklariert - liegt es an den eckigen Klammern ?
Habe dann $sRow deklariert und die "runden Klammern" anstelle der eckigen genommen, bekomme aber dann einen anderen Fehler , dass
das hier nicht stimmt
If $aData($i, 0) = $sConcern Then
If $aData^ ERROR
Wo liege ich falsch ???
AutoIt
Alles anzeigen#include <Array.au3> #include <Excel.au3> #include <MsgBoxConstants.au3> Local $oExcel = _Excel_Open(True) If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_RangeFind Example", "Error creating the Excel application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended) Local $oWorkbook = _Excel_BookOpen($oExcel, @DocumentsCommonDir & "\search.xlsm") Global $sConcern = "C14435440" Global $sSelected = "L01" Global $aData = _Excel_RangeRead($oWorkbook) ; Komplettes Worksheet einlesen, inkl Headerlines _ArrayDisplay($aData) For $i = 0 To UBound($aData) - 1 ; Kompletten Array durchlaufen und Suchargument 1 suchen If $aData[$i, 0] = $sConcern Then ; Wenn Suchargument 1 gefunden If $aData[$i, 1] = $sSelected Then ; Suchargument 2 vergleichen. Wenn gefunden For $j = 2 To UBound($aData, 2) - 1 ; alle Spalten rechts davon verarbeiten $sRow = $sRow & $aData[$i, $j] & "|" ; mit | als TrennzeichenWenn verknüpfen ConsoleWrite($sRow & @CRLF) ; und auf Konsole ausgeben $sRow = "" Next EndIf EndIf Next
-
Also ohne das ganze genau angesehen zu haben:
Exportiere den Excel Inhalt in eine CSV. Dann das ganze in ein Array einlesen, Und nun kann man mit einer simplen Schleife jederzeit nach mehr als einem Wert filtern.
MFG
Peter
Ps.: Genauer geht es nicht - das ist Firmenpolitik
ich lese den Inhalt doch bereits in ein Array
ich kann leider die komplette Excel Liste nicht rausgeben, weil es verboten ist, betriebsinterne Daten weiter zu geben ( dass zur Firmenpolitik )
-
Hi creativewonders ,
willkommen im Forum 👋 .
- Bitte teile deine Excel bzw. ein Teil davon oder erstelle kurz eine Demo-Excel (falls das Original sensible Daten enthalten sollte) die wir nutzen können und hänge sie bitte deinem post #1 an, Danke 🤝 .
- Des Weiteren habe ich nicht verstanden, was du mit "übertragen" konkret meinst, kannst du dies nochmal bitte kurz beschreiben?
- Sinnvoll ist es auf jeden Fall auch, dass du deinen bisherigen Code-Stand mit uns teilst, damit wir deinen Ansatz besser verstehen können und dir ggf. weitere oder sogar robustere Varianten vorschlagen können.
Danke für die Zuarbeit, damit wird dir hier sicherlich zügig geholfen 😀 .
Viele Grüße
SvenHallo Sven,
danke erstmal für deine schnelle Antwort, Datei habe ich angehangen, eine ".xlsm" hat das System nicht akzeptiert, deshalb ein zip Datei
Mit "übertragen" meine ich, dass ich die Werte aus den Zellen in inputboxen übergebe in AutoIT
Nein, leider kann ich Dir den bisherigen Code nicht teilen, der erstreckt sich mittlerweile aus fast 1500 Zeilen für das gesamte Programm und das kann ich leider nicht teilen ( Firmenpolitik )
Hier ein Ausschnitt davon ... - vielleicht reicht das ja schon
AutoIt
Alles anzeigenFunc _show_Concern_values_multiple() ; set select ModelNo to fields in Concern $LH = GUICtrlGetHandle($idListview) $x = _GUICtrlListView_GetItemTextString($LH, _GUICtrlListView_GetSelectedIndices($LH)) Global $sFilePath = $temp & "\SBU-TRACKING" & "\" & $iIndex & "_SBU_Tracking-List.xlsm" Global $sSearch_Concern = GUICtrlRead($concern_select) ; ausgewählter Concern Global $sSearch = $x ; ausgewählte Model No Global $oExcel = _Excel_Open(false, Default, Default, Default, True) Global $oWorkbook = _Excel_BookOpen($oExcel, $sFilePath) Local $sSheet = "Concern" $oWorkbook.Sheets($sSheet).Activate Local $iNum Global $aData = _Excel_RangeRead($oWorkbook, $sSheet, "B5:AE50") ;_ArrayDisplay($aData) Global $strSearch = $sSearch Global $intIndex = -1 $intIndex = _ArraySearch($aData, $strSearch) Global $aResultC2 = _Excel_RangeFind($oWorkBook, $x, $oWorkBook.Sheets($sSheet).Range("B:B")) Global $FindvalueC2 = UBound($aResultC2) if $FindvalueC2 <=1 Then Global $newEntry = $intIndex ; Ergebnis in welcher Reihe die gefundene Model Nummer steht _Excel_BookClose ( $oWorkbook , True ) _Excel_Close($oExcel, Default, True) ;... weiterer Code guictrlsetdata( ) etc. ... ... ... EndFunc
-
Hallo...
wie kann ich in Excel in einer Tabelle nach 2 Werten gleichzeitig suchen???
Wie ich nach einem suche, habe ich herausgefunden, aber ich bekomme es nicht hin, das AutoIt nur die Zellenadresse wiedergibt, wenn beide "SuchWerte" übereinstimmen...
Wer kann mir evtl. helfen ?
Die Tabelle sieht so aus :
Die Tabelle geht rechts noch weiter, d.h. zu jeder Zeile gibt es weitere Einträge, die dann übertragen werden müssen!
Ich suche z.B. nach "C14435440" und das Array gibt mir die Werte "L01" und "L03" als Auswahl zurück, soweit, so gut, jetzt möchte ich, wenn ich z.B. "L03" auswähle aus dem Ergebnis, alle Zellen in Excel, die rechts neben (in dem Fall "L03") stehen, übertragen...
In der Tabelle kann es durchaus sein, das Werte öfters vorkommen, deshalb das Problem, mit der normalen Methode findet er immer den ersten Eintrag, aber nicht den passenden...
also kurzum, wenn "C14435440" und dazugehörend "L03" gefunden wird, dann soll er alle Zellenwerte übertragen, die rechts daneben stehen...
Ich hoffe, ich habe es nicht zu kompliziert erklärt
Wäre für eine Hilfe sehr dankbar...
Gruß