Napisałem makro, które pozwala mi wykonać na zaznaczonej tabeli operację SQL i zwrócić pojedynczą wartość. Jeżeli jest tych wartości więcej, są one przedstawione, jako łańcuch tekstowy w jednej komórce.
Jak uwzględnić możliwość zwrócenia przez moją funkcję więcej niż jednej wartości? Zwrócić tablicę/array do sąsiadujących komórek?
Wiem, że funkcja nie może modyfikować komórek sąsiednich tak jak procedura, może zmodyfikować tylko wartość komórki, w której się znajduje. Ale może da się zaznaczyć zakres i dla całego wprowadzić jedną formułę, i Ctrl+Shift+Enter (jak dla formuł tablicowych)? Jak powinna w takiej sytuacji wyglądać:
- deklaracja typu zwracanego przez funkcję i,
- jak inaczej zwrócić wartości z Recordset, by do komórek została zwrócona tablica (najchętniej z nagłówkami). Poniżej mój kod, załączam też plik:
Function SQL(dataRange As Range, CritA As String) Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim currAddress As String currAddress = ActiveSheet.Name & "$" & dataRange.Address(False, False) strFile = ThisWorkbook.FullName strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile _ & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";" Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") cn.Open strCon strSQL = "SELECT * FROM [" & currAddress & "]" & _ "WHERE [A] = '" & CritA & "' " & _ "ORDER BY 1 ASC" rs.Open strSQL, cn SQL = rs.GetString End Function
Załączniki
- sql_udf_JacekKotowski.xlsm ( 20K )