webForumDet fria alternativet

Referera till en cell i SQL-fråga

7 svar · 675 visningar · startad av uge

ugeMedlem sedan feb. 20075 inlägg
#1

Hej!

Jag har även postat detta i Visual Basic-forumet för någon dag sedan, men det verkar ju inte vara någon hejdlös aktivitet där... Så jag försöker här istället.

Jag försöker plocka ut viss data från en databas genom en ODBC-drivrutin i Excel 97. I det aktuella fallet så vill jag skriva ett artikelnummer i en cell och sen trycka på en knapp och då hämtar Excel data från databasen baserat på artikelnummret som jag skrev i cellen. Dock är jag inte så haj på VB även om jag förstår en del, men jag listar inte ut hur jag refererar till cellen i databasfrågan. Själva frågan plockade jag fram genom att spela in ett makro som hämtar data.

Detta är vad makrot b.la spelade in:

SELECT Artikel.Nr, Artikel.Beskrivning" & Chr(13) & "" & Chr(10) & "FROM Artikel Artikel" & Chr(13) & "" & Chr(10) & "WHERE (Artikel.Nr='0092213700')" _
)

På något sätt vill jag skriva artikelnummret 0092213700 i cellen A1 och sedan referera till cellen i databasfrågan längst till höger, istället för artikelnummret.

Finns det någon vänlig själ som kan hjälpa mig med detta?!

// uge

MindreVetandeMedlem sedan okt. 2005371 inlägg
#2

Worksheets("blad1").Range("A1").Value

Men att få in " och ' rätt i en textstäng är inte min starka sida. Men ett slut i den här stilen borde bli hyggligt rätt:

& Chr(10) & """WHERE (Artikel.Nr='" & _
Worksheets("blad1").Range("A1").Value & "')""" & ")"

Ähhh, tror jag...

Tänk på att du måste mata in värdet i A1 rätt också. Dvs som en textsträng (om de initiala 0:orna är viktiga). Det enklaste sättet är att sätta en ' (enkelfnutt) innan siffrorna när du matar in, typ:
'0092213700
Då tolkas det som text ( ' tecknet skickas inte vidare)

ugeMedlem sedan feb. 20075 inlägg
#3

Tack för ditt svar! Jag har suttit en lång stund och försökt få det att fungera, men det vill sig inte... Jag har förmodligen också problem med " och ' på rätt ställe... Jag har nu suttit länge och i mitt tycke testat alla kombinationer för att det ska fungera, men icke...

Jag kanske klipptre bort lite för mycket när jag klistrade in koden i förra inlägget, så här kommer lite mer:

.Sql = Array( _
"SELECT Artikel.Nr, Artikel.Beskrivning" & Chr(13) & "" & Chr(10) & "FROM Artikel Artikel" & Chr(13) & "" & Chr(10) & "WHERE (Artikel.Nr='0092213700')" _
)

Någon annan som har en bra lösning - hur får jag in Worksheets("blad1").Range("A1").Value istället för artikelnummret ovan?

MindreVetandeMedlem sedan okt. 2005371 inlägg
#4

Är helt oduglig på SQL. Men du vill alltså skicka iväg någonting i stil med:

SELECT Artikel.Nr, Artikel.Beskrivning
FROM Artikel Artikel
WHERE (Artikel.Nr='0092213700')

det är bara enkelfnuttarna runt artikelnumret som skall vara kvar? Då är ju mitt slut åt Hxxxxte fel. Trodde du ville skicka med " också.

sHelpString = "SELECT Artikel.Nr, Artikel.Beskrivning" & Chr(13) & "" & Chr(10) _
& "FROM Artikel Artikel" & Chr(13) & "" & Chr(10) _
& "WHERE (Artikel.Nr='" & Worksheets("blad1").Range("A1").Value & "')"

.Sql = Array( sHelpString )

Om det sista blir rätt vette tusan (borttaget från XL-hjälpen eftersom det är "obsolet" efter excel 97). Men strängen borde stämma i alla fall. Ähhh, tror jag...

sHelpString = "SELECT Artikel.Nr, Artikel.Beskrivning" & Chr(13) & "" & Chr(10) _
& "FROM Artikel Artikel" & Chr(13) & "" & Chr(10) _
& "WHERE (Artikel.Nr='" & Worksheets("blad1").Range("A1").Value & "')"

MsgBox (sHelpString)

' Ser i alla fall likadant ut som

MsgBox ( _
"SELECT Artikel.Nr, Artikel.Beskrivning" & Chr(13) & "" & Chr(10) & _
"FROM Artikel Artikel" & Chr(13) & "" & Chr(10) & _
"WHERE (Artikel.Nr='0092213700')" _
)

Det finns för övrigt en VBA-konstant för "Carriage return–linefeed "
vbCrLf = Chr(13) + Chr(10)
Så kanske du kan korta ner den delen i alla fall

ugeMedlem sedan feb. 20075 inlägg
#5

Tack för hjälpen!

AH! Det fungerar! Tack för hjälpen!

Dock en liten effekt som jag inte hade räknat med... Jag kopplade koden till en knapp så när jag fyller i ett artikelnummer och trycker på knappen så hämtar koden artikelnummret och beskrivningen till cellerna B1 och C1.

Trycker jag på knappen igen så får jag ett felmeddelande om att minnet är fullt. Det verkar som om den inte kan skriva informationen till cellerna en gång till. Om jag markerar cellerna B1 och C1 och trycker delete på detta så går det bra att trycka på knappen igen och informationen hämtas som den ska.

Hur kan man lösa detta?! Hur "nollar" jag cellerna före databasfrågan?

Förresten, det här är ju skitkul! Finns det någon bra källa på internet (gärna svensk) där man kan se exempel på VB för Excel?

MindreVetandeMedlem sedan okt. 2005371 inlägg
#6

Hur tilldelar du cellerna värdet?
Det här borde fungera:
Range("b1").Value=svaret på din körning

Eller, en nollning
Range("b1").Value=""

Sen tror jag att excel 97 har en begränsning i hur mycket som får stå i varje cell. Typ 256 eller 1024 tecken. Nyare excel är lite flexiblare

Gurun är väl:
https://www.xldennis.com
Sen finns det ganska mycket hos microsoft. Men det är inte så lätt att hitta.
Den här sidan:
https://www.exceltip.com Forumsidorna
Har (?haft?) möjligheten att söka i en massa olika nyhetsgrupper från ett ställe, men det verkar inte fungera just nu:-(
Annars kan du gå direkt på Googlegrupperna, t.ex:
http://groups.google.com/group/microsoft.public.excel.programming/topics?gvc=2

ugeMedlem sedan feb. 20075 inlägg
#7

Jag nollade enligt ditt förslag och då löste sig allting! Nu nollas cellerna först och sen körs databasfrågan. Funkar kanon!

Tänk att man aldrig lär sig... jag skulle förstås tagit med ALL koden från början så hade vi sluppit ett par inlägg, hähä!


Private Sub CommandButton1_Click()
            
Range("B1").Value = ""
Range("C1").Value = ""

    With ActiveSheet.QueryTables.Add(Connection:= _
        "ODBC;DRIVER={C/ODBC 32 bit};CSF=Yes;SName=bla-server;NType=tcp;UID=username;PWD=userpass;CN=companyn ame AB;SERVER=N;" _
        , Destination:=Range("B1"))
        
        sHelpString = "SELECT Artikel.Nr, Artikel.Beskrivning" & Chr(13) & "" & Chr(10) _
        & "FROM Artikel Artikel" & Chr(13) & "" & Chr(10) _
        & "WHERE (Artikel.Nr='" & Worksheets("blad1").Range("A1").Value & "')"

        .Sql = Array(sHelpString)
        
        .FieldNames = False
        .RefreshStyle = xlInsertDeleteCells
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .RefreshOnFileOpen = False
        .HasAutoFormat = True
        .BackgroundQuery = True
        .TablesOnlyFromHTML = True
        .Refresh BackgroundQuery:=False
        .SavePassword = True
        .SaveData = False
    End With

End Sub

Tack så himla mycket för hjälpen! // En tacksam UGE

MindreVetandeMedlem sedan okt. 2005371 inlägg
#8

Du kanske skall fylla "sHelpString" utanför (innan) frågan?
Nu skapas den mitt i "with...QueryTables... End with".
Egentligen skall väll all kod som står där vara direkt relaterad till frågan? Jag antar att VBA är ganska förlåtande. Men det kanske är dumt att ta onödiga risker?

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