Excel 验证下拉列表崩溃,值超过21
这是我的第一个问题。我试图在VBA for Excel上制作一个非常简单的宏 我希望代码在Access中打开数据库,从数据库中读取表名,将它们保存在动态字符串中,然后使用该值在工作表的特定单元格上创建一个下拉列表 代码是一组宏的一部分,因此在完成上述操作时,它会在下拉单元格旁边创建一个按钮,并启动一条消息,警告用户在选择所需的表后,他/她应该按下一个按钮启动下一个宏(我不报告该宏,因为该宏工作正常) 以下是我到目前为止一直在使用的代码:Excel 验证下拉列表崩溃,值超过21,excel,vba,ms-access,adodb,Excel,Vba,Ms Access,Adodb,这是我的第一个问题。我试图在VBA for Excel上制作一个非常简单的宏 我希望代码在Access中打开数据库,从数据库中读取表名,将它们保存在动态字符串中,然后使用该值在工作表的特定单元格上创建一个下拉列表 代码是一组宏的一部分,因此在完成上述操作时,它会在下拉单元格旁边创建一个按钮,并启动一条消息,警告用户在选择所需的表后,他/她应该按下一个按钮启动下一个宏(我不报告该宏,因为该宏工作正常) 以下是我到目前为止一直在使用的代码: Sub consultaAccess_v4_1()
Sub consultaAccess_v4_1()
Dim cn As Object
Dim datos As Object
Dim consultaSQL As String
Dim conexion As String
Dim cont As Long
Dim rs As ADODB.Recordset
Dim NombresTablas() As String
Sheets("Indice").Select
Range("C10").Clear
Set cn = CreateObject("ADODB.Connection")
conexion = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=C:\Users\0205406\Desktop\Base_Datos(EN PROCESO).accdb"
cn.Open conexion
Set rs = cn.OpenSchema(adSchemaTables)
i = 0
a = 0
Do While Not rs.EOF
If rs.Fields("TABLE_NAME").Value Like "MSys*" Then
rs.MoveNext
ElseIf rs.Fields("TABLE_NAME").Value Like "~*" Then
rs.MoveNext
Else
ReDim Preserve NombresTablas(i)
NombresTablas(i) = rs.Fields("TABLE_NAME").Value
rs.MoveNext
i = i + 1
a = a + 1
If a = 21 Then
Exit Do
End If
End If
Loop
With Worksheets("Indice").Range("C10").Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, Formula1:=Join(NombresTablas, ",")
End With
cn.Close
Set cn = Nothing
ActiveSheet.Buttons.Delete
Dim t As Range
Set t = ActiveSheet.Range(Cells(10, 5), Cells(10, 5))
Set btn = ActiveSheet.Buttons.Add(t.Left, t.Top, t.Width, t.Height)
With btn
.OnAction = "consultaAccess_v4_2"
.Caption = "Continuar"
.Name = "Continuar"
End With
Range("C10").Select
MsgBox "Seleccione una tabla del desplegable y pulsa 'Continuar'"
End Sub
宏工作正常,并按我希望的方式工作,但我有一个问题:如果我启动它并关闭excel保存更改,当我再次打开它时,我会收到以下消息:
对于非西班牙语使用者,错误表明书中的内容存在缺陷,如果我信任书中的内容,excel可以尝试恢复尽可能多的内容。单击“是”并打开VBA后,会发生以下情况:
从本质上讲,工作簿会损坏,复制工作表,并删除您可能在其中任何一个工作表上绘制并与宏关联的所有按钮
在调试代码时,我发现了错误,但我不太了解其原因
似乎添加到下拉列表中的列表太大了,这就是为什么excel在重新打开时会爆炸(如果我不启动宏,所有内容都会顺利打开)。我试图修改代码如下(为下拉列表添加最多21个值),这样做没有问题。即使如此,我也知道,可以添加到下拉列表中的最大值数大约是200个,还有一些
Sub consultaAccess_v4_1()
Dim cn As Object
Dim datos As Object
Dim consultaSQL As String
Dim conexion As String
Dim cont As Long
Dim rs As ADODB.Recordset
Dim NombresTablas() As String
Sheets("Indice").Select
Range("C10").Clear
Set cn = CreateObject("ADODB.Connection")
conexion = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=C:\Users\0205406\Desktop\Base_Datos(EN PROCESO).accdb"
cn.Open conexion
Set rs = cn.OpenSchema(adSchemaTables)
i = 0
a = 0
Do While Not rs.EOF
If rs.Fields("TABLE_NAME").Value Like "MSys*" Then
rs.MoveNext
ElseIf rs.Fields("TABLE_NAME").Value Like "~*" Then
rs.MoveNext
Else
ReDim Preserve NombresTablas(i)
NombresTablas(i) = rs.Fields("TABLE_NAME").Value
rs.MoveNext
i = i + 1
a = a + 1
If a = 21 Then
Exit Do
End If
End If
Loop
With Worksheets("Indice").Range("C10").Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, Formula1:=Join(NombresTablas, ",")
End With
cn.Close
Set cn = Nothing
ActiveSheet.Buttons.Delete
Dim t As Range
Set t = ActiveSheet.Range(Cells(10, 5), Cells(10, 5))
Set btn = ActiveSheet.Buttons.Add(t.Left, t.Top, t.Width, t.Height)
With btn
.OnAction = "consultaAccess_v4_2"
.Caption = "Continuar"
.Name = "Continuar"
End With
Range("C10").Select
MsgBox "Seleccione una tabla del desplegable y pulsa 'Continuar'"
End Sub
你知道怎么解决这个问题吗?我已经想了好几天了,什么也没想。
公式1:=Join(NombresTablas,“,”)
在这一行之后,你能把这一行写下来,告诉我它给出了什么吗<代码>Msgbox Len(Join(NombresTablas,“,”)Uhm它给出241。怎么可能呢?NombresTablas上没有那么多241个字符而不是值的条目(它们不应该有,总共有45个表)。您能否debug.Print Join(NombresTablas,“,”)
并检查它包含什么?列表中的字符串可能限制为255个字符……哦,我明白了。调试的结果是所有表的名称,用逗号分隔: