2010-11-16 34 views
8

Tôi đang sử dụng Excel để lấy dữ liệu từ một db SQL. Tôi đã sử dụng mã từ một câu hỏi SO khác và nó hoạt động tốt. Bây giờ tôi muốn kéo vào các tên cột từ một bảng ngoài bảng thực tế. Tôi đã tìm ra rằng tôi có thể lấy tên bằng cách sử dụng vòng lặp For For fld. Tuy nhiên vẫn còn vấn đề của chúng cư trú theo chiều ngang trong một hàng trong Excel như số cột có thể thay đổi - vì vậy tôi nghĩ rằng tôi sẽ cần khác Đối với mỗi vòng lặp cũng hoặc một cái gì đó tương tự.Kéo các tên cột vào Excel từ truy vấn SQL

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

Bạn có muốn các tiêu đề được xếp hàng với dữ liệu không? Dữ liệu bắt đầu bằng A1, nhưng dường như bạn đã đặt phạm vi tiêu đề thành A4. –

+0

yeah bạn nói đúng - sao chép và dán sai phần của tôi. – firedrawndagger

Trả lời

11

Ok vì vậy tôi đã tìm ra sau 4 lần thử, đây là mã cho vòng lặp.

'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

Bạn không cần phải chọn Cell sử dụng một cái gì đó như 'Range (" A4 "). OffSet (0, x) .value = fld.Name' –

19

đang bình thường của tôi là rất giống nhau:

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

Tôi thích" độ ngắn "của giải pháp của bạn. Tôi vừa mở rộng nó một chút để đặt tiêu đề thành Bold. –

+1

Tôi bối rối khi không có giải pháp nào không phải là vòng lặp. – mvbentes

6

Để làm cho nó siêu đơn giản, làm một cái gì đó như thế này (sử dụng Sheet1 và recordset r)

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

Bạn chỉ có thể thiết lập của bạn Biến "x" thành 0 và sau đó thực hiện như sau:

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 

Và điều đó sẽ làm cho nó dễ đọc hơn một chút ... :)

Các vấn đề liên quan