엑셀 시트 내의 지정된 범위에서 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
'programing' 카테고리의 다른 글
Spring Boot Resource Server에서 보안 예외 처리 (0) | 2023.06.25 |
---|---|
클라이언트의 NLS_LANG를 확인하려면 어떻게 해야 합니까? (0) | 2023.06.25 |
Python AttributeError: 'module' 개체에 'Serial' 특성이 없습니다. (0) | 2023.06.25 |
Spring-Boot Jersey: Jersey가 정적 콘텐츠를 제공하도록 허용 (0) | 2023.06.25 |
설치 폴더에 대한 MariaDB를 쿼리하시겠습니까? (0) | 2023.06.25 |