[VB6] Daten aus Internet

Julexander

Lieutenant
Registriert
Juli 2004
Beiträge
568
Hi haette mal ne Frage ^^
Ich schreibe ein Umrechnungsprogramm.
Es soll den aktuellen Kurs aus dem Internet laden. Falls ihr Ideen habt, welche Seite ich nehmen kann, bitte sagen.. Sonst wuerde ich

nehmen.. Muesst ihr mal in den Quelltext gucken..
http://www.convertworld.com/de/
Also, das einzige was ich weiss, ist das ich WinSock brauche ^^ Hab ich auch konfiguriert (auf den convertworld.com):
RemoteHost : 195.47.247.77
Local Port : 80
Remote Port : 80
Protocol : TCP
(ich hoffe das is ueberhaupt richtig :p )

Dann spaeter muesste ich aus dem >>Quelltext<< die Kurse extrahieren. Das Prog muss daher irgendwie an den Quelltext kommen und daraus die Kurse holen..
Die extrahierten Kurse, koennten dann in einer Datei abgelegt werden, damit dann die ListBox daraus endlich die Kurse holen kann. ^^

Ja, recht schwer das Projekt.. jedenfallz fuer mich :D

Danke fuer Hilfe ;)
 
Zuletzt bearbeitet:
Hallo Julexander,

das ist sicher machbar, aber was ist Deine Frage?

Über den Port 80 bekommst Du dann eben den Quelltext der HTML Seite.
Entweder kommt die Seite bereits beim connect auf den Port, oder Du musst einen HTTP request schicken.
Da hilft am besten ausprobieren.
Daraus musst Du dann eben mittels parsen des HTML Codes die Dich interessierenden Stellen heraussuchen.

MfG

Arnd
 
Zuletzt bearbeitet:
Ich hab einfach nur auf ein kleines Beispielchen wie das denn funktionieren wuerde gehofft ^^
Wie wuerde es denn aussehen(also vom Code her), wenn sich das Prog diese datei laedt,alle unnoetigen Teile weglaesst (Kurs_Wert und Kurs_Name bleiben nur).

Ich habe mir das so vorgestellt, das das Prog sich ab

<select name="unit_from" class="table">
<option value="1|0|EUR">Euro (EUR)</option>

bis

</select><br />

den Code holt und aus diesem Code dann
zwischen

<option value=" und || den Kurs holt, und ihn in eine
Listbox mit dem dazugehoerigen Namen(der nach den ||) einfuegt.
 
Also ein fertiges Programm kann ich Dir nicht liefern. Meine VB Zeiten sind auch schon ein bisschen her :-).

Nur ein Vorschlag, geh einfach mal schrittweise an das Problem ran. Versuche erst mal an den kompletten Code der HTML Seite ranzukommen. D.h. stell eine Socket Verbindung zu dem Server her und lies das aus was dann über den Socket reinkommt.

Wenn Du das hast, kannst Du doch einfach in den Daten nach den Schlüsselwörtern suche.
Dazu benötigst Du nur eine Schleife und ein paar if Bedingungen. Die gesuchten Textstellen sicherst Du dann einfach in einen String und zeigst die Werte in einer Listbox an.

Dazu musst Du sicher mal die Online Hilfe bemühen und etwas Zeit aufwenden. Aber lernen tust Du dabei am meisten. Wenn Du irgendwo hängst, kannst Du ja nochmal etwas konkreter nachfragen.

Aber mal eine andere Idee. Es gibt doch ein Webbrowser Control von MS. Wenn Du dem die URL mitgibst und das Control unsichtbar hältst, musst Du nur noch an den Inhalt des Controls kommen. Das sollte ja eigentlich gehen. Dann musst Du nur noch das parsen des HTML Codes machen und sparst Dir die Hälfte der Arbeit.

MfG

Arnd
 
Zuletzt bearbeitet:
Ich kann dir jetzt leider auch kein Beispiel nennen (bin im moment zu müde),
aber such mal in der Hilfe nach den Funktionen InStr, Mid, und Left.
Das ganze in eine For-Schleife gepackt und du solltest relativ schnell die entsprechenden Werte finden können.
Vielleicht poste ich morgen noch was. (Wenn ich es nicht vergesse und Zeit habe :))
 
Bin jetzt zZ so weit, dass der Quelltext der Seite (convertworld.com/de/) auf der Festplatte gespeichert ist. Jetz will ich halt die aktuellen Kurse raustrennen.
Alternativ koennte man auch alles unnoetige loeschen, und nur den Kurs und Namen drin lassen..
Code:
"<option value="1.3755|0|CAD">Kanada (CAD)</option>"
sollte dann zB so aussehen
AktuellerKurs(0...) = 1.3755
KursName(0...) = Kanada CAD
Den Index Wert (0...) koennte man mit einer For-Schleife erweitern.

Mit Left(..) geht das schon, doch wenn sie den Titel veraendern usw, bekommt das Prog falsche Daten..
Mit Mid(..) kanns auch nicht geh, da sich der Kurs staendig aendert ._.
Mit Instr(..) wirds dann wohl auch nicht gehen..

Bitte um Rat, ich bin am Ende meiner (nicht gerade grossen :p) Faehigkeiten ^^
Danke shconmal ;)

Edit: Noch ne Frage, wie ist der Befehl um etwas aus der Datei zu loeschen, wenn ich jetz so hab :
Code:
iKanalNr = FreeFile()
Open LocalFile For Input As iKanalNr

Line Input #iKanalNr, sDateiInhalt

sTempText = Left(sDateiInhalt, 3860)

Text1.Text = sTempText

Habdie ersten 3680 Zeichen vom Quelltext jetz in eine TextBox gepackt und alles ist so wie es sein soll. Jetz wuerde ich gern den Teil (ersten 3860 Zeichen) aus der Datei loeschen, speichern, und weiter fortfahren (zb die xxx letzten Zeichen um nur noch
Code:
"<option value="1.3755|0|CAD">Kanada (CAD)</option>"
solche Formen zu bekommen :)
 
Zuletzt bearbeitet:
Mal angenommen folgendes ist dein Text und du willst den Kurs haben:
text = "<option value="1.3755|0|CAD">Kanada (CAD)</option>" 'Funktioniert in VB so nicht wegen dem "
x = 1
a = "<option value="
AktuellerKurs(i) = Mid(text,InStr(x, text, a) + Len(a) +1, InStr(x, text, "|") - Len(a) -2)

Hier mal ein kleines Beispiel, es ist allerdings nicht ganz leicht zu verstehen.

- InStr(x, text, a) ermittelt die Anfangsposition von <option value=
- hinzuaddiert wird die Länge von <option value=
- +1 weil noch ein " folgt
- somit ist InStr(x, text, a) + Len(a) +1 = Startposition vom Aktuellen Kurs
- für die Länge des Kurses brauchen wir die Position nach dem Kurs,
also InStr(x, text, "|")
- -Len(a) damit die länge von <option value= abgezogen wird
- -2 damit es passt ^^ (einfach testen)
- somit haben wir eine Anfangs- und Endposition für den Kurs den wir mit der Mid Funktion "herausschneiden" können.
- x ist die erste Stelle von der aus gesucht werden soll, wenn du x also entsprechend erhöhst bekommst du jedesmal den nächsten Kurs aus dem Text --> z.B. For oder Do Schleife
- für den kurzen Text oben würde er kein zweites Mal <option value= finden und die InStr Funktion gibt eine 0 zurück --> Abbruchbedingung

Ich hoffe Du kannst damit was anfangen, man muss die Funktionen halt miteinander benutzen und versuchen Bedingungen zu finden die immer passen und einmalig sind. :D
Ich hab mich in Excel etwas länger mit so etwas beschäftigen müssen. ^^

Kopier mal alles in eine Textdatei und lade sie hier hoch, dann könnte ich mehr helfen, andererseits hab ich dann ja fast den wichtigsten Teil an Quellcode für Dich geschrieben, aber vielleicht lernst Du dabei noch was.
 
Zuletzt bearbeitet:
Wow, vielen Dank das du dir so viel Muehe gemacht hast.
Leider muss ich dir mitteilen, das dein Befehl einen Error gibt.
Hab mal das Projekt, die Form, und die Form als txtDatei upgeloadet.

Btw hab die Datei nicht mit Winsock, sondern mit einer anderen viel einfacheren Funktion (fuer mich) geladen.
 

Anhänge

  • Umrechnungen.zip
    4,6 KB · Aufrufe: 136
Code:
Private Sub cmdconnect()
  Dim retVal As Long, iKanalNr As Integer, sDateiInhalt As String
  
  Const httpURLDownload = "http://convertworld.com/de/"
  Const URLDownload = "convertworld.com/de/"
  Const LocalFile = "c:\Rechn0rKurs.txt"
    
'Host wird verbunden und Download angefordert
  Me.MousePointer = vbHourglass
  cmdconnect.Enabled = False

  retVal = URLDownloadToFile(0, httpURLDownload, LocalFile, 0, 0)

  Me.MousePointer = 99
  cmdconnect.Enabled = True

  If retVal = 0 Then
    'Datei in LocalFile gespeichert
    MsgBox "datei gespeichert"
  Else
    'Datei nicht gespeichert, abbrechen..
    MsgBox "Beim Download von " & URLDownload & " ist ein Fehler aufgetreten !", vbOKOnly + vbInformation, "Fehler beim Download"
    Exit Sub
  End If
  
fileopen:
'Dateizugriff
iKanalNr = FreeFile()
Open LocalFile For Input As iKanalNr
Line Input #iKanalNr, sDateiInhalt

Dim CursorPos As Single
Dim StartString As String, EndString As String, CurrencyString As String, NumberString As String

Dim AktuellerKurs(99) As String, AktuelleWaehrung(99) As String
Dim i As Integer, sText As String

sText = sDateiInhalt
i = 1
CursorPos = 1
StartString = "<option value="
CurrencyString = Chr(34) & ">" '">
NumberString = "|0|"
EndString = "</option>"


For i = 1 To 49 '49 Währungen
    AktuellerKurs(i) = Mid(sText, InStr(CursorPos, sText, StartString) + Len(StartString) + 1, InStr(CursorPos, sText, NumberString) - InStr(CursorPos, sText, StartString) - Len(StartString) - 1)
    CursorPos = InStr(CursorPos, sText, StartString)
    AktuelleWaehrung(i) = Mid(sText, InStr(CursorPos, sText, CurrencyString) + Len(CurrencyString), InStr(CursorPos, sText, EndString) - InStr(CursorPos, sText, CurrencyString) - Len(CurrencyString))
    CursorPos = InStr(CursorPos, sText, EndString) + 1
    If InStr(1, AktuelleWaehrung(i), "&") <> 0 Then
        AktuelleWaehrung(i) = Replace(AktuelleWaehrung(i), "&szlig;", "ß")
        AktuelleWaehrung(i) = Replace(AktuelleWaehrung(i), "&auml;", "ä")
        AktuelleWaehrung(i) = Replace(AktuelleWaehrung(i), "&ouml;", "ö")
        AktuelleWaehrung(i) = Replace(AktuelleWaehrung(i), "&uuml;", "ü")
    End If
    If AktuellerKurs(i) = 0 Then Exit For
    List1.AddItem (AktuellerKurs(i) & " " & AktuelleWaehrung(i))
Next i

Close iKanalNr
End Sub

Teste das mal, einfach kopieren und einfügen. Mach vorsichtshalber vorher mal ein Backup.
Der Kurs und die dazugehörige Währung haben immer den gleichen Index.
z.B. AktuellerKurs(2) = 1.1970 und AktuelleWaehrung(2) = Vereinigten Staaten (USD)

Wenn Du nur die Kürzel brauchst sag bescheid, dann änder ich das nochmal. Versuch das ganze mal zu verstehen, ich habe den Variablen auch nochmal bessere Namen gegeben.
Viel Spaß
$ui
 
Wow, vielen Dank, da hast du dir bestimmt richtig Muehe gemacht!
Die Liste wird auch mit Kursen und Namen gefuellt allerdings bekomm ich noch einen
"Error! Type mismatch" bei

If AktuellerKurs(i) = 0 Then Exit For

Ich hab die Funktion erstmal mit einem ' versehen und die Liste wird ganz normal gefuellt. Anscheinend ist die Funktion nicht notwendig


Zur Liste/Umrechnung:
Ich hab das Prog so gemacht, dass die Liste so gefuellt wird:
EURO
1
USD
1.xxx
usw..
Ist erstmal temporaer bis ich ne andere Moeglichkeit gefunden habee zB eine Statusbar..

Code:
Private Sub cmdUmrechnen_Click()
Dim Ergebnis As Double
Dim Ausgangszahl As Double
Dim Faktor As Double
Dim Waehrung As Double
Dim iNr As Integer

Faktor = lstFaktor.Text
Ausgangszahl = txtUmrechnungen.Text
lblErgebnis.Caption = Ergebnis


'Eigentliche Berechnung
If txtUmrechnungen.Text = "" Then
MsgBox "Bitte eine Zahl eingeben!", vbQuestion, "Error!"
End If

If IsNumeric(Ausgangszahl) = True Then
Ergebnis = Ausgangszahl * Faktor
Else
MsgBox "Bitte Kurs auswaehlen!", vbCritical, "Error!"
End If

End Sub

Allerdings kommt als Ergebnis 0 raus ._.
 
Zuletzt bearbeitet:
Hi,
schau dir mal das hier an, ist zwar ein Makro für ne Excel-Mappe aber vielleicht nützlich:
Code:
Sub Aktienkurs_Abrufen()
Dim wName$, WKN$
Application.ScreenUpdating = False
WKN = InputBox("WKN-Nr.:", "Web-Abfrage", 879530) 'T-Aktie
If WKN = "" Then Exit Sub
wName = "http://de.finance.yahoo.com/q?s=" & WKN & ".f"
Worksheets.Add after:=Worksheets(Worksheets.Count)
WebAufruf wName, ActiveSheet
Worksheets("Daten").Range("A2:G2").Value = Range("A17:G17").Value
Application.DisplayAlerts = False
ActiveSheet.Delete
Application.DisplayAlerts = True
Worksheets("Daten").Select
Range("A1").Select
Columns("A:G").AutoFit
End Sub

Function WebAufruf(wName$, TB As Worksheet)
With ActiveSheet.QueryTables.Add(Connection:= _
"URL;" & wName, _
Destination:=Range("A1"))
.FieldNames = False
.RefreshStyle = xlInsertDeleteCells
.RowNumbers = False
.FillAdjacentFormulas = False
.RefreshOnFileOpen = False
.HasAutoFormat = True
.BackgroundQuery = True
.TablesOnlyFromHTML = True
.Refresh BackgroundQuery:=False
.SavePassword = False
.SaveData = True
End With
End Function
Quelle: http://bert-koern.de/

Gruß,
stengbiegel
 
Zurück
Oben