Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

VBA String zwischen zwei Zeichenketten auslesen

Frage Entwicklung VB for Applications

Mitglied: OxanaG

OxanaG (Level 1) - Jetzt verbinden

13.12.2012, aktualisiert 11:36 Uhr, 2408 Aufrufe, 9 Kommentare

Hallo,

ich habe folgendes Problem:

01.
Dim strContent As String 
02.
Dim LineTag As String 
03.
Dim LineStart As Integer 
04.
Dim LineEnd As Integer 
05.
    
06.
            strContent = "<Typ> Elektroseilwinde <Typ> Manuelle Seilwinde"  
07.
            LineStart = 0 ' 
08.
            LineEnd = 1  
09.
 
10.
    Do 
11.
            LineStart = InStr(LineEnd, strContent, "<Typ>") 
12.
            LineEnd = InStr(LineStart, strContent, "<Typ>") 
13.
      
14.
            LineTag = Mid(strContent, LineStart + 1, LineEnd - LineStart - 1) 
15.
    Loop Until LineEnd = Len(strContent)
Es soll nun immer nur ab dem 1. "<Typ>" bis zum 2. "<Typ>" ausgelesen werden.
Immer einschließlich des vorangegangen "<Typ>"

Also es soll mir dann folgendes nacheinander ausgegeben werden:
<Typ> Elektroseilwinde

im 2. Durchlauf der Schleife soll:
<Typ> Manuelle Seilwinde
ausgegeben werden.

Der Teilstring soll sozusagen beim ersten "<Typ>" beginnen und vor dem 2. "<Typ>" aufhören.

Kann mir jemand weiterhelfen?
Mitglied: miniversum
13.12.2012 um 12:40 Uhr
Hallo,

Bei mir funktioniert es so:
01.
Dim strContent As String 
02.
Dim LineTag As String 
03.
Dim LineStart As Integer 
04.
Dim LineEnd As Integer 
05.
    
06.
            strContent = "<Typ> Elektroseilwinde <Typ> Manuelle Seilwinde" 
07.
            LineStart = 0 ' 
08.
            LineEnd = 1 
09.
 
10.
    Do 
11.
            LineStart = LineEnd 
12.
            LineEnd = InStr(LineStart + 1, strContent, "<Typ>") 
13.
            If LineEnd = 0 Then LineEnd = Len(strContent) + 1 
14.
      
15.
            LineTag = Mid(strContent, LineStart, LineEnd - LineStart) 
16.
            Debug.Print LineTag  
17.
    Loop Until LineEnd = Len(strContent) + 1
Wobei ich persönlich diese Variante schöner finde:
01.
Dim strContent As String 
02.
Dim LineTag As String 
03.
Dim s As Variant 
04.
Const delimiter = "<Typ>" 
05.
    
06.
            strContent = "<Typ> Elektroseilwinde <Typ> Manuelle Seilwinde" 
07.
             
08.
            For Each s In Split(strContent, delimiter) 
09.
                  LineTag = delimiter & s 
10.
                  Debug.Print LineTag  
11.
            Next s
Bitte warten ..
Mitglied: TsukiSan
13.12.2012, aktualisiert um 13:11 Uhr
...und was zum Testen:

01.
strContent = Split("<Typ> Elektroseilwinde <Typ> Manuelle Seilwinde" ,"<Typ>") 
02.
Wscript.Echo Join(strContent,vbcrlf)
Gruss
Tsuki

Ps.: oder als Oneliner
01.
Wscript.Echo Join(Split("<Typ> Elektroseilwinde <Typ> Manuelle Seilwinde" ,"<Typ>"),vbcrlf)
Bitte warten ..
Mitglied: miniversum
13.12.2012 um 13:36 Uhr
Warum dann nicht gleich?
01.
Wscript.Echo Replace("<Typ> Elektroseilwinde <Typ> Manuelle Seilwinde" ,"<Typ>",vbcrlf)
Allerdings fehlt dann der <Typ>, daher wenn dann so:
01.
Wscript.Echo Replace("<Typ> Elektroseilwinde <Typ> Manuelle Seilwinde" ,"<Typ>",vbcrlf & "<Typ>")
Nur das da dann eine Leerzeile zu viel ist und außerdem die evtl. Einzelverarbeitung auch nicht möglich ist.
Bitte warten ..
Mitglied: TsukiSan
13.12.2012 um 14:21 Uhr
Hallo miniversum,

bei den String-Verarbeitungen gibt es viele Wege nach Rom
Die Replace-Methode macht sicher letztenendlich dasselbe.

Wie man's dreht und wendet, der TO soll sich das für ihn/sie beste Szenario rauspicken. Es ist Weihnachtszeit

Hier mal noch einer, den ich meinen Jungs am Anfang immer mit auf den weg gebe (nur zum spielen!!!):

01.
'example "how to make things complicated or easy" by using string functions 
02.
 
03.
Dim MyText 
04.
Dim MyTextNew1 
05.
Dim MyTextNew2 
06.
Dim MyTextNew3 
07.
 
08.
MyText = "1,2,3,4,5,6" 
09.
 
10.
MyTextNew1 = "" 
11.
MyTextNew2 = "" 
12.
MyTextNew3 = "" 
13.
 
14.
'***************************Methode 1**************************************** 
15.
For i = 1 to len(MyText) 
16.
	temp = mid(MyText,i,1)	 
17.
		IF temp = "," then 
18.
			temp = "\" 
19.
		Else 
20.
			temp = temp 
21.
		End IF 
22.
	MyTextNew1 = MyTextNew1 & temp 
23.
next 
24.
 
25.
WScript.Echo MyTextNew1 & " Methode 1" 
26.
'**************************************************************************** 
27.
 
28.
 
29.
'***************************Methode 2**************************************** 
30.
temp = Split(MyText , ",") 
31.
MyTextNew2 = Join(temp, "\") 
32.
 
33.
WScript.Echo MyTextNew2 & " Methode 2" 
34.
'**************************************************************************** 
35.
 
36.
 
37.
'***************************Methode 3**************************************** 
38.
MyTextNew3 = Replace(MyText, "," , "\") 
39.
  
40.
WScript.Echo MyTextNew3 & " Methode 3" 
41.
'****************************************************************************
Gruss
Tsuki
Bitte warten ..
Mitglied: OxanaG
13.12.2012, aktualisiert um 16:57 Uhr
Vielen Dank für eure zahlreiche Hilfe!
Habe mich sehr gefreut, konnte leider jetzt erst antworten.

der erste Vorschlag funktioniert soweit, nur habe den code erweitern müssen.

Dieser lautet nun:

01.
  Set fs = CreateObject("Scripting.FileSystemObject") 
02.
  Set a = fs.CreateTextFile("T:\Typschild\" & LfschNr & Chr(45) & LfschPos & Chr(45) & LfschUPos & ".xml", True) 
03.
     
04.
  intStart = 0 
05.
  intEnd = 1 
06.
  LineStart = 0 ' 
07.
  LineEnd = 1 ' 
08.
  strStart = 0 ' 
09.
  strEnd = 1 ' 
10.
     
11.
  a.WriteLine ("<LASERPLUSJOB>") 
12.
  a.WriteLine (Chr(9) & ("<JOBNAME>") & ("TestOrder") & ("</JOBNAME>")) 
13.
  a.WriteLine (Chr(9) & ("<TEMPLATE>") & ("C:\TemplateFiles\" & strTemplate) & ("</TEMPLATE>")) 
14.
 
15.
  strContent = "<Typ><Test1><Test2><Test3><Test4><Test5>-------<Typ><Test6><Test7><Test8><Test9><Test10>" 
16.
 
17.
If InStr(strContent, "-------") > 0 Then ' 
18.
         
19.
        Do 
20.
            a.WriteLine (Chr(9) & ("<TAGGROUP>")) ' 
21.
            a.WriteLine (Chr(9) & Chr(9) & ("<NROFTAGS>") & ("1") & ("</NROFTAGS>")) ' 
22.
            LineStart = LineEnd 
23.
            LineEnd = InStr(LineStart + 1, strContent, "<Typ>") 
24.
             
25.
            If LineEnd = 0 Then LineEnd = Len(strContent) + 1 
26.
 
27.
               LineTag = Mid(strContent, LineStart, LineEnd - LineStart) 
28.
               Debug.Print LineTag 
29.
             MsgBox (LineTag) 
30.
             
31.
            Do 
32.
                intStart = InStr(intEnd, LineTag, "<") 
33.
                intEnd = InStr(intStart, LineTag, ">") 
34.
      
35.
                strTag = Mid(LineTag, intStart + 1, intEnd - intStart - 1) 
36.
   
37.
                'MsgBox (strTag), vbMsgBoxSetForeground 
38.
      
39.
                a.WriteLine (Chr(9) & Chr(9) & ("<TEXT>") & strTag & ("</TEXT>")) 
40.
      
41.
            Loop Until intEnd = Len(LineTag) 
42.
            a.WriteLine (Chr(9) & ("</TAGGROUP>")) ' 
43.
       Loop Until LineEnd = Len(strContent) + 1
Nun kommt in der Zeile 33 folgender Fehler: Laufzeitfehler 5 - Ungülter Prozeduraufruf oder ungültiges Argument

Kann mia jemand da weiterhelfen?

Danke nochmals.

Beste Grüße
Bitte warten ..
Mitglied: TsukiSan
13.12.2012 um 17:00 Uhr
Ja!
mach mal aus deiner Zeile 04
01.
intStart = 1
Gruss
Tsuki
Bitte warten ..
Mitglied: OxanaG
14.12.2012, aktualisiert um 08:08 Uhr
Guten Morgen,

funktioniert immer noch nicht, selber Fehler an der gleichen Stelle.
Die Ausgabe der xml-Datei hat sich auch nicht verändert.

Ausgabe in XML-Datei:
01.
<LASERPLUSJOB> 
02.
	<JOBNAME>TestOrder</JOBNAME> 
03.
	<TEMPLATE>C:\TemplateFiles\ce2.pl</TEMPLATE> 
04.
	<TAGGROUP> 
05.
		<NROFTAGS>1</NROFTAGS> 
06.
		<TEXT>Typ</TEXT> 
07.
		<TEXT>Zeile1a</TEXT> 
08.
		<TEXT>Zeiel2</TEXT> 
09.
		<TEXT>Zeile2a</TEXT> 
10.
		<TEXT>Zeile3</TEXT> 
11.
		<TEXT>Zeile3a</TEXT> 
12.
		<TEXT>Zeile4</TEXT> 
13.
		<TEXT>Zeile4a</TEXT>
Die Ausgabe sollte normalerweise so lauten, wenn Sie richtig funktionieren würde:

01.
<LASERPLUSJOB> 
02.
	<JOBNAME>TestOrder</JOBNAME> 
03.
	<TEMPLATE>C:\TemplateFiles\ce2.pl</TEMPLATE> 
04.
	<TAGGROUP> 
05.
		<NROFTAGS>1</NROFTAGS> 
06.
		<TEXT>Typ</TEXT> 
07.
		<TEXT>Zeile1a</TEXT> 
08.
		<TEXT>Zeiel2</TEXT> 
09.
		<TEXT>Zeile2a</TEXT> 
10.
		<TEXT>Zeile3</TEXT> 
11.
		<TEXT>Zeile3a</TEXT> 
12.
		<TEXT>Zeile4</TEXT> 
13.
		<TEXT>Zeile4a</TEXT> 
14.
       </TAGGROUP> 
15.
       <TAGGROUP> 
16.
                <NROFTAGS>1</NROFTAGS> 
17.
                <TEXT>Typ</TEXT> 
18.
		<TEXT>Zeile1c</TEXT> 
19.
		<TEXT>Zeiel2b</TEXT> 
20.
		<TEXT>Zeile2c</TEXT> 
21.
		<TEXT>Zeile3b</TEXT> 
22.
		<TEXT>Zeile3c</TEXT> 
23.
		<TEXT>Zeile4b</TEXT> 
24.
		<TEXT>Zeile4c</TEXT> 
25.
       </TAGGROUP> 
26.
</LASERPLUSJOB>

und in dem Textfeld strContent (aus diesem Feld werden die Daten ausgelesen) steht dieser Text:
01.
<Typ> <Zeile1a> 
02.
<Zeiel2> <Zeile2a> 
03.
<Zeile3> <Zeile3a> 
04.
<Zeile4> <Zeile4a> 
05.
----------------------- 
06.
<Typ><Zeile1c> 
07.
<Zeile2b><Zeile2c> 
08.
<Zeile3b><Zeile3c> 
09.
<Zeile4b><Zeile4c>
wenn ich intStart in der 4. Zeile wieder auf "0" setze, dann ist sogar die Ausgabe gleich, also verändert hat sich dadurch gar nichts.

Kann mir jemand nochmals helfen?

Trotzdem danke an TsukiSan


Beste Grüße
Bitte warten ..
Mitglied: OxanaG
14.12.2012, aktualisiert um 10:17 Uhr
ich habe nun eine Funktion eingebaut, die zählen soll wie oft "<Typ>" vorkommt.
Jetzt will ich eine for schleife schreiben, diese soll abhängig vom der zähl-Funktion sein. Kommt zb <Typ> zweimal vor, so soll die for-Schleife zwei mal durchlaufen.

Die zähl-Funktion funktioniert einwandfrei. Diese heisst cntOccurence, diese gibt wiederum einen Integer-Wert zurück.
Das heißt, wenn <Typ> zweimal vorkommt, dann gibt die Funktion eine 2 zurück.

Weiss jemand wie ich das machen kann? Schleifen sind leider nicht so meine Stärke.

Danke schon mal.
Bitte warten ..
Mitglied: miniversum
14.12.2012 um 13:50 Uhr
Hallo
Sorry hab jetzt erst wieder reingeschaut.

Ich denke ich würde das ganze eher so machen (ohne die ersten beiden Zeilen und das schreiben in eine Datei (wäre dann die letzte Zeile bei folgendem Code)):
01.
    strContent = "<Typ><Test1><Test2><Test3><Test4><Test5>-------<Typ><Test6><Test7><Test8><Test9><Test10>" 
02.
    strout = "" 
03.
     
04.
    strout = strout & "<LASERPLUSJOB>" 
05.
    strout = strout & vbTab & "<JOBNAME>TestOrder</JOBNAME>" & vbNewLine 
06.
    strout = strout & vbTab & "<TEMPLATE>C:\TemplateFiles\" & strTemplate & "</TEMPLATE>" & vbNewLine 
07.
     
08.
    For Each s In Split(strContent, "<Typ>") 
09.
        ps = InStr(1, s, "<") 
10.
        pe = InStrRev(s, ">") 
11.
        If ps > 0 And pe > 0 Then 
12.
            strout = strout & vbTab & "<TAGGROUP>" & vbNewLine 
13.
            strout = strout & vbTab & vbTab & "<NROFTAGS>1</NROFTAGS>" & vbNewLine 
14.
            strout = strout & vbTab & vbTab & "<TEXT>Typ</TEXT>" & vbNewLine 
15.
             
16.
            ts = Mid(s, ps, pe - ps + 1) 
17.
            ts = Replace(ts, ">", "#") 
18.
            ts = Replace(ts, "<", vbTab & vbTab & "<TEXT>") 
19.
            ts = Replace(ts, "#", "</TEXT>" & vbNewLine) 
20.
            strout = strout & ts 
21.
             
22.
            strout = strout & vbTab & "</TAGGROUP>" & vbNewLine 
23.
        End If 
24.
    Next s 
25.
     
26.
    strout = strout & "</LASERPLUSJOB>" 
27.
     
28.
    MsgBox strout
Ich hoffe das hilft dir weiter
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Unbekannte Zeichenkette aus txt mit Zeilenangabe auslesen
gelöst Frage von IForeverBatch & Shell4 Kommentare

Hallo Community :) Nach über 4 Stunden herum probieren habe ich es aufgegeben und muss hier um Rat bitten ...

Batch & Shell
String Zeichenpaare auslesen und bearbeiten
Frage von ahstaxBatch & Shell6 Kommentare

Moin, ich möchte gerne einen String der Form "41004800", der beliebig lang sein kann, in Zeichenpaare aufteilen, also in ...

Microsoft Office
VBA zum auslesen von einem Zellbereich Excel
gelöst Frage von schwalbepilotMicrosoft Office1 Kommentar

Hallo, leider bin ich mit Makros noch nicht su vertraut. Ich habe in einen Ordner mehrere hunderte Datein. Alles ...

VB for Applications
Mit VBA Zertifikate auslesen
gelöst Frage von it4baerVB for Applications3 Kommentare

Hallo, ist es möglich mit VBA Zertifikate auszulesen? Ich habe *.crt Dateien, aus diesen möchte ich z.B. Aussteller in ...

Neue Wissensbeiträge
Microsoft

Update KB4073578 für AMD CPU (Spectre und Meltdown Lücke)

Information von sabines vor 3 StundenMicrosoft

Wegen Problemen (BOSD, nicht startende PCs) wurde das Update KB4056897 und KB4056894 für AMD CPUs zurückgezogen. Dieses Update KB4073578 ...

Mac OS X

MacOS wo ist die Tilde ?

Tipp von Alchimedes vor 16 StundenMac OS X1 Kommentar

Hallo, ich hab eine MacOS qwertz Keyboard auf US Layout umgestellt da die Sonderzeichen besser erreichbar sind. Leider fehlt ...

Datenschutz

Weitere Informationen zum Sicherheitsproblem BeA

Information von Penny.Cilin vor 23 StundenDatenschutz

Im folgenden ein weiterer Bericht über die Sicherheitsprobleme von Bea. Fataler Konstruktionsfehler im besonderen elektronischen Anwaltspostfach Gruss Penny

Windows 10

Systemdienste behalten nach Win10 inplace-Upgrade nicht die ggf. modifizierte Startart bei

Tipp von DerWoWusste vor 1 TagWindows 103 Kommentare

Stellt Euch vor, Ihr habt ein Win10 System und modifiziert dort die Startart von Systemdiensten. Zum Beispiel wollt Ihr ...

Heiß diskutierte Inhalte
Batch & Shell
Anmeldevorgang für Informatikraum (Schule) unter Windows
Frage von IngenieursBatch & Shell24 Kommentare

Hey zusammen, ich werde in naher Zukunft den Informatik Raum meiner jetzigen Schule von dem aktuellen Betreiber übernehmen (Vertrag ...

Windows 10
Netbook erkennt Soundkarte nicht - keinerlei Info zum Hersteller und Modell vom Netbook und Hardware bekannt
Frage von fyrb38Windows 1019 Kommentare

Guten Tag, meine Schwester reist in einigen Wochen für ein paar Monate ins Ausland und hat sich dafür ein ...

Batch & Shell
AD-Abfrage in Batchdatei und Ergebnis als Variable verarbeiten
gelöst Frage von Winfried-HHBatch & Shell19 Kommentare

Hallo in die Runde! Ich habe eine Ergänzungsfrage zu einem alten Thread von mir. Ausgangslage ist die Batchdatei, die ...

Microsoft Office
Deaktivieren von Startbildschirm und Backstage-Ansicht in Office 2016 per Batch-Datei
Anleitung von SarekHLMicrosoft Office17 Kommentare

Guten Morgen zusammen! Ich habe mir gestern (auch mit Hilfe dieses Boards) ein Script gebastelt, um in Office 2016 ...