2010-11-16 15 views
8

Verileri bir SQL db'den çekmek için Excel kullanıyorum. Kodu başka bir sorudan kullandım ve iyi çalışıyor. Şimdi gerçek tabloya ek olarak bir tablodan sütun isimlerini çekmek istiyorum. Her fld döngüsünü kullanarak isimleri alabileceğimi anladım. Ancak, sütunların sayısı değişebileceğinden, bunları Excel'in bir satırında yatay olarak doldurma sorunu hala var - bu yüzden her bir döngü için ya da benzer bir şeye ihtiyaç duyacağımı düşünüyorum.Sütun Adlarını SQL sorgusundan Excel'e Çekme

Sub GetDataFromADO() 

'Declare variables' 
    Set objMyConn = New ADODB.Connection 
    Set objMyCmd = New ADODB.Command 
    Set objMyRecordset = New ADODB.Recordset 

'Open Connection' 
    objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;User ID=abc;Password=abc;" 
    objMyConn.Open 

'Set and Excecute SQL Command' 
    Set objMyCmd.ActiveConnection = objMyConn 
    objMyCmd.CommandText = "select * from myTable" 
    objMyCmd.CommandType = adCmdText 
    objMyCmd.Execute 

'Loop Names' 
    ' WHAT TO DO HERE????' 

'Open Recordset' 
    Set objMyRecordset.ActiveConnection = objMyConn 
    objMyRecordset.Open objMyCmd 

'Copy Data to Excel' 
    ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset) 

End Sub 
+0

Başlıkların veri ile dizilmesini istemiyor musunuz? Veri A1'de başlar, ancak başlık aralığını A4 olarak ayarlamışsınız demektir. –

+0

evet haklısın - kötü kopya ve benim tarafıma yapıştır. – firedrawndagger

cevap

11

Tamam, ben 4 denemeden sonra bunu çözdüm, işte döngü için kod.

'Loop' 
Dim FieldRange As Range 
Set FieldRange = Range("A4") 
Set TableColumns = Range("A4:H4") 
x = 1 

Range("A4").Select 

For Each fld in objMyRecordset.Fields 
     ActiveCell.Value = fld.Name 
     ActiveCell.Offset(0, x).Select 
     x = x + 1 'tick iterator 
Next 

ActiveSheet.Range("A5").CopyFromRecordset objMyRecordset 
Range("A4").Select 
+1

Hücrenin, Aralık Aralığı ("A4") gibi bir şey kullanmasına gerek yoktur. OffSet (0, x) .value = fld.Name' –

19

Her zamanki kod çok benzer:

For intColIndex = 0 To objMyRecordset.Fields.Count - 1 
    Range("A4").Offset(0, intColIndex).Value = objMyRecordset.Fields(intColIndex).Name 
Next 
+0

Çözeltinizin "kısalığı" nı seviyorum. Üstbilgileri Bold'a ayarlamak için biraz genişlettim. –

+1

Bir döngüye başvurmayan bir çözümün yokluğunda şaşırdım. – mvbentes

6

, süper basit hale Sadece ayarlayabilirsiniz böyle bir şey (Sayfa1 kullanarak ve kayıt kümesi r)

For i = 0 To r.Fields.Count - 1 
     Sheet1.Cells(1, i + 1) = r.Fields(i).Name 
    Next i 
3

yapmak için senin

x = 0 

For Each Field In RS.Fields 'RS being my Recordset variable 
    Range("A3").Offset(0, x).Value = Field.Name 
    x = x + 1 
Next Field 
: o zaman "x" 0 olarak değişken ve böyle bir şey yapmak 0

Ve bu onu okumayı biraz daha kolaylaştıracak ... :)

İlgili konular