web-dev-qa-db-ja.com

SQLクエリからExcelに列名をプルする

私はExcelを使用してSQLデータベースからデータをプルしています。別のSO質問のコードを使用しましたが、正常に機能します。実際のテーブルに加えて、テーブルから列名を取得したいと思います。名前を取得できることがわかりました。 For Each fldループを使用します。ただし、列の数が変わる可能性があるため、Excelの行に水平方向に入力するという問題がまだあります。したがって、別のForEachループなども必要になると思います。

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
10
firedrawndagger

わかりました。4回試行した後でわかりました。ループのコードは次のとおりです。

 '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
12
firedrawndagger

私の通常のコードは非常に似ています:

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

非常に簡単にするには、次のようにします(Sheet1とrecordset rを使用)

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

「x」変数を0に設定してから、次のようにすることができます。

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

そしてそれはそれを少し読みやすくするでしょう... :)

3
Tony Diaz