Foxtable(狐表)用户栏目专家坐堂 → 处理EXCEL


  共有8276人关注过本帖树形打印复制链接

主题:处理EXCEL

帅哥哟,离线,有人找我吗?
有点蓝
  11楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107304 积分:545781 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/5/8 8:25:00 [只看该作者]

可以考虑使用异步函数处理,比如:http://www.foxtable.com/mobilehelp/topics/3274.htm

 回到顶部
帅哥哟,离线,有人找我吗?
wh420
  12楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1107 积分:10574 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2021/5/8 15:40:00 [只看该作者]

看了一下,但需要怎么用呢?麻烦老师再具体的说说,或者说有这方面的例子吗学习一下

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  13楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107304 积分:545781 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/5/8 15:44:00 [只看该作者]

帮助就是例子。把需要费时处理的代码放到异步函数里执行,异步函数里需要刷新界面显示的时候调用同步函数刷新。

使用的时候注意:http://www.foxtable.com/mobilehelp/topics/277.htm

 回到顶部
帅哥哟,离线,有人找我吗?
wh420
  14楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1107 积分:10574 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2021/5/10 11:19:00 [只看该作者]

例如下面标红代码处如果用异步函数怎么写代码?麻烦老师指教。(下面代码本身就在一个自定义函数中)
For i As Integer=1 To RowsMax
                    For j As Integer = 1 To ColsMax
                        If ary(i, j) <> Nothing  AndAlso Typeof ary(i,j) Is String AndAlso dic.ContainsKey(ary(i,j).ToLower.Replace(" ","").Replace(chr(10), "").Replace(chr(13), "")) Then
                         rg(i, j).Value= dic(ary(i,j).ToLower.Replace(" ","").Replace(chr(10), "").Replace(chr(13), ""))
lbl11.text="Sheet名称:" & ws.name & rg(i,j).value)                            
                            
                        End If
                    Next

Next
[此贴子已经被作者于2021/5/10 11:21:52编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  15楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107304 积分:545781 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/5/10 12:17:00 [只看该作者]

标红代码不能使用异步函数。而是上面一整段代码所在的自定义函数改为异步函数调用,然后再把标红代码放到一个同步函数里调用

比如自定义函数名称为abc,改一下函数内容为
For i As Integer=1 To RowsMax
                    For j As Integer = 1 To ColsMax
                        If ary(i, j) <> Nothing  AndAlso Typeof ary(i,j) Is String AndAlso dic.ContainsKey(ary(i,j).ToLower.Replace(" ","").Replace(chr(10), "").Replace(chr(13), "")) Then
                         rg(i, j).Value= dic(ary(i,j).ToLower.Replace(" ","").Replace(chr(10), "").Replace(chr(13), ""))                   
                        Functions.BeginSyncExecute("def","Sheet名称:" & ws.name & rg(i,j).value)    
                        End If
                    Next

Next
原来调用方法:Functions.Execute("abc")

现在使用异步的调用方法:Functions.AsyncExecute("abc")

添加一个同步函数,假设名称为def,函数内容为:
Forms("翻译器").Controls("Label11").text = args(0)
Application.DoEvents



 回到顶部
帅哥哟,离线,有人找我吗?
wh420
  16楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1107 积分:10574 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2021/5/10 15:41:00 [只看该作者]

收到,测试了一下果然执行效率上有所提升。但仔细分析一下:假如我的EXCEL有很多SHEET,每个SHEET又有很多行列,那么处理最耗时间的就是下面这些代码。
如果有10个SHEET,可否每个SHEET分出一个线程来执行,10个可以同时执行那效率岂不是更高?如果可以如何改这段代码?老师辛苦指教
For k As Integer=1 To wb.worksheets.Count
            output.show(1)
            If Wb.WorkSheets(k).Visible <> 0 Then        '如果sheet表为不隐藏时处理(0隐藏,-1为不隐藏
                Dim Ws As MSExcel.WorkSheet=Wb.WorkSheets(k)
                If Numcb1.Text = Nothing And Numcb2.Text = Nothing Then
                    RowsMax = 0
                    ColsMax = ws.UsedRange.columns.count
                    '获取最大行
                    For i As Integer = 1 To ColsMax
                        Dim r = ws.cells(excelrows,i).End(MsExcel.XlDirection.xlUp).Row
                        If r > RowsMax Then
                            RowsMax = r
                        End If
                    Next
                    '获取最大列
                    For i As Integer = 1 To RowsMax
                        Dim r = ws.cells(i,excelcol).End(MsExcel.XlDirection.xlToLeft).Column
                        If r > ColsMax Then
                            ColsMax = r
                        End If
                    Next
                Else
                    RowsMax = Numcb1.Value
                    ColsMax = Numcb2.Value
                End If
                Dim  rg As MSExcel.Range =  Ws.Range(Ws.Cells(1,1), Ws.Cells(RowsMax,ColsMax))
                If rg.Count = 1 And rg(1).Value is nothing  Then 
                    Continue For
                End If
                Dim ary = rg.value
                For i As Integer=1 To RowsMax
                    For j As Integer = 1 To ColsMax
                        If ary(i, j) <> Nothing  AndAlso Typeof ary(i,j) Is String AndAlso dic.ContainsKey(ary(i,j).ToLower.Replace(" ","").Replace(chr(10), "").Replace(chr(13), "")) Then
                            lbl11.text= "Sheet名称:" & ws.name
                         rg(i, j).Value= dic(ary(i,j).ToLower.Replace(" ","").Replace(chr(10), "").Replace(chr(13), ""))
                        End If
                    Next
                Next
            End If '不处理隐藏sheet
        Next

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  17楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107304 积分:545781 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/5/10 16:00:00 [只看该作者]

把for循环里处理单个sheet的代码放到函数里

For k As Integer=1 To wb.worksheets.Count
            output.show(1)
            If Wb.WorkSheets(k).Visible <> 0 Then        '如果sheet表为不隐藏时处理(0隐藏,-1为不隐藏
                Dim Ws As MSExcel.WorkSheet=Wb.WorkSheets(k)
Functions.AsyncExecute("abc",Ws)
        End If '不处理隐藏sheet
Next

 回到顶部
帅哥哟,离线,有人找我吗?
wh420
  18楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1107 积分:10574 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2021/5/10 16:17:00 [只看该作者]

不太会改,麻烦老师给段代码。Functions.AsyncExecute("abc",Ws),abc函数里的代码有很多变量还需要重新定义?麻烦老师代码指导一下

 回到顶部
帅哥哟,离线,有人找我吗?
wh420
  19楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1107 积分:10574 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2021/5/10 16:19:00 [只看该作者]

如:这段代码放到ABC函数,应该怎么改怎么调用参数?
If Forms("翻译器").Controls("NumComBox1").Text = Nothing And Forms("翻译器").Controls("NumComBox2").Text = Nothing Then
    RowsMax = 0
    ColsMax = ws.UsedRange.columns.count
    '获取最大行
    For i As Integer = 1 To ColsMax
        Dim r = ws.cells(excelrows,i).End(MsExcel.XlDirection.xlUp).Row
        If r > RowsMax Then
            RowsMax = r
        End If
    Next
    '获取最大列
    For i As Integer = 1 To RowsMax
        Dim r = ws.cells(i,excelcol).End(MsExcel.XlDirection.xlToLeft).Column
        If r > ColsMax Then
            ColsMax = r
        End If
    Next
Else
    RowsMax = Numcb1.Value
    ColsMax = Numcb2.Value
End If
Dim  rg As MSExcel.Range =  Ws.Range(Ws.Cells(1,1), Ws.Cells(RowsMax,ColsMax))
If rg.Count = 1 And rg(1).Value Is Nothing  Then
    Continue For
End If
Dim ary = rg.value
For i As Integer=1 To RowsMax
    For j As Integer = 1 To ColsMax
        If ary(i, j) <> Nothing  AndAlso Typeof ary(i,j) Is String AndAlso dic.ContainsKey(ary(i,j).ToLower.Replace(" ","").Replace(chr(10), "").Replace(chr(13), "")) Then
            lbl11.text= "Sheet名称:" & ws.name
            rg(i, j).Value= dic(ary(i,j).ToLower.Replace(" ","").Replace(chr(10), "").Replace(chr(13), ""))
        End If
    Next
Next
End If

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  20楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107304 积分:545781 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/5/10 16:29:00 [只看该作者]

这一句也放到函数外面,因为只是做个判断,处理execl也用不到

If Numcb1.Text = Nothing And Numcb2.Text = Nothing Then

其它变量该重新定义的就重新定义

 回到顶部
总数 108 上一页 1 2 3 4 5 6 7 8 9 10 下一页 ..11