Avatar billede tkaas Nybegynder
16. september 2005 - 14:08 Der er 11 kommentarer og
2 løsninger

Gentage en web-forespørgsel med parametre via makro/VBA?

Jeg vil hente noget statistik, der ligger ensartet på >2000 sider. Det ligger på sogn.dk, og kirkeministeriet har henvist mig til at hente det fra siden, hvis jeg vil have det. Det prøver jeg så på.

Jeg har fået noget hjemmestrikket til at virke ved hjælp af makroer, men jeg tror, at lidt vba-programmering måske kan gøre det rigtigt smart.
Adressen på siderne ser sådan ud:
http://www.sogn.dk/radsted/index.php?mod=sognside&func=sogneInfo&p1=7392
(firecifret kode afgør, hvilken sogneside, der vises)
Jeg starter i mit regneark (Excel 2003) med at oprette en webforespørgel på ovennævnte link. Webforespørgslen gemmes på pc'en, og i notepad ændrer jeg den firecifrede kode til []

I Excel 2003 har jeg i ark 1 i kolonne A en liste med alle de firecifrede koder.
I Ark 2 har jeg lavet en simpel makro (indsat nedenfor), der:
a) åbner den gemte webforespørgsel
(her dukker "Indtast parameterværdi"-boksen op. Jeg har kopieret en henvisning til celle A1 i Ark1 til klippebordet, så jeg trykker ctrl + v og der bliver indsat =Ark1!$a$1 i boksen. Jeg trykker enter)
b) makroen går til Ark1 og sletter indholdet i celle A1, så hele striben af numre rykker et hak op.
c) makroen går tilbage til ark 2 og flytter cursoren et tilpas antal celler ned, og den afsluttes nu.
Altså: Jeg kan med tastekombinationen ctrl+b (genvej til makroen), ctrl+v og enter nu hente statistik ind fra én side af gangen ind til min pc.
Det kan jeg godt gøre mange gange, men det må kunne lade sig gøre at skrive en løkke eller lignende ind i min makro, så den bare kører rutinen om og om igen. Jeg har eksperimenteret meget, men kan ikke hitte ud af det.
Har nogen en smartere løsning, der kan genbruges i andre situationer, der minder, er forslag også velkomne.

Og her er makroen.

' Genvejstast:Ctrl+b
'
    With ActiveSheet.QueryTables.Add(Connection:= _
        "FINDER;C:\Documents and Settings\dicaar.STK\Skrivebord\sogn\sogndk.iqy", _
        Destination:=ActiveCell)
        .Name = "sogndk"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlSpecifiedTables
        .WebFormatting = xlWebFormattingNone
        .WebTables = "10"
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
    End With
    Sheets("Ark1").Select
    Selection.Delete Shift:=xlUp
    Sheets("Ark2").Select
    ActiveCell.Offset(19, 0).Range("A1").Select
End Sub
Avatar billede bak Forsker
16. september 2005 - 14:45 #1
hvilken excel-version bruger du ??
Avatar billede tkaas Nybegynder
16. september 2005 - 14:47 #2
Excel 2003
Avatar billede bak Forsker
16. september 2005 - 15:14 #3
Jeg har oprettet 3 ark. "Numre" , "Query" og "Resultat"
Numrene står i "Numre" kolonne A
Forespørgslen i "Query" startede i A1
Resultatet leveres i "Resultat"
Vær opmærksom på ikke at overskrive de 65536 rækker :-)

Sub HentKirkeData()
Dim No As Variant
Dim rgIns As Range
Dim vNumre As Variant
  'Dette range skal du selv sætte
  vNumre = Sheets("Numre").Range("A2:A29")

  Application.ScreenUpdating = False

  For Each No In vNumre
      With Sheets("Query").Range("A1").QueryTable
        .Connection = _
        "URL;http://www.sogn.dk/radsted/index.php?mod=sognside&func=sogneInfo&p1=" & CStr(No)
        .WebSelectionType = xlSpecifiedTables
        .WebFormatting = xlWebFormattingNone
        .WebTables = "10"
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .Refresh BackgroundQuery:=False
      End With
      Sheets("Query").Range("A1:D17").Copy
      Set rgIns = Sheets("Resultat").Range("A65536").End(xlUp).Offset(4, 0)
      rgIns.PasteSpecial (xlPasteValues)
      rgIns.Font.Bold = True

  Next
  Application.ScreenUpdating = True
End Sub
Avatar billede tkaas Nybegynder
16. september 2005 - 16:32 #4
Det ser lovende ud, men jeg har problemer.
Forstår jeg det rigtigt:
Jeg opretter tre regneark og giver dem dine navne.
I Numre indsættes numre fra A2 til A2170
Så opretter jeg en ny makro og indsætter din (rettede) tekst.

Skal jeg så ikke køre selve webforespørgslen, men blot din makro?
Hvis så - forstår jeg ikke helt det du skriver om at "Forespørgslen i "Query" startede i A1"

Hvis jeg blot kører makroen, får jeg fejl runtime error '1004'
application-defined or object-defined
Avatar billede bak Forsker
16. september 2005 - 17:07 #5
du skal køre din web-forespørgsel 1 gang i "Query" A1 således at den ligger der. Min makro modificerer så web-forespørgslen x antal gange
Avatar billede tkaas Nybegynder
16. september 2005 - 17:48 #6
Det virker rigtigt godt. Men ca. to tredjedele gennem listen stopper den med en fejl. Nu fik jeg selvfølgelig ikke skrevet teksten af, men noget med, at der ikke blev fundet numre eller noget i den stil. Jeg havde ikke mulighed for at trykke fortsæt, men kun end eller debug. Jeg testede lige det næste nummer i rækken, og der var tilsyneladende ingen problemer - siden fandtes. Kan jeg på nogen måde fortsætte indsamlingen, hvor det gik galt, eller skal jeg starte forfra?
Avatar billede bak Forsker
16. september 2005 - 18:19 #7
Ja det kan du godt
Bare sæt reference til den celle under hvor den stoppede
fx. vNumre = Sheets("Numre").Range("A1025:A2000")
og kør igen
Avatar billede tkaas Nybegynder
19. september 2005 - 19:37 #8
Mange tak (og point) for hjælpen.
Avatar billede tkaas Nybegynder
19. september 2005 - 19:41 #9
Nu føler jeg mig som en komplet novice, hvad jeg også er, men hvordan pokker får jeg afleveret de point?
Avatar billede bak Forsker
19. september 2005 - 19:59 #10
Jeg skal lige svare først :-)
Avatar billede bak Forsker
19. september 2005 - 23:28 #11
Hvad kan du egentlig bruge det til, sådan som resultatet er opstillet nu. De må da være svært at lave statistik på dette materiale.

Hvis du vil omdanne det til en database så prøv at indsætte et ekstra ark og navngiv det "Data"

kør så denne kode

Type kirke
  Sogn As String
  Provsti As String
  Stift As String
  Myndighedskode As String
  Pastorat As String
  Kirker As Long
  Folkekirkemedlemmer As Long
  Kommune As String
  Kommunenr As String
  Amt As String
  Indbyggere As Long
  Fødte As Long
  Døde As Long
  Døbte As Long
  Vielser As Long
  Begravelser As Long
  Konfirmerede As Long
  Velsignelser As Long
End Type

Sub transfer2database()
Dim LastCell As Range
Dim c As Range, rIns As Range
Dim vkirke() As kirke
Dim Header
Dim temp As Long, i As Long, x As Long
  Header = Array("Sogn", "Provsti", "Stift", "Myndighedskode:", "Pastorat:", "Kirker i sognet/kirkedistriktet:", _
                  "Folkekirkemedlemmer:", "Kommune:", "Kommunenr:", "Amt:", "Indbyggere:", "Fødte:", "Døde:", "Døbte:", _
                  "Vielser:", "Kirkelige begravelser:", "Konfirmerede:", "Velsignelser:")

  Set LastCell = Sheets("resultat").Range("A65536").End(xlUp)
  temp = LastCell.Row / 18
  ReDim vkirke(temp)
  For Each c In Sheets("resultat").Range("A1", LastCell)
      If c.Font.Bold = True And UCase(c.Value) Like "*SOGN" Then
        With vkirke(i)
            .Sogn = c
            .Provsti = c.Offset(2, 0)
            .Stift = c.Offset(4, 0)
            .Myndighedskode = c.Offset(7, 1)
            .Pastorat = c.Offset(8, 1)
            .Kirker = c.Offset(9, 1)
            .Folkekirkemedlemmer = c.Offset(10, 1)
            .Kommune = c.Offset(7, 3)
            .Kommunenr = c.Offset(8, 3)
            .Amt = c.Offset(9, 3)
            .Indbyggere = c.Offset(10, 3)
            .Fødte = c.Offset(11, 1)
            .Døde = c.Offset(11, 3)
            .Døbte = c.Offset(13, 1)
            .Vielser = c.Offset(14, 1)
            .Begravelser = c.Offset(15, 1)
            .Konfirmerede = c.Offset(13, 3)
            .Velsignelser = c.Offset(14, 3)
        End With
        i = i + 1
      End If
  Next
  Sheets("Data").Range("A1:R1") = Header
  For x = 0 To UBound(vkirke)
      Set rIns = Sheets("Data").Range("A" & x + 2)
      With vkirke(x)
        rIns(1, 1) = .Sogn
        rIns(1, 2) = .Provsti
        rIns(1, 3) = .Stift
        rIns(1, 4) = .Myndighedskode
        rIns(1, 5) = .Pastorat
        rIns(1, 6) = .Kirker
        rIns(1, 7) = .Folkekirkemedlemmer
        rIns(1, 8) = .Kommune
        rIns(1, 9) = .Kommunenr
        rIns(1, 10) = .Amt
        rIns(1, 11) = .Indbyggere
        rIns(1, 12) = .Fødte
        rIns(1, 13) = .Døde
        rIns(1, 14) = .Døbte
        rIns(1, 15) = .Vielser
        rIns(1, 16) = .Begravelser
        rIns(1, 17) = .Konfirmerede
        rIns(1, 18) = .Velsignelser

      End With
  Next
End Sub
Avatar billede tkaas Nybegynder
20. september 2005 - 06:33 #12
He - mange tak. Men at rense det til en database fra resultatet i den første model er et minimalt arbejde i Excel. Det klarer jeg ved hjælp af koder.
Dette er naturligvis mere elegant, men jeg var også på jagt i en model, der ved hjælp af minimale tilretninger kan bruges i andre, lignende sammenhænge.
Hvis jeg nu også skal lære lidt om VBA i denne omgang, kunne jeg så lokke dig til at "oversætte", hvad det er der sker i koden. Bare i den første model, du lavede. Der er et par dunkle punkter.
Avatar billede bak Forsker
20. september 2005 - 08:35 #13
Sub HentKirkeData1()
Dim No As Variant
Dim rgIns As Range
Dim vNumre As Variant
  'Her hentes alle numre fra "Numre"-arket ind i et array i et hug
  vNumre = Sheets("Numre").Range("A2:A29")
  'skærmopdatering slås fra pga. hastighed
  Application.ScreenUpdating = False
  'for hvert nummer i nummer-arrayet
  For Each No In vNumre
      With Sheets("Query").Range("A1").QueryTable
        'ændring af connection-strengen til det nye nummer
        'CStr bruges til at lave nummeret til streng
        .Connection = _
        "URL;http://www.sogn.dk/radsted/index.php?mod=sognside&func=sogneInfo&p1=" & CStr(No)
        'Må IKKE fjernes . Angiver at vi kun henter en tabel og ikke en side
        .WebSelectionType = xlSpecifiedTables
        'kan fjernes
        .WebFormatting = xlWebFormattingNone
        'Tabel nummer 10 fra websiden. Dette er væsentlig
        .WebTables = "10"
        'kan fjernes
        .WebPreFormattedTextToColumns = True
        'kan fjernes
        .WebConsecutiveDelimitersAsOne = True
        'kan fjernes
        .WebSingleBlockTextImport = False
        'kan fjernes
        .WebDisableDateRecognition = False
        'Må IKKE fjernes, sørger for at web-queryen kører
        .Refresh BackgroundQuery:=False
      End With
      'kopier alt i query-området
      Sheets("Query").Range("A1:D17").Copy
      'på resultatarket findes nederste celle i kolonne A og  der lægges 4 rækker til
      Set rgIns = Sheets("Resultat").Range("A65536").End(xlUp).Offset(4, 0)
      'værdierne af det kopierede indsættes i resultatarket
      rgIns.PasteSpecial (xlPasteValues)
      'fed skrift på sogn
      rgIns.Font.Bold = True

  Next
  'slå skærmopdatering til igen. burde faktisk være unødvendigt
  Application.ScreenUpdating = True
End Sub
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

Seneste spørgsmål Seneste aktivitet
I går 21:00 Libre Office Impress Af Frank i Andre styresystemer
I går 11:47 VB script Af Jenshentze i Word
I går 11:21 Popup ved opstart Af mort1 i Windows
04/0918:50 Slet lokal konto Af ErikHg i Windows
04/0916:05 Ændre tal i en celle Af xvid i Excel