none
Excel VBA Textzeile aus Webseite auslesen RRS feed

  • Frage

  • HI!

    Ich würde gerne von einer Webseite:

    http://logik.phl.univie.ac.at/~chris/gateway/formular-zentral.html

    nur EINE Textzeile (mit der Lösung) in EINE Excelzelle auslesen lassen.

    Zuvor will ich eine Zelle in den Rechner hineinkopieren und KNF wählen lassen und absenden drücken. (Hintere Teil geht schon, hineinkopieren noch nicht)

    Lösung z.B. so:

    (~Q v R v ~P) & (~S v R v ~P) 

    Also nur das in eine Zelle kopieren

    Ich sehe zwar den Quellcode und weiß wo es beginnt:

    <p>

    <!-- Ausgabestart -->(~Q v R v ~P) &amp; (~S v R v ~P)

    <!-- Ausgabeende -->

    </p>

    <hr>

    aber kann nicht wirklich darauf zugreifen oder?

    Ist ja keine Tabelle... habe schon etwas rumgespielt und so eine Idee gehabt:

    Sub btn_version_01()

    Dim ieApp As Object
    Dim ieDoc As Object
    Dim ieForm As Object
    Dim ieObj As Object
    Dim URL As String

       
       URL = "http://logik.phl.univie.ac.at/~chris/gateway/formular-zentral.html"
       Set ieApp = CreateObject("InternetExplorer.Application")
       ieApp.Visible = True
       ieApp.navigate URL
       While ieApp.Busy Or ieApp.readyState <> 4: DoEvents: Wend

       Set ieDoc = ieApp.Document
       Set ieForm = ieDoc.forms(0)
      
      
       ieForm.elements(1).textcontent = "HIER SOLLTE EINE SICH VERÄNDERNDE ZEILE SEIN"
       ieForm.elements(2).Value = "KNF"
       'ieForm.elements(4).Click
       ieForm.elements(5).Click

    HIER IST UNKLAR WIE ES GEHEN KÖNNTE

     With ActiveSheet.QueryTables.Add(Connection:= _
            "URL;http://logik.phl.univie.ac.at/~chris/cgi-bin/cgi-logik", Destination:= _
            Range("$B$1"))
            'ieForm.CallByName = "<p><!-- Ausgabestart -->"

       
    Dim besucher As String, a As Integer, b As Integer
     Dim lst_row As Integer
     'If Not Intersect(Target, Range("C2")) Is Nothing Then
        If Intersect(Target, Range("C2")) Is Nothing Then
         a = Application.WorksheetFunction.Search("<!-- Ausgabestart -->", Cells(2, 2)) + 5
         b = Application.WorksheetFunction.Search("Bitte", Cells(2, 2))
         lst_row = Range("D2").End(xlUp).Row + 1
         Cells(lst_row, 5) = Mid(Cells(2, 2), a, b - a)
     End If
    End With

    End Sub

    aber ging nicht so richtig.

    Montag, 2. Januar 2017 04:58

Alle Antworten

  • Anders als bei deinem Ansatz, bei dem die Webseite 'ferngesteuert' werden soll um dann das Ergebnis abzugreifen, schlage ich einen anderen Weg vor: Sende die gewünschten Daten an die verarbeitende Seite und greife das Ergebnis (ist dann natürlich auch eine HTML-Seite) ab.

    Bei der Vorgehensweise habe ich mich recht eng an ein gewusst wie von Microsoft gehalten:

            Dim request As WebRequest = WebRequest.Create("http://logik.phl.univie.ac.at/~chris/cgi-bin/cgi-logik")
            request.Method = "POST"
    
            Dim postData As String = "notation=pr"
            postData = postData + "&Ausdruck=" + HttpUtility.UrlEncode("P->((Q->R)&(~S v R))") ' hier die Formel
            postData = postData + "&auftrag=" + HttpUtility.UrlEncode("WD") ' Verarbeitungsauftrag
            postData = postData + "&warten=" + HttpUtility.UrlEncode("10") ' Maximale Wartezeit
            'postData = postData + += "&schritt=" + HttpUtility.UrlEncode("J"); ' Zeile nur bei schrittweiser Ausgabe
            Dim byteArray As Byte() = Encoding.ASCII.GetBytes(postData)
    
            request.ContentType = "application/x-www-form-urlencoded"
            request.ContentLength = byteArray.Length
    
            Dim dataStream As Stream = request.GetRequestStream()
            dataStream.Write(byteArray, 0, byteArray.Length)
            dataStream.Close()
    
            Dim response As WebResponse = request.GetResponse()
            Console.WriteLine(CType(response, HttpWebResponse).StatusDescription)
    
            dataStream = response.GetResponseStream()
    
            Dim reader As New StreamReader(dataStream)
            Dim responseFromServer As String = reader.ReadToEnd()
            Console.WriteLine(responseFromServer)
    
            reader.Close()
            dataStream.Close()
            response.Close()


    Montag, 2. Januar 2017 08:45
  • Bei der Vorgehensweise habe ich mich recht eng an ein gewusst wie von Microsoft gehalten:
            Dim request As WebRequest = WebRequest.Create("http://logik.phl.univie.ac.at/~chris/cgi-bin/cgi-logik")
            

    Der OP fragte nach einer Lösung in VBA, nicht VB.NET

    Ein HTTP-Request ist mit VBA zwar möglich, aber ich denke nicht das dies mit dieser Webseite funktioniert... ich lasse mich aber gerne eines besseren belehren. :-)

    Andreas.

    Option Explicit
    
    Sub Test()
      Const READYSTATE_COMPLETE = 4
    
      Dim IE As Object 'SHDocVw.InternetExplorer
      Dim IEdoc As Object 'MSHTML.HTMLDocument
      Dim Item As Variant
      Dim Lines() As String
      Dim i As Long
      'Open IE and go to the side
      Set IE = CreateObject("InternetExplorer.Application")
      'IE.Visible = True
      IE.Navigate "http://logik.phl.univie.ac.at/~chris/gateway/formular-zentral.html"
      
      'Wait until side it loaded
      Do While IE.ReadyState <> READYSTATE_COMPLETE
        DoEvents
      Loop
      'Get the body
      Set IEdoc = IE.Document
      'Find each field and fill out
      Item = IEdoc.getElementsByName("Ausdruck")
      Item.Value = "(~Q v R v ~P) & (~S v R v ~P)"
      IEdoc.forms(0).submit
      
      'Wait until side it loaded
      Do While IE.Busy
        DoEvents
      Loop
      Do While IE.ReadyState <> READYSTATE_COMPLETE
        DoEvents
      Loop
      
      'Search for the result field
      Set Item = IEdoc.getElementsByTagName("PRE").Item(0)
      Lines = Split(Item.innerText, vbCrLf)
      For i = 0 To UBound(Lines)
        Debug.Print Lines(i)
      Next
    End Sub

    Montag, 2. Januar 2017 10:27
  • Hi Andreas

    also dein Code funktioniert. Vielen Dank schon mal!

    Allerdings erhalte ich das Ergebnis als Wahrheitstabelle statt als konjungierte Normalform und vor allem im Makrofeld (Direktbereich). Ich wollte es ja in der Excel Datei in einer Spalte neben dem Original :/

    Ne Idee?

    Und wie kann ich die Spalte links einlesen lassen damit?

    Also statt Item.Value = "(~Q v R v ~P) & (~S v R v ~P)" soll mein Ausdruck in der Spalte stehen

    Dienstag, 3. Januar 2017 05:22
  • Allerdings erhalte ich das Ergebnis als Wahrheitstabelle statt als konjungierte Normalform

    Was kann ich dazu? Da musst Du den Betreiber der Webseite fragen wie das geht.

    Und einen Text in eine Zelle reinschreiben... ich bitte Dich, wir sind hier im Entwicklerforum...

    Andreas.

    Dienstag, 3. Januar 2017 08:10