アクセス データベースを作成し、ある開発者がこのデータベースのデータにアクセスする関数を Excel に作成しました。接続は、ADDB.Connection を介して行われます。この数式は、いくつかのパラメーターを考慮して、Access データベース内のボリュームの合計である 1 つの数字を返します。1 つのセルで数式を実行すると完全に機能しますが、レポートにはこの数式を含む複数のセル (約 160 セル) が含まれているためです。レポートの実行は非常に遅いです。
Access の専門家の 1 人がデータベースをチェックしましたが、構築方法に誤りはありませんでした。
これをソートする方法を誰かが考えているでしょうか?Excel を適切に機能させるためにチェックを入れる必要があるライブラリについてはどうでしょうか。私たちは現在、MS Excel & Access 2003 で作業しています (私たちは時代遅れであることを知っています) が、Excel & Access 2007 にアップグレードする機会があるでしょう (何という進歩 ;-) )、それは役に立ちますか?
これは、Excel での vba コードの詳細です。
'The function is called GetMarketData
Function GetMarketData(Optional ProductLine As String, Optional country As String, Optional CountryGroup As String, Optional Market As String, Optional startMonth As Long, Optional endMonth As Long, Optional Brand As String, Optional Model As String, Optional Segment As String, Optional EngineSegment As String)
'This is the declaration of variables
Dim con As ADODB.Connection
Dim rsQuery As ADODB.Recordset
Dim i As Integer
Dim iCount As Integer
Dim resVar As Integer
Dim query1 As String, query2 As String, query3 As String, query4 As String
Dim parametres As String, param1 As String, param2 As String, param3 As String, param4 As String, param5 As String, param6 As String, param7 As String, param8 As String, param9 As String, param10 As String
' Query cut in 3 parts (will be regrouped later on)
query1 = "SELECT Sum(T_MARKET.Volume) "
query2 = "FROM T_COUNTRY_GROUP INNER JOIN (T_TIME_PERIOD INNER JOIN (T_SELECTED_MARKET INNER JOIN (T_SEGMENT INNER JOIN (T_PRODUCT_LINE INNER JOIN ((T_BRAND INNER JOIN T_MODEL ON T_BRAND.ID_Brand = T_MODEL.FK_Brand) INNER JOIN ((T_COUNTRY INNER JOIN T_MARKET ON T_COUNTRY.ID_Country = T_MARKET.FK_Country) INNER JOIN ((T_ENGINE_SEGMENT INNER JOIN T_PRODUCT ON T_ENGINE_SEGMENT.ID_Engine_Segment = T_PRODUCT.FK_Engine_Segment) " _
& "INNER JOIN T_SEGMENT_FINAL ON T_ENGINE_SEGMENT.ID_Engine_Segment = T_SEGMENT_FINAL.FK_Engine_Segment) ON (T_PRODUCT.ID_Product = T_MARKET.FK_Product) AND (T_COUNTRY.ID_Country = T_SEGMENT_FINAL.FK_Country)) ON T_MODEL.ID_Model = T_PRODUCT.FK_Model) ON T_PRODUCT_LINE.ID_Product_Line = T_SEGMENT_FINAL.FK_Product_Line) ON (T_SEGMENT.ID_Segment = T_SEGMENT_FINAL.FK_Segment) AND (T_SEGMENT.ID_Segment = T_PRODUCT.FK_Segment)) ON T_SELECTED_MARKET.ID_Selected_Market = T_SEGMENT_FINAL.FK_Selected_Market) ON T_TIME_PERIOD.ID_Period = T_MARKET.FK_Time_period) ON T_COUNTRY_GROUP.ID_Country_Groupe = T_COUNTRY.FK_Country_Group "
query3 = "WHERE ("
param1 = "((T_PRODUCT_LINE.Product_Line)='" & ProductLine & "')"
param2 = " AND ((T_COUNTRY.Country)='" & country & "')"
param3 = " AND ((T_COUNTRY_GROUP.Country_Group)='" & CountryGroup & "')"
param4 = " AND ((T_SELECTED_MARKET.Selected_Market)='" & Market & "')"
param5 = " AND ((T_TIME_PERIOD.Cal_FullDate)>=" & startMonth & ")"
param6 = " AND ((T_TIME_PERIOD.Cal_FullDate)<=" & endMonth & ")"
param7 = " AND ((T_BRAND.Brand)='" & Brand & "')"
param8 = " AND ((T_MODEL.Model)='" & Model & "')"
param9 = " AND ((T_SEGMENT.Segment)='" & Segment & "')"
param10 = " AND ((T_ENGINE_SEGMENT.Engine_Segment)='" & EngineSegment & "')"
parametres = param1
If country <> "" Then
parametres = parametres & param2
End If
If CountryGroup <> "" Then
parametres = parametres & param3
End If
If Market <> "" Then
parametres = parametres & param4
End If
If startMonth <> 0 Then
parametres = parametres & param5
End If
If endMonth <> 0 Then
parametres = parametres & param6
End If
If Brand <> "" Then
parametres = parametres & param7
End If
If Model <> "" Then
parametres = parametres & param8
End If
If Segment <> "" Then
parametres = parametres & param9
End If
If EngineSegment <> "" Then
parametres = parametres & param10
End If
query4 = ");"
'Connexion with the Access database
Set con = New ADODB.Connection
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & URL_Base & ";"
'Open a recordset based on the query
Set rsQuery = New ADODB.Recordset
Set rsQuery.ActiveConnection = con
rsQuery.Open query1 & query2 & query3 & parametres & query4
' Give back the value from the query
GetMarketData = rsQuery.Fields(0).Value
'Clear variables
rsQuery.Close
Set rsQuery = Nothing
con.Close
Set con = Nothing
終了機能