【问题标题】:Type mismatch , compare excel cell value to array value *FIXED*键入 mismatch ,将 excel 单元格值与数组值进行比较 *FIXED*
【发布时间】: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


【解决方案1】:

我认为问题出在这一行:

for each oRow in usedRowsXP  
Introw = oRow

我不是很擅长VBA,但我认为usedRowsXP是一个Range,它的每一行也是一个范围。因此 Introw 将是一个范围。尝试使用 oRow 的 Row 属性,它会返回它的行号:

for each oRow in usedRowsXP  
Introw = oRow.Row 

之后,Introw 应该可以在 Cells(Introw, 1) 等表达式中正常工作。

【讨论】:

  • oRow.row 有效,现在问题只是数组值是 "SURNAME firstname" 和单元格值 SURNAME Firstname ,所以单元格值没有括号。我已经尝试过使用 Cstr(...),但值保持相同的格式
  • 我把这个拿回来,两个值都是字符串,括号来自csv表本身
  • 现在我唯一关心的是如何从csv数组值中排除括号,以便该值可以与excel表值匹配
  • 语法如下:Replace(arrStr(2), """", "") 这会将引号替换为空字符串。将此写在匹配两个值的行中,因此它将匹配未加引号的名称。
  • 我希望进入 split(objTextFile.ReadLine,",") ,但它不接受引号内的引号。这样引号就不会被复制到任何数组值中
猜你喜欢
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
相关资源
最近更新 更多