带有 Adodb 查询的下拉列表

Mar*_*rie 4 excel vba

我想用我的查询结果创建下拉列表。我正在寻求帮助,因为我不知道如何在列表中显示此结果。

清单示例:

在此处输入图片说明

我的查询是:

 'DROPDOWN LIST

  Private Sub cb_gest_Change()
  If Not FSD.cb_gest.MatchFound And FSD.cb_gest <> "" Then
  MsgBox "Saisie impossible, le gestionnaire n'existe pas !", , "Contrôle 
  Gestionnaire"
  FSD.cb_gest = ""
  Else
  FSD.Cells(29, COL_DATA) = FSD.cb_gest
  End If
  End Sub

  'DROPDOWN LIST

  Sub init_combo()
  Dim Resultat As ADODB.Recordset
  Dim Requete As String
  FSD.cb_gest.Clear
  Requete = "select lb_gestion from DB_GESTIONNAIRE "
  Requete = Requete + "WHERE (d_deb_valid <= TRUNC(SYSDATE) OR d_deb_valid IS 
  NULL) AND (d_fin_valid >= TRUNC(SYSDATE) OR d_fin_valid IS NULL)"
  Requete = Requete + " ORDER BY LB_GESTION"
  Set Resultat = New ADODB.Recordset
  Resultat.ActiveConnection = oBase
  Resultat.Source = Requete
  Resultat.Open
  While Not Resultat.EOF
  FSD.cb_gest.AddItem Resultat!lb_gestion
  Resultat.MoveNext
  Wend
  If FSD.Cells(29, COL_DATA).Value <> "" Then
  FSD.cb_gest = FSD.Cells(29, COL_DATA).Value
  Else
  FSD.Cells(29, COL_DATA).Value = ""
  End If
  End Sub
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助 !

Mat*_*don 5

考虑一种不同的无代码方法:

  • 将新工作表添加到宿主文档/工作簿
  • 从“数据”功能区选项卡导入外部数据(选择“来自 SQL Server”)
    • Excel 创建一个ListObjectQueryTable对象支持的表,该对象使用WorkbookConnection可以配置为在打开时自动刷新,或单独作为一次性拉取。
  • 选择produitListObject/table中的列;Excel 突出显示整个列内容并保持未选中标题。
  • 从“公式”功能区选项卡中,单击“定义名称”组中的“定义名称”命令。
    • 命名范围ProductsList,验证它所引用的内容,TableName[produit]以便它自动增长和缩小以适应列内容。
  • 将数据验证列表更改为=ProductsList.
  • 如果需要,隐藏包含查询和表的工作表。

无需代码,验证列表将始终与刷新的查询结果保持同步。


旁注,该查询似乎使交叉联接效率低下,其中至少一个是可以表示为内部联接的 where-join。您确定查询产生了预期的记录(我怀疑它产生了大量重复项,具体取决于交叉联接表中存在的记录数)?

SELECT prod.cd_produit AS produit 
FROM db_dossier sousc, db_produit prod, db_protocole proto, db_tiers tiers, db_personne pers
WHERE sousc.cd_dossier = 'SOUSC' AND sousc.lp_etat_doss NOT IN ('ANNUL','A30','IMPAY') AND sousc.is_produit = prod.is_produit
Run Code Online (Sandbox Code Playgroud)

本能是删除我们没有从中选择或过滤任何内容的表 - 如果此查询产生相同的预期输出,那么假设定义了主键和外键,我相信它的执行计划会更有效:

SELECT prod.cd_produit AS produit 
FROM db_dossier AS sousc
INNER JOIN db_produit AS prod ON sousc.is_produit = prod.is_produit
WHERE sousc.cd_dossier = 'SOUSC' AND sousc.lp_etat_doss NOT IN ('ANNUL','A30','IMPAY') 
Run Code Online (Sandbox Code Playgroud)