Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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 如何为大数据加速宏?_Excel_Vba - Fatal编程技术网

Excel 如何为大数据加速宏?

Excel 如何为大数据加速宏?,excel,vba,Excel,Vba,这是我的代码,它从sub Userfrom_Initialize调用。它工作得很好。但是,当涉及到大量数据时,显示包含加载数据的表单所需的时间太长。有人能帮我吗 Sub LoadData() Dim cn As ADODB.Connection Dim sqlstr As String Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset Dim rn As Range Set rn = Ac

这是我的代码,它从sub Userfrom_Initialize调用。它工作得很好。但是,当涉及到大量数据时,显示包含加载数据的表单所需的时间太长。有人能帮我吗

Sub LoadData()
    Dim cn As ADODB.Connection
    Dim sqlstr As String
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    Dim rn As Range
    Set rn = ActiveCell

    Application.ScreenUpdating = False

    Set cn = New ADODB.Connection
    cn.Open "connection; "

    If rn.Offset(0, -1).Value = "abc" Then
        OptionButton2.Visible = False
        TextBox3.Visible = False


        sqlstr = "query"
        OptionButton1.Value = True
        TextBox1.Value = ActiveCell.Value

        rs.Open sqlstr, cn, adOpenStatic
        While Not rs.EOF
            ListBox1.AddItem rs(0).Value
            rs.MoveNext
        Wend
    End If

    If rn.Offset(0, -1).Value = "xyz" Then
        OptionButton1.Visible = False
        TextBox1.Visible = False

        sqlstr = "query"
        OptionButton2.Value = True
        TextBox3.Value = ActiveCell.Value

        rs.Open sqlstr, cn, adOpenStatic
        While Not rs.EOF
            ListBox1.AddItem rs(0).Value
            rs.MoveNext
        Wend
    End If


    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
    Application.ScreenUpdating = True

End Sub

我稍微清理了一下代码,删除了
,而不是rs.EOF ListBox1.AddItem rs(0)。Value rs.MoveNext Wend
循环

Sub LoadData()
    Dim cn As ADODB.Connection
    Dim sqlstr As String
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    Dim rn As Range
    Set rn = ActiveCell


    'Application.ScreenUpdating = False   ' <== not necessary

    cn.Open "connection; "

    sqlstr = "query"
    rs.Open sqlstr, cn, adOpenForwardOnly 

    Dim v As Variant
    v = rs.GetRows(, , rs.Fields(0).Name)


    If rn.Offset(0, -1).Value = "abc" Then
        OptionButton2.Visible = False
        TextBox3.Visible = False
        OptionButton1.Value = True
        TextBox1.Value = ActiveCell.Value

        ListBox1.Column = v
    End If

    If rn.Offset(0, -1).Value = "xyz" Then
        OptionButton1.Visible = False
        TextBox1.Visible = False
        OptionButton2.Value = True
        TextBox3.Value = ActiveCell.Value

        ListBox1.Column = v
    End If


    rs.Close  ' This will crash in the OP's version
    ' Set rs = Nothing  ' This is not neccessary
    cn.Close
    ' Set cn = Nothing  ' not neccessary
    ' Application.ScreenUpdating = True '  <== also not necessary

End Sub
子加载数据()
Dim cn作为ADODB.Connection
作为字符串的Dim sqlstr
将rs设置为ADODB.Recordset
Set rs=New ADODB.Recordset
低雷诺数范围
设置rn=ActiveCell

'Application.screenUpdate=False'您根本不清楚减速的位置。有两个循环:是一个循环还是两个循环?是SQL速度慢吗?你如何定义“慢”?是几秒钟,几分钟?您执行了哪些分析?使用这种方法填充列表框可能会有所帮助。我检查过,查询并不慢。我不知道出了什么问题,这就是我发帖子的原因。你甚至都没试过,是吗?您将摆脱循环
,而不是rs.EOF ListBox1.AddItem rs(0)。Value rs.MoveNext Wend
@Storax-我尝试过,但仍然需要很长时间才能解决。我正在尝试将大约4000条记录加载到列表框中。我建议您完成代码的第一步,并识别需要很长时间的行。我仍然无法解决我的问题。你能帮我一下吗?你在哪里花了很长时间才修改代码?现在,如果没有你提供的信息,请尝试使用
adOpenForwardOnly
而不是
adOpenStatic
,尽管我并不期望由于该更改而有多大的改进。我试着用了4000多张唱片。根本没有性能问题。那个用户表单上还有什么?你还装了什么?