Sida 1 av 1

OBDC via VBA till EXCEL

Postat: 11 november 2015, 10:55:00
av Bosen
Jag har gjort ett macro som analyserar artikelnummer och kollar hur många objekt den artikeln är kopplad mot.
Databasen är inte min utan jag har bara möjligheta att ställa frågor mot den.
.CommandText i nedanstående kod har jag tagit fram genom att exprimentera i Microsoft Query, resterande är klipp och klistra från ett äldre macro.
Variabeln ArtNr hämtas från en tabell som även den är tagen från samma databas med en annan .CommandText och jag loopar den tabellen.
Tabellen kan innehålla t.ex 150 artiklar så för varje rad i tabellen så anropar jag nedanstående kod med ett nytt ArtNr.

Problemet är att när det är väldigt många recordsets så låste sig excel. Vilket gjorde att jag la till TOP 20 för att begränsa hur mycket jag hämtade från databasen. (är artikeln kopplad mot fler än 20 objekt så behöver jag inte veta vilka alla objekten är)

koden fungerar men är brutalt slött. Excel slutar att svara då och då under hela körningen. går det att snabba upp hämtningen på något sätt??
Jag ska bara kopiera data till excel-arket, inga modifikationer skall göras.

Hoppas ni förstår min något flummiga fråga :)

Kod: Markera allt

With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
        "ODBC;DSN=MeritProdSCV;Description=Merit Produktion;;;DATABASE=MeritSCV;LANGUAGE=S" _
        ), Array("venska;Trusted_Connection=Yes")), Destination:=ThisWorkbook.Sheets("Arbetsblad2").Range("A1"))
        .CommandText = "SELECT TOP 20 GOD_D.ART_NR, BXI_D.ANL_NR, GOD_D.BENAMNING1, GOD_D.TYP_BETECKN, ARTREG_D.SENAST_UTT_DATUM FROM MeritSCV.dbo.ARTREG_D ARTREG_D, MeritSCV.dbo.BXI_D BXI_D, MeritSCV.dbo.GOD_D GOD_D WHERE BXI_D.ANL_NRX = GOD_D.ANL_NR AND ARTREG_D.ART_NR = GOD_D.ART_NR AND ((GOD_D.ART_NR='" & ArtNr & "')) ORDER BY BXI_D.ANL_NR"
        .Name = "Fråga från VarMeritProd"
        .FieldNames = False
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .Refresh BackgroundQuery:=False
    End With

Re: OBDC via VBA till EXCEL

Postat: 11 november 2015, 11:01:36
av sodjan
Är du säker på att det är i klienten det hänger?
Inte i servern där databasen ligger? Kan du köra
SQL frågan mot databasen på annat sätt utan att
det "hänger"?

Re: OBDC via VBA till EXCEL

Postat: 11 november 2015, 11:55:50
av Bosen
Nä, det är jag inte säker på, det kan ju va så stt jag kör för många förfrågningar.
Men just excel hänger sig oc visar "(svarar inte)" i menyraden.

Re: OBDC via VBA till EXCEL

Postat: 11 november 2015, 11:58:08
av sodjan
Jo, men Excel kan ju upplevas att "hänga" (av dig eller av Windows)
p.g.a. att Excel väntar på att servern ska svara. En koll på servern
borde ganska enkelt svara på det.

Re: OBDC via VBA till EXCEL

Postat: 11 november 2015, 12:35:26
av Bosen
Kan man lägga in en timeout i min förfrågan? Hur isåfall?

Re: OBDC via VBA till EXCEL

Postat: 11 november 2015, 12:40:26
av Jan Almqvist
Vissa MS ODBC-drivrutiner är väldigt primitiva och om man kör över nätverk blir det snart segt. Undvik.

Re: OBDC via VBA till EXCEL

Postat: 11 november 2015, 13:14:33
av Bosen
Nu har jag själv hittat felet. Det visade sig att när jag raderade QueryTable inför varje förfrågan så funkade det dåligt med att använda Columns.Clear . När jag istället använde Columns.Delete så snabbade det upp allt!!!

Tack för er hjälp ändå!

Re: OBDC via VBA till EXCEL

Postat: 11 november 2015, 13:49:04
av Lennart Aspenryd
Kul att köra ingår i, och matcha mot består av.
Bra att du fann en lösning.