webForumDet fria alternativet

[Excel] Skapa anslutning on the fly

Kontorsprogramur Kontorsprogram

7 svar · 542 visningar · startad av Gein

GeinMedlem sedan sep. 20005 700 inlägg
#1

Jag har en arbetsbok i Excel 2007 där jag skapar Anslutningar och QueryTables on the fly. Det fungerar som så att man matar in ett värde i en cell och då skapas en QueryTable samt en Anslutning för att hämta hem information från webben.

Tanken är att man ska kunna radera denna QueryTable samt Anslutningen om man raderar värdet ur cellen. Detta fungerar bra så länge man inte anger något tokigt i cellen. Koden ser ut såhär:

            Set QT = ActiveSheet.QueryTables.Add(Connection:= _
            "URL;http://här-finns-en-address/?ID=" & fId _
            , Destination:=Target.Offset(-1, 2))
            With QT
                .Name = "ID_" & fId & "_1"
                .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 = "4"
                .WebPreFormattedTextToColumns = True
                .WebConsecutiveDelimitersAsOne = True
                .WebSingleBlockTextImport = False
                .WebDisableDateRecognition = False
                .WebDisableRedirections = False
                .Refresh BackgroundQuery:=False
            End With
            Target.Offset(0, 1).Value = QT.Name

Om man raderar värdet ur en cell så raderas QT:n och då följer Anslutningen med också. Så här ser koden ut:

ActiveSheet.QueryTables(Target.Offset(0, 1).Value).Delete

Target.Offset(0,1).Value innehåller namnet på den QueryTable.

Allt bra så här långt. Problemet kommer när man matar in ett felaktigt ID som får Anslutningen att misslyckas. Dvs att den inte lyckas hämta hem den specificerade tabellen för den URL:en. Jag har försökt sköta detta med en Felhanterare som, om detta sker, raderar QT:n. Problemet är här att Anslutningen inte raderas på samma gång utan ligger kvar. Vilket betyder att det teoretiskt sett kan ligga kvar massa "slaskanslutningar".

Jag vet inte riktigt hur jag ska kunna referera till den Anslutning som skapas i samband med att jag kör Set QT = ActiveSheet.QueryTables.Add. Dessa anslutningar får bara standardnamnen "Anslutning", "Anslutning1", "Anslutning2", osv osv.

Jag har försökt att först skapa en anslutning och sedan referera till den när jag kör

Set QT = ActiveSheet.QueryTables.Add

men jag lyckas inte. Vet inte ens om det går att göra på det sättet.

Några idéer?

lecxeMedlem sedan okt. 200750 inlägg
#2

Du kan ju prova att tex via datavalidering eller VBA styra vilka värden som är tillåtna att mata in. Detta borde bota "symptomet" även om det inte är en lösning på "sjukdomen".

/lecxe

GeinMedlem sedan sep. 20005 700 inlägg
#3

lecxe skrev:

Du kan ju prova att tex via datavalidering eller VBA styra vilka värden som är tillåtna att mata in. Detta borde bota "symptomet" även om det inte är en lösning på "sjukdomen".

/lecxe

Problemet är att jag inte i förväg vet vad som är ett giltigt ID. Jag måste "testköra" för att veta det och då är det redan för sent.

lecxeMedlem sedan okt. 200750 inlägg
#4

Du kanske skulle kunna prova att skriva en kod som ändrar connection på din querytable till något som du vet fungerar och därefter köra qt.delete. Har inte provat det själv men du kan ju alltid prova och sse om det fungerar.

/lecxe

GeinMedlem sedan sep. 20005 700 inlägg
#5

Ändrar jag Connection på QT:n och sedan raderar den så kommer inte den gamla Anslutningen att försvinna utan den ligger då kvar.

lecxeMedlem sedan okt. 200750 inlägg
#6

Var ligger den kvar någonstans? Kör du kod för att kolla vilka anslutningar som inte har någon QT?

lecxeMedlem sedan okt. 200750 inlägg
#7

Prova om detta funkar:

ActiveSheet.QueryTables(Target.Offset(0, 1).Value).WorkbookConnection.Delete

GeinMedlem sedan sep. 20005 700 inlägg
#8

lecxe skrev:

Prova om detta funkar:

ActiveSheet.QueryTables(Target.Offset(0, 1).Value).WorkbookConnection.Delete

Stort tack! Där har vi lösning! :bire

130 ms totalt · 3 externa anrop · v20260731065814-full.b2af184d
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)