Vb.net 导出到Excel:索引在数组边界之外
谢谢你,布莱克伍德和玛丽。仍然收到错误,但我正在跟踪。更正代码替换如下 玛丽:正如你所建议的 我在“For Each”行和“Dim_LogParts()”行上将StringSplitOptions返回选项重置为None 我将“xlsheet.Cells(_Row,_DT_HDR)=”中的变量从“_LogParts(3)”更改为我的预格式化变量“_ANY_DT” 布莱克伍德:按照你的建议: 我添加了一个msgbox来显示分配给4个变量的内容 第一次运行的结果如下所示: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,
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循环内部,只是不是第一次通过循环。要么逐步执行循环中的指令直到出现错误,要么在错误发生时检查变量以了解问题所在。