internet2107
Goto Top

VBScript, Excel - Find in Range

Hallo zusammen.

Ein nettes Mitglied hat mir mit einem langen Code geholfen, dafür noch mal großen Dank.
Jedoch benötige ich in diesem Code eine Erweiterung. Aktuell wird in einer extra Datei festgestellt, welche Spalten (Columns) gelöscht werden. Das klappt auch einwandfrei. Jedoch würde ich die Sache gerne soweit erweitern, dass er vorher noch die Spalten nach einem bestimmten Zeichen durchsucht. Falls das Zeichen "<" vorhanden ist, soll er in die Zelle (2.1) das Wort "error" schreiben.

Hier der Ausschnitt vom Code:

' ##### neu hinzugefügt 13.08.2014 ANFANG #####  
With Worksheets(1).Range("a1:cc")   
    Set c_error = .Find("<", lookin:=xlValues)   
    If Not c_error Is Nothing Then
	    firstAddress = c_error.Address 
        Do 
        objColumn.Cells(2, 1).value = error 
        Set c_error = .FindNext(c_error) 
        Loop While Not c_error Is Nothing And c_error.Address <> firstAddress 
    End If 
End With
Next

' ##### neu hinzugefügt 13.08.2014 ENDE #####  

' ##### ab hier bisher Original #####  
  'Alle Elemente der Löschliste verarbeiten  
  For Each strColumnHeader In arrColumnsToDelete
    'Alle verwendeten Spalten des Arbeitsblatts verarbeiten  
    For Each objColumn In objActiveSheet.UsedRange.Columns
      'Wenn in Zeile 2 der Spalte einer der Spaltentitel aus der  
      'Löschliste enthalten ist, die komplette Spalte löschen  
      If objColumn.Cells(2, 1) = strColumnHeader Then
        objColumn.Delete
      End If
    Next
  Next

Was ist im oberen Codebereich (' ##### neu hinzugefügt 13.08.2014 #####) falsch, da ich bei der Ausführung einen Kompilieriungsfehler bekomme ?

Content-ID: 246348

Url: https://administrator.de/contentid/246348

Ausgedruckt am: 23.11.2024 um 21:11 Uhr

colinardo
colinardo 13.08.2014, aktualisiert am 15.08.2014 um 09:39:12 Uhr
Goto Top
Moin,
setze das kleiner als Zeichen in Anführungszeichen "<" , ohne ist es sonst kein String sondern wird als Operator interpretiert.

Grüße Uwe
internet2107
internet2107 13.08.2014 um 09:10:00 Uhr
Goto Top
Hallo Uwe,

DANKE. Jedoch hatte ich den Code eingefügt, dabei aber die Zeichen vergessen (noch mal aktualisiert), darum ist dein Vorschlag natürlich sehr gut, danke dafür, aber dennoch muss noch etwas falsch sein, weil er dennoch einen Fehler bringt.
colinardo
colinardo 13.08.2014 aktualisiert um 09:21:41 Uhr
Goto Top
Der Zellbezug a1:cc ist kein gültiger Zellbezug, und du hast ein Next in Zeile 12 alleine ohne dazugehöriges vorher auftauchendes for stehen...
internet2107
internet2107 13.08.2014 um 09:42:04 Uhr
Goto Top
OK, verstehe. Mein Fehler.

Geändert nun:
With Worksheets(1).Range("a1", "cc")  
Set c_error = .Find("<", lookin:=xlValues)  
If Not c_error Is Nothing Then
firstAddress = c_error.Address
Do 
objColumn.Cells(2, 1).value = error 
Set c_error = .FindNext(c_error) 
Loop While Not c_error Is Nothing And c_error.Address <> firstAddress 
End If 
End With

Dennoch immer wieder:
Kompilierungsfehler in Microsoft VBScript: ')' erwartet
face-sad
colinardo
colinardo 13.08.2014, aktualisiert am 15.08.2014 um 11:42:17 Uhr
Goto Top
Range("a1", "cc")
ist auch kein richtiger Bezug ! Wenn dann "A:CC"

Führst du das ganze als VBS Script aus und nicht in VBA ? So kann der Code nicht in VBS ausgeführt werden, da die Konstanten wie xlValues in ihre tatsächlichen Werte umgewandelt werden müssen und das Worksheets durch das Objekt ersetzt werden muss das in deinem Script dafür verwendet wird !
With objActiveSheet.Range("A:CC")  
	Set c_error = .Find("<",,-4163,1)  
	If Not c_error Is Nothing Then
		firstAddress = c_error.Address
		Do 
			c_error.Cells(2, 1).value = "Error"  
			Set c_error = .FindNext(c_error) 
		Loop While Not c_error Is Nothing And c_error.Address <> firstAddress 
	End If 
End With

VBA is not VBS, da gibt es einige Unterschiede zu beachten !
internet2107
internet2107 13.08.2014 um 09:59:33 Uhr
Goto Top
Oh man.. es ist früh am Morgen.. DANKE.. meine eigene Dummheit.
Jetzt klappt es.
internet2107
internet2107 15.08.2014 um 09:37:51 Uhr
Goto Top
Hallo an alle,
Hallo @colinardo

Ich habe erst heute wieder die Zeit gefunden, noch mal mit dieser Änderung zu arbeiten, also einen Test zu machen. Vorgestern schrieb ich zwar, dass er nun klappt, damit meinte ich aber nur, dass die Ausführung des Scripts nun ohne Kompilierungsfehler klappt.

Leider aber bekomme ich nicht das Ergebnis, was gewünscht ist. Mein Wunsch ist ja, dass er das ganze Excelsheet nach dem Wort "<Test" durchsucht und falls es in einer Zelle gefunden wird, soll er in der zweiten Reihe der Spalte in der sich die Zelle befindet, das Wort "error" schreiben.

Entdeckt jemand den Fehler ?.

Hier noch mal der bisherige Code.

With objActiveSheet.Range("A:CC")  
	Set c_error = .Find("<Test",,-4163)  
	If Not c_error Is Nothing Then
		firstAddress = c_error.Address
		Do 
			objColumn.Cells(2, 1).value = Error 
			Set c_error = .FindNext(c_error) 
		Loop While Not c_error Is Nothing And c_error.Address <> firstAddress 
	End If 
End With

Danke im Voraus.
colinardo
colinardo 15.08.2014 aktualisiert um 11:09:27 Uhr
Goto Top
Zitat von @internet2107:
Mein Wunsch ist ja, dass er das ganze Excelsheet nach dem Wort "<Test" durchsucht
warum suchst du dann nur in A:CC ?
und falls es in einer Zelle gefunden wird, soll er in der zweiten Reihe der Spalte in der sich die Zelle befindet, das Wort "error" schreiben.
Entdeckt jemand den Fehler ?.
ja... der Fehler liegt in Zeile 6, du setzt den String-Wert nicht in Anführungszeichen, und du verwendest das falsche Range-Objekt
c_error.Cells(2, 1).value = "Error"
Grüße Uwe

-edit- Objekt korrigiert
internet2107
internet2107 15.08.2014 um 11:00:38 Uhr
Goto Top
Zitat von @colinardo:
warum suchst du dann nur in A:CC ?
weil die Tabelle nicht mehr als bis CC groß ist.
Wenn ich es ändere auf:
With objActiveSheet.Range

ja... der Fehler liegt in Zeile 6, du setzt den String-Wert nicht in Anführungszeichen!
 objColumn.Cells(2, 1).value = "Error" >   

OK, habe ich geändert auf
objColumn.Cells(2, 1).value = "Error"  

Aber dennoch verändert sich rein gar nichts.
Sorry, wenn ich so oft frage, aber von VBS habe ich leider sehr wenig Erfahrung.
colinardo
colinardo 15.08.2014 aktualisiert um 11:06:17 Uhr
Goto Top
s. korrigierter Code oben, das Objekt war noch nicht i.O..
internet2107
internet2107 15.08.2014 um 11:34:35 Uhr
Goto Top
colinardo

Danke für deine Hilfe bis jetzt. Doch leider face-sad
Ich habe nun alles so geändert wie du es vorgeschlagen hast, um keine Missverständnisse aufkommen zu lassen, hier der aktuelle Code.

With objActiveSheet.Range
	Set c_error = .Find("<Test",, -4163)  
	If Not c_error Is Nothing Then
		firstAddress = c_error.Address
		Do 
			c_error.Cells(2, 1).value = "Error"  
			Set c_error = .FindNext(c_error) 
		Loop While Not c_error Is Nothing And c_error.Address <> firstAddress 
	End If 
End With
colinardo
colinardo 15.08.2014 aktualisiert um 11:47:41 Uhr
Goto Top
schon wieder Fehler in deiner Zeile1, es fehlt der range und eine 1 in Zeile 2
With objActiveSheet.Range
colinardo
colinardo 15.08.2014 aktualisiert um 11:50:15 Uhr
Goto Top
Ich hatte den Code oben doch schon funktionsfähig gepostet, hier also nochmal:
With objActiveSheet.Range("A:CC")  
	Set c_error = .Find("<Test",,-4163,1)  
	If Not c_error Is Nothing Then
		firstAddress = c_error.Address
		Do 
			c_error.Cells(2, 1).value = "Error"  
			Set c_error = .FindNext(c_error) 
		Loop While Not c_error Is Nothing And c_error.Address <> firstAddress 
	End If 
End With
funktioniert einwandfrei.

Grüße Uwe
internet2107
internet2107 15.08.2014 um 12:05:17 Uhr
Goto Top
Ich habe nun definitiv diesen Code (hatte den geänderten vorher nicht gesehen):

With objActiveSheet.Range("A:CC")  
	Set c_error = .Find("<Test",,-4163,1)  
	If Not c_error Is Nothing Then
		firstAddress = c_error.Address
		Do 
			c_error.Cells(2, 1).value = "Error"  
			Set c_error = .FindNext(c_error) 
		Loop While Not c_error Is Nothing And c_error.Address <> firstAddress 
	End If 
End With

Dennoch:
funktioniert einwandfrei.
bei mir leider nicht. Wo auch immer der Haken ist ?. *Verzweifel*
colinardo
colinardo 15.08.2014 aktualisiert um 16:39:28 Uhr
Goto Top
Muss denn der ganze Wert der Zelle übereinstimmen oder nur ein Teil ?
wenn du nur nach einem Teil einer Zelle suchst musst du bei Zeile 2 den letzten Parameter auf 2 ändern.

Set c_error = .Find("<Test",,-4163,2) 
ansonsten liegt der Fehler in einem Codeteil den ich hier nicht einsehen kann, bzw. der Code steht an einer Stelle die nicht immer ausgeführt wird.

Grüße Uwe
Biber
Biber 15.08.2014 um 16:52:09 Uhr
Goto Top
Moin,

es kann nicht einfach ganz banal an der Zeile 1 liegen, die vielleicht nur bei colinardo gültig ist?

With Worksheets(1).Range("a1:cc") als erste Zeile wäre doch noch einen Versuch wert, oder?

Ansonsten wäre eine etwas ausführlichere Beschreibung des ....
bei mir leider nicht. Wo auch immer der Haken ist ?. *Verzweifel*
..sinnvoll.

Grüße
Biber
internet2107
internet2107 16.08.2014 um 16:37:08 Uhr
Goto Top
Hallo Ihr beiden. Danke für die beiden Antworten. Ich bin erst gerade nach Hause gekommen, werde mich gleich mal mit beiden Dingen noch mal beschäftigen und dann Feedback geben. Danke erstmal.
internet2107
internet2107 16.08.2014 um 19:11:25 Uhr
Goto Top
Hallo noch mal, zusammen.

Ich habe nun Zeit gehabt, beide Vorschläge noch mal zu testen. Leider hat sich nichts verändert.

Zu deiner Frage @Biber:
"Ansonsten wäre eine etwas ausführlichere Beschreibung des ....
bei mir leider nicht. Wo auch immer der Haken ist ?. *Verzweifel*
..sinnvoll."

Wenn ich ja eine ausführlichere Beschreibung geben könnte. Das VBScript wird ohne Fehler ausgeführt, er macht in dem Script alles andere, was es soll, nur der gewünschte Fall tritt nicht ein.
Ich kann aber auch nicht sehen, wo er evtl. etwas nicht versteht ?. Also, ob er überhaupt das gewünschte Wort findet und/oder ob er was in die Zeit schreibt. Leider bin ich, so wie z.B. Ihr, in VBScript nicht so gebildet um hier ggf. auf Fehlersuche zu gehen.
Kann ich nicht z.B. die Schritte die das Script abzuarbeiten hat, nicht in eine Textdatei schreiben lassen, um so ggf. den Fehler zu erkennen ??
colinardo
colinardo 16.08.2014 aktualisiert um 21:14:24 Uhr
Goto Top
Codeabschnitt kopieren und in Excel im VBA-Editor(ALT-F11) in eine Sub-Prozedur einfügen und manuell Schritt für Schritt (F8) ausführen lassen und dabei die Variablen mit dem Debugger beobachten. So kannst du den Fehler eingrenzen.
Ansonsten schick mir kurz eine PM dann kannst du mir dein Sheet zuschicken und ich sehe mir das mal an, sonst wird das hier dieses Jahr nichts mehr. Uns fehlt hier nur der komplette Zusammenhang deines Scriptes und der Inhalt des Sheet's in denen es ausgeführt wird.

Grüße Uwe
internet2107
internet2107 17.08.2014 um 14:04:23 Uhr
Goto Top
Ich habe dir eine PN gesendet. Danke im Voraus.