以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  从EXL表导入数据为何出错?!  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=126212)

--  作者:qtxsp
--  发布时间:2018/10/16 16:42:00
--  从EXL表导入数据为何出错?!
从外部表EXL导入数据(导入代码如下:),为何出现:“索引超出范围。必须为非负值并小于集合大小。” 参数名:index


怎么也查不出原因,其他外表都可以,到底怎么回事?请教老师,谢谢!

代码:
图片点击可在新窗口打开查看此主题相关图片如下:出错截图.jpg
图片点击可在新窗口打开查看

For Each file As String In filesys .GetFiles("D:\\百度云同步盘\\丽水\\数据\\市公司财务") \'获取该目录下的所有文件集
    If file.EndsWith(".xls") OrElse file.EndsWith(".xlsx") Then
        Dim Book As New XLS.Book(file)
        Dim Sheet As XLS.Sheet = Book.Sheets("全市储蓄分钟类表") \'打开"储蓄"工作表
        \' Tables("网点分储种余额").StopRedraw()
        \' Dim nms() As String = {"日期","机构代码","县","网点简称","合计","活期","通知存款","定活两便","定期","其中大额存单"}
        Dim rq1 As String = sheet(3,9).text
        Dim rq_y As String = left(rq1.trim(" "),4)
        Dim rq_m As Integer =iif(rq1.length <= 7,rq1.SubString(5,1),rq1.SubString(5,2))
        Dim Days As Integer = Date.DaysInMonth(rq_y,rq_m) \'取该月天数
        Dim rq As Date = New Date(rq_y,rq_m,Days) \'取该月日期
        MessageBox.show("年=[ " & rq_y & "] 月=[" & rq_m & "] 地市名称=[ & dw_s & ]  类别= [ & LB & ],!","警告!",messageboxbuttons.ok)
        Return
        Dim dw As String = sheet(3,0).Text \'取市级[单位名称]栏数据
        Dim dw_s As String = dw.substring(5,3) \'选取市级名称 \'iif(right(dw.trim(""),2) = "汇总",left(dw,2),"  ") \'判断是否汇总栏?
        Dim LB As String =dw.Substring(15,2)  \'选取代理 还是 自营
        
        \'dw=iif(right(dw,2) = "汇总","汇总",left(dw,1)+right(dw,1)) \'trim(" ")  \'去掉空格
        If IsDate(rq) Then  \'确定表达式expression能否转换成日期格式. len(rq1.trim(" ")) = 10 And
        Else
            MessageBox.show("日期[" & rq & "]格式错误,请在3行9列按[YYYY-MM-DD]重输!","警告!",messageboxbuttons.ok)
            Return
        End If
        Dim js As Integer = 1
        For n As Integer = 6 To Sheet.Rows.Count -1
            
            dw = sheet(n,0).Text \'取[单位名称]栏数据
            dw = dw.trim(" ")
            dw=iif(left(dw,2) = "丽水","市本级",iif(left(dw,2) = "景宁",left(dw,7),left(dw,3))) 
            Dim dr As DataRow = DataTables("全市分储种余额").Find("日期 = " & rq & "  And 市 = \'" & dw_s & "\' and 县 = \'" & dw & "\'")
            If ( dr Is Nothing Or dr IsNot Nothing ) And dw <> "" Then \'如果不存在同日期与机构代码的,将增加数据(自动过滤机构代码为空的行数)
                If dr Is Nothing Then
                    dr =  DataTables("全市分储种余额").AddNew()
                    dr("日期") = rq
                    dr("市") = dw_s
                    dr("县") = dw
                    dr("板块") = LB \'iif(e.Form.Controls("RadioButton1").Checked  = True,"代理","自营") \'RadioButton1
                End If

                If ( n > =10 And n <= 18) Then
                    dr("存款余额") = sheet(n,1).text \'期末余额
                    dr("活期余额") = sheet(n,2).text \'活期
                    dr("定活两便") = sheet(n,5).text \'定活两便
                    dr("个人通知存款") = sheet(n,7).text \'个人通知
                    dr("DQ00") = sheet(n,9).text \'定期余额
                    dr("DQ0301") = sheet(n,18).text \'三个月不含协议
                    dr("DQ0302") = sheet(n,20).text \'三个月协议
                    dr("DQ0601") = sheet(n,28).text \'六个月不含协议
                    dr("DQ0602") = sheet(n,30).text \'六个月协议
                    dr("DQ1201") = sheet(n+15,3).text \'一年不含协议
                    dr("DQ1202") = sheet(n+15,5).text \'一年协议
                    dr("DQ2401") = sheet(n+15,17).text \'二年不含协议
                    dr("DQ2402") = sheet(n+15,19).text \'二年协议
                    dr("DQ3601") = sheet(n+15,27).text \'三年不含协议
                    dr("DQ3602") = sheet(n+15,29).text \'三年协议
                    dr("DQ6001") = sheet(n+15,37).text \'五年不含协议
                    dr("DQ6002") = sheet(n+15,39).text \'五年协议
                    
                End If
                application.Doevents \'即刻暂停代码的执行,重新绘制控件后,继续执行代码.
            End If
        Next
    End If
    Output.Show(File)
Next
\'End If
Tables("全市分储种余额").ResumeRedraw()
DataTables("全市分储种余额").save

--  作者:有点甜
--  发布时间:2018/10/16 16:50:00
--  

应该是你的【substring】有问题,比如只有 3个字符,但你获取了第4个位置的字符。

 

比如,下面的代码,两个substring都是要计算的,如果你rq1的长度小于7,就会报错。

 

Dim rq_m As Integer =iif(rq1.length <= 7,rq1.SubString(5,1),rq1.SubString(5,2))


--  作者:qtxsp
--  发布时间:2018/10/16 18:32:00
--  
好象不是这个原因,我用messagebox函数放置(Dim rq_m As Integer =iif(rq1.length <= 7,rq1.SubString(5,1),rq1.SubString(5,2)))前进行该测试,还没执行到messagebox语句就报错了,出错代码还是如上啊!!好象进行到第二语句
    If file.EndsWith(".xls") OrElse file.EndsWith(".xlsx") Then 就出现该出错提示了?

我应该怎么做?谢谢老师!


以下为测试语句:
        MessageBox.show("年=[ " & rq_y & "] 月=[" & rq_m & "] 地市名称=[ & dw_s & ]  类别= [ & LB & ],!","警告!",messageboxbuttons.ok)

[此贴子已经被作者于2018/10/16 18:37:25编辑过]

--  作者:qtxsp
--  发布时间:2018/10/16 18:44:00
--  
我精减了下整体语句(如下:),结果运行还是出错同样的出错!不知何故?!请老师指教!!谢谢

For Each file As String In filesys .GetFiles("D:\\百度云同步盘\\丽水\\数据\\市公司财务") \'获取该目录下的所有文件集
    If file.EndsWith(".xls") OrElse file.EndsWith(".xlsx") Then
        Dim Book As New XLS.Book(file)
        \'Dim Sheet As XLS.Sheet = Book.Sheets("Sheet1") 
        Dim Sheet As XLS.Sheet = Book.Sheets("全市储蓄分钟类表")
        Dim dw As String = sheet(3,0).Text \'取市级[单位名称]栏数据
        MessageBox.show("年=[  & rq1 & ] 月=[ & rq_m & ] 地市名称=[" & dw & "]  类别= [ & LB & ],!","警告!",messageboxbuttons.ok)
\'        Return
   End If
    Output.Show(File)
Next
[此贴子已经被作者于2018/10/16 18:47:58编辑过]

--  作者:qtxsp
--  发布时间:2018/10/16 18:49:00
--  
我放在命令窗口测试上述代码仍出错:

出错截图:

图片点击可在新窗口打开查看此主题相关图片如下:出错截图.jpg
图片点击可在新窗口打开查看


--  作者:qtxsp
--  发布时间:2018/10/16 19:19:00
--  
无法在 System.DateTime 和 System.Int32 上执行“=”操作
--  作者:有点蓝
--  发布时间:2018/10/16 20:34:00
--  
回3楼:这种代码肯定有问题,不过要循环到有问题的数据才会出错

……
if rq1.length < 6 orelse rq1.length > 7 then continue for
Dim rq_m As Integer =iif(rq1.length <= 7,rq1.SubString(5,1),rq1.SubString(5,2))

回4楼:不是所有的文件都有“全市储蓄分钟类表”这个sheet名称吧,如果没有就会出错