Makro wygląda nastepująco:
Sub odczyt_SQL_doTabl()
connstring = "ODBC;DSN=Nazwa;UID=User;PWD=Password;Database=NazwaBazy"
sqlstring = "select * from TABELA where Nr_Rekordu='" & InputBox("podaj nr
rekordu") & "'"
With ActiveSheet.QueryTables.Add(Connection:=connstring, _
Destination:=Range("B1"), Sql:=sqlstring)
.Refresh BackgroundQuery:=False
.ResultRange.Select
End With
End Sub
--
Pozdrawiam
Daniel Stawicki
Specjalista ds. Pomocy Technicznej
Pomoc Techniczna Microsoft
// Uprzejmie proszę o nie wysyłanie zapytań bezpośrednio na mój adres email.
Zapytania takie pozostaną bez odpowiedzi, gdyż adres ten nie jest
monitorowany. //
Tak jak P.Daniel niedokładnie rozumiem problem ....
Mogę tylko domyślać się, że pobierasz z bazy JEDEN rekord z wieloma polami
("kolumnami") ... i chcesz dane każdego pola wypisać jedno pod drugim (w
układzie pionowym)
Takie rozwiązanie należy do raczej niestandardowych i nie wykonasz tego
chyba w ten sposób.
Wg. mnie powinieneś pobrać recordset w kodzie i sterować jego
"wyświetleniem" ... mniej więcej tak:
Dim moCon As New ADODB.Connection
Dim rsDat As New ADODB.Recordset
Dim sSQL As String
moCon.ConnectionString =
"ODBC;DSN=Nazwa;UID=User;PWD=Password;Database=NazwaBazy;"
moCon.Open
sSQL = "select * from TABELA where Nr_Rekordu='" & InputBox("podaj nr
rekordu") & "'"
rsDat.Open sSQL, moCon, adOpenStatic, adLockReadOnly, adCmdText
If Not rsDat.EOF Then
For lwiersz = 0 To rsDat.Fields.Count -1
With Sheet1.Range("A1")
.Offset(lwiersz, 0).Value = rsDat.Fields(lwiersz ).Name
.Offset(lwiersz, 1).Value = rsDat.Fields(lwiersz ).Value
End With
Next lwiersz
End If
Na szybko wypisałem kod, więc mam nadzieje, że ewentualne literówki itp.
poprawisz ;)
Idea powinna być czytelna.
Pozdrawiam
--
IDKrzych
"Jakkolwiek będzie - będzie inaczej, aniżeli sobie wyobrażamy
- ponieważ między Dobrem a Złem znajdujemy się w życiu i w świecie
wielowymiarowym,
w którym dokumentnie pomieszane jest Przypadkowe z Nieuchronnym."
(S. Lem 1999)
"IDKrzych" wrote:
> .
>
Dziękuje bardzo za reakcję w mojej sprawie.
Dokładnie tak. Jak napisałeś. Chcę pobrac jeden rekord z tablicy z wieloma
kolumnami (posiadającymi różne typy danych - liczbowe, tekstowe, data...) i
chcę wypisać je jedno pod drugim (w kolumnie)....
Skopiowałem przykład do swojego makra w Excelu i już wysypuje się na
początku zwracając błąd: Compile Error: User-defined type not defined
Sprawdziłem problem wpisując wszystko z ręki i po "Dim moCon As New" w oknie
wyboru nie mam ADODB...
Po pierwsze musisz dodac referencje (w edytorze VBA Tools References) do
Microsoft ActiveX Object 2.8 Library
A dalej
Dim oConn As Object (polaczenie z sql)
DIm rs As ADODB.Recordset (zmienna przechowujaca wynik z sql)
Dim oRS As Object
dim sSQL as string (zmienna przechowujaca polecenie SQL)
oConn.Open = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=NAZWA
UZYTKOWNIKA SQL ;Initial Catalog=NAZWA BAZY;Data Source=NAZWA SERWERA;Use
Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Password=HASLO"
(otwiera polaczenie)
sSQL = "Tutaj wpisz swojego selecta)
Set rs = oConn.Execute(sSQL) (pobranie danych z SQL)
Arkusz1.Cells(1, 1).Value = rs.Fields(0).Value
Arkusz1.Cells(1, 2).Value = rs.Fields(1).Value
Arkusz1.Cells(1, 3).Value = rs.Fields(2).Value
Do While Not rs.EOF
Petli w sumie mozesz sie pozbyc w twoim przypadku.
A dane z SQL masz w rs.fields i numerek. 0 to pierwsza kolumna, 1 to druga
kolumna itd.
rs.MoveNext
Loop
Aha tak .. zapomniałem napisać:
Potrzebna jest zdefiniowana referencja do biblioteki wykorzystującej ADO
Musisz w oknie Visual Basic .. menu Tools > References .. tu znalezć na
liście "Microsoft ActiveX Data Objects 2.8 Library
" i "zaptaszyć" :) ... (wszystko będąc/widząc arkusz/moduł makra w którym
jest używane ADODB)
Nie wiem w czym tkwi problem, gdyż pierwotne makro na połączeniu wskazanym
na początku postu działało.
to już ciężko będzie, bez podania konkretniejszych informacji ... sam w
sumie mało korzystam z ODBC (to już prawie wymarły standard):
problemem jest ciąg połączenia .. tu podałem ten z Twojego przykładu:
"ODBC;DSN=Nazwa;UID=User;PWD=Password;Database=NazwaBazy"
musisz skonfigurować sterownik ODBC i plik wymiany DSN.
z jakiego typu bazy danych pobierasz rekordy ?
musisz wygooglować odpowiedni ciąg ... czasami troszkę metodą prób i błędów
dobrać
(pomocna stronka http://www.connectionstrings.com/)
najlepij poprzez ADO ...
np dla plików Accessa *.mdb "provider" w najprostszej formie wystarczy np.
tak:
"Provider='Microsoft.Jet.OLEDB.4.0';Data Source='d:\pliki\baza.mdb';"
(Microsoft.Jet też już jest niewspierany, ale ze względu na popularność
jeszcze chyba długo posłuży w większości windowsów)
"Provider=SQLOLEDB.1;UID=UserName;PWD=Password;" & _
"Persist Security Info=False;" & _
"Initial Catalog=NazwaBazy;" & _
"Data Source=Nazwa"
Natomiast w rozwiązaniu P. Daniela zmienie uległa deklaracja zmiennej
Dim oConn As New ADODB.Connection
oraz w dalszej części
oConn.ConnectionString = "Provider=SQLOLEDB.1;UID=UserName;PWD=Password;" & _
"Persist Security Info=False;" & _
"Initial Catalog=NazwaBazy;" & _
"Data Source=Nazwa"
oConn.Open
Tak, czy tak, jeszcze raz podziękowania za pomoc i pełen profesjonalizm.
pozdrawiam,
Cieszę się że mogliśmy pomóc :)
> Natomiast w rozwiązaniu P. Daniela zmienie uległa deklaracja zmiennej
>
> Dim oConn As New ADODB.Connection
na marginesie:
deklaracji "as Object" jak było w pierwotnym przykładzie należy się
wystrzegać .... jest to tak zwane "późne wiązanie" i wiąże się z
pogorszeniem wydajności i trudnościami podczas pisania "brak podpowiedzi w
edytorze".
Wszystkie obiekty należy od początku deklarować jako konkretne ... a
przypadki "as object" tylko w szczególnych wypadkach gdy musimy do jednej
zmiennej podawać referencje do różnych obiektów.