【发布时间】:2012-10-19 07:12:48
【问题描述】:
当前问题:
目标是将数据从源 .csv 文件复制到目标 excel 工作表,基于将 .csv 的每一行中的值与 excel 工作表列中的值匹配,然后基于该复制到更正 Excel 工作表中的单元格。
我正在循环中从 .csv 文件将值收集到数组中,将数组中的一个值与目标 Excel 工作表列 A 中的值进行比较,如果发生匹配,则数组中的所有值都是复制到excel表的对应行。
我现在在尝试将 Excel 工作表的单元格值与数组值进行比较时遇到“类型不匹配”错误。
以下是代码的相关位:
sfile="\\DFSpath\file1.csv"
smaster="\\DFSpath\file2.xlsx"
set xlapp = createobject("excel.application")
set wbtarget = xlapp.workbooks.open(smaster)
set tgtworksheet = wbtarget.worksheets("sheet1")
set usedRowsXP = tgtworksheet.UsedRange.Rows
dim fs,objTextFile
set fs=CreateObject("Scripting.FileSystemObject")
dim arrStr
set objTextFile = fs.OpenTextFile(sfile)
Do while NOT objTextFile.AtEndOfStream
arrStr = split(objTextFile.ReadLine,",")
for each oRow in usedRowsXP
Introw = oRow
If tgtworksheet.cells(Introw,1).value = arrStr(2) Then
tgtworksheet.cells(Introw,4).value = arrStr(0)
tgtworksheet.cells(Introw,5).value = arrStr(1)
tgtworksheet.cells(Introw,6).value = arrStr(2)
End If
next
Loop
通过修改代码修复如下:
dim fs,objTextFile
set fs=CreateObject("Scripting.FileSystemObject")
dim arrStr
set objTextFile = fs.OpenTextFile(sfile)
'##Replace quotation marks with nothing in .csv##
strText = objtextFile.ReadAll
objTextFile.Close
strNewText = Replace(strText, """", "")
Set objtextFile = fs.OpenTextFile(sfile, 2)
objtextFile.Write strNewText
objtextFile.Close
set objTextFile = fs.OpenTextFile(sfile, 1)
'##Gather array out of line in .csv + compare user's name to name in excel sheet, if matches, copy data, repeat for each line##
Do while NOT objTextFile.AtEndOfStream
arrStr = split(objTextFile.ReadLine,",")
for each oRow in usedRowsXP
Introw = oRow.row
If Cstr(tgtworksheet.cells(Introw,1).value) = arrStr(2) Then
tgtworksheet.cells(Introw,4).value = arrStr(0)
tgtworksheet.cells(Introw,5).value = arrStr(1)
tgtworksheet.cells(Introw,6).value = arrStr(2)
End If
next
Loop
【问题讨论】:
-
确切的错误是什么,在哪一行?如果您调试,您是否检查了该行中变量的值和类型?例如,如果您的错误在 tgtworksheet.cells(Introw,1).value = arrStr(2) 行,那么 arrStr(2) 是什么类型,tgtworksheet.cells(Introw,1).value 是什么类型?如果你知道这些值将是数字,那么就这样声明你的变量,如果你知道你需要字符串,那么就声明为字符串。
-
失败就行了: If tgtworksheet.cells(Introw,1).value = arrStr(2) Then , 错误是 "Type mismatch" code: 800A000D , 运行时错误。我已经尝试使用 value.ToString 的单元格值,但没有骰子,同样的错误。要比较的 2 个位置的内容格式相似: SURNAME Firstname 。 ArrStr 值可以回显但excel单元格值不能回显,产生相同类型不匹配错误。
-
我认为你的问题是 Introw - 我敢打赌它是一个行对象而不是一个整数。如果您知道第一行号,则将 Introw 声明为该整数并将“Introw = oRow”替换为“Introw = Introw + 1”
-
否则行对象是否有子单元格?也许您可以将 tgtworksheet.cells(Introw,1).value 替换为 oRow.cells(1, 1).value 或 oRow.columns(1).value 或类似的东西?
-
与oRow.row一起工作,现在我唯一关心的是如何从csv数组值中排除括号,以便该值可以与excel表值匹配
标签: excel csv vbscript match type-mismatch