Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 验证下拉列表崩溃,值超过21_Excel_Vba_Ms Access_Adodb - Fatal编程技术网

Excel 验证下拉列表崩溃,值超过21

Excel 验证下拉列表崩溃,值超过21,excel,vba,ms-access,adodb,Excel,Vba,Ms Access,Adodb,这是我的第一个问题。我试图在VBA for Excel上制作一个非常简单的宏 我希望代码在Access中打开数据库,从数据库中读取表名,将它们保存在动态字符串中,然后使用该值在工作表的特定单元格上创建一个下拉列表 代码是一组宏的一部分,因此在完成上述操作时,它会在下拉单元格旁边创建一个按钮,并启动一条消息,警告用户在选择所需的表后,他/她应该按下一个按钮启动下一个宏(我不报告该宏,因为该宏工作正常) 以下是我到目前为止一直在使用的代码: Sub consultaAccess_v4_1()

这是我的第一个问题。我试图在VBA for Excel上制作一个非常简单的宏

我希望代码在Access中打开数据库,从数据库中读取表名,将它们保存在动态字符串中,然后使用该值在工作表的特定单元格上创建一个下拉列表

代码是一组宏的一部分,因此在完成上述操作时,它会在下拉单元格旁边创建一个按钮,并启动一条消息,警告用户在选择所需的表后,他/她应该按下一个按钮启动下一个宏(我不报告该宏,因为该宏工作正常)

以下是我到目前为止一直在使用的代码:

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个字符……哦,我明白了。调试的结果是所有表的名称,用逗号分隔: