Excel VBA中不必要的值串联和类型错误

Excel VBA中不必要的值串联和类型错误,excel,vba,Excel,Vba,我的VBA代码从特定软件输出(Carlson Survey software)中获取一个.txt文件,并进行一些计算,然后将其转换为.CSV文件。我特别是在计算组件方面遇到了问题,其中文本文件的一列(使用逗号分隔符带入excel)没有执行我告诉它的计算,并且似乎在连接自身(删除小数点后的所有内容)。我的假设是,因为我将这些值放入一个数组(必须设置为字符串,否则我会得到类型错误),该数组被设置为字符串,这会导致小数点后的串联。我不明白为什么计算看起来没有运行,因为程序似乎执行得很好 以及用于快速参

我的VBA代码从特定软件输出(Carlson Survey software)中获取一个.txt文件,并进行一些计算,然后将其转换为.CSV文件。我特别是在计算组件方面遇到了问题,其中文本文件的一列(使用逗号分隔符带入excel)没有执行我告诉它的计算,并且似乎在连接自身(删除小数点后的所有内容)。我的假设是,因为我将这些值放入一个数组(必须设置为字符串,否则我会得到类型错误),该数组被设置为字符串,这会导致小数点后的串联。我不明白为什么计算看起来没有运行,因为程序似乎执行得很好

以及用于快速参考的VBA脚本(有问题的特定部分是“执行数据转换”部分:

Private Sub Workbook_Open()
Sheets("Sheet1").Cells.ClearContents
'---------------------------------------------------------------------------------------
'Choose and open the .TXT file for conversion
Dim answer As Integer
answer = MsgBox("Do you want to process a .TXT file for use in InfoSWMM?", vbYesNo + vbQuestion, "Select .TXT File")
If answer = vbNo Then
    Exit Sub
End If
Dim Ret
Ret = Application.GetOpenFilename("Text Files (*.txt),*.txt")
If Ret <> False Then
    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;" & Ret, Destination:=Range("$A$1") _
        )
        .Name = "Sample"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        TextFilePromptOnRefresh = False
        .TextFilePlatform = 437
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
End If
'---------------------------------------------------------------------------------------
'Do data conversion, SECTION NEEDS UPDATING LACKING FEATURES, BUGS
Dim row As Integer
Dim col As Integer
Dim i As Integer
Dim tester(3) As String 'Bug[1] related, type error (see below).  String type fixes type error, but causes undesired concatenation
Dim col_test As Integer
Dim rim As Integer

For row = 1 To ActiveSheet.UsedRange.Rows.Count
    If IsEmpty(ActiveSheet.Cells(row, 1).Value) = True Then
        Exit For
    End If
    'Change these values in case feature code library is changed in Carlson, also need to add extra fields
    If ActiveSheet.Cells(row, 5).Value = "SD" Or ActiveSheet.Cells(row, 5).Value = "WQ" Then
        col_test = 20
        rim = ActiveSheet.Cells(row, 4).Value
        For i = 0 To 3
            tester(i) = ActiveSheet.Cells(row, col_test).Value 'Bug[1] here, type error if not a String.
            col_test = col_test + 4
        Next i
        ActiveSheet.Cells(row, 37).Value = rim - Application.Max(tester) 'Bug[2] here, not performing calculation.
    End If
Next row
'---------------------------------------------------------------------------------------
'Save converted file as .CSV
MsgBox "Choose the desired save location for the .CSV file."
Dim InitialName As String
Dim PathName As Variant
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
InitialName = "sfm_output"
PathName = Application.GetSaveAsFilename(InitialFileName:=InitialName, fileFilter:="CSV (Comma delimited) (*.csv), *.csv")
ws.Copy
ActiveWorkbook.SaveAs Filename:=PathName, _
    FileFormat:=xlCSV, CreateBackup:=False
MsgBox "Process completed successfully." & vbNewLine & "File saved to:" & vbNewLine & PathName
'---------------------------------------------------------------------------------------
'Close all Workbooks
Application.DisplayAlerts = False
Application.Quit
End Sub
Private子工作簿\u Open()
表(“表1”).Cells.ClearContents
'---------------------------------------------------------------------------------------
'选择并打开.TXT文件进行转换
将答案设置为整数
answer=MsgBox(“是否要处理用于InfoSWMM的.TXT文件?”,vbYesNo+vbQuestion,“选择.TXT文件”)
如果答案=vbNo,则
出口接头
如果结束
暗网
Ret=Application.GetOpenFilename(“文本文件(*.txt),*.txt”)
如果Ret为False,则
使用ActiveSheet.QueryTables.Add(连接:=_
TEXT;&Ret,目的地:=范围($A$1)_
)
.Name=“样本”
.FieldNames=True
.rowNumber=False
.FillAdjacentFormulas=False
.PreserveFormatting=True
.refreshinfoleopen=False
.RefreshStyle=xlInsertDeleteCells
.SavePassword=False
.SaveData=True
.AdjustColumnWidth=True
.RefreshPeriod=0
TextFilePromptOnRefresh=False
.TextFilePlatform=437
.TextFileStartRow=1
.TextFileParseType=xlDelimited
.TextFileTextQualifier=xlTextQualifierDoubleQuote
.textfileconsutivedelimiter=False
.TextFileTabDelimiter=True
.TextFileSemicolonDelimiter=False
.textfilecommadelimitor=True
.TextFileSpaceDelimiter=False
.TextFileColumnDataTypes=数组(1,1,1,1,1)
.TextFileTrailingMinusNumbers=True
.Refresh BackgroundQuery:=False
以
如果结束
'---------------------------------------------------------------------------------------
'进行数据转换,部分需要更新缺少功能,错误
将行设置为整数
作为整数的Dim col
作为整数的Dim i
Dim tester(3)与字符串错误[1]相关,类型错误(见下文)。字符串类型修复了类型错误,但会导致不需要的连接
作为整数的Dim col_测试
作为整数的Dim rim
对于行=1到ActiveSheet.UsedRange.Rows.Count
如果IsEmpty(ActiveSheet.Cells(行,1.Value)=True,则
退出
如果结束
'更改这些值,以防Carlson中的功能代码库发生更改,还需要添加额外的字段
如果ActiveSheet.Cells(第5行).Value=“SD”或ActiveSheet.Cells(第5行).Value=“WQ”则
col_试验=20
rim=ActiveSheet.Cells(第4行).Value
对于i=0到3
tester(i)=ActiveSheet.Cells(行、列测试)。Value'Bug[1]如果不是字符串,请在此处键入error。
col_测试=col_测试+4
接下来我
ActiveSheet.Cells(第37行)。Value=rim-Application.Max(tester)此处存在错误[2],未执行计算。
如果结束
下一排
'---------------------------------------------------------------------------------------
'将转换后的文件另存为.CSV
MsgBox“为.CSV文件选择所需的保存位置。”
Dim InitialName作为字符串
变暗路径名作为变量
将ws设置为工作表
设置ws=ThisWorkbook.Worksheets(“Sheet1”)
InitialName=“sfm\U输出”
路径名=应用程序.GetSaveAsFilename(初始文件名:=初始名称,文件筛选器:=“CSV(逗号分隔)(*.CSV),*.CSV”)
ws.Copy
ActiveWorkbook.SaveAs文件名:=路径名_
FileFormat:=xlCSV,CreateBackup:=False
MsgBox“进程成功完成”。&vbNewLine&“文件保存到:”&vbNewLine&PathName
'---------------------------------------------------------------------------------------
'关闭所有工作簿
Application.DisplayAlerts=False
申请,退出
端接头

非常感谢您的帮助。谢谢。

您尝试过CSTRING或CINT功能吗

例如:
tester(i)=CString(ActiveSheet.Cells(row,col_test).Value)

我尝试了CInt,然后它抛出了一个类型不匹配错误。但是,由于您的回答,我查找了CInt并发现Val()做了类似的事情。使用Val修复了连接和类型错误问题。第二个计算未执行的问题是由于我缺乏观察,因为我没有注意到该行中的值实际上包含一些文本,因此减法没有意义。我现在正在修复该部分,感谢帮助!听起来像没有真正的问题是缺乏验证。查看
iError
IsNumeric
在给定任何
Variant
值的情况下可以为您做些什么。听起来您的工作表中似乎包含错误。包含错误值的单元格将是
Variant/error
-在尝试之前,您应该使用
iError
验证情况是否如此将该错误值视为字符串或数字。
CStr
针对
变量/错误
可能不会产生您期望的结果。在针对工作表中的值进行数学运算之前,请始终使用
IsNumeric
进行验证。