Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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, 2334 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 ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (9)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...

Backup
Clients als Server missbrauchen? (9)

Frage von 1410640014 zum Thema Backup ...