2017-01-13 13 views
1

よくわからない人には、VBAマクロにSQL機能を追加するのはかなり簡単です。次の記事では、コードを提供します:http://analystcave.com/excel-using-sql-in-vba-on-excel-data/Excel VBAのSQL機能

これを少し修正して(コードを提供して嬉しいです)、うまく出力され、呼び出すことができるSubに入れます。これにより、大きなワークシートから特定のデータを見つけるために、複数のソートやコピー貼り付けなどを行う必要がなくなります。

ただし、オンラインソースからブックを操作するときに問題が発生することに注意してください。 Gmailの場合:

.ConnectionString = "データソース=" & ThisWorkbook.Path & "\" & ThisWorkbook.Name & ";"

ファイルがドライブに保存されているが、オンラインサイトからExcelが接続できない場合は正常に動作します。ファイルがどこにも保存されない場合の接続文字列の変更に関する提案はありますか?

+0

この場合、ConnectionStringのサンプルを提供できますか?それが機能するには、それを操作する必要があるかもしれません。 – wdosanjos

+2

ワークブックがディスクに保存されていない場合は、この方法を使用できません。あなたができるベストは、一時的なコピーをディスクに保存してそれを照会することです。 –

+0

@wdosanjos現在の接続文字列はThisWorkbook.Pathと.Nameを使用しますが、ファイルが保存されていないためパスがない場合はどうすればよいでしょうか? –

答えて

1

興味のある方は、このコード(Analyst Caveのコードに基づいています)はVBAでSQLを使用するのに最適です。サブとして次を保存します。

Option Explicit 

Sub QuerySQL(result_location As Range, query As String) 

    Dim ResultWS As Worksheet 
    Set ResultWS = ThisWorkbook.Sheets("Query Results") 
    ResultWS.Cells.ClearContents 

    If query = "" Then Exit Sub 

    Dim cn As Object, rs As Object 
    'Add to the workbook a database connection with itself 
    'Note other ConnectionString could be used to access a variety of media 
    Set cn = CreateObject("ADODB.Connection") 
    With cn 
     .Provider = "Microsoft.ACE.OLEDB.12.0" 
     .ConnectionString = "Data Source=" & ThisWorkbook.Path & "\" & ThisWorkbook.Name & ";" & _ 
     "Extended Properties=""Excel 12.0 Xml;HDR=YES"";" 
     .Open 
    End With 

    'Build and execute the SQL query 
    Set rs = cn.Execute(query) 
    If rs.EOF = True Then Exit Sub 

    'Print column labels 
    Dim i As Long, j As Long 
    For i = 0 To rs.Fields.Count - 1 
     result_location.Offset(0, i).Value = rs.Fields(i).Name 
    Next i 

    'Print column contents 
    i = 0 
    Do 
     For j = 0 To rs.Fields.Count - 1 
      result_location.Offset(i + 1, j).Value = rs.Fields(j).Value 
     Next j 

     rs.MoveNext 
     i = i + 1 
    Loop Until rs.EOF 

    'Close the connections 
    rs.Close 
    cn.Close 
    Set rs = Nothing 
    Set cn = Nothing 

End Sub 

それを使用するには、次の手順を実行します。

Dim myQuery As String 
myQuery = "SELECT * FROM [Sheet2$]" 
Call QuerySQL(ThisWorkbook.Sheets("Sheet1").Range("A1"), myQuery) 

それはMS AccessのスタイルSQLを使用しています。上記では、Sheet2をテーブルとして検索し、A1で始まる結果をSheet1に印刷します。

+1

これは、問題で提起された問題に対処するために表示されません。 (そして、 'result_location.Offset(1、0).CopyFromRecordset rs'を使ってデータを保存すると、速度が飛躍的に向上します) – YowE3K

+0

ExcelにSQLを追加する方法を尋ねる人がいるので、それは私にとって完璧に機能します。 –

+0

質問に答えることができない場合は回答として追加しないでください。質問の一部として追加する必要がありますが、この場合は、既に良いMCVEを持っている必要はありません。 – YowE3K