programing

엑셀 시트 내의 지정된 범위에서 SQL 문을 실행하려면 어떻게 해야 합니까?

magicmemo 2023. 6. 25. 18:37
반응형

엑셀 시트 내의 지정된 범위에서 SQL 문을 실행하려면 어떻게 해야 합니까?

Excel 시트의 표준 범위(예: 명명된 범위 또는 A1:F100)를 사용하여 일부 SQL 쿼리를 실행하고 VBA 코드로 단계별로 수행하거나 동일한 워크북의 다른 시트에 붙여넣을 수 있는 레코드 세트를 반환하는 것입니다.

ADODB를 사용하는 것이 한 가지 고려 사항이었지만, 현재 워크북 내에서 특정 범위를 가리키도록 연결 문자열을 어떻게 설정할 수 있습니까?

Microsoft 쿼리 마법사를 사용하기 전에 이미 알고 있습니다. 이 마법사는 이상적이지는 않지만 작동할 것입니다.이것이 시트 내의 범위를 나타내는 것인지 알 수 없습니다. 다른 엑셀 파일만 해당됩니다.


여기에 제가 남겨둔 기능이 있습니다.몇 번 실행하면 리소스 부족 오류 메시지와 함께 Excel이 충돌합니다.제 스프레드시트에서 이 기능을 제거했고, 모든 것이 여러 번 원활하게 실행되므로 분명히 여기 코드 때문에 발생한 것입니다.

모든 개체를 정리했습니다(정확히?).뭐가 잘못되고 있는지 아는 사람?연결 문자열에 조정될 수 있는 무언가가 있거나 GetRows 메서드에서 반환되는 변형과 관련이 있을 수 있습니까?

저는 MSADO 2.8을 사용하고 있으며, 2.5도 같은 동작으로 사용해 보았습니다.

Function getTimeBuckets() As Collection

Dim strFile As String
Dim strCon As String
Dim strSQL As String
Dim dateRows As Variant
Dim i As Integer
Dim today As Date

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
Set getTimeBuckets = New Collection

strFile = ThisWorkbook.FullName
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _
    & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
cn.Open strCon

strSQL = "SELECT DISTINCT(Expiration) FROM [PositionSummaryTable] where [Instrument Type] = 'LSTOPT'" 

rs.Open strSQL, cn


dateRows = rs.GetRows
rs.Close

'today = Date
today = "6-may-2009"

For i = 1 To UBound(dateRows, 2)
    If (dateRows(0, i) >= today) Then
        getTimeBuckets.Add (dateRows(0, i))
    End If
Next i

Set dateRows = Nothing
Set cn = Nothing
Set rs = Nothing
End Function

그냥 이름으로 하시면 됩니다.

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset 

strFile = Workbooks(1).FullName
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _
    & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

cn.Open strCon

''Pick one:
strSQL = "SELECT * FROM DataTable" ''Named range
strSQL = "SELECT * FROM [Sheet1$A1:E346]" ''Range

rs.Open strSQL, cn

Debug.Print rs.GetString

질문 2에 대한 답변

오늘의 레코드만 원하는 것으로 알고 있으므로 SQL을 다음으로 수정할 수 있습니다.

strSQL = "SELECT DISTINCT(Expiration) FROM [PositionSummaryTable] " _
& "where [Instrument Type] = 'LSTOPT' AND [Expiration]=#" _
& Format(Date(),"yyyy/mm/dd") & "#"

연결을 닫지 않았습니다.

cn.Close

그리고 나서.

 Set rs=Nothing
 Set cn=Nothing

LIKE 조항을 사용하는 것은 어떻습니까?

사용하려고 했습니다.

select * from [PES$] where PID_TAG like '*5400001'

성공하지 못한 채로...

작동합니다.

select * from [PES$] where PID_TAG = 'PIT5400001'

하지만 이건 내가 원하는 게 아닙니다.

편집

음... 우리는 와일드카드를 바꿔야 합니다...* 사용 안 함, % 사용

VBA에 대해서는 잘 모르겠습니다만, Delphi와 C#에 온라인에 있는 코드 중에 형식을 사용하는 코드가 있습니다.

SELECT * FROM [SheetName$A1:B2]

먹어 봤어요?

파워셸을 사용하는 경우 $는 내부 문자입니다.$를 사용합니다.

예:

"Select * from [VM`$A3:F30]"

언급URL : https://stackoverflow.com/questions/914980/how-can-i-run-sql-statements-on-a-named-range-within-an-excel-sheet

반응형