Vb.net 导出到Excel:索引在数组边界之外

Vb.net 导出到Excel:索引在数组边界之外,vb.net,excel,vba,Vb.net,Excel,Vba,谢谢你,布莱克伍德和玛丽。仍然收到错误,但我正在跟踪。更正代码替换如下 玛丽:正如你所建议的 我在“For Each”行和“Dim_LogParts()”行上将StringSplitOptions返回选项重置为None 我将“xlsheet.Cells(_Row,_DT_HDR)=”中的变量从“_LogParts(3)”更改为我的预格式化变量“_ANY_DT” 布莱克伍德:按照你的建议: 我添加了一个msgbox来显示分配给4个变量的内容 第一次运行的结果如下所示: admin,FS,OPEN,

谢谢你,布莱克伍德和玛丽。仍然收到错误,但我正在跟踪。更正代码替换如下

玛丽:正如你所建议的

我在“For Each”行和“Dim_LogParts()”行上将StringSplitOptions返回选项重置为None

我将“xlsheet.Cells(_Row,_DT_HDR)=”中的变量从“_LogParts(3)”更改为我的预格式化变量“_ANY_DT”

布莱克伍德:按照你的建议:

我添加了一个msgbox来显示分配给4个变量的内容

第一次运行的结果如下所示:

admin,FS,OPEN,3/21/2018 9:06:39 AM
admin,FS,SAVE,3/21/2018 9:10:29 AM
admin,FS,SAVE,3/21/2018 9:10:32 AM
admin,FS,SAVE,3/21/2018 9:13:37 AM
admin,FS,SAVE,3/21/2018 9:14:42 AM
admin,FS,CLOSE,3/21/2018 9:14:43 AM
UserID=Admin

角色=UU

事件=打开

时间戳=xx/xx/xxxx###:##:##

但是,输出中的每个后续行如下所示:

admin,FS,OPEN,3/21/2018 9:06:39 AM
admin,FS,SAVE,3/21/2018 9:10:29 AM
admin,FS,SAVE,3/21/2018 9:10:32 AM
admin,FS,SAVE,3/21/2018 9:13:37 AM
admin,FS,SAVE,3/21/2018 9:14:42 AM
admin,FS,CLOSE,3/21/2018 9:14:43 AM
用户ID=

管理员

角色=UU

事件=打开

时间戳=xx/xx/xxxx###:##:##

我无法理解为什么用户ID文本(“Admin”)每次都会换行到第二行,但这是第一次,不过我有理由肯定这是我的问题。在Excel工作表中,第一行使用标准高度行,但所有后续行都是双倍高度。我相信如果我能停止包装,我有我的解决办法

原始(编辑)查询:

我使用的一个单机版会生成不断增加的数据日志,并将其以网格格式发布到下拉文本框中。我的任务是编写VB代码,将数据从文本框导出到Excel。下面的代码确实导出了日志中的所有内容,但是我得到了“索引超出数组边界”错误,并且没有应用任何格式。我在下一个命令之前得到了一个干净的断点。如果我将断点移到它下面一行,我首先会得到错误

日志数据由插件发布到输入屏幕中的下拉文本框中。看起来是这样的:

admin,FS,OPEN,3/21/2018 9:06:39 AM
admin,FS,SAVE,3/21/2018 9:10:29 AM
admin,FS,SAVE,3/21/2018 9:10:32 AM
admin,FS,SAVE,3/21/2018 9:13:37 AM
admin,FS,SAVE,3/21/2018 9:14:42 AM
admin,FS,CLOSE,3/21/2018 9:14:43 AM
使用以下代码输出到Excel应该如下所示: (无格式)

下面是我正在(仍然)处理的编辑按钮代码:

    Dim xlApp As Object = CreateObject("Excel.Application") 

    If xlApp Is Nothing Then
        MsgBox("It appears that Excel is not available at this time." & vbCrLf & _
        "You may need to close all instances of Excel and try again." & vbCrLf & _
        "If that doesn't work, you may need to reboot your computer." & vbCrLf & _
        "If that doesn't work, there may be a problem with Excel")
    End If

    Dim xlWorkBook  As Object
    Dim xlWorkSheet As Object

    Dim _USERID_HDR     As Integer = 1
    Dim _ASSOCROLE_HDR  As Integer = 2
    Dim _EVENT_HDR      As Integer = 3
    Dim _DT_HDR         As Integer = 4

' Start Data at _Row
    Dim _Row            As Integer = 4 
    Dim _Delimiter()    As String = {","}

            xlApp.DisplayAlerts = False
            xlApp.Visible       = True 
            xlApp.UserControl   = True
            xlWorkBook          = xlApp.Workbooks.Add()
            xlWorkSheet         = xlWorkBook.ActiveSheet()

' Add table headers going cell by cell.

            xlWorkSheet.Cells((_Row - 3), 1).Value = String.Format("UserTouchesFX{0} by MortgageTech{1}", Chr(0153), Chr(0169))
            xlWorkSheet.Cells((_Row - 2), 1).Value = DateTime.Now.ToString("MMMM dd, yyyy @ hh:mm tt")
            xlWorkSheet.Cells((_Row - 1), _USERID_HDR).Value    = "User ID"
            xlWorkSheet.Cells((_Row - 1), _ASSOCROLE_HDR).Value = "Role"
            xlWorkSheet.Cells((_Row - 1), _EVENT_HDR).Value     = "Event"
            xlWorkSheet.Cells((_Row - 1), _DT_HDR).Value        = "Date Time"

' Assign Log Items to specific Excel cells 

    Try
    For Each _LogEntry As String in (FX_AU_Sessions_Log.Text.Split(New Char() { Environment.NewLine }, StringSplitOptions.None))

        Dim  _ANY_DT        As DateTime             = Nothing
        Dim  _LogParts()    As String               = _LogEntry.Split( _Delimiter, StringSplitOptions.None)
        DateTime.TryParse(_LogParts(3), _ANY_DT)

            xlWorkSheet.Cells(_Row, _USERID_HDR)    = _LogParts(0)  'User ID
            xlWorkSheet.Cells(_Row, _ASSOCROLE_HDR) = _LogParts(1)  'User Role
            xlWorkSheet.Cells(_Row, _EVENT_HDR)     = _LogParts(2)  'Event
            xlWorkSheet.Cells(_Row, _DT_HDR)        = _ANY_DT       'Time Stamp

        _Row = _Row + 1

' MsgBox ( _
' "UserID   = " &   _LogParts(0)    & vbCrLf & _
' "Role         =   _LogParts(0)    & vbCrLf & _
' "Event        =   _LogParts(0)    & vbCrLf & _
' "TimeStamp    =   _ANY_DT         & vbCrLf & _
' )

     Next _LogEntry

' Format Settings:
' ColorIndex values: 0 Auto, 1 Black, 2 White, 3 Red, 5 Blue, 6 Yellow, '10 Green, 40 Tan, 34 Light Turquoise, 35 Light Green, 36 Light Yellow, '37 Pale Blue
' Set first row to Bold Font Size 16 - Top Company Name Row | 
' Vertical Alignment: Top  = -4160, Center = -4108, Bottom = -4107
' Horizont Alignment: Left = -4131, Center = -4108,  Right = -4152

       With xlWorkSheet.Range("A1", "D1")
            .Interior.ColorIndex        = 35
            .Merge("A1", "D1")
            .Font.Size = 16
            .Font.Bold = True
            .VerticalAlignment          = -4107 
            .HorizontalAlignment        = -4108
       End With

' Set second row to Regular Font Size 12 - Date Now Row
       With xlWorkSheet.Range("A2", "D2")      
            .Interior.ColorIndex        = 34
            .Merge("A2", "D2")
            .Font.Size                  = 12
            .Font.Bold                  = False
            .VerticalAlignment          = -4107 
            .HorizontalAlignment        = -4108
       End With

' Set third row to Bold Font Size 12 - Column Header Row
       With xlWorkSheet.Range("A3", "D3")
            .Interior.ColorIndex        = 15
            .Font.Size                  = 11
            .Font.Bold                  = True
            .VerticalAlignment          = -4107 
            .HorizontalAlignment        = -4108
'           .EntireColumn.AutoFit
       End With

' Set column widths
        With xlWorkSheet
            .Columns("A").ColumnWidth   = 20
            .Columns("B").ColumnWidth   = 10
            .Columns("C").ColumnWidth   = 20
            .Columns("D").ColumnWidth   = 40
            .Rows.WrapText = False
        End With

' Set column formatting
        With xlWorkSheet
            .Columns("A").EntireColumn.HorizontalAlignment = -4131 ' Left
            .Columns("B").EntireColumn.HorizontalAlignment = -4108 ' Center
            .Columns("C").EntireColumn.HorizontalAlignment = -4108 ' Center
            .Columns("D").EntireColumn.HorizontalAlignment = -4152 ' Right
            .Columns("D").NumberFormat  = "yyyy-mm-dd hh:mm AM/PM"
        End With

    Catch Ex As Exception

        Macro.Alert(String.Format("There is problem with xlWorkBook: {0}", Ex.Message ))

    End Try

我能看到的唯一超出范围的索引是这一行

 Dim  _LogParts() As String  = _LogEntry.Split( _Separators, StringSplitOptions.RemoveEmptyEntries)
删除空条目将导致不同大小的LogParts数组,并且当您使用此数组的元素时,LogParts(3)将超出范围,数据可能会出现在错误的列中。 不相关但奇怪的是

DateTime.TryParse(_LogParts(3), _ANY_DT)

_任何数据都不会被使用。

你能给出一个输入数据的例子,以及你想要实现的输出格式吗?当然,数据会被发布到一个下拉文本框中,看起来是这样的:admin,FS,OPEN,3/21/2018 9:06:39 AM admin,FS,SAVE,3/21/2018 9:10:29 AM admin,FS,SAVE,3/21/2018 9:10:32 AM admin,FS,SAVE,2018年3月21日上午9:13:37 admin,FS,SAVE,2018年3月21日上午9:14:42 admin,FS,CLOSE,2018年3月21日上午9:14:43 excel输出如下所示:UserTouchesFX™ MortgageTech©2018年3月29日上午10:51用户ID角色事件日期时间管理员FS开放时间2018年3月21日9:06“谢谢-建议您编辑原始问题,使其独立,输出数据的格式更易于阅读。对我的原始帖子进行了要求的编辑。”。在两个方面都能快速学习。希望这就是你的想法。感谢您在第一次点击
Next
语句之前没有出现错误。但是在点击
Next
之后的语句之前,您就得到了错误,然后错误发生在for循环内部,只是不是第一次通过循环。要么逐步执行循环中的指令直到出现错误,要么在错误发生时检查变量以了解问题所在。